@actuate-media/cms-admin 0.76.7 → 0.78.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +38 -0
- package/dist/__tests__/components/attribution-rows.test.d.ts +2 -0
- package/dist/__tests__/components/attribution-rows.test.d.ts.map +1 -0
- package/dist/__tests__/components/attribution-rows.test.js +82 -0
- package/dist/__tests__/components/attribution-rows.test.js.map +1 -0
- package/dist/__tests__/views/form-editor.render.test.d.ts +2 -0
- package/dist/__tests__/views/form-editor.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/form-editor.render.test.js +146 -0
- package/dist/__tests__/views/form-editor.render.test.js.map +1 -0
- package/dist/__tests__/views/form-entries.render.test.js +20 -0
- package/dist/__tests__/views/form-entries.render.test.js.map +1 -1
- package/dist/__tests__/views/form-submissions.render.test.js +12 -0
- package/dist/__tests__/views/form-submissions.render.test.js.map +1 -1
- package/dist/actuate-admin.css +1 -1
- package/dist/components/forms/ExportMenu.d.ts +8 -0
- package/dist/components/forms/ExportMenu.d.ts.map +1 -0
- package/dist/components/forms/ExportMenu.js +32 -0
- package/dist/components/forms/ExportMenu.js.map +1 -0
- package/dist/components/forms/FormEntryDetailPane.d.ts +13 -0
- package/dist/components/forms/FormEntryDetailPane.d.ts.map +1 -1
- package/dist/components/forms/FormEntryDetailPane.js +74 -8
- package/dist/components/forms/FormEntryDetailPane.js.map +1 -1
- package/dist/components/forms/WebhooksPanel.d.ts.map +1 -1
- package/dist/components/forms/WebhooksPanel.js +1 -1
- package/dist/components/forms/WebhooksPanel.js.map +1 -1
- package/dist/lib/forms-service.d.ts +29 -3
- package/dist/lib/forms-service.d.ts.map +1 -1
- package/dist/lib/forms-service.js +37 -1
- package/dist/lib/forms-service.js.map +1 -1
- package/dist/views/FormEditor.d.ts.map +1 -1
- package/dist/views/FormEditor.js +211 -116
- package/dist/views/FormEditor.js.map +1 -1
- package/dist/views/FormEntries.d.ts.map +1 -1
- package/dist/views/FormEntries.js +8 -36
- package/dist/views/FormEntries.js.map +1 -1
- package/dist/views/FormSubmissions.d.ts.map +1 -1
- package/dist/views/FormSubmissions.js +7 -36
- package/dist/views/FormSubmissions.js.map +1 -1
- package/package.json +9 -9
- package/src/__tests__/components/attribution-rows.test.ts +93 -0
- package/src/__tests__/views/form-editor.render.test.tsx +186 -0
- package/src/__tests__/views/form-entries.render.test.tsx +29 -0
- package/src/__tests__/views/form-submissions.render.test.tsx +17 -0
- package/src/components/forms/ExportMenu.tsx +70 -0
- package/src/components/forms/FormEntryDetailPane.tsx +82 -8
- package/src/components/forms/WebhooksPanel.tsx +5 -1
- package/src/lib/forms-service.ts +61 -2
- package/src/views/FormEditor.tsx +655 -510
- package/src/views/FormEntries.tsx +7 -46
- package/src/views/FormSubmissions.tsx +6 -46
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,43 @@
|
|
|
1
1
|
# @actuate-media/cms-admin
|
|
2
2
|
|
|
3
|
+
## 0.78.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 80d4e5f: Marketing attribution tracking for forms — captures where every lead came from, automatically.
|
|
8
|
+
|
|
9
|
+
**cms-core**: rebuilt `forms/attribution` (now also published at `@actuate-media/cms-core/forms/attribution`) with a first-touch (30-day) / last-touch (24-hour) model merged at submit, the full ad click-ID registry (gclid, fbclid, msclkid, ttclid, li_fat_id, dclid, twclid, rdt_cid + long-tail IDs in `extraIds`), and referrer classification into marketing channels (paid / organic search / social / email / **ai** / referral / direct) with friendly source names ("ChatGPT" instead of "chat.openai.com"). Form entry payloads now expose the full `attribution` blob, CSV exports gained Source / Medium / Campaign / Channel / Referrer / Landing Page columns, and `form.submitted` webhooks forward the merged attribution to CRM consumers. Note: `AttributionData` gained required fields (`channel`, `referrerName`, `extraIds`, `firstTouchAt`, `lastTouchAt`, `version`) and `clickIds` grew from 5 to 8 networks.
|
|
10
|
+
|
|
11
|
+
**sections-react**: `<ActuateForm>` now records an attribution touch on mount and attaches the merged first/last-touch payload to every submission — no setup required. Capture is consent-gated when `@actuate-media/plugin-consent` is installed (waits for an analytics grant; proceeds when the plugin is absent). New `<AttributionTracker />` component for the site layout improves first-touch fidelity across multi-page journeys.
|
|
12
|
+
|
|
13
|
+
**cms-admin**: the form entry detail pane now shows the full attribution picture — channel with friendly source name, source/medium/campaign/term/content, landing page, referrer, device type, first-touch date, and any ad click IDs — with graceful fallback to the legacy UTM columns for older entries.
|
|
14
|
+
|
|
15
|
+
- 80d4e5f: Complete form entries export: server-side CSV/XLSX for every view.
|
|
16
|
+
|
|
17
|
+
**cms-core**
|
|
18
|
+
- New dependency-free XLSX workbook writer (`forms/xlsx.ts`) — deflate-compressed OOXML, inline strings (injection-safe by construction, values round-trip exactly).
|
|
19
|
+
- `GET /forms/entries/export` now accepts `format=csv|xlsx` and an optional `formId`: omitting it exports entries across **all forms** (Form column + union of data keys). Audit log records scope and format.
|
|
20
|
+
- New `exportFormEntriesXlsx()` service alongside `exportFormEntries()` (both share one export table with attribution columns; `formId` is now optional on both).
|
|
21
|
+
|
|
22
|
+
**cms-admin**
|
|
23
|
+
- The Export buttons on Submissions and All Entries now download the full server-side export (all pages, decrypted values, attribution columns, up to 5,000 rows) instead of only the 25 visible rows — with a CSV / Excel (.xlsx) format menu.
|
|
24
|
+
- All Entries export honors the active form filter.
|
|
25
|
+
- Zapier integration helper now documents the `attribution.*` fields available in webhook payloads.
|
|
26
|
+
|
|
27
|
+
## 0.77.0
|
|
28
|
+
|
|
29
|
+
### Minor Changes
|
|
30
|
+
|
|
31
|
+
- 21aa417: Consolidate the two form-editing surfaces onto the typed Forms API and make GA4 form analytics work end-to-end.
|
|
32
|
+
|
|
33
|
+
**cms-admin** — The Edit Form page is rebuilt as the canonical full-page form editor, backed by the same typed Forms API as the Forms list's inline Schema pane (no more legacy `/collections/forms` writes that bypassed schema versioning). It now covers everything in one place: Details (name/description/status + post-submit confirmation), Fields (versioned schema editor), **Notifications** (previously only reachable from the Schema pane), Analytics (GA4), Embed, and Integrations (webhooks). Confirmation settings now persist to `successMessage` / `redirectUrl` — the fields the public submission pipeline actually reads (the old editor wrote a `confirmation` object the runtime ignored). New forms are created through `POST /forms`, gaining slug generation, an initial schema version, and notification defaults, then route into the full editor.
|
|
34
|
+
|
|
35
|
+
**cms-core** — `FormDefinition` gains a sanitized `analytics` (GA4) config, persisted via the forms service (`createForm` / `updateForm` / `duplicateForm`) and exposed on the public form schema only when tracking is enabled. New `normalizeAnalyticsConfig` export and a client-safe `@actuate-media/cms-core/forms/analytics` subpath export.
|
|
36
|
+
|
|
37
|
+
**sections-react** — `<ActuateForm>` now fires GA4 `form_start` / `form_submit` / `form_error` events (with optional conversion value) when the form has analytics enabled. Also fixes the success state to read the submit endpoint's `confirmation` _object_ (`{ type, message, redirectUrl }`) — previously it was treated as a string, which broke the success message and ignored server-driven redirects. New `resolveSubmitOutcome` helper with regression coverage.
|
|
38
|
+
|
|
39
|
+
**plugin-forms** — The `forms` collection field map now declares every key the typed forms service persists (`description`, `notificationSettings`, `embedSettings`, `spamSettings`, `successMessage`, `redirectUrl`, `analytics`, `activeSchemaVersionId`, …). The data layer strips undeclared keys on write, so consumer apps registering this plugin would previously drop notification/embed/spam settings silently. Status options now match the typed `FormStatus` (`active` / `draft` / `archived`).
|
|
40
|
+
|
|
3
41
|
## 0.76.7
|
|
4
42
|
|
|
5
43
|
### Patch Changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attribution-rows.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/components/attribution-rows.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { buildAttributionRows } from '../../components/forms/FormEntryDetailPane.js';
|
|
3
|
+
function entry(overrides = {}) {
|
|
4
|
+
return {
|
|
5
|
+
id: 'e1',
|
|
6
|
+
formId: 'f1',
|
|
7
|
+
data: {},
|
|
8
|
+
unread: false,
|
|
9
|
+
starred: false,
|
|
10
|
+
archived: false,
|
|
11
|
+
spamStatus: 'clean',
|
|
12
|
+
submittedAt: '2026-07-13T00:00:00.000Z',
|
|
13
|
+
createdAt: '2026-07-13T00:00:00.000Z',
|
|
14
|
+
updatedAt: '2026-07-13T00:00:00.000Z',
|
|
15
|
+
...overrides,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function rowMap(e) {
|
|
19
|
+
const out = {};
|
|
20
|
+
for (const row of buildAttributionRows(e))
|
|
21
|
+
out[row.label] = String(row.value);
|
|
22
|
+
return out;
|
|
23
|
+
}
|
|
24
|
+
describe('buildAttributionRows', () => {
|
|
25
|
+
it('renders the rich attribution blob with channel, click IDs, and landing page', () => {
|
|
26
|
+
const rows = rowMap(entry({
|
|
27
|
+
attribution: {
|
|
28
|
+
source: 'google',
|
|
29
|
+
medium: 'cpc',
|
|
30
|
+
campaign: 'spring',
|
|
31
|
+
term: 'implants',
|
|
32
|
+
channel: 'paid',
|
|
33
|
+
referrerName: 'Google',
|
|
34
|
+
landingPage: 'https://site.com/landing',
|
|
35
|
+
referrer: 'https://www.google.com/',
|
|
36
|
+
deviceType: 'mobile',
|
|
37
|
+
clickIds: { gclid: 'G123', fbclid: '' },
|
|
38
|
+
},
|
|
39
|
+
}));
|
|
40
|
+
expect(rows['Channel']).toBe('Paid · Google');
|
|
41
|
+
expect(rows['Source']).toBe('google');
|
|
42
|
+
expect(rows['Medium']).toBe('cpc');
|
|
43
|
+
expect(rows['Campaign']).toBe('spring');
|
|
44
|
+
expect(rows['Term']).toBe('implants');
|
|
45
|
+
expect(rows['Landing page']).toBe('https://site.com/landing');
|
|
46
|
+
expect(rows['Device']).toBe('Mobile');
|
|
47
|
+
expect(rows['GCLID (Google Ads)']).toBe('G123');
|
|
48
|
+
// Empty click IDs never render a row.
|
|
49
|
+
expect(rows['FBCLID (Meta)']).toBeUndefined();
|
|
50
|
+
});
|
|
51
|
+
it('falls back to denormalized UTM columns for legacy entries without a blob', () => {
|
|
52
|
+
const rows = rowMap(entry({
|
|
53
|
+
utmSource: 'newsletter',
|
|
54
|
+
utmMedium: 'email',
|
|
55
|
+
utmCampaign: 'july',
|
|
56
|
+
pageUrl: 'https://site.com/contact',
|
|
57
|
+
referrer: 'https://mail.google.com/',
|
|
58
|
+
}));
|
|
59
|
+
expect(rows['Source']).toBe('newsletter');
|
|
60
|
+
expect(rows['Medium']).toBe('email');
|
|
61
|
+
expect(rows['Campaign']).toBe('july');
|
|
62
|
+
expect(rows['Page']).toBe('https://site.com/contact');
|
|
63
|
+
expect(rows['Referrer']).toBe('https://mail.google.com/');
|
|
64
|
+
expect(rows['Channel']).toBeUndefined();
|
|
65
|
+
});
|
|
66
|
+
it('returns no rows when nothing was captured', () => {
|
|
67
|
+
expect(buildAttributionRows(entry())).toEqual([]);
|
|
68
|
+
});
|
|
69
|
+
it('labels an AI channel with the assistant name', () => {
|
|
70
|
+
const rows = rowMap(entry({
|
|
71
|
+
attribution: {
|
|
72
|
+
source: 'chatgpt',
|
|
73
|
+
medium: 'referral',
|
|
74
|
+
channel: 'ai',
|
|
75
|
+
referrerName: 'ChatGPT',
|
|
76
|
+
referrer: 'https://chatgpt.com/',
|
|
77
|
+
},
|
|
78
|
+
}));
|
|
79
|
+
expect(rows['Channel']).toBe('AI · ChatGPT');
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
//# sourceMappingURL=attribution-rows.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attribution-rows.test.js","sourceRoot":"","sources":["../../../src/__tests__/components/attribution-rows.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,+CAA+C,CAAA;AAGpF,SAAS,KAAK,CAAC,YAAqC,EAAE;IACpD,OAAO;QACL,EAAE,EAAE,IAAI;QACR,MAAM,EAAE,IAAI;QACZ,IAAI,EAAE,EAAE;QACR,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,KAAK;QACf,UAAU,EAAE,OAAO;QACnB,WAAW,EAAE,0BAA0B;QACvC,SAAS,EAAE,0BAA0B;QACrC,SAAS,EAAE,0BAA0B;QACrC,GAAG,SAAS;KACb,CAAA;AACH,CAAC;AAED,SAAS,MAAM,CAAC,CAAiB;IAC/B,MAAM,GAAG,GAA2B,EAAE,CAAA;IACtC,KAAK,MAAM,GAAG,IAAI,oBAAoB,CAAC,CAAC,CAAC;QAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAC7E,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,6EAA6E,EAAE,GAAG,EAAE;QACrF,MAAM,IAAI,GAAG,MAAM,CACjB,KAAK,CAAC;YACJ,WAAW,EAAE;gBACX,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,QAAQ;gBAClB,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,MAAM;gBACf,YAAY,EAAE,QAAQ;gBACtB,WAAW,EAAE,0BAA0B;gBACvC,QAAQ,EAAE,yBAAyB;gBACnC,UAAU,EAAE,QAAQ;gBACpB,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE;aACxC;SACF,CAAC,CACH,CAAA;QACD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QAC7C,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACrC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACvC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACrC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;QAC7D,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACrC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC/C,sCAAsC;QACtC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa,EAAE,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAClF,MAAM,IAAI,GAAG,MAAM,CACjB,KAAK,CAAC;YACJ,SAAS,EAAE,YAAY;YACvB,SAAS,EAAE,OAAO;YAClB,WAAW,EAAE,MAAM;YACnB,OAAO,EAAE,0BAA0B;YACnC,QAAQ,EAAE,0BAA0B;SACrC,CAAC,CACH,CAAA;QACD,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QACzC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACpC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACrC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;QACrD,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;QACzD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,IAAI,GAAG,MAAM,CACjB,KAAK,CAAC;YACJ,WAAW,EAAE;gBACX,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,UAAU;gBAClB,OAAO,EAAE,IAAI;gBACb,YAAY,EAAE,SAAS;gBACvB,QAAQ,EAAE,sBAAsB;aACjC;SACF,CAAC,CACH,CAAA;QACD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-editor.render.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/views/form-editor.render.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
// @vitest-environment happy-dom
|
|
3
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
4
|
+
import { fireEvent, render, screen, waitFor } from '@testing-library/react';
|
|
5
|
+
// Drive the editor through a mocked forms-service so the test owns the data
|
|
6
|
+
// and can assert that every tab persists through the typed Forms API (the
|
|
7
|
+
// same backend as the Forms list's Schema pane — no more legacy
|
|
8
|
+
// /collections/forms writes).
|
|
9
|
+
const FORM = {
|
|
10
|
+
id: 'f1',
|
|
11
|
+
name: 'Contact Us',
|
|
12
|
+
slug: 'contact-us',
|
|
13
|
+
description: 'General contact',
|
|
14
|
+
status: 'active',
|
|
15
|
+
fields: [
|
|
16
|
+
{ id: 'c1', label: 'Full Name', key: 'name', type: 'text', required: true, sortOrder: 0 },
|
|
17
|
+
{ id: 'c2', label: 'Email', key: 'email', type: 'email', required: true, sortOrder: 1 },
|
|
18
|
+
],
|
|
19
|
+
successMessage: 'Thanks for reaching out!',
|
|
20
|
+
redirectUrl: '',
|
|
21
|
+
analytics: { enabled: false },
|
|
22
|
+
totalEntries: 3,
|
|
23
|
+
notifyEnabled: true,
|
|
24
|
+
};
|
|
25
|
+
const fetchFormById = vi.fn(async (_id) => ({ ...FORM }));
|
|
26
|
+
const fetchFormSchema = vi.fn(async (_id) => ({
|
|
27
|
+
fields: FORM.fields,
|
|
28
|
+
activeVersionId: 'v1',
|
|
29
|
+
versions: [],
|
|
30
|
+
}));
|
|
31
|
+
const updateForm = vi.fn(async (_id, patch) => ({
|
|
32
|
+
data: { ...FORM, ...patch },
|
|
33
|
+
}));
|
|
34
|
+
const saveFormSchema = vi.fn(async (_id, _fields) => ({ data: {} }));
|
|
35
|
+
const createForm = vi.fn(async (payload) => ({
|
|
36
|
+
data: { ...FORM, id: 'new-form-id', ...payload },
|
|
37
|
+
}));
|
|
38
|
+
const fetchNotificationSettings = vi.fn(async (_id) => ({
|
|
39
|
+
enabled: true,
|
|
40
|
+
recipients: ['team@example.com'],
|
|
41
|
+
}));
|
|
42
|
+
const updateNotificationSettings = vi.fn(async () => ({ data: {} }));
|
|
43
|
+
const fetchEmbedSettings = vi.fn(async () => ({}));
|
|
44
|
+
const fetchFormWebhooks = vi.fn(async () => []);
|
|
45
|
+
vi.mock('../../lib/forms-service.js', () => ({
|
|
46
|
+
fetchFormById: (id) => fetchFormById(id),
|
|
47
|
+
fetchFormSchema: (id) => fetchFormSchema(id),
|
|
48
|
+
updateForm: (id, patch) => updateForm(id, patch),
|
|
49
|
+
saveFormSchema: (id, fields) => saveFormSchema(id, fields),
|
|
50
|
+
createForm: (payload) => createForm(payload),
|
|
51
|
+
fetchNotificationSettings: (id) => fetchNotificationSettings(id),
|
|
52
|
+
updateNotificationSettings: () => updateNotificationSettings(),
|
|
53
|
+
fetchEmbedSettings: () => fetchEmbedSettings(),
|
|
54
|
+
updateEmbedSettings: vi.fn(async () => ({ data: {} })),
|
|
55
|
+
fetchFormWebhooks: () => fetchFormWebhooks(),
|
|
56
|
+
createFormWebhook: vi.fn(async () => ({ data: {} })),
|
|
57
|
+
updateFormWebhook: vi.fn(async () => ({ data: {} })),
|
|
58
|
+
deleteFormWebhook: vi.fn(async () => ({})),
|
|
59
|
+
testFormWebhook: vi.fn(async () => ({ data: { ok: true } })),
|
|
60
|
+
}));
|
|
61
|
+
vi.mock('sonner', () => ({ toast: { success: vi.fn(), error: vi.fn(), loading: vi.fn() } }));
|
|
62
|
+
const { FormEditor } = await import('../../views/FormEditor.js');
|
|
63
|
+
// Radix Tabs activates on mousedown (button 0), not a bare click.
|
|
64
|
+
function selectTab(name) {
|
|
65
|
+
const tab = screen.getByRole('tab', { name });
|
|
66
|
+
fireEvent.mouseDown(tab, { button: 0 });
|
|
67
|
+
fireEvent.click(tab);
|
|
68
|
+
}
|
|
69
|
+
beforeEach(() => {
|
|
70
|
+
fetchFormById.mockClear();
|
|
71
|
+
fetchFormSchema.mockClear();
|
|
72
|
+
updateForm.mockClear();
|
|
73
|
+
saveFormSchema.mockClear();
|
|
74
|
+
createForm.mockClear();
|
|
75
|
+
fetchNotificationSettings.mockClear();
|
|
76
|
+
});
|
|
77
|
+
describe('FormEditor (existing form)', () => {
|
|
78
|
+
it('loads through the typed Forms API and renders every settings tab', async () => {
|
|
79
|
+
render(_jsx(FormEditor, { formId: "f1", onNavigate: () => { } }));
|
|
80
|
+
expect(await screen.findByRole('heading', { name: 'Contact Us' })).toBeTruthy();
|
|
81
|
+
expect(fetchFormById).toHaveBeenCalledWith('f1');
|
|
82
|
+
expect(fetchFormSchema).toHaveBeenCalledWith('f1');
|
|
83
|
+
const tabs = screen.getAllByRole('tab').map((t) => t.textContent);
|
|
84
|
+
expect(tabs).toEqual([
|
|
85
|
+
'Details',
|
|
86
|
+
'Fields',
|
|
87
|
+
'Notifications',
|
|
88
|
+
'Analytics',
|
|
89
|
+
'Embed',
|
|
90
|
+
'Integrations',
|
|
91
|
+
]);
|
|
92
|
+
});
|
|
93
|
+
it('saves details (message confirmation clears the redirect URL)', async () => {
|
|
94
|
+
render(_jsx(FormEditor, { formId: "f1", onNavigate: () => { } }));
|
|
95
|
+
await screen.findByRole('heading', { name: 'Contact Us' });
|
|
96
|
+
fireEvent.change(screen.getByLabelText(/Form Name/), { target: { value: 'Contact' } });
|
|
97
|
+
fireEvent.click(screen.getByRole('button', { name: /Save Details/ }));
|
|
98
|
+
await waitFor(() => expect(updateForm).toHaveBeenCalledWith('f1', expect.objectContaining({
|
|
99
|
+
name: 'Contact',
|
|
100
|
+
status: 'active',
|
|
101
|
+
successMessage: 'Thanks for reaching out!',
|
|
102
|
+
redirectUrl: '',
|
|
103
|
+
})));
|
|
104
|
+
});
|
|
105
|
+
it('exposes notification settings from the editor (the old editor had none)', async () => {
|
|
106
|
+
render(_jsx(FormEditor, { formId: "f1", onNavigate: () => { } }));
|
|
107
|
+
await screen.findByRole('heading', { name: 'Contact Us' });
|
|
108
|
+
selectTab('Notifications');
|
|
109
|
+
await waitFor(() => expect(fetchNotificationSettings).toHaveBeenCalledWith('f1'));
|
|
110
|
+
expect(await screen.findByText('Enable notifications')).toBeTruthy();
|
|
111
|
+
});
|
|
112
|
+
it('persists GA4 analytics through the typed update endpoint', async () => {
|
|
113
|
+
render(_jsx(FormEditor, { formId: "f1", onNavigate: () => { } }));
|
|
114
|
+
await screen.findByRole('heading', { name: 'Contact Us' });
|
|
115
|
+
selectTab('Analytics');
|
|
116
|
+
fireEvent.click(await screen.findByRole('switch', { name: /Google Analytics 4/ }));
|
|
117
|
+
fireEvent.click(screen.getByRole('button', { name: /Save Analytics/ }));
|
|
118
|
+
await waitFor(() => expect(updateForm).toHaveBeenCalledWith('f1', {
|
|
119
|
+
analytics: expect.objectContaining({ enabled: true }),
|
|
120
|
+
}));
|
|
121
|
+
});
|
|
122
|
+
it('saves the field schema through the versioned schema endpoint', async () => {
|
|
123
|
+
render(_jsx(FormEditor, { formId: "f1", onNavigate: () => { } }));
|
|
124
|
+
await screen.findByRole('heading', { name: 'Contact Us' });
|
|
125
|
+
selectTab('Fields');
|
|
126
|
+
fireEvent.click(await screen.findByRole('button', { name: 'Add Field' }));
|
|
127
|
+
fireEvent.click(screen.getByRole('button', { name: /Save Schema/ }));
|
|
128
|
+
await waitFor(() => expect(saveFormSchema).toHaveBeenCalledWith('f1', expect.arrayContaining([expect.objectContaining({ key: 'name' })])));
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
describe('FormEditor (new form)', () => {
|
|
132
|
+
it('creates through the typed API and routes into the full editor', async () => {
|
|
133
|
+
const onNavigate = vi.fn();
|
|
134
|
+
render(_jsx(FormEditor, { onNavigate: onNavigate }));
|
|
135
|
+
fireEvent.change(screen.getByLabelText(/Form Name/), { target: { value: 'Newsletter' } });
|
|
136
|
+
fireEvent.click(screen.getByRole('button', { name: /Create Form/ }));
|
|
137
|
+
await waitFor(() => expect(createForm).toHaveBeenCalledWith(expect.objectContaining({ name: 'Newsletter', status: 'active' })));
|
|
138
|
+
await waitFor(() => expect(onNavigate).toHaveBeenCalledWith('/forms/new-form-id/edit'));
|
|
139
|
+
});
|
|
140
|
+
it('disables Create until a name is entered', () => {
|
|
141
|
+
render(_jsx(FormEditor, { onNavigate: () => { } }));
|
|
142
|
+
const create = screen.getByRole('button', { name: /Create Form/ });
|
|
143
|
+
expect(create.disabled).toBe(true);
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
//# sourceMappingURL=form-editor.render.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-editor.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/form-editor.render.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -59,6 +59,7 @@ const fetchEntryCounts = vi.fn(async (_p) => ({
|
|
|
59
59
|
}));
|
|
60
60
|
const fetchEntry = vi.fn(async (_id) => ({ entry: ENTRIES[0], fields: [] }));
|
|
61
61
|
const updateEntry = vi.fn(async (_id, _patch) => ({ data: ENTRIES[0] }));
|
|
62
|
+
const downloadEntriesExport = vi.fn(async (_opts) => ({}));
|
|
62
63
|
vi.mock('../../lib/forms-service.js', () => ({
|
|
63
64
|
fetchForms: () => fetchForms(),
|
|
64
65
|
fetchEntries: (p) => fetchEntries(p),
|
|
@@ -67,6 +68,7 @@ vi.mock('../../lib/forms-service.js', () => ({
|
|
|
67
68
|
updateEntry: (id, patch) => updateEntry(id, patch),
|
|
68
69
|
deleteEntry: vi.fn(async () => ({})),
|
|
69
70
|
bulkUpdateEntries: vi.fn(async () => ({ data: { updated: 1 } })),
|
|
71
|
+
downloadEntriesExport: (opts) => downloadEntriesExport(opts),
|
|
70
72
|
}));
|
|
71
73
|
vi.mock('../../lib/forms-events.js', () => ({
|
|
72
74
|
onFormsChanged: () => () => { },
|
|
@@ -118,5 +120,23 @@ describe('FormEntries (All Entries)', () => {
|
|
|
118
120
|
fireEvent.click(screen.getByRole('button', { name: 'Close entry details' }));
|
|
119
121
|
expect(screen.queryByRole('region', { name: 'Entry details' })).toBeNull();
|
|
120
122
|
});
|
|
123
|
+
it('downloads the unscoped export, honoring the active form filter', async () => {
|
|
124
|
+
downloadEntriesExport.mockClear();
|
|
125
|
+
render(_jsx(FormEntries, { onNavigate: () => { } }));
|
|
126
|
+
await screen.findByText('Jordan Avery');
|
|
127
|
+
// Radix DropdownMenu opens on pointerdown (not click), which happy-dom
|
|
128
|
+
// doesn't synthesize from fireEvent.click — open via keyboard instead.
|
|
129
|
+
const openExportMenu = () => fireEvent.keyDown(screen.getByRole('button', { name: /Export/ }), { key: 'Enter' });
|
|
130
|
+
// Unscoped: exports across all forms.
|
|
131
|
+
openExportMenu();
|
|
132
|
+
fireEvent.click(await screen.findByRole('menuitem', { name: /CSV/ }));
|
|
133
|
+
await waitFor(() => expect(downloadEntriesExport).toHaveBeenCalledWith({ formId: undefined, format: 'csv' }));
|
|
134
|
+
// Scoped: the form filter carries into the export.
|
|
135
|
+
fireEvent.change(screen.getByLabelText('Filter by form'), { target: { value: 'f2' } });
|
|
136
|
+
await screen.findByText('Jordan Avery');
|
|
137
|
+
openExportMenu();
|
|
138
|
+
fireEvent.click(await screen.findByRole('menuitem', { name: /Excel/ }));
|
|
139
|
+
await waitFor(() => expect(downloadEntriesExport).toHaveBeenCalledWith({ formId: 'f2', format: 'xlsx' }));
|
|
140
|
+
});
|
|
121
141
|
});
|
|
122
142
|
//# sourceMappingURL=form-entries.render.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-entries.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/form-entries.render.test.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"form-entries.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/form-entries.render.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -57,6 +57,7 @@ const fetchEntryCounts = vi.fn(async (_p) => ({
|
|
|
57
57
|
}));
|
|
58
58
|
const fetchEntry = vi.fn(async (_id) => ({ entry: ENTRIES[0], fields: [] }));
|
|
59
59
|
const updateEntry = vi.fn(async (_id, _patch) => ({ data: ENTRIES[0] }));
|
|
60
|
+
const downloadEntriesExport = vi.fn(async (_opts) => ({}));
|
|
60
61
|
vi.mock('../../lib/forms-service.js', () => ({
|
|
61
62
|
fetchFormById: (id) => fetchFormById(id),
|
|
62
63
|
fetchEntries: (p) => fetchEntries(p),
|
|
@@ -65,6 +66,7 @@ vi.mock('../../lib/forms-service.js', () => ({
|
|
|
65
66
|
updateEntry: (id, patch) => updateEntry(id, patch),
|
|
66
67
|
deleteEntry: vi.fn(async () => ({})),
|
|
67
68
|
bulkUpdateEntries: vi.fn(async () => ({ data: { updated: 1 } })),
|
|
69
|
+
downloadEntriesExport: (opts) => downloadEntriesExport(opts),
|
|
68
70
|
}));
|
|
69
71
|
vi.mock('../../lib/forms-events.js', () => ({
|
|
70
72
|
onFormsChanged: () => () => { },
|
|
@@ -116,5 +118,15 @@ describe('FormSubmissions table', () => {
|
|
|
116
118
|
fireEvent.click(screen.getByRole('button', { name: 'Close entry details' }));
|
|
117
119
|
expect(screen.queryByRole('region', { name: 'Entry details' })).toBeNull();
|
|
118
120
|
});
|
|
121
|
+
it('downloads the server-side export scoped to this form', async () => {
|
|
122
|
+
downloadEntriesExport.mockClear();
|
|
123
|
+
render(_jsx(FormSubmissions, { formId: "f1", onNavigate: () => { } }));
|
|
124
|
+
await screen.findByText('Jordan Avery');
|
|
125
|
+
// Radix DropdownMenu opens on pointerdown (not click), which happy-dom
|
|
126
|
+
// doesn't synthesize from fireEvent.click — open via keyboard instead.
|
|
127
|
+
fireEvent.keyDown(screen.getByRole('button', { name: /Export/ }), { key: 'Enter' });
|
|
128
|
+
fireEvent.click(await screen.findByRole('menuitem', { name: /Excel/ }));
|
|
129
|
+
await waitFor(() => expect(downloadEntriesExport).toHaveBeenCalledWith({ formId: 'f1', format: 'xlsx' }));
|
|
130
|
+
});
|
|
119
131
|
});
|
|
120
132
|
//# sourceMappingURL=form-submissions.render.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-submissions.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/form-submissions.render.test.tsx"],"names":[],"mappings":";AAAA,gCAAgC;AAChC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAE3E,6EAA6E;AAC7E,2EAA2E;AAC3E,wEAAwE;AACxE,SAAS,SAAS,CAAC,OAAgC,EAAE;IACnD,OAAO;QACL,EAAE,EAAE,IAAI;QACR,WAAW,EAAE,CAAC;QACd,MAAM,EAAE,IAAI;QACZ,IAAI,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,aAAa,EAAE;QACnF,UAAU,EAAE,cAAc;QAC1B,WAAW,EAAE,oBAAoB;QACjC,OAAO,EAAE,aAAa;QACtB,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,KAAK;QACf,UAAU,EAAE,OAAO;QACnB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,GAAG,IAAI;KACR,CAAA;AACH,CAAC;AAED,MAAM,OAAO,GAAG;IACd,SAAS,EAAE;IACX,SAAS,CAAC;QACR,EAAE,EAAE,IAAI;QACR,WAAW,EAAE,CAAC;QACd,UAAU,EAAE,YAAY;QACxB,WAAW,EAAE,mBAAmB;QAChC,OAAO,EAAE,0BAA0B;QACnC,MAAM,EAAE,KAAK;KACd,CAAC;CACH,CAAA;AAED,MAAM,aAAa,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,GAAY,EAAE,EAAE,CAAC,CAAC;IACnD,EAAE,EAAE,IAAI;IACR,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,YAAY;IAClB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,EAAE;CACX,CAAC,CAAC,CAAA;AACH,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAY,EAAE,EAAE,CAAC,CAAC;IAClD,OAAO,EAAE,OAAO;IAChB,KAAK,EAAE,OAAO,CAAC,MAAM;IACrB,IAAI,EAAE,CAAC;IACP,QAAQ,EAAE,GAAG;CACd,CAAC,CAAC,CAAA;AACH,MAAM,gBAAgB,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAY,EAAE,EAAE,CAAC,CAAC;IACtD,KAAK,EAAE,CAAC;IACR,MAAM,EAAE,CAAC;IACT,OAAO,EAAE,CAAC;IACV,QAAQ,EAAE,CAAC;IACX,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE;CAClB,CAAC,CAAC,CAAA;AACH,MAAM,UAAU,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,GAAY,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;AACrF,MAAM,WAAW,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,GAAY,EAAE,MAAgB,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"form-submissions.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/form-submissions.render.test.tsx"],"names":[],"mappings":"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"}
|