Files
marketing-app/CLAUDE.md
2026-02-23 11:57:32 +03:00

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.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