diff --git a/.playwright-mcp/console-2026-03-12T09-10-35-433Z.log b/.playwright-mcp/console-2026-03-12T09-10-35-433Z.log new file mode 100644 index 0000000..d03dca0 --- /dev/null +++ b/.playwright-mcp/console-2026-03-12T09-10-35-433Z.log @@ -0,0 +1,4 @@ +[ 433ms] [ERROR] Failed to load resource: the server responded with a status of 401 (Unauthorized) @ http://localhost:5173/api/auth/me:0 +[ 434ms] [ERROR] Failed to load resource: the server responded with a status of 401 (Unauthorized) @ http://localhost:5173/api/auth/me:0 +[ 516ms] [ERROR] Failed to load resource: the server responded with a status of 401 (Unauthorized) @ http://localhost:5173/api/auth/me:0 +[ 520ms] [ERROR] Failed to load resource: the server responded with a status of 401 (Unauthorized) @ http://localhost:5173/api/auth/me:0 diff --git a/.playwright-mcp/console-2026-03-12T09-13-12-081Z.log b/.playwright-mcp/console-2026-03-12T09-13-12-081Z.log new file mode 100644 index 0000000..d28f32c --- /dev/null +++ b/.playwright-mcp/console-2026-03-12T09-13-12-081Z.log @@ -0,0 +1,2 @@ +[ 101ms] [ERROR] Failed to load resource: the server responded with a status of 401 (Unauthorized) @ http://localhost:5173/api/auth/me:0 +[ 107ms] [ERROR] Failed to load resource: the server responded with a status of 401 (Unauthorized) @ http://localhost:5173/api/auth/me:0 diff --git a/.playwright-mcp/element-2026-03-12T09-16-19-386Z.png b/.playwright-mcp/element-2026-03-12T09-16-19-386Z.png new file mode 100644 index 0000000..78dda0f Binary files /dev/null and b/.playwright-mcp/element-2026-03-12T09-16-19-386Z.png differ diff --git a/.playwright-mcp/page-2026-03-12T09-14-27-234Z.png b/.playwright-mcp/page-2026-03-12T09-14-27-234Z.png new file mode 100644 index 0000000..4eeff18 Binary files /dev/null and b/.playwright-mcp/page-2026-03-12T09-14-27-234Z.png differ diff --git a/.playwright-mcp/page-2026-03-12T09-14-39-127Z.png b/.playwright-mcp/page-2026-03-12T09-14-39-127Z.png new file mode 100644 index 0000000..eb12744 Binary files /dev/null and b/.playwright-mcp/page-2026-03-12T09-14-39-127Z.png differ diff --git a/.playwright-mcp/page-2026-03-12T09-14-58-114Z.png b/.playwright-mcp/page-2026-03-12T09-14-58-114Z.png new file mode 100644 index 0000000..13a0b39 Binary files /dev/null and b/.playwright-mcp/page-2026-03-12T09-14-58-114Z.png differ diff --git a/.playwright-mcp/page-2026-03-12T09-15-13-695Z.png b/.playwright-mcp/page-2026-03-12T09-15-13-695Z.png new file mode 100644 index 0000000..2befa90 Binary files /dev/null and b/.playwright-mcp/page-2026-03-12T09-15-13-695Z.png differ diff --git a/.playwright-mcp/page-2026-03-12T09-15-38-125Z.png b/.playwright-mcp/page-2026-03-12T09-15-38-125Z.png new file mode 100644 index 0000000..e07fe2e Binary files /dev/null and b/.playwright-mcp/page-2026-03-12T09-15-38-125Z.png differ diff --git a/.playwright-mcp/page-2026-03-12T09-15-47-682Z.png b/.playwright-mcp/page-2026-03-12T09-15-47-682Z.png new file mode 100644 index 0000000..5dd4b4d Binary files /dev/null and b/.playwright-mcp/page-2026-03-12T09-15-47-682Z.png differ diff --git a/.playwright-mcp/page-2026-03-12T09-16-57-469Z.png b/.playwright-mcp/page-2026-03-12T09-16-57-469Z.png new file mode 100644 index 0000000..89753e4 Binary files /dev/null and b/.playwright-mcp/page-2026-03-12T09-16-57-469Z.png differ diff --git a/client/src/App.jsx b/client/src/App.jsx index 42dacd9..7032e01 100644 --- a/client/src/App.jsx +++ b/client/src/App.jsx @@ -15,6 +15,7 @@ import { useKeyboardShortcuts, DEFAULT_SHORTCUTS } from './hooks/useKeyboardShor // Lazy-loaded page components const Dashboard = lazy(() => import('./pages/Dashboard')) const PostProduction = lazy(() => import('./pages/PostProduction')) +const PostDetail = lazy(() => import('./pages/PostDetail')) const Assets = lazy(() => import('./pages/Assets')) const Campaigns = lazy(() => import('./pages/Campaigns')) const CampaignDetail = lazy(() => import('./pages/CampaignDetail')) @@ -303,6 +304,7 @@ function AppContent() { : }> } /> {hasModule('marketing') && <> + } /> } /> } /> } /> diff --git a/client/src/components/ArtefactDetailPanel.jsx b/client/src/components/ArtefactDetailPanel.jsx index d66a9e5..cf134b6 100644 --- a/client/src/components/ArtefactDetailPanel.jsx +++ b/client/src/components/ArtefactDetailPanel.jsx @@ -412,18 +412,6 @@ export default function ArtefactDetailPanel({ artefact, onClose, onUpdate, onDel - {/* Approvers */} -
-

{t('artefacts.approversLabel')}

- { - setEditApproverIds(ids) - handleUpdateField('approver_ids', ids.length > 0 ? ids.join(',') : '') - }} - /> -
)} @@ -508,11 +496,33 @@ export default function ArtefactDetailPanel({ artefact, onClose, onUpdate, onDel {/* Review Tab */} {activeTab === 'review' && (
+ {/* Reviewer Selection (single) */} + {['draft', 'revision_requested', 'rejected'].includes(artefact.status) && ( +
+

{t('artefacts.reviewer')}

+ +
+ )} + {/* Submit for Review */} {['draft', 'revision_requested', 'rejected'].includes(artefact.status) && (
-
+
{children}
diff --git a/client/src/components/PostCompositionCaption.jsx b/client/src/components/PostCompositionCaption.jsx new file mode 100644 index 0000000..6cb088c --- /dev/null +++ b/client/src/components/PostCompositionCaption.jsx @@ -0,0 +1,29 @@ +import { useLanguage } from '../i18n/LanguageContext' + +const CAPTION_LIMITS = { instagram: 2200, tiktok: 4000, twitter: 280, linkedin: 3000, facebook: 63206, youtube: 5000, snapchat: 250 } + +export default function PostCompositionCaption({ caption, onChange, disabled, platforms = [] }) { + const { t } = useLanguage() + const len = (caption || '').length + const minLimit = platforms.length > 0 + ? Math.min(...platforms.map(p => CAPTION_LIMITS[p] || 5000)) + : null + + return ( +
+