Dashboard fix, expense system, currency settings, visual upgrade

- Fix Dashboard stat card: show "Budget Remaining" instead of "Budget Spent"
  with correct remaining value accounting for campaign allocations
- Add expense system: budget entries now have income/expense type with
  server-side split, per-campaign and per-project expense tracking,
  colored amounts, type filters, and summary bar in Budgets page
- Add configurable currency in Settings (SAR ⃁ default, supports 10
  currencies) replacing all hardcoded SAR references across the app
- Replace PiggyBank icon with Landmark (culturally appropriate for KSA)
- Visual upgrade: mesh background, gradient text, premium stat cards with
  accent bars, section-card containers, sidebar active glow
- UX polish: consistent text-2xl headers, skeleton loaders for Finance
  and Budgets pages
- Finance page: expenses column in campaign/project breakdown tables,
  ROI accounts for expenses, expense stat card

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
fahed
2026-02-15 15:49:28 +03:00
parent f3e6fc848d
commit e76be78498
17 changed files with 2817 additions and 1379 deletions

View File

@@ -4,11 +4,13 @@
"nav.dashboard": "Dashboard",
"nav.campaigns": "Campaigns",
"nav.finance": "Finance & ROI",
"nav.financeDashboard": "Dashboard",
"nav.budgets": "Budgets",
"nav.posts": "Post Production",
"nav.assets": "Assets",
"nav.projects": "Projects",
"nav.tasks": "Tasks",
"nav.team": "Team",
"nav.team": "Teams",
"nav.settings": "Settings",
"nav.users": "Users",
"nav.logout": "Logout",
@@ -46,6 +48,7 @@
"dashboard.activeCampaigns": "Active Campaigns",
"dashboard.total": "total",
"dashboard.budgetSpent": "Budget Spent",
"dashboard.budgetRemaining": "Budget Remaining",
"dashboard.of": "of",
"dashboard.noBudget": "No budget yet",
"dashboard.overdueTasks": "Overdue Tasks",
@@ -170,7 +173,45 @@
"tasks.deleted": "Task deleted successfully!",
"tasks.statusUpdated": "Task status updated!",
"tasks.canOnlyEditOwn": "You can only edit your own tasks.",
"tasks.search": "Search tasks...",
"tasks.board": "Board",
"tasks.list": "List",
"tasks.calendar": "Calendar",
"tasks.filters": "Filters",
"tasks.allProjects": "All Projects",
"tasks.allBrands": "All Brands",
"tasks.allPriorities": "All Priorities",
"tasks.allStatuses": "All Statuses",
"tasks.allAssignees": "All Assignees",
"tasks.allCreators": "All Creators",
"tasks.overdue": "Overdue",
"tasks.clearFilters": "Clear Filters",
"tasks.details": "Details",
"tasks.discussion": "Discussion",
"tasks.unscheduled": "Unscheduled",
"tasks.today": "Today",
"tasks.project": "Project",
"tasks.brand": "Brand",
"tasks.status": "Status",
"tasks.creator": "Creator",
"tasks.assignee": "Assignee",
"tasks.commentCount": "{n} comments",
"tasks.dueDateRange": "Due Date",
"tasks.noProject": "No project",
"tasks.createdBy": "Created by",
"tasks.startDate": "Start Date",
"tasks.attachments": "Attachments",
"tasks.uploadFile": "Upload file",
"tasks.setAsThumbnail": "Set as thumbnail",
"tasks.removeThumbnail": "Remove thumbnail",
"tasks.thumbnail": "Thumbnail",
"tasks.dropOrClick": "Drop file or click to upload",
"projects.thumbnail": "Thumbnail",
"projects.uploadThumbnail": "Upload Thumbnail",
"projects.changeThumbnail": "Change Thumbnail",
"projects.removeThumbnail": "Remove Thumbnail",
"team.title": "Team",
"team.members": "Team Members",
"team.addMember": "Add Member",
@@ -250,6 +291,8 @@
"settings.noBrands": "No brands yet. Add your first brand.",
"settings.moreComingSoon": "More Settings Coming Soon",
"settings.additionalSettings": "Additional settings for notifications, display preferences, and more will be added here.",
"settings.currency": "Currency",
"settings.currencyHint": "This currency will be used across all financial pages.",
"settings.preferences": "Manage your preferences and app settings",
"tutorial.skip": "Skip Tutorial",
@@ -303,5 +346,148 @@
"timeline.noItems": "No items to display",
"timeline.addItems": "Add items with dates to see the timeline",
"timeline.tracks": "Tracks",
"timeline.timeline": "Timeline"
"timeline.timeline": "Timeline",
"posts.details": "Details",
"posts.platformsLinks": "Platforms & Links",
"posts.discussion": "Discussion",
"campaigns.details": "Details",
"campaigns.performance": "Performance",
"campaigns.discussion": "Discussion",
"campaigns.name": "Name",
"campaigns.description": "Description",
"campaigns.brand": "Brand",
"campaigns.status": "Status",
"campaigns.platforms": "Platforms",
"campaigns.startDate": "Start Date",
"campaigns.endDate": "End Date",
"campaigns.budget": "Budget",
"campaigns.goals": "Goals",
"campaigns.notes": "Notes",
"campaigns.budgetSpent": "Budget Spent",
"campaigns.revenue": "Revenue",
"campaigns.impressions": "Impressions",
"campaigns.clicks": "Clicks",
"campaigns.conversions": "Conversions",
"campaigns.createCampaign": "Create Campaign",
"campaigns.editCampaign": "Edit Campaign",
"campaigns.deleteCampaign": "Delete Campaign?",
"campaigns.deleteConfirm": "Are you sure you want to delete this campaign? All associated data will be removed. This action cannot be undone.",
"tracks.details": "Details",
"tracks.metrics": "Metrics",
"tracks.trackName": "Track Name",
"tracks.type": "Type",
"tracks.platform": "Platform",
"tracks.budgetAllocated": "Budget Allocated",
"tracks.status": "Status",
"tracks.notes": "Notes",
"tracks.budgetSpent": "Budget Spent",
"tracks.revenue": "Revenue",
"tracks.addTrack": "Add Track",
"tracks.editTrack": "Edit Track",
"tracks.deleteTrack": "Delete Track?",
"tracks.deleteConfirm": "Are you sure you want to delete this track? This action cannot be undone.",
"projects.details": "Details",
"projects.discussion": "Discussion",
"projects.name": "Name",
"projects.description": "Description",
"projects.brand": "Brand",
"projects.owner": "Owner",
"projects.status": "Status",
"projects.startDate": "Start Date",
"projects.dueDate": "Due Date",
"projects.editProject": "Edit Project",
"projects.deleteProject": "Delete Project?",
"projects.deleteConfirm": "Are you sure you want to delete this project? This action cannot be undone.",
"team.details": "Details",
"team.workload": "Workload",
"team.recentTasks": "Recent Tasks",
"team.recentPosts": "Recent Posts",
"team.modules": "Modules",
"team.selectBrands": "Select brands...",
"team.gridView": "Grid View",
"team.teamsView": "Teams View",
"team.unassigned": "Unassigned",
"modules.marketing": "Marketing",
"modules.projects": "Projects",
"modules.finance": "Finance",
"teams.title": "Teams",
"teams.teams": "Teams",
"teams.createTeam": "Create Team",
"teams.editTeam": "Edit Team",
"teams.deleteTeam": "Delete Team?",
"teams.deleteConfirm": "Are you sure you want to delete this team? This action cannot be undone.",
"teams.name": "Team Name",
"teams.description": "Description",
"teams.members": "members",
"teams.details": "Details",
"teams.noTeams": "No teams yet",
"teams.selectMembers": "Search members...",
"dates.today": "Today",
"dates.yesterday": "Yesterday",
"dates.thisWeek": "This Week",
"dates.lastWeek": "Last Week",
"dates.thisMonth": "This Month",
"dates.lastMonth": "Last Month",
"dates.thisQuarter": "This Quarter",
"dates.thisYear": "This Year",
"dates.customRange": "Custom Range",
"dates.clearDates": "Clear Dates",
"dashboard.myTasks": "My Tasks",
"dashboard.projectProgress": "Project Progress",
"dashboard.noProjectsYet": "No projects yet",
"finance.project": "Project",
"finance.projectBudget": "Project Budget",
"finance.projectBreakdown": "Project Breakdown",
"finance.budgetFor": "Budget for",
"budgets.title": "Budgets",
"budgets.subtitle": "Add and manage budget entries — track source, destination, and allocation",
"budgets.addEntry": "Add Entry",
"budgets.editEntry": "Edit Entry",
"budgets.deleteEntry": "Delete Entry?",
"budgets.deleteConfirm": "Are you sure you want to delete this budget entry? This action cannot be undone.",
"budgets.searchEntries": "Search entries...",
"budgets.allCategories": "All Categories",
"budgets.allDestinations": "All Destinations",
"budgets.noEntries": "No budget entries yet. Add your first entry.",
"budgets.noMatch": "No entries match your filters.",
"budgets.label": "Label",
"budgets.labelPlaceholder": "e.g., Q1 Marketing Budget, Equipment Purchase...",
"budgets.amount": "Amount",
"budgets.dateReceived": "Date Received",
"budgets.source": "Source",
"budgets.sourcePlaceholder": "e.g., CEO Approval, Annual Budget...",
"budgets.destination": "Destination",
"budgets.selectDestination": "Select destination...",
"budgets.companyCard": "Company Card",
"budgets.personalAccount": "Personal Account",
"budgets.corporateAccount": "Corporate Account",
"budgets.otherDest": "Other",
"budgets.category": "Category",
"budgets.linkedTo": "Linked To",
"budgets.noCampaign": "No campaign",
"budgets.noProject": "No project",
"budgets.general": "General",
"budgets.notes": "Notes",
"budgets.notesPlaceholder": "Any details about this budget entry...",
"budgets.date": "Date",
"budgets.type": "Type",
"budgets.income": "Income",
"budgets.expense": "Expense",
"budgets.allTypes": "All Types",
"budgets.net": "Net",
"budgets.dateExpensed": "Date",
"dashboard.expenses": "Expenses",
"finance.expenses": "Total Expenses"
}