Marketing Hub: RBAC, i18n (AR/EN), tasks overhaul, team/user merge, tutorial

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)
This commit is contained in:
fahed
2026-02-08 20:46:58 +03:00
commit 35d84b6bff
2240 changed files with 846749 additions and 0 deletions

239
client/src/i18n/en.json Normal file
View File

@@ -0,0 +1,239 @@
{
"app.name": "Samaya",
"app.subtitle": "Marketing Hub",
"nav.dashboard": "Dashboard",
"nav.campaigns": "Campaigns",
"nav.finance": "Finance & ROI",
"nav.posts": "Post Production",
"nav.assets": "Assets",
"nav.projects": "Projects",
"nav.tasks": "Tasks",
"nav.team": "Team",
"nav.settings": "Settings",
"nav.users": "Users",
"nav.logout": "Logout",
"nav.collapse": "Collapse",
"common.save": "Save",
"common.cancel": "Cancel",
"common.delete": "Delete",
"common.edit": "Edit",
"common.create": "Create",
"common.search": "Search...",
"common.filter": "Filter",
"common.all": "All",
"common.noResults": "No results",
"common.loading": "Loading...",
"common.unassigned": "Unassigned",
"common.required": "Required",
"auth.login": "Sign In",
"auth.email": "Email",
"auth.password": "Password",
"auth.loginBtn": "Sign In",
"auth.signingIn": "Signing in...",
"dashboard.title": "Dashboard",
"dashboard.welcomeBack": "Welcome back",
"dashboard.happeningToday": "Here's what's happening with your marketing today.",
"dashboard.totalPosts": "Total Posts",
"dashboard.published": "published",
"dashboard.activeCampaigns": "Active Campaigns",
"dashboard.total": "total",
"dashboard.budgetSpent": "Budget Spent",
"dashboard.of": "of",
"dashboard.noBudget": "No budget yet",
"dashboard.overdueTasks": "Overdue Tasks",
"dashboard.needsAttention": "Needs attention",
"dashboard.allOnTrack": "All on track",
"dashboard.budgetOverview": "Budget Overview",
"dashboard.details": "Details",
"dashboard.noBudgetRecorded": "No budget recorded yet.",
"dashboard.addBudget": "Add budget",
"dashboard.spent": "spent",
"dashboard.received": "received",
"dashboard.remaining": "Remaining",
"dashboard.revenue": "Revenue",
"dashboard.roi": "ROI",
"dashboard.recentPosts": "Recent Posts",
"dashboard.viewAll": "View all",
"dashboard.sar": "SAR",
"dashboard.noPostsYet": "No posts yet. Create your first post!",
"dashboard.upcomingDeadlines": "Upcoming Deadlines",
"dashboard.noUpcomingDeadlines": "No upcoming deadlines this week. 🎉",
"dashboard.loadingHub": "Loading Samaya Marketing Hub...",
"posts.title": "Post Production",
"posts.newPost": "New Post",
"posts.editPost": "Edit Post",
"posts.createPost": "Create Post",
"posts.saveChanges": "Save Changes",
"posts.postTitle": "Title",
"posts.description": "Description",
"posts.brand": "Brand",
"posts.platforms": "Platforms",
"posts.status": "Status",
"posts.assignTo": "Assign To",
"posts.scheduledDate": "Scheduled Date",
"posts.notes": "Notes",
"posts.campaign": "Campaign",
"posts.noCampaign": "No campaign",
"posts.publicationLinks": "Publication Links",
"posts.attachments": "Attachments",
"posts.uploadFiles": "Click or drag files to upload",
"posts.dropFiles": "Drop files here",
"posts.maxSize": "Max 50MB per file",
"posts.allBrands": "All Brands",
"posts.allPlatforms": "All Platforms",
"posts.allPeople": "All People",
"posts.searchPosts": "Search posts...",
"posts.deletePost": "Delete Post?",
"posts.deleteConfirm": "Are you sure you want to delete this post? This action cannot be undone.",
"posts.publishMissing": "Cannot publish: missing publication links for:",
"posts.publishRequired": "All publication links are required to publish",
"posts.noPostsFound": "No posts found",
"posts.selectBrand": "Select brand",
"posts.additionalNotes": "Additional notes",
"posts.uploading": "Uploading...",
"posts.deleteAttachment": "Delete attachment",
"posts.whatNeedsDone": "What needs to be done?",
"posts.optionalDetails": "Optional details...",
"posts.postTitlePlaceholder": "Post title",
"posts.postDescPlaceholder": "Post description...",
"posts.dropHere": "Drop here",
"posts.noPosts": "No posts",
"posts.sendToReview": "Send to Review",
"posts.approve": "Approve",
"posts.schedule": "Schedule",
"posts.publish": "Publish",
"posts.status.draft": "Draft",
"posts.status.in_review": "In Review",
"posts.status.approved": "Approved",
"posts.status.scheduled": "Scheduled",
"posts.status.published": "Published",
"tasks.title": "Tasks",
"tasks.newTask": "New Task",
"tasks.editTask": "Edit Task",
"tasks.createTask": "Create Task",
"tasks.saveChanges": "Save Changes",
"tasks.taskTitle": "Title",
"tasks.description": "Description",
"tasks.priority": "Priority",
"tasks.dueDate": "Due Date",
"tasks.assignTo": "Assign to",
"tasks.allTasks": "All Tasks",
"tasks.assignedToMe": "Assigned to Me",
"tasks.createdByMe": "Created by Me",
"tasks.byTeamMember": "By Team Member",
"tasks.noTasks": "No tasks yet",
"tasks.noMatch": "No tasks match this filter",
"tasks.createFirst": "Create a task to get started",
"tasks.tryFilter": "Try a different filter",
"tasks.deleteTask": "Delete Task?",
"tasks.deleteConfirm": "Are you sure you want to delete this task? This action cannot be undone.",
"tasks.todo": "To Do",
"tasks.in_progress": "In Progress",
"tasks.done": "Done",
"tasks.start": "Start",
"tasks.complete": "Complete",
"tasks.from": "From:",
"tasks.assignedTo": "Assigned to:",
"tasks.task": "task",
"tasks.tasks": "tasks",
"tasks.of": "of",
"tasks.priority.low": "Low",
"tasks.priority.medium": "Medium",
"tasks.priority.high": "High",
"tasks.priority.urgent": "Urgent",
"team.title": "Team",
"team.members": "Team Members",
"team.addMember": "Add Member",
"team.newMember": "New Team Member",
"team.editMember": "Edit Team Member",
"team.myProfile": "My Profile",
"team.editProfile": "Edit My Profile",
"team.name": "Name",
"team.email": "Email",
"team.password": "Password",
"team.teamRole": "Team Role",
"team.phone": "Phone",
"team.brands": "Brands",
"team.brandsHelp": "Comma-separated brand names",
"team.removeMember": "Remove Team Member?",
"team.removeConfirm": "Are you sure you want to remove {name}? This action cannot be undone.",
"team.noMembers": "No team members",
"team.backToTeam": "Back to Team",
"team.totalTasks": "Total Tasks",
"team.saveProfile": "Save Profile",
"team.saveChanges": "Save Changes",
"team.member": "team member",
"team.membersPlural": "team members",
"team.fullName": "Full name",
"team.defaultPassword": "Default: changeme123",
"team.optional": "(optional)",
"team.fixedRole": "Fixed role for managers",
"team.remove": "Remove",
"team.noTasks": "No tasks",
"team.toDo": "To Do",
"team.inProgress": "In Progress",
"campaigns.title": "Campaigns",
"campaigns.newCampaign": "New Campaign",
"campaigns.noCampaigns": "No campaigns",
"assets.title": "Assets",
"assets.upload": "Upload",
"assets.noAssets": "No assets",
"settings.title": "Settings",
"settings.language": "Language",
"settings.english": "English",
"settings.arabic": "Arabic",
"settings.restartTutorial": "Restart Tutorial",
"settings.tutorialDesc": "Need a refresher? Restart the interactive tutorial to learn about all the features of the Samaya Marketing Hub.",
"settings.general": "General",
"settings.onboardingTutorial": "Onboarding Tutorial",
"settings.tutorialRestarted": "Tutorial Restarted!",
"settings.restarting": "Restarting...",
"settings.reloadingPage": "Reloading page to start tutorial...",
"settings.moreComingSoon": "More Settings Coming Soon",
"settings.additionalSettings": "Additional settings for notifications, display preferences, and more will be added here.",
"settings.preferences": "Manage your preferences and app settings",
"tutorial.skip": "Skip Tutorial",
"tutorial.next": "Next",
"tutorial.prev": "Back",
"tutorial.finish": "Finish",
"tutorial.of": "of",
"tutorial.step": "Step",
"tutorial.dashboard.title": "Dashboard",
"tutorial.dashboard.desc": "Your command center. See campaign performance, task progress, and team activity at a glance.",
"tutorial.campaigns.title": "Campaigns",
"tutorial.campaigns.desc": "Plan and manage marketing campaigns across all brands and platforms.",
"tutorial.posts.title": "Post Production",
"tutorial.posts.desc": "Create, review, and publish content. Drag posts through your workflow pipeline.",
"tutorial.tasks.title": "Tasks",
"tutorial.tasks.desc": "Assign and track tasks. Filter by who assigned them or who they're assigned to.",
"tutorial.team.title": "Team",
"tutorial.team.desc": "Your team directory. Complete your profile and see who you're working with.",
"tutorial.assets.title": "Assets",
"tutorial.assets.desc": "Upload and manage creative assets — images, videos, and documents.",
"tutorial.newPost.title": "Create Content",
"tutorial.newPost.desc": "Start creating content here. Pick your brand, platforms, and assign it to a team member.",
"tutorial.filters.title": "Filter & Focus",
"tutorial.filters.desc": "Use filters to focus on specific brands, platforms, or team members.",
"login.title": "Samaya Marketing",
"login.subtitle": "Sign in to continue",
"login.forgotPassword": "Forgot password?",
"login.defaultCreds": "Default credentials:",
"profile.completeYourProfile": "Complete Your Profile",
"profile.completeDesc": "Please complete your profile to access all features and help your team find you.",
"profile.completeProfileBtn": "Complete Profile",
"profile.later": "Later"
}