Skip to content

Commit

Permalink
settings: Added support for non-admin users, with partial access
Browse files Browse the repository at this point in the history
  • Loading branch information
cederberg committed Dec 15, 2024
1 parent cf56e1d commit 99ca62a
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 25 deletions.
55 changes: 39 additions & 16 deletions src/plugin/settings/files/app/settings/app.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,15 @@ import initProcedureTab from './tab-procedure.mjs';
import initUserTab from './tab-user.mjs';
import { loadTypes } from './util.mjs';

async function hasAccess(path, perm) {
try {
return await RapidContext.App.callProc('system/user/access', [path, perm, null]);
} catch (e) {
console.error('settings: failed to check', path, 'access', e);
return false;
}
}

export default class {
async start() {
// Initialize shared data
Expand All @@ -13,12 +22,19 @@ export default class {
RapidContext.UI.showError(e);
}

// Initialize tab UI
// FIXME: Support non-admin users with disabled tabs
await initPluginTab(this.ui);
await initConnectionTab(this.ui);
await initProcedureTab(this.ui);
await initUserTab(this.ui);
// Initialize views
if (await hasAccess('/.storage/plugin/', 'search')) {
await this.initTab('pluginPane', initPluginTab);
}
if (await hasAccess('/connection/', 'search')) {
await this.initTab('cxnPane', initConnectionTab);
}
if (await hasAccess('/procedure/', 'search')) {
await this.initTab('procPane', initProcedureTab);
}
if (await hasAccess('/user/', 'search')) {
await this.initTab('userPane', initUserTab);
}

// Setup event handlers
this.ui.tabs.on('click', '[data-view]:not(.disabled)', (evt) => {
Expand All @@ -33,16 +49,23 @@ export default class {
// Do nothing here
}

selectTab(target) {
if (target) {
let view = this.ui[target.dataset.view];
this.ui.tabs.querySelectorAll('div[data-view]').forEach((el) => {
el.classList.toggle('selected', el == target);
});
this.ui.views.querySelectorAll('.view').forEach((el) => {
el.classList.toggle('hidden', el != view);
});
view && view.dispatchEvent(new CustomEvent('enter'));
async initTab(id, fn) {
try {
this.ui.tabs.querySelector(`div[data-view="${id}"]`).classList.remove('disabled');
await fn(this.ui);
} catch (e) {
console.error(`settings: failed to init ${id} view`, e);
}
}

selectTab(target) {
let view = target && this.ui[target.dataset.view];
this.ui.tabs.querySelectorAll('div[data-view]').forEach((el) => {
el.classList.toggle('selected', el == target);
});
this.ui.views.querySelectorAll('.view').forEach((el) => {
el.classList.toggle('hidden', el != view);
});
view && view.dispatchEvent(new CustomEvent('enter'));
}
}
18 changes: 9 additions & 9 deletions src/plugin/settings/files/app/settings/ui.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,19 @@
<ui class="settings-app" xmlns:settings="app/settings">
<div class="flex flex-dir-row position-relative w-100 h-100">
<Pane id="tabs" class="vertical-tabs select-none" style="min-width: 7rem;">
<div data-view="pluginPane">
<div class="disabled" data-view="pluginPane">
<i class="fa fa-3x fa-puzzle-piece" />
<h3>Plug-ins</h3>
</div>
<div data-view="cxnPane">
<div class="disabled" data-view="cxnPane">
<i class="fa fa-3x fa-plug" />
<h3>Connections</h3>
</div>
<div data-view="procPane">
<div class="disabled" data-view="procPane">
<i class="fa fa-3x fa-bolt" />
<h3>Procedures</h3>
</div>
<div data-view="userPane">
<div class="disabled" data-view="userPane">
<i class="fa fa-3x fa-users" />
<h3>Users</h3>
</div>
Expand All @@ -26,7 +26,7 @@
</Pane>
<div id="views" class="flex-fill position-relative border-l pl-3" style="left: -1px;">

<Pane id="pluginPane" class="view flex flex-dir-column w-100 h-100">
<Pane id="pluginPane" class="view flex flex-dir-column w-100 h-100 hidden">
<settings:search-form id="pluginSearch" placeholder="Search by id, name, etc">
<label id="pluginInstall" class="btn m-0 mr-2">
<i class="fa fa-lg fa-puzzle-piece"></i>
Expand Down Expand Up @@ -70,7 +70,7 @@
</div>
</Pane>

<Pane id="cxnPane" class="view flex flex-dir-column w-100 h-100">
<Pane id="cxnPane" class="view flex flex-dir-column w-100 h-100 hidden">
<settings:search-form id="cxnSearch" placeholder="Search by id, type, etc">
<Button id="cxnValidateAll" icon="fa fa-lg fa-magic" class="m-0 mr-2">Check all</Button>
<Button id="cxnAdd" icon="fa fa-lg fa-plus" class="m-0">Add connection</Button>
Expand Down Expand Up @@ -171,7 +171,7 @@
</Dialog>
</Pane>

<Pane id="procPane" class="view flex flex-dir-column w-100 h-100">
<Pane id="procPane" class="view flex flex-dir-column w-100 h-100 hidden">
<settings:search-form id="procSearch" placeholder="Search by id">
<Button id="procAdd" icon="fa fa-lg fa-plus" class="m-0">Add procedure</Button>
</settings:search-form>
Expand Down Expand Up @@ -411,7 +411,7 @@
</Dialog>
</Pane>

<Pane id="userPane" class="view flex flex-dir-column w-100 h-100">
<Pane id="userPane" class="view flex flex-dir-column w-100 h-100 hidden">
<settings:search-form id="userSearch" placeholder="Search by name, email, etc">
<Button id="userAdd" icon="fa fa-lg fa-plus" class="m-0">Add user</Button>
</settings:search-form>
Expand Down Expand Up @@ -557,7 +557,7 @@
</Dialog>
</Pane>

<div id="storagePane" class="view flex flex-dir-column w-100 h-100">
<div id="storagePane" class="view flex flex-dir-column w-100 h-100 hidden">
</div>

</div>
Expand Down

0 comments on commit 99ca62a

Please sign in to comment.