Skip to content

Commit 85bd8d6

Browse files
committed
Feature: Customize sidebar section visibility in the user settings screen.
1 parent 6a62b36 commit 85bd8d6

File tree

6 files changed

+76
-23
lines changed

6 files changed

+76
-23
lines changed

docs/config.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,8 @@ See [Privileges](privileges.md) for more details on privileges.
520520

521521
This object sets default UI preferences for new users (locale, theme, motion/contrast, volume, saved searches, etc.), merged into profiles at creation/login.
522522

523+
See [User](data.md#user) for details on what properties can be specified here.
524+
523525

524526

525527
## db_maint

docs/data.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1692,6 +1692,7 @@ A user account is a representation of an individual user within the system. The
16921692
"loc": "Search?result=critical"
16931693
}
16941694
],
1695+
"sidebar": ["main", "job_searches", "ticket_searches", "shortcuts", "scheduler", "monitoring", "settings", "admin", "help"],
16951696
"timezone": "",
16961697
"username": "bluetiger469",
16971698
"volume": 7
@@ -1794,6 +1795,14 @@ A list of roles assigned to the user. See [Role](#role).
17941795

17951796
A list of search presets for the user.
17961797

1798+
### User.sidebar
1799+
1800+
An array of all the sidebar sections to show in the UI for the user. The default full set is:
1801+
1802+
```json
1803+
["main", "job_searches", "ticket_searches", "shortcuts", "scheduler", "monitoring", "settings", "admin", "help"]
1804+
```
1805+
17971806
## WebHook
17981807

17991808
A web hook is a user-defined HTTP callback that is triggered by specific actions in xyOps. When the specified action occurs, the web hook sends a HTTP request to the specified URL with an optional payload containing information about the event. Web hooks are commonly used for real-time notifications, integrations with other services, and automating workflows. Here is an example Web Hook in JSON format:

htdocs/index-dev.html

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -39,52 +39,52 @@
3939
<div class="sidebar">
4040
<div class="title"></div>
4141

42-
<div class="section_title"><i class="ctrl mdi mdi-chevron-down"></i><i class="icon mdi mdi-home">&nbsp;</i>Main</div>
43-
<div class="section">
42+
<div class="section_title sbs_main"><i class="ctrl mdi mdi-chevron-down"></i><i class="icon mdi mdi-home">&nbsp;</i>Main</div>
43+
<div class="section sbs_main">
4444
<a href="#Dashboard" id="tab_Dashboard" class="section_item"><i class="icon mdi mdi-monitor-dashboard">&nbsp;</i>Dashboard</a>
4545
</div>
4646

47-
<div class="section_title"><i class="ctrl mdi mdi-chevron-down"></i><i class="icon mdi mdi-account-search-outline">&nbsp;</i>Job Searches</div>
48-
<div id="d_section_my_job_searches" class="section"></div>
47+
<div class="section_title sbs_job_searches"><i class="ctrl mdi mdi-chevron-down"></i><i class="icon mdi mdi-account-search-outline">&nbsp;</i>Job Searches</div>
48+
<div id="d_section_my_job_searches" class="section sbs_job_searches"></div>
4949

50-
<div class="section_title"><i class="ctrl mdi mdi-chevron-down"></i><i class="icon mdi mdi-text-box-search-outline">&nbsp;</i>Ticket Searches</div>
51-
<div id="d_section_my_ticket_searches" class="section"></div>
50+
<div class="section_title sbs_ticket_searches"><i class="ctrl mdi mdi-chevron-down"></i><i class="icon mdi mdi-text-box-search-outline">&nbsp;</i>Ticket Searches</div>
51+
<div id="d_section_my_ticket_searches" class="section sbs_ticket_searches"></div>
5252

53-
<div class="section_title"><i class="ctrl mdi mdi-chevron-down"></i><i class="icon mdi mdi-hand-pointing-right">&nbsp;</i>Shortcuts</div>
54-
<div class="section">
55-
<a href="#Tickets?sub=new" id="tab_NewTicket" class="section_item"><i class="icon mdi mdi-text-box-plus-outline">&nbsp;</i>New Ticket...</a>
56-
<a href="#Events?sub=new" id="tab_NewEvent" class="section_item"><i class="icon mdi mdi-calendar-edit-outline">&nbsp;</i>New Event...</a>
57-
<a href="#Workflows?sub=new" id="tab_NewWorkflow" class="section_item"><i class="icon mdi mdi-clipboard-edit-outline">&nbsp;</i>New Workflow...</a>
58-
<a href="#Servers?add=1" id="tab_NewServer" class="section_item"><i class="icon mdi mdi-server-plus-outline">&nbsp;</i>New Server...</a>
53+
<div class="section_title sbs_shortcuts"><i class="ctrl mdi mdi-chevron-down"></i><i class="icon mdi mdi-hand-pointing-right">&nbsp;</i>Shortcuts</div>
54+
<div class="section sbs_shortcuts">
55+
<a href="#Tickets?sub=new" id="tab_NewTicket" class="section_item sbs_ticket_searches"><i class="icon mdi mdi-text-box-plus-outline">&nbsp;</i>New Ticket...</a>
56+
<a href="#Events?sub=new" id="tab_NewEvent" class="section_item sbs_scheduler"><i class="icon mdi mdi-calendar-edit-outline">&nbsp;</i>New Event...</a>
57+
<a href="#Workflows?sub=new" id="tab_NewWorkflow" class="section_item sbs_scheduler"><i class="icon mdi mdi-clipboard-edit-outline">&nbsp;</i>New Workflow...</a>
58+
<a href="#Servers?add=1" id="tab_NewServer" class="section_item sbs_monitoring"><i class="icon mdi mdi-server-plus-outline">&nbsp;</i>New Server...</a>
5959
</div>
6060

61-
<div class="section_title"><i class="ctrl mdi mdi-chevron-down"></i><i class="icon mdi mdi-calendar-multiple">&nbsp;</i>Scheduler</div>
62-
<div class="section">
61+
<div class="section_title sbs_scheduler"><i class="ctrl mdi mdi-chevron-down"></i><i class="icon mdi mdi-calendar-multiple">&nbsp;</i>Scheduler</div>
62+
<div class="section sbs_scheduler">
6363
<a href="#Events" id="tab_Events" class="section_item"><i class="icon mdi mdi-calendar-clock">&nbsp;</i>Events</a>
6464
<a href="#Events?plugin=_workflow" id="tab_Workflows" class="section_item"><i class="icon mdi mdi-clipboard-flow-outline">&nbsp;</i>Workflows</a>
6565
<a href="#Categories" id="tab_Categories" class="section_item"><i class="icon mdi mdi-folder-multiple-outline">&nbsp;</i>Categories</a>
6666
<a href="#Buckets" id="tab_Buckets" class="section_item"><i class="icon mdi mdi-pail-outline">&nbsp;</i>Buckets</a>
6767
<a href="#Tags" id="tab_Tags" class="section_item"><i class="icon mdi mdi-tag-multiple-outline">&nbsp;</i>Tags</a>
6868
</div>
6969

70-
<div class="section_title"><i class="ctrl mdi mdi-chevron-down"></i><i class="icon mdi mdi-camera-outline">&nbsp;</i>Monitoring</div>
71-
<div class="section">
70+
<div class="section_title sbs_monitoring"><i class="ctrl mdi mdi-chevron-down"></i><i class="icon mdi mdi-camera-outline">&nbsp;</i>Monitoring</div>
71+
<div class="section sbs_monitoring">
7272
<a href="#Alerts" id="tab_Alerts" class="section_item"><i class="icon mdi mdi-car-brake-alert">&nbsp;</i>Alerts</a>
7373
<a href="#Servers" id="tab_Servers" class="section_item"><i class="icon mdi mdi-server">&nbsp;</i>Servers</a>
7474
<a href="#Groups" id="tab_Groups" class="section_item"><i class="icon mdi mdi-lan">&nbsp;</i>Groups</a>
7575
<a href="#Snapshots" id="tab_Snapshots" class="section_item"><i class="icon mdi mdi-monitor-multiple">&nbsp;</i>Snapshots</a>
7676
</div>
7777

78-
<div class="section_title"><i class="ctrl mdi mdi-chevron-down"></i><i class="icon mdi mdi-cogs">&nbsp;</i>Settings</div>
79-
<div class="section">
78+
<div class="section_title sbs_settings"><i class="ctrl mdi mdi-chevron-down"></i><i class="icon mdi mdi-cogs">&nbsp;</i>Settings</div>
79+
<div class="section sbs_settings">
8080
<a href="#MyAccount" id="tab_MyAccount" class="section_item"><i class="icon mdi mdi-account">&nbsp;</i>My Account</a>
8181
<a href="#MySettings" id="tab_MySettings" class="section_item"><i class="icon mdi mdi-tune-vertical-variant">&nbsp;</i>Preferences</a>
8282
<a href="#MySecurity" id="tab_MySecurity" class="section_item"><i class="icon mdi mdi-shield-account">&nbsp;</i>Security Log</a>
8383
</div>
8484

8585
<div id="d_sidebar_admin_group" style="margin-top:10px">
86-
<div class="section_title"><i class="ctrl mdi mdi-chevron-down"></i><i class="icon mdi mdi-lock">&nbsp;</i>Admin</div>
87-
<div class="section">
86+
<div class="section_title sbs_admin"><i class="ctrl mdi mdi-chevron-down"></i><i class="icon mdi mdi-lock">&nbsp;</i>Admin</div>
87+
<div class="section sbs_admin">
8888
<a href="#ActivityLog" id="tab_ActivityLog" class="section_item"><i class="icon mdi mdi-script-text-outline">&nbsp;</i>Activity Log</a>
8989
<a href="#AlertSetup" id="tab_AlertSetup" class="section_item"><i class="icon mdi mdi-bell-ring-outline">&nbsp;</i>Alert Setup</a>
9090
<a href="#APIKeys" id="tab_APIKeys" class="section_item"><i class="icon mdi mdi-key-chain-variant">&nbsp;</i>API Keys</a>
@@ -103,8 +103,8 @@
103103
</div>
104104
</div>
105105

106-
<div class="section_title"><i class="ctrl mdi mdi-chevron-down"></i><i class="icon mdi mdi-help-network-outline">&nbsp;</i>Help</div>
107-
<div class="section">
106+
<div class="section_title sbs_help"><i class="ctrl mdi mdi-chevron-down"></i><i class="icon mdi mdi-help-network-outline">&nbsp;</i>Help</div>
107+
<div class="section sbs_help">
108108
<a href="#Docs" id="tab_Docs" class="section_item"><i class="icon mdi mdi-file-document-multiple-outline">&nbsp;</i>Documentation</a>
109109
<a href="#Docs/support" id="tab_Support" class="section_item"><i class="icon mdi mdi-lifebuoy">&nbsp;</i>Support</a>
110110
</div>

htdocs/js/app.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,10 +510,22 @@ app.extend({
510510
$('#tab_LogViewer').removeClass('enabled').hide();
511511
}
512512

513+
// apply user preferences for sidebar sections
514+
var user_sections = app.user.sidebar || config.ui.sidebar_sections.map( section => section.id );
515+
config.ui.sidebar_sections.forEach( function(section) {
516+
var $sect = $('.sidebar .sbs_' + section.id);
517+
if (user_sections.includes(section.id)) $sect.show();
518+
else $sect.removeClass('enabled').hide();
519+
} );
520+
513521
// possibly hide entire admin section
514522
if ($('#d_sidebar_admin_group > .section > .section_item.enabled').length) $('#d_sidebar_admin_group').show();
515523
else $('#d_sidebar_admin_group').hide();
516524

525+
// possibly hide entire shortcuts section if all items are hidden
526+
if ($('.sidebar > section.sbs_shortcuts > .section_item.enabled').length) $('.sidebar > section_title.sbs_shortcuts, .sidebar > section.sbs_shortcuts').show();
527+
else $('.sidebar > section_title.sbs_shortcuts, .sidebar > section.sbs_shortcuts').hide();
528+
517529
// add hint to body tag for admin UI hints
518530
if (this.isAdmin()) $('body').addClass('admin');
519531
else $('body').removeClass('admin');

htdocs/js/pages/user/MySettings.class.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,22 @@ Page.MySettings = class MySettings extends Page.Base {
157157
html += '</div>';
158158
html += '<div class="box_content" style="margin-bottom:30px">';
159159

160+
// sidebar sections
161+
html += this.getFormRow({
162+
label: 'Sidebar:',
163+
content: this.getFormMenuMulti({
164+
id: 'fe_ms_sidebar',
165+
title: 'Show sidebar sections',
166+
placeholder: 'Select sidebar sections to show...',
167+
options: config.ui.sidebar_sections,
168+
values: user.sidebar || config.ui.sidebar_sections.map( section => section.id ),
169+
onChange: '$P().saveChanges()',
170+
'data-hold': 1,
171+
'data-select-all': 1
172+
}),
173+
caption: 'Select which sidebar sections you would like to be visible.'
174+
});
175+
160176
// motion preference
161177
html += this.getFormRow({
162178
label: 'Motion:',
@@ -428,6 +444,7 @@ Page.MySettings = class MySettings extends Page.Base {
428444

429445
this.div.html( html ).buttonize();
430446
SingleSelect.init( this.div.find('#fe_ms_language, #fe_ms_region, #fe_ms_tz, #fe_ms_numformat, #fe_ms_hrcycle, #fe_ms_motionacc, #fe_ms_contrastacc') );
447+
MultiSelect.init( this.div.find('#fe_ms_sidebar') );
431448
this.update_date_time_preview();
432449
}
433450

@@ -571,7 +588,7 @@ Page.MySettings = class MySettings extends Page.Base {
571588
var tds = [
572589
'<span><i class="mdi mdi-' + ((item.page_id == 'Global') ? 'earth' : 'folder-open-outline') + '">&nbsp;</i>' + item.page_id + '</span>',
573590
`<button class="link icon_pad" onClick="$P().doEditHotKey(this)" data-keyid="${item.id}"><i class="mdi mdi-keyboard-outline"></i><b>${item.title}</b></button>`,
574-
self.getNiceHotKeyList(item.keys) || '&nbsp;',
591+
self.getNiceHotKeyList(item.keys, ' , ') || '&nbsp;',
575592
item.edited ? '<i class="mdi mdi-checkbox-marked-outline"></i>' : '-',
576593
`<button class="link" onClick="$P().doEditHotKey(this)" data-keyid="${item.id}"><b>Edit Keys</b></button>`
577594
];
@@ -736,6 +753,7 @@ Page.MySettings = class MySettings extends Page.Base {
736753
page_info: this.div.find('#fe_ms_pageinfo').is(':checked'),
737754
notifications: this.div.find('#fe_ms_notify').is(':checked'),
738755
effects: this.div.find('#fe_ms_effects').is(':checked'),
756+
sidebar: this.div.find('#fe_ms_sidebar').val(),
739757
filters: {}
740758
};
741759

internal/ui.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1335,6 +1335,18 @@
13351335
"data": "Data"
13361336
},
13371337

1338+
"sidebar_sections": [
1339+
{ "id": "main", "title": "Main", "icon": "home" },
1340+
{ "id": "job_searches", "title": "Job Searches", "icon": "account-search-outline" },
1341+
{ "id": "ticket_searches", "title": "Ticket Searches", "icon": "text-box-search-outline" },
1342+
{ "id": "shortcuts", "title": "Shortcuts", "icon": "hand-pointing-right" },
1343+
{ "id": "scheduler", "title": "Scheduler", "icon": "calendar-multiple" },
1344+
{ "id": "monitoring", "title": "Monitoring", "icon": "camera-outline" },
1345+
{ "id": "settings", "title": "Settings", "icon": "cogs" },
1346+
{ "id": "admin", "title": "Admin", "icon": "lock" },
1347+
{ "id": "help", "title": "Help", "icon": "help-network-outline" }
1348+
],
1349+
13381350
"satellite_install_menu": [
13391351
{ "id": "standard", "title": "Linux", "icon": "penguin" },
13401352
{ "id": "macos", "title": "macOS", "icon": "apple" },

0 commit comments

Comments
 (0)