mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-20 09:46:28 +08:00
core&ui: optimize injectable
This commit is contained in:
1 parent
25444f69f0
commit
7343c596e9
9 files changed
+64
-64
No files matched your search
@@ -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;
|
||||
Reference in new issue
Block a user