You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
2.6 KiB
TypeScript
74 lines
2.6 KiB
TypeScript
import { Dictionary, isNull } from 'lodash';
|
|
import { PERM, PRIV } from '../model/builtin';
|
|
|
|
const trueChecker = () => true;
|
|
const Checker = (perm: bigint, priv: number, checker: Function = trueChecker) => (handler) => (
|
|
checker(handler)
|
|
&& (perm ? handler.user.hasPerm(perm) : true)
|
|
&& (priv ? handler.user.hasPriv(priv) : true)
|
|
);
|
|
const buildChecker = (...permPrivChecker: Array<number | bigint | Function>) => {
|
|
let _priv: number;
|
|
let _perm: bigint;
|
|
let checker: Function = trueChecker;
|
|
for (const item of permPrivChecker) {
|
|
if (item instanceof Object && !isNull(item)) {
|
|
if (item instanceof Array) {
|
|
if (typeof item[0] === 'number') {
|
|
// @ts-ignore
|
|
_priv = item;
|
|
} else if (typeof item[0] === 'bigint') {
|
|
// @ts-ignore
|
|
_perm = item;
|
|
}
|
|
} else if (typeof item.call !== 'undefined') {
|
|
checker = item;
|
|
}
|
|
} else if (typeof item === 'number') {
|
|
_priv = item;
|
|
} else if (typeof item === 'bigint') {
|
|
_perm = item;
|
|
}
|
|
}
|
|
return Checker(_perm, _priv, checker);
|
|
};
|
|
|
|
export const Nav = (
|
|
name: string, args: Dictionary<any> = {}, prefix: string,
|
|
...permPrivChecker: Array<number | bigint | Function>
|
|
) => {
|
|
if (name.startsWith('@@')) {
|
|
global.Hydro.ui.nodes.nav.splice(+name.split('@@')[1], 0, {
|
|
name: name.split('@@')[2], args: args || {}, prefix, checker: buildChecker(...permPrivChecker),
|
|
});
|
|
} else {
|
|
global.Hydro.ui.nodes.nav.push({
|
|
name, args: args || {}, prefix, checker: buildChecker(...permPrivChecker),
|
|
});
|
|
}
|
|
};
|
|
|
|
export const ProblemAdd = (
|
|
name: string, args: Dictionary<any> = {}, icon = 'add', text = 'Create Problem',
|
|
) => {
|
|
global.Hydro.ui.nodes.problem_add.push({
|
|
name, args, icon, text,
|
|
});
|
|
};
|
|
|
|
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', {}, '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');
|
|
ProblemAdd('problem_import_syzoj', {}, 'copy', 'Import From SYZOJ');
|
|
|
|
global.Hydro.ui.Nav = Nav;
|
|
global.Hydro.ui.ProblemAdd = ProblemAdd;
|