4.7 KiB
4.7 KiB
Marketing App - Project Context
Tech Stack
- Frontend: React (Vite), Tailwind CSS, Lucide icons
- Backend: Express.js, NocoDB (database via REST API), SQLite (auth)
- Key patterns:
api.jsnormalizes NocoDB responses (snake_case + camelCase aliases, Id/id/_id). SlidePanel uses createPortal. AppContext provides brands/teamMembers. AuthContext provides user/permissions/canEditResource/canDeleteResource.
Architecture Notes
- NocoDB uses
Id(capital I) as primary key,CreatedAt/UpdatedAttimestamps ensureRequiredTables()only creates NEW tables — skips existing onesensureFKColumns()adds Number columns to existing tables (FK_COLUMNS map)ensureTextColumns()adds text/other columns to existing tables (TEXT_COLUMNS map)- Column migrations run on every server restart in
startServer()
Current State / Known Issues
CRITICAL: Approvers on Artefacts — NOT YET WORKING
The approver_ids column (SingleLineText, comma-separated user IDs) may not exist in the NocoDB Artefacts table. Symptoms: approvers selected in the UI don't persist when panel is closed and reopened.
Diagnosis steps added:
- Server startup now lists ALL Artefacts table columns and auto-creates missing ones (
approver_ids,project_id,campaign_id) POST /artefactslogs the approver_ids being sent and what NocoDB returnsPATCH /artefacts/:idlogs the update data and the re-read valueensureTextColumns()now logs success/failure for each column creation
What to check: Restart the server and look at terminal output:
- If
approver_idsis listed in columns → column exists, issue is elsewhere - If
⚠ MISSING columnappears → column was missing, should be auto-created now - PATCH logs show if the value persists after write (
After re-read: approver_ids=...)
Root cause: ensureRequiredTables() (line ~310) skips existing tables entirely (if (existingTables.has(tableName)) continue). The approver_ids column was added to REQUIRED_TABLES schema but the Artefacts table already existed, so the column was never created. Fixed by adding to TEXT_COLUMNS and adding a belt-and-suspenders check at startup.
Recently Completed Features
Artefacts Page
- Grid + List view toggle with sorting (recently updated, newest, oldest, title A-Z)
- Filters: brand, status, type, creator, project, campaign
- Project and Campaign assignment (dropdowns in create modal + detail panel)
- Approver multi-select (ApproverMultiSelect component at bottom of Artefacts.jsx)
- Save Draft button in detail panel header (saves title + description)
- Delete button in detail panel header (with permission check via canDeleteResource)
- Editable title (inline input in header) and description (textarea) in detail panel
- Language picker for copy artefacts uses predefined list: Arabic (AR), English (EN), French (FR), Bahasa Indonesia (ID)
- Auto-opens detail panel after creating an artefact
Issues Page
- Board (kanban) + List view toggle with drag-and-drop
- 5 status columns: New, Acknowledged, In Progress, Resolved, Declined
- IssueCard component (
client/src/components/IssueCard.jsx) - Inline filters (always visible, no toggle button)
- Status count cards work as quick-filter buttons
AuthContext
- Added
artefacttype tocanEditResourceandcanDeleteResource(usescanEditAnyPost/canDeleteAnyPostpermissions + isOwner)
Server
- Artefacts schema has: project_id, campaign_id, approver_ids columns
- GET/POST/PATCH /artefacts routes handle project_id, campaign_id, approver_ids with name enrichment
- Issues PATCH supports brand_id (bug fix)
- FK_COLUMNS includes
Artefacts: ['project_id', 'campaign_id'] - TEXT_COLUMNS includes
Artefacts: [{ name: 'approver_ids', uidt: 'SingleLineText' }]
i18n
- Added 12+ keys to both en.json and ar.json for issues board/list and artefacts grid/list/filters/sorting
Key Files
server/server.js— all API routes, schema definitions, migrationsserver/nocodb.js— NocoDB client wrapperclient/src/pages/Artefacts.jsx— artefacts page + ArtefactDetailPanel + ApproverMultiSelectclient/src/pages/Issues.jsx— issues page with board + list viewsclient/src/components/IssueCard.jsx— card component for issues kanbanclient/src/contexts/AuthContext.jsx— auth, permissions, ownership checksclient/src/utils/api.js— API client with normalize functionclient/src/i18n/en.json/ar.json— translations
Debugging Tips
- Console logs prefixed with
[POST /artefacts]and[PATCH /artefacts/:id]show approver data flow - Startup logs show all Artefacts table columns and missing column auto-creation
- NocoDB silently ignores writes to non-existent columns (no error thrown) — this is why approvers appear to save but don't persist