- Auto-advance artefact to next working version on rejection/revision
- Add post_id field to artefact creation
- Add request timeout (20s) to NocoDB client
- Add POST /api/admin/test-email for diagnosing SMTP issues
- Fix FK column creation logging
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
PostDetail now uses Artefacts exclusively for all 4 asset types:
- Caption copy = Artefact with type='copy', copy_type='caption'
- Body copy = Artefact with type='copy', copy_type='body'
- Design = Artefact with type='design'
- Video = Artefact with type='video'
Removed TranslationDetailPanel from PostDetail entirely.
Same ArtefactDetailPanel, same workflow, same version management
for all asset types. Link picker searches artefacts only.
Server: copy_type added to Artefacts schema, accepted in POST/PATCH.
post-composition.js rewritten to use Artefacts table for all pieces.
Content preview fetched from ArtefactVersionTexts.
Translations entity still exists for the standalone Copy page.
Also: version creation rules, submit-review content validation,
reviewer mandatory for translations, artefact creation simplified.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Removed unused ApproverMultiSelect imports (ArtefactDetailPanel, TranslationDetailPanel)
- Removed stale editProjectId/editCampaignId state from ArtefactDetailPanel
- Added 3 missing i18n keys (selectVersionFirst, pendingReviewInfo, noReviewInfo)
- Added error toast on link picker API failure (PostDetail)
- Added ARIA attributes to PortalSelect (role=combobox, aria-expanded, listbox, option)
- Deleted test screenshots from project root
- Simplified artefact creation modal: title + type only (removed brand/project/campaign/approver/description)
- Cleaned up ArtefactDetailPanel props (removed unused projects/campaigns)
- Translation submit-review: requires source_content before allowing review
- Artefact submit-review: requires at least one attachment for design/video
- Translation reviewer moved to Review tab (single select, mandatory)
- Server blocks translation submit without reviewer
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
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>
- 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>
- 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>
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>
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>
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>
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>
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>
- 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>
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>
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>
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>
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>
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>
- 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>
- 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>
- 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>
- 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>
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>
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>
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>
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>
- 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>
- 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>
- 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>