Commit Graph

68 Commits

Author SHA1 Message Date
fahed 49e1a796ed fix: code review — security, dead code, performance, consistency
Critical fixes:
- XSS: escapeHtml() on all user-supplied text in email notifications
- Budget PATCH: added mutex lock + availability validation (prevents corruption)
- batchResolveNames: fixed wrong signature for budget request earmark names

Dead code cleanup:
- Deleted 8 unused PostComposition* files (replaced by PostDetail full page)

Performance:
- budget-helpers: single-fetch with computeFromEntries(), optional prefetch param
- post-composition: parallelized text + thumbnail fetches with Promise.all

Consistency:
- PostDetail.jsx: native <select> → PortalSelect (matches all panels)
- Finance.jsx: 11 hardcoded English table headers → t() with i18n keys
- PostCalendar.jsx: day names, Month/Week labels → t() with i18n keys
- App.jsx Suspense: "Loading..." → brand spinner (can't use i18n in fallback)
- UploadZone: proper useRef pattern, no vanilla JS document.createElement
- All file inputs: className="hidden" → absolute w-0 h-0 opacity-0
- ArtefactDetailPanel: removed campaign/project selects (inherited from post)
- TranslationDetailPanel: removed brand/linked post selects (inherited from post)
- ApproverMultiSelect: portal-based dropdown (fixes clipping in modals)
- Thumbnail fix: post-composition constructs URL from filename (was undefined)
- Upload fix: UploadZone with drag-and-drop for design + video artefacts

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 14:17:08 +03:00
fahed ce4d6025d7 feat: post composition redesign + budget allocation + brand identity (Rawaj)
Post Workflow:
- PostDetail full page (/posts/:id) replaces slide panel approach
- Post = 1 Caption Copy + 1 Body Copy + 1 Design + 0-1 Video
- copy_type field on Translations (caption/body)
- Composition endpoint returns rich data (content preview, languages, thumbnails)
- Stage auto-advances on translation/artefact changes (both link and unlink)
- "Translations" renamed to "Copy" in navigation
- GET /api/posts/:id, /api/translations/:id, /api/artefacts/:id routes added
- PostProduction: "New Post" creates → navigates to full page
- CampaignDetail: click post → navigates to full page
- Inline link picker (no modals) with search + rich item display
- PostComposition sub-components for caption, copy, designs, video, formats, readiness

Budget Allocation:
- Single source of truth: BudgetEntries (Campaign.budget deprecated)
- Budget mutex for race conditions
- Validation at all levels (main → campaign → track, expenses)
- CEO approval workflow: BudgetRequests table, public approval page
- Finance page: request budget UI, budget requests section
- Settings: CEO email field
- All emails branded with "Rawaj —" prefix

Brand Identity:
- Name: Rawaj (رواج) — trending/virality
- Deep teal palette (#0d9488), forest-tinted dark mode
- DM Sans font, custom SVG logo
- Consistent across login, sidebar, emails, public pages

Approval Workflow:
- Single reviewer per artefact (not multi-select)
- Reviewer redirect on public review page
- Server blocks submit-review without reviewer
- Review URLs use APP_URL (not server URL)

UI/UX:
- Scroll clipping fix: Modal, TabbedModal, SlidePanel restructured
  to avoid overflow-y-auto clipping native select dropdowns
- section-card overflow-hidden → overflow-clip
- All page titles via Header.jsx (removed duplicate h1s)
- CampaignDetail redesigned: prominent budget card, compact team

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 18:02:29 +03:00
fahed e1d1c392eb feat: comprehensive UI overhaul + budget allocation redesign
Audit & Quality:
- RTL: replaced 121 LTR-only utilities (text-left, pl-, left-) with logical properties
- A11y: focus traps + ARIA on Modal/SlidePanel/TabbedModal, clickable divs→buttons
- Theming: bg-white→bg-surface (170 instances), text-gray→semantic tokens
- Performance: useMemo on filters, loading="lazy" on 24 images
- CSS: prefers-reduced-motion, removed dead animations

Component Splits:
- PostDetailPanel: 1332→623 lines + 4 sub-components
- ArtefactDetailPanel: 972→590 lines + 1 sub-component

Brand Identity — Rawaj (رواج):
- New name, DM Sans font, deep teal palette (#0d9488)
- Custom SVG logo, forest-tinted dark mode
- All emails branded with app name in subject line

Design Refinement:
- Dashboard: merged posts+deadlines into tabbed ActivityFeed, inline stats
- Quieter: removed card lift, brand glow, gradient text, mesh backgrounds
- CampaignDetail: prominent budget card, compact team avatars, Lucide icons
- Consistent page titles via Header.jsx, standardized section headers
- Finance page fully i18n'd (20+ hardcoded strings replaced)

Budget Allocation Redesign:
- Single source of truth: BudgetEntries (Campaign.budget deprecated)
- Validation at all levels: main→campaign→track, expenses blocked if insufficient
- Budget request workflow with CEO approval via public link
- BudgetRequests table, CRUD routes, public approval page
- Budget mutex for race condition prevention
- Idempotent migration for existing campaign budgets

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 15:36:19 +03:00
fahed ba3900bc33 refactor: simplify translations — shared utils, deduplicated code
- Extract shared constants to client/src/utils/translations.js
  (AVAILABLE_LANGUAGES, TRANSLATION_STATUS_COLORS, isTextSelected, groupTextsByLanguage)
- TranslationDetailPanel: deduplicate copy button JSX, hoist hasSelected
- PublicTranslationReview: memoize textsByLanguage, use shared isTextSelected
- Translations page: import from shared module
- Server: translation schema updates, post_id linking
- Add reassign-user utility script
- Add new translation i18n keys to en.json and ar.json

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 17:27:57 +03:00
fahed b17108b321 feat: add Translation Management with approval workflow
Deploy / deploy (push) Successful in 12s
- New Translations + TranslationTexts NocoDB tables (auto-created on restart)
- Full CRUD: list, create, update, delete, bulk-delete translations
- Translation texts per language (add/edit/delete inline)
- Review flow: submit-review generates public token link
- Public review page: shows source + all translations, approve/reject/revision
- Email notifications to approvers (registered users)
- Sidebar nav under Marketing category
- Bilingual i18n (80+ keys in en.json and ar.json)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 14:49:04 +03:00
fahed 14751c42e4 fix: inline video upload in artefacts — drop modal, add drag-and-drop + progress bar
Deploy / deploy (push) Successful in 12s
- Replace the two-step video modal with inline drag-and-drop zone + click-to-browse
- Add Google Drive URL input directly in the versions tab
- Add upload progress bar with percentage via XHR
- Support onUploadProgress in api.upload()

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 11:34:11 +03:00
fahed 51708267d3 fix: add missing i18n key for artefacts details tab
Deploy / deploy (push) Successful in 11s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 10:49:51 +03:00
fahed 05dc5df3f8 fix: persist artefact review link by deriving URL from approval_token
Deploy / deploy (push) Successful in 12s
Previously the review URL was only stored in component state and lost
when the panel was reopened. Now derives it from the artefact's
approval_token field, matching how PostDetailPanel works.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 15:37:34 +03:00
fahed f1bcf217ac fix: add missing i18n key for artefacts review tab
Deploy / deploy (push) Successful in 12s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 13:59:52 +03:00
fahed ed98ebb67f fix: add missing i18n keys for issues modal tabs
Deploy / deploy (push) Successful in 12s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 13:34:33 +03:00
fahed 44e706f777 feat: convert all slide panels to tabbed modals with shared TabbedModal component
Deploy / deploy (push) Successful in 11s
Extract reusable TabbedModal component (portal, backdrop, tab bar with icons/badges/underline, scrollable body, footer) and convert all 9 detail panels from SlidePanel+CollapsibleSection to tabbed modal layout:
- PostDetailPanel (5 tabs), TaskDetailPanel (3), ProjectEditPanel (2)
- TrackDetailPanel (2), CampaignDetailPanel (3), TeamMemberPanel (3)
- TeamPanel (2), IssueDetailPanel (4), ArtefactDetailPanel (4)
Also adds post versioning system (server routes + frontend).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 17:12:32 +03:00
fahed 539c204bde fix: add delete button inside brand edit modal
Deploy / deploy (push) Successful in 12s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:28:38 +03:00
fahed 64e377060f feat: bilingual public issue pages with browser detection and language toggle
Deploy / deploy (push) Successful in 11s
Both PublicIssueSubmit and PublicIssueTracker now support EN/AR with
auto-detection from browser language, a floating toggle button, RTL
layout, and localized dates.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:23:06 +03:00
fahed 0ee3552c58 fix: show assignee in dashboard deadlines, untrack .env, update gitignore
Deploy / deploy (push) Successful in 11s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:12:36 +03:00
fahed 5d733ce066 fix: add language picker to Team add-member modal, remove orphaned Users page
Deploy / deploy (push) Successful in 11s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 13:21:44 +03:00
fahed 12628e2f78 fix: use named import for api in LanguageContext
Deploy / deploy (push) Successful in 11s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 13:17:38 +03:00
fahed 5e47d11e32 feat: language selector on user creation, pass to welcome email
Deploy / deploy (push) Failing after 9s
Adds preferred_language field to Users, language picker (EN/AR) in
create/edit user form, persists to NocoDB, and passes it to the
welcome notification so new users receive emails in their language.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 13:14:32 +03:00
fahed 8c69f1846f feat: add bilingual email notification system for key events
Deploy / deploy (push) Failing after 8s
Notifications (fire-and-forget, non-blocking) for: review submitted,
approved/rejected/revision requested, task assigned/completed, issue
assigned/status changed, campaign created, user invited. Emails render
in user's preferred language (EN/AR) with RTL support. Adds
preferred_language to Users, syncs from frontend language toggle.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 13:08:36 +03:00
fahed c9d0b8f151 fix: show creator name prominently in detail panels and public review pages
Deploy / deploy (push) Successful in 12s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 02:13:15 +03:00
fahed 35a0c4d6ce fix: allow unauthenticated access to public review pages
Deploy / deploy (push) Successful in 12s
The 401 handler in api.js was redirecting to /login on ALL pages,
including public review/approval pages, defeating their purpose.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 23:37:21 +03:00
fahed f4cf2e39a4 fix: remove duplicate page titles, add OG meta for review links
Deploy / deploy (push) Successful in 11s
- Removed h1 titles from Settings and Brands (already in Header)
- Server injects og:title, og:description, og:image meta tags for
  /review-post/:token URLs so WhatsApp/Slack show proper previews

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 17:50:45 +03:00
fahed 96fb838388 fix: consistent page titles for all routes in header
Deploy / deploy (push) Successful in 12s
Added missing title keys for calendar, artefacts, brands, budgets,
issues, and settings. No more fallback "Page" text.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 17:46:57 +03:00
fahed 8eaea27e89 fix: allow generating review link for pre-existing posts
Deploy / deploy (push) Successful in 12s
Show button only when post has no approval token. Once a link exists,
only the link is shown. Server preserves status for non-draft posts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 17:41:42 +03:00
fahed 593adbbc0b fix: review link always visible for posts with approval token
Deploy / deploy (push) Successful in 12s
Derived from post.approval_token instead of transient state, so it
persists when the panel is closed and reopened.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 17:34:37 +03:00
fahed 6203bf36e6 fix: brand cards now square-shaped in a denser grid
Deploy / deploy (push) Successful in 11s
Grid changed from 3-col to 5-col, cards use aspect-square layout.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 16:55:54 +03:00
fahed 0789b7e550 fix: superadmin can edit own brands and modules in team panel
Deploy / deploy (push) Successful in 11s
Brands and modules fields were hidden/disabled when editing self.
Superadmins now see editable brands dropdown and modules toggles.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 15:38:11 +03:00
fahed 70de02c97c fix: superadmin can now assign brands/modules to themselves
Deploy / deploy (push) Successful in 11s
The self-edit path only sent name+phone. Superadmins now use the full
team update endpoint so brands, modules, and role changes persist.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 15:31:23 +03:00
fahed 93956ff117 fix: require feedback on post rejection, post-specific review text, show superadmins in team list
Deploy / deploy (push) Successful in 11s
- Reject requires feedback on both client and server (400 if empty)
- PublicPostReview uses post-specific i18n keys instead of artefact ones
- Team list always includes superadmins/managers for non-superadmin users

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 15:24:48 +03:00
fahed 0e948cbf37 feat: public review flow for posts (like artefacts)
Deploy / deploy (push) Successful in 12s
- Token-based public review page at /review-post/:token
- Submit for Review button generates shareable link
- External reviewers can approve/reject with comments
- Approval gate prevents skipping review (superadmin override)
- i18n keys for review flow in en + ar

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 15:16:13 +03:00
fahed 8e243517e2 fix: select dropdowns clipped by sections, add approval actions to posts
Deploy / deploy (push) Successful in 12s
- Fix CollapsibleSection overflow clipping select dropdowns
- Add SlidePanel footer prop for always-visible save/cancel bar
- Add approval action buttons: Send to Review, Approve, Reject, Schedule
- Add sync-brands.js script for local→remote NocoDB brand sync
- Add posts.reject i18n key (en + ar)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 14:34:15 +03:00
fahed 82236ecffa feat: post approval workflow, i18n completion, and multiple fixes
Deploy / deploy (push) Successful in 11s
- Add approval process to posts (approver multi-select, rejected status column)
- Reorganize PostDetailPanel into Content, Scheduling, Approval sections
- Fix save button visibility: move to fixed footer via SlidePanel footer prop
- Change date picker from datetime-local to date-only
- Complete Arabic translations across all panels (Header, Issues, Artefacts)
- Fix artefact versioning to start empty (copyFromPrevious defaults to false)
- Separate media uploads by type (image, audio, video) in PostDetailPanel
- Fix team membership save when editing own profile as superadmin
- Server: add approver_ids column to Posts, enrich GET/POST/PATCH responses

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 14:17:16 +03:00
fahed daf2404bda fix: remove non-functional notification bell from header
Deploy / deploy (push) Successful in 11s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 00:05:45 +03:00
fahed 7dc7fbbbe2 fix: RTL support for timelines and header dropdown
Deploy / deploy (push) Successful in 11s
- InteractiveTimeline: dir="ltr" on scroll area, i18n for all strings
- ArtefactVersionTimeline: text-start, ms-11 logical properties
- Header dropdown: end-0 instead of right-0, text-start on menu items
- Added 11 new timeline i18n keys (en + ar)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 23:54:32 +03:00
fahed fe509b65a9 fix: toast z-index above slide panels
Deploy / deploy (push) Successful in 11s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 23:34:23 +03:00
fahed ad539fd7f4 feat: admin password change with confirmation in team panel
Deploy / deploy (push) Successful in 11s
Add "Admin Actions" section (superadmin-only, collapsed by default) with
password + confirm fields, eye toggle, mismatch validation, and success toast.
Delete button moved here too.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 23:30:03 +03:00
fahed e8539af4f7 fix: solid dark toast backgrounds — no transparency
Deploy / deploy (push) Successful in 12s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 17:40:51 +03:00
fahed 1c10f79036 fix: dark mode card contrast — elevate bg-white above surface-secondary
Deploy / deploy (push) Successful in 11s
Cards (bg-white → #22223a) now sit visibly above kanban columns
and section backgrounds (surface-secondary → #1c1c2a).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 17:39:46 +03:00
fahed 06e992e2eb feat: premium dark mode inspired by SpaceTime
Deploy / deploy (push) Successful in 12s
Deep layered surfaces (#15151e → #1c1c2a → #24243a), ambient
purple/cyan/gold background glow, glass-edge borders, translucent
status badges, form inputs with accent focus glow, comprehensive
overrides for all hardcoded bg-white/gray/border/text utilities,
brand primary with violet glow effect, and dark selection highlight.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 17:38:25 +03:00
fahed f3c53e27aa fix: dark mode CSS variables and overrides
Deploy / deploy (push) Successful in 11s
The ThemeContext was toggling the 'dark' class on <html> but the CSS
custom properties never changed. Added:
- .dark selector overriding all theme color variables
- .dark overrides for hardcoded bg-white, bg-gray-*, text-gray-*,
  border-gray-* classes used throughout components
- Dark mode input/select/textarea styling
- Dark mode scrollbar colors

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 17:00:00 +03:00
fahed 643d004dc7 feat: use modals for creation across all pages + fix profile prompt
Deploy / deploy (push) Successful in 11s
- Campaigns: add create modal (name, brand, team, dates, budget)
- PostProduction: add create modal (title, brand, campaign, assignee),
  auto-opens detail panel after creation
- Tasks: add create modal (title, project, priority, assignee),
  auto-opens detail panel after creation
- Fix profileComplete check: use !!user.name instead of !!user.team_role
  in /api/auth/me (was always showing profile prompt since team_role
  is now deprecated in favor of role_id)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 16:44:22 +03:00
fahed 959bd6066d feat: use modals for creation, side panels for editing
Deploy / deploy (push) Successful in 11s
- Team page: add member via modal with password confirmation,
  keep SlidePanel for editing existing members only
- Settings: add role via modal with color picker presets,
  keep inline editing for existing roles
- Remove create-mode code from TeamMemberPanel
- Add i18n keys: confirmPassword, passwordsDoNotMatch, memberAdded,
  roleColor (en + ar)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 16:37:37 +03:00
fahed da161014af feat: team-based visibility, roles management, unified users, UI fixes
Deploy / deploy (push) Successful in 12s
- Add Roles table with CRUD routes and Settings page management
- Unify user management: remove Users page, enhance Team page with
  permission level + role dropdowns
- Add team-based visibility scoping to projects, campaigns, posts,
  tasks, issues, artefacts, and dashboard
- Add team_id to projects and campaigns (create + edit forms)
- Add getUserTeamIds/getUserVisibilityContext helpers
- Fix Budgets modal horizontal scroll (separate linked-to row)
- Add collapsible filter bar to PostProduction page

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 15:55:15 +03:00
fahed fa6345f63e feat: add theme toggle, shared KanbanCard, keyboard shortcuts
Deploy / deploy (push) Successful in 11s
Previously unstaged files from prior sessions: ThemeContext,
ThemeToggle, KanbanCard, useKeyboardShortcuts hook, and updated
Header, KanbanBoard, Issues, Tasks, PostProduction, index.css.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 12:12:34 +03:00
fahed c31e6222d7 feat: consolidate auth into NocoDB, add password reset, health check
Deploy / deploy (push) Failing after 9s
- Migrate auth credentials from SQLite (auth.db) to NocoDB Users table
  with one-time migration function (auth.db → auth.db.bak)
- Add email-based password reset via Cloudron SMTP (nodemailer)
- Add GET /api/health endpoint for monitoring
- Add startup env var validation with clear error messages
- Strip sensitive fields (password_hash, reset_token) from all API responses
- Add ForgotPassword + ResetPassword pages with i18n (en/ar)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 11:47:27 +03:00
fahed 42a5f17d0b feat: bulk delete, team dispatch, calendar views, timeline colors
Deploy / deploy (push) Successful in 11s
- Multi-select bulk delete in all 5 list views (Artefacts, Posts, Tasks,
  Issues, Assets) with cascade deletes and confirmation modals
- Team-based issue dispatch: team picker on public issue form, team filter
  on Issues page, copy public link from Team page and Issues header,
  team assignment in IssueDetailPanel
- Month/Week toggle on PostCalendar and TaskCalendarView
- Month/Week/Day zoom on project and campaign timelines (InteractiveTimeline)
  and ProjectDetail GanttView, with Month as default
- Custom timeline bar colors: clickable color dot with 12-color palette
  popover on project, campaign, and task timeline bars
- Artefacts default view changed to list
- BulkSelectBar reusable component
- i18n keys for all new features (en + ar)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 14:55:36 +03:00
fahed 20d76dea8b correction erreur approval flow
Deploy / deploy (push) Successful in 11s
2026-03-01 11:30:20 +03:00
fahed 12415d5426 fix: replace hardcoded localhost:3001 URLs with relative paths
Deploy / deploy (push) Successful in 13s
Fixes CORS errors when deployed behind a reverse proxy by removing
hardcoded localhost references in Brands.jsx and PostCard.jsx.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 11:19:54 +03:00
fahed 0c945405e3 fix: use api.upload() for artefact file attachments
Deploy / deploy (push) Successful in 12s
api.post() was setting Content-Type to application/json and JSON.stringifying
the FormData, which destroyed the file data and caused "Either file upload or
drive_url is required" error.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 14:10:41 +03:00
fahed 01fdb93efd feat: hide dashboard sections for modules the user cannot access
Deploy / deploy (push) Successful in 11s
Only fetch data and render stat cards, lists, and widgets for modules
the user has enabled (marketing, projects, finance).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 15:58:48 +03:00
fahed 52d69ee02d feat: add self-service password change from user menu
Deploy / deploy (push) Successful in 11s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 15:54:29 +03:00