Features: - Full RBAC with 3 roles (superadmin/manager/contributor) - Ownership tracking on posts, tasks, campaigns, projects - Task system: assign to anyone, filter combobox, visibility scoping - Team members merged into users table (single source of truth) - Post thumbnails on kanban cards from attachments - Publication link validation before publishing - Interactive onboarding tutorial with Settings restart - Full Arabic/English i18n with RTL layout support - Language toggle in sidebar, IBM Plex Sans Arabic font - Brand-based visibility filtering for non-superadmins - Manager can only create contributors - Profile completion flow for new users - Cookie-based sessions (express-session + SQLite)
39 lines
1.1 KiB
JavaScript
39 lines
1.1 KiB
JavaScript
"use strict";
|
|
function noop() { }
|
|
function once(emitter, name) {
|
|
const o = once.spread(emitter, name);
|
|
const r = o.then((args) => args[0]);
|
|
r.cancel = o.cancel;
|
|
return r;
|
|
}
|
|
(function (once) {
|
|
function spread(emitter, name) {
|
|
let c = null;
|
|
const p = new Promise((resolve, reject) => {
|
|
function cancel() {
|
|
emitter.removeListener(name, onEvent);
|
|
emitter.removeListener('error', onError);
|
|
p.cancel = noop;
|
|
}
|
|
function onEvent(...args) {
|
|
cancel();
|
|
resolve(args);
|
|
}
|
|
function onError(err) {
|
|
cancel();
|
|
reject(err);
|
|
}
|
|
c = cancel;
|
|
emitter.on(name, onEvent);
|
|
emitter.on('error', onError);
|
|
});
|
|
if (!c) {
|
|
throw new TypeError('Could not get `cancel()` function');
|
|
}
|
|
p.cancel = c;
|
|
return p;
|
|
}
|
|
once.spread = spread;
|
|
})(once || (once = {}));
|
|
module.exports = once;
|
|
//# sourceMappingURL=index.js.map
|