80 lines
4.7 KiB
Markdown
80 lines
4.7 KiB
Markdown
# 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.js` normalizes 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`/`UpdatedAt` timestamps
|
|
- `ensureRequiredTables()` only creates NEW tables — skips existing ones
|
|
- `ensureFKColumns()` 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:**
|
|
1. Server startup now lists ALL Artefacts table columns and auto-creates missing ones (`approver_ids`, `project_id`, `campaign_id`)
|
|
2. `POST /artefacts` logs the approver_ids being sent and what NocoDB returns
|
|
3. `PATCH /artefacts/:id` logs the update data and the re-read value
|
|
4. `ensureTextColumns()` now logs success/failure for each column creation
|
|
|
|
**What to check:** Restart the server and look at terminal output:
|
|
- If `approver_ids` is listed in columns → column exists, issue is elsewhere
|
|
- If `⚠ MISSING column` appears → 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 `artefact` type to `canEditResource` and `canDeleteResource` (uses `canEditAnyPost`/`canDeleteAnyPost` permissions + 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, migrations
|
|
- `server/nocodb.js` — NocoDB client wrapper
|
|
- `client/src/pages/Artefacts.jsx` — artefacts page + ArtefactDetailPanel + ApproverMultiSelect
|
|
- `client/src/pages/Issues.jsx` — issues page with board + list views
|
|
- `client/src/components/IssueCard.jsx` — card component for issues kanban
|
|
- `client/src/contexts/AuthContext.jsx` — auth, permissions, ownership checks
|
|
- `client/src/utils/api.js` — API client with normalize function
|
|
- `client/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
|