core&ui: optimize injectable

This commit is contained in:
undefined committed 2022-09-07 20:30:44 +08:00
1 parent 25444f69f0
commit 7343c596e9
9 files changed
+64 -64

No files matched your search

+41 -44
View File
@@ -1,3 +1,4 @@
import { UIInjectableFields } from '../interface';
import { PERM, PRIV } from '../model/builtin';
const trueChecker = () => true;
@@ -6,7 +7,8 @@ const Checker = (perm: bigint | bigint[], priv: number | number[], checker: Func
&& (perm ? handler.user.hasPerm(perm) : true)
&& (priv ? handler.user.hasPriv(priv) : true)
);
const buildChecker = (...permPrivChecker: Array<number | bigint | Function | number[] | bigint[]>) => {
type PermPrivChecker = Array<number | bigint | Function | number[] | bigint[]>;
const buildChecker = (...permPrivChecker: PermPrivChecker) => {
let _priv: number | number[];
let _perm: bigint | bigint[];
let checker: Function = trueChecker;
@@ -22,51 +24,46 @@ const buildChecker = (...permPrivChecker: Array<number | bigint | Function | num
return Checker(_perm, _priv, checker);
};
export const Nav = (
name: string, args: ((handler: any) => Record<string, any>) | Record<string, any> = {}, prefix: string,
...permPrivChecker: Array<number | bigint | Function>
) => {
if (typeof args !== 'function') args = () => (args || {});
const checker = buildChecker(...permPrivChecker);
if (name.startsWith('@@')) {
global.Hydro.ui.nodes.nav.splice(+name.split('@@')[1], 0, {
name: name.split('@@')[2], args, prefix, checker,
});
} else {
global.Hydro.ui.nodes.nav.push({
name, args, prefix, checker,
});
}
export const nodes = new Proxy({}, {
get(self, key) {
if (!self[key]) self[key] = [];
return self[key];
},
});
export function inject(node: UIInjectableFields, name: string, args: Record<string, any> = {}, ...permPrivChecker: PermPrivChecker) {
nodes[node].push({ name, args: args || {}, checker: buildChecker(...permPrivChecker) });
}
export function getNodes(name: UIInjectableFields) {
return nodes[name];
}
/** @deprecated */
export const Nav = (name, args, prefix, ...permPrivChecker) => {
inject('Nav', name, { ...args, prefix }, ...permPrivChecker);
};
/** @deprecated */
export const ProblemAdd = (name, args, icon = 'add', text = 'Create Problem') => {
inject('ProblemAdd', name, { ...args, icon, text });
};
export const ProblemAdd = (
name: string, args: Record<string, any> = {}, icon = 'add', text = 'Create Problem',
) => {
global.Hydro.ui.nodes.problem_add.push({
name, args, icon, text,
});
};
export const UserDropdown = (
name: string, args: Record<string, any> = {}, ...permPrivChecker: Array<number | bigint | Function>
) => {
global.Hydro.ui.nodes.user_dropdown.push({
name, args: args || {}, checker: buildChecker(...permPrivChecker),
});
};
Nav('homepage', {}, 'homepage');
Nav('problem_main', {}, 'problem', PERM.PERM_VIEW_PROBLEM);
Nav('training_main', {}, 'training', PERM.PERM_VIEW_TRAINING);
Nav('homework_main', {}, 'homework', PERM.PERM_VIEW_HOMEWORK);
Nav('discussion_main', {}, 'discussion', PERM.PERM_VIEW_DISCUSSION);
Nav('contest_main', {}, 'contest', PERM.PERM_VIEW_CONTEST);
Nav('record_main', (handler) => (handler.user.hasPriv(PRIV.PRIV_USER_PROFILE) ? { query: { uidOrName: handler.user._id } } : {}), 'record');
Nav('ranking', {}, 'ranking', PERM.PERM_VIEW_RANKING);
Nav('domain_dashboard', {}, 'domain', PERM.PERM_EDIT_DOMAIN);
Nav('manage_dashboard', {}, 'manage', PRIV.PRIV_EDIT_SYSTEM);
ProblemAdd('problem_create');
inject('Nav', 'homepage', { prefix: 'homepage' });
inject('Nav', 'problem_main', { prefix: 'problem' }, PERM.PERM_VIEW_PROBLEM);
inject('Nav', 'training_main', { prefix: 'training' }, PERM.PERM_VIEW_TRAINING);
inject('Nav', 'contest_main', { prefix: 'contest' }, PERM.PERM_VIEW_CONTEST);
inject('Nav', 'homework_main', { prefix: 'homework' }, PERM.PERM_VIEW_HOMEWORK);
inject('Nav', 'discussion_main', { prefix: 'discussion' }, PERM.PERM_VIEW_DISCUSSION);
inject('Nav', 'record_main', {
prefix: 'record',
query: (handler) => (handler.user.hasPriv(PRIV.PRIV_USER_PROFILE)
? ({ uidOrName: handler.user._id })
: ({})),
});
inject('Nav', 'ranking', { prefix: 'ranking' }, PERM.PERM_VIEW_RANKING);
inject('Nav', 'domain_dashboard', { prefix: 'domain' }, PERM.PERM_EDIT_DOMAIN);
inject('Nav', 'manage_dashboard', { prefix: 'manage' }, PRIV.PRIV_EDIT_SYSTEM);
inject('ProblemAdd', 'problem_create', { icon: 'add', text: 'Create Problem' });
global.Hydro.ui.inject = inject;
global.Hydro.ui.nodes = nodes as any;
global.Hydro.ui.getNodes = getNodes;
global.Hydro.ui.Nav = Nav;
global.Hydro.ui.ProblemAdd = ProblemAdd;
global.Hydro.ui.UserDropdown = UserDropdown;