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)
24 lines
535 B
JavaScript
24 lines
535 B
JavaScript
'use strict'
|
|
|
|
// When writing files on Windows, translate the characters to their
|
|
// 0xf000 higher-encoded versions.
|
|
|
|
const raw = [
|
|
'|',
|
|
'<',
|
|
'>',
|
|
'?',
|
|
':',
|
|
]
|
|
|
|
const win = raw.map(char =>
|
|
String.fromCharCode(0xf000 + char.charCodeAt(0)))
|
|
|
|
const toWin = new Map(raw.map((char, i) => [char, win[i]]))
|
|
const toRaw = new Map(win.map((char, i) => [char, raw[i]]))
|
|
|
|
module.exports = {
|
|
encode: s => raw.reduce((s, c) => s.split(c).join(toWin.get(c)), s),
|
|
decode: s => win.reduce((s, c) => s.split(c).join(toRaw.get(c)), s),
|
|
}
|