@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.
Files changed (50) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/dist/__tests__/components/attribution-rows.test.d.ts +2 -0
  3. package/dist/__tests__/components/attribution-rows.test.d.ts.map +1 -0
  4. package/dist/__tests__/components/attribution-rows.test.js +82 -0
  5. package/dist/__tests__/components/attribution-rows.test.js.map +1 -0
  6. package/dist/__tests__/views/form-editor.render.test.d.ts +2 -0
  7. package/dist/__tests__/views/form-editor.render.test.d.ts.map +1 -0
  8. package/dist/__tests__/views/form-editor.render.test.js +146 -0
  9. package/dist/__tests__/views/form-editor.render.test.js.map +1 -0
  10. package/dist/__tests__/views/form-entries.render.test.js +20 -0
  11. package/dist/__tests__/views/form-entries.render.test.js.map +1 -1
  12. package/dist/__tests__/views/form-submissions.render.test.js +12 -0
  13. package/dist/__tests__/views/form-submissions.render.test.js.map +1 -1
  14. package/dist/actuate-admin.css +1 -1
  15. package/dist/components/forms/ExportMenu.d.ts +8 -0
  16. package/dist/components/forms/ExportMenu.d.ts.map +1 -0
  17. package/dist/components/forms/ExportMenu.js +32 -0
  18. package/dist/components/forms/ExportMenu.js.map +1 -0
  19. package/dist/components/forms/FormEntryDetailPane.d.ts +13 -0
  20. package/dist/components/forms/FormEntryDetailPane.d.ts.map +1 -1
  21. package/dist/components/forms/FormEntryDetailPane.js +74 -8
  22. package/dist/components/forms/FormEntryDetailPane.js.map +1 -1
  23. package/dist/components/forms/WebhooksPanel.d.ts.map +1 -1
  24. package/dist/components/forms/WebhooksPanel.js +1 -1
  25. package/dist/components/forms/WebhooksPanel.js.map +1 -1
  26. package/dist/lib/forms-service.d.ts +29 -3
  27. package/dist/lib/forms-service.d.ts.map +1 -1
  28. package/dist/lib/forms-service.js +37 -1
  29. package/dist/lib/forms-service.js.map +1 -1
  30. package/dist/views/FormEditor.d.ts.map +1 -1
  31. package/dist/views/FormEditor.js +211 -116
  32. package/dist/views/FormEditor.js.map +1 -1
  33. package/dist/views/FormEntries.d.ts.map +1 -1
  34. package/dist/views/FormEntries.js +8 -36
  35. package/dist/views/FormEntries.js.map +1 -1
  36. package/dist/views/FormSubmissions.d.ts.map +1 -1
  37. package/dist/views/FormSubmissions.js +7 -36
  38. package/dist/views/FormSubmissions.js.map +1 -1
  39. package/package.json +9 -9
  40. package/src/__tests__/components/attribution-rows.test.ts +93 -0
  41. package/src/__tests__/views/form-editor.render.test.tsx +186 -0
  42. package/src/__tests__/views/form-entries.render.test.tsx +29 -0
  43. package/src/__tests__/views/form-submissions.render.test.tsx +17 -0
  44. package/src/components/forms/ExportMenu.tsx +70 -0
  45. package/src/components/forms/FormEntryDetailPane.tsx +82 -8
  46. package/src/components/forms/WebhooksPanel.tsx +5 -1
  47. package/src/lib/forms-service.ts +61 -2
  48. package/src/views/FormEditor.tsx +655 -510
  49. package/src/views/FormEntries.tsx +7 -46
  50. package/src/views/FormSubmissions.tsx +6 -46
@@ -1,131 +1,226 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useState, useCallback, useEffect } from 'react';
4
- import { Save, ArrowLeft, Plus, Trash2, GripVertical, MessageSquare, ExternalLink, BarChart3, ChevronDown, ChevronRight, Loader2, } from 'lucide-react';
5
- import { useApiData } from '../lib/useApiData.js';
6
- import { cmsApi } from '../lib/api.js';
3
+ /**
4
+ * Full-page form editor the canonical place to configure everything about a
5
+ * form. Backed entirely by the typed Forms API (`lib/forms-service.ts`), the
6
+ * same backend as the Forms list's inline Schema pane, so the two surfaces can
7
+ * never drift:
8
+ *
9
+ * - Details → name / description / status + post-submit confirmation
10
+ * (`PATCH /forms/:id` — `successMessage` / `redirectUrl`,
11
+ * which the public submission pipeline actually reads)
12
+ * - Fields → versioned schema editor (`PUT /forms/:id/schema`)
13
+ * - Notifications→ shared NotificationsPanel (`/forms/:id/notifications`)
14
+ * - Analytics → GA4 event tracking config (persisted on the definition,
15
+ * exposed on the public schema, fired by `<ActuateForm>`)
16
+ * - Embed → shared EmbedPanel (endpoints, snippet, allowed domains)
17
+ * - Integrations → shared WebhooksPanel (signed CRM/Zapier webhooks)
18
+ *
19
+ * New forms get a focused create screen (details + starting fields); saving
20
+ * routes into this editor so notifications/embed/webhooks — which need a form
21
+ * id — are one click away.
22
+ */
23
+ import * as Tabs from '@radix-ui/react-tabs';
24
+ import { ArrowLeft, ExternalLink, Inbox, Loader2, MessageSquare, Save } from 'lucide-react';
25
+ import { useCallback, useEffect, useState } from 'react';
26
+ import { toast } from 'sonner';
27
+ import { EmbedPanel } from '../components/forms/EmbedPanel.js';
28
+ import { FieldsPanel } from '../components/forms/FieldsPanel.js';
29
+ import { NotificationsPanel } from '../components/forms/NotificationsPanel.js';
30
+ import { WebhooksPanel } from '../components/forms/WebhooksPanel.js';
31
+ import { FormStatusBadge, FormsErrorState, FormsLoading, btnPrimary, btnSecondary, } from '../components/forms/primitives.js';
7
32
  import { Toggle } from '../components/ui/Toggle.js';
8
- const FIELD_TYPES = [
9
- { value: 'text', label: 'Text' },
10
- { value: 'email', label: 'Email' },
11
- { value: 'tel', label: 'Phone' },
12
- { value: 'textarea', label: 'Textarea' },
13
- { value: 'select', label: 'Dropdown' },
14
- { value: 'checkbox', label: 'Checkbox' },
15
- { value: 'number', label: 'Number' },
16
- { value: 'date', label: 'Date' },
17
- { value: 'url', label: 'URL' },
18
- { value: 'file', label: 'File Upload' },
19
- { value: 'hidden', label: 'Hidden' },
33
+ import { emitFormsChanged } from '../lib/forms-events.js';
34
+ import { createForm, fetchFormById, fetchFormSchema, saveFormSchema, updateForm, } from '../lib/forms-service.js';
35
+ import { useNavigationBlocker } from '../router/index.js';
36
+ const inputCls = 'border-border bg-input-background text-foreground focus-visible:ring-ring w-full rounded-lg border px-3 py-2 text-sm focus-visible:ring-2 focus-visible:outline-none';
37
+ const TABS = [
38
+ { id: 'details', label: 'Details' },
39
+ { id: 'fields', label: 'Fields' },
40
+ { id: 'notifications', label: 'Notifications' },
41
+ { id: 'analytics', label: 'Analytics' },
42
+ { id: 'embed', label: 'Embed' },
43
+ { id: 'integrations', label: 'Integrations' },
20
44
  ];
45
+ function detailsFromForm(form) {
46
+ return {
47
+ name: form.name,
48
+ description: form.description ?? '',
49
+ status: form.status,
50
+ // The submission pipeline redirects whenever redirectUrl is non-empty,
51
+ // otherwise it shows successMessage — mirror that decision here.
52
+ confirmationType: form.redirectUrl?.trim() ? 'redirect' : 'message',
53
+ successMessage: form.successMessage ?? '',
54
+ redirectUrl: form.redirectUrl ?? '',
55
+ };
56
+ }
57
+ const DEFAULT_ANALYTICS = { enabled: false };
21
58
  export function FormEditor({ formId, onNavigate }) {
22
- const isNew = !formId;
23
- const { data: existingForm, loading } = useApiData(formId ? `/collections/forms/${formId}` : null);
24
- const [name, setName] = useState('');
25
- const [description, setDescription] = useState('');
26
- const [status, setStatus] = useState('active');
59
+ if (!formId) {
60
+ return _jsx(NewFormEditor, { onNavigate: onNavigate });
61
+ }
62
+ return _jsx(ExistingFormEditor, { formId: formId, onNavigate: onNavigate });
63
+ }
64
+ // ─── Existing form ─────────────────────────────────────────────────────────
65
+ function ExistingFormEditor({ formId, onNavigate, }) {
66
+ const [form, setForm] = useState(null);
67
+ const [loading, setLoading] = useState(true);
68
+ const [error, setError] = useState(null);
69
+ const [tab, setTab] = useState('details');
70
+ const [details, setDetails] = useState(null);
71
+ const [detailsDirty, setDetailsDirty] = useState(false);
72
+ const [savingDetails, setSavingDetails] = useState(false);
27
73
  const [fields, setFields] = useState([]);
28
- const [saving, setSaving] = useState(false);
29
- const [expandedSection, setExpandedSection] = useState('fields');
30
- const [confirmation, setConfirmation] = useState({
31
- type: 'message',
32
- message: 'Thank you! Your submission has been received.',
33
- redirectUrl: '',
34
- redirectDelay: 0,
35
- });
36
- const [analytics, setAnalytics] = useState({
37
- enabled: false,
38
- measurementId: '',
39
- submitEventName: 'form_submit',
40
- startEventName: 'form_start',
41
- trackAsConversion: false,
42
- conversionValue: 0,
43
- conversionCurrency: 'USD',
44
- customParameters: {},
45
- });
46
- useEffect(() => {
47
- if (existingForm) {
48
- const d = existingForm.data ?? existingForm;
49
- setName(d.name ?? '');
50
- setDescription(d.description ?? '');
51
- setStatus(d.status ?? 'active');
52
- if (Array.isArray(d.fields))
53
- setFields(d.fields);
54
- if (d.confirmation) {
55
- setConfirmation((prev) => ({ ...prev, ...d.confirmation }));
56
- }
57
- if (d.analytics) {
58
- setAnalytics((prev) => ({ ...prev, ...d.analytics }));
59
- }
60
- }
61
- }, [existingForm]);
62
- const addField = useCallback((type) => {
63
- setFields((prev) => [
64
- ...prev,
65
- {
66
- id: crypto.randomUUID(),
67
- type,
68
- label: `New ${type} field`,
69
- required: false,
70
- },
71
- ]);
72
- }, []);
73
- const removeField = useCallback((id) => {
74
- setFields((prev) => prev.filter((f) => f.id !== id));
75
- }, []);
76
- const updateField = useCallback((id, updates) => {
77
- setFields((prev) => prev.map((f) => (f.id === id ? { ...f, ...updates } : f)));
78
- }, []);
79
- const moveField = useCallback((from, to) => {
80
- setFields((prev) => {
81
- const next = [...prev];
82
- const [moved] = next.splice(from, 1);
83
- next.splice(to, 0, moved);
84
- return next;
85
- });
86
- }, []);
87
- const handleSave = async () => {
88
- setSaving(true);
74
+ const [fieldsDirty, setFieldsDirty] = useState(false);
75
+ const [savingFields, setSavingFields] = useState(false);
76
+ const [analytics, setAnalytics] = useState(DEFAULT_ANALYTICS);
77
+ const [analyticsDirty, setAnalyticsDirty] = useState(false);
78
+ const [savingAnalytics, setSavingAnalytics] = useState(false);
79
+ useNavigationBlocker(detailsDirty || fieldsDirty || analyticsDirty);
80
+ const load = useCallback(async () => {
81
+ setLoading(true);
82
+ setError(null);
89
83
  try {
90
- const payload = {
91
- name,
92
- description,
93
- status,
94
- fields,
95
- confirmation,
96
- analytics: analytics.enabled ? analytics : { enabled: false },
97
- };
98
- if (isNew) {
99
- await cmsApi('/collections/forms', {
100
- method: 'POST',
101
- body: JSON.stringify(payload),
102
- });
84
+ const [loaded, schema] = await Promise.all([fetchFormById(formId), fetchFormSchema(formId)]);
85
+ if (!loaded) {
86
+ setError('Form not found');
87
+ return;
103
88
  }
104
- else {
105
- await cmsApi(`/collections/forms/${formId}`, {
106
- method: 'PUT',
107
- body: JSON.stringify(payload),
108
- });
109
- }
110
- onNavigate?.('/forms');
89
+ setForm(loaded);
90
+ setDetails(detailsFromForm(loaded));
91
+ setAnalytics(loaded.analytics ?? DEFAULT_ANALYTICS);
92
+ setFields(schema.fields);
93
+ setDetailsDirty(false);
94
+ setFieldsDirty(false);
95
+ setAnalyticsDirty(false);
96
+ }
97
+ catch (e) {
98
+ setError(e instanceof Error ? e.message : 'Failed to load form');
111
99
  }
112
100
  finally {
113
- setSaving(false);
101
+ setLoading(false);
114
102
  }
115
- };
116
- const toggleSection = (section) => {
117
- setExpandedSection(expandedSection === section ? null : section);
118
- };
103
+ }, [formId]);
104
+ useEffect(() => {
105
+ void load();
106
+ }, [load]);
107
+ function patchDetails(patch) {
108
+ setDetails((cur) => (cur ? { ...cur, ...patch } : cur));
109
+ setDetailsDirty(true);
110
+ }
111
+ function patchAnalytics(patch) {
112
+ setAnalytics((cur) => ({ ...cur, ...patch }));
113
+ setAnalyticsDirty(true);
114
+ }
115
+ async function saveDetails() {
116
+ if (!details)
117
+ return;
118
+ setSavingDetails(true);
119
+ const res = await updateForm(formId, {
120
+ name: details.name,
121
+ description: details.description,
122
+ status: details.status,
123
+ successMessage: details.successMessage,
124
+ // Message mode must clear the URL — a non-empty redirectUrl always wins
125
+ // in the submission pipeline.
126
+ redirectUrl: details.confirmationType === 'redirect' ? details.redirectUrl : '',
127
+ });
128
+ setSavingDetails(false);
129
+ if (res.error) {
130
+ toast.error(res.error);
131
+ return;
132
+ }
133
+ if (res.data) {
134
+ setForm(res.data);
135
+ setDetails(detailsFromForm(res.data));
136
+ }
137
+ setDetailsDirty(false);
138
+ toast.success('Form details saved.');
139
+ emitFormsChanged();
140
+ }
141
+ async function saveFields() {
142
+ setSavingFields(true);
143
+ const res = await saveFormSchema(formId, fields.map((f, i) => ({ ...f, sortOrder: i })));
144
+ setSavingFields(false);
145
+ if (res.error) {
146
+ toast.error(res.error);
147
+ return;
148
+ }
149
+ setFieldsDirty(false);
150
+ toast.success('Schema saved.');
151
+ emitFormsChanged();
152
+ }
153
+ async function saveAnalytics() {
154
+ setSavingAnalytics(true);
155
+ const res = await updateForm(formId, { analytics });
156
+ setSavingAnalytics(false);
157
+ if (res.error) {
158
+ toast.error(res.error);
159
+ return;
160
+ }
161
+ if (res.data)
162
+ setAnalytics(res.data.analytics ?? { enabled: false });
163
+ setAnalyticsDirty(false);
164
+ toast.success('Analytics settings saved.');
165
+ }
119
166
  if (loading) {
120
- return (_jsx("div", { className: "flex h-64 items-center justify-center p-4", children: _jsx(Loader2, { className: "text-primary h-6 w-6 animate-spin" }) }));
167
+ return (_jsx("div", { className: "max-w-4xl p-3 pr-6 sm:p-4 sm:pr-8", children: _jsx(FormsLoading, { label: "Loading form\u2026" }) }));
168
+ }
169
+ if (error || !form || !details) {
170
+ return (_jsx("div", { className: "max-w-4xl p-3 pr-6 sm:p-4 sm:pr-8", children: _jsx(FormsErrorState, { message: error ?? 'Form not found', onRetry: () => void load() }) }));
121
171
  }
122
- return (_jsxs("div", { className: "max-w-4xl p-3 pr-6 sm:p-4 sm:pr-8", children: [_jsxs("div", { className: "mb-6 flex items-center gap-3", children: [_jsx("button", { onClick: () => onNavigate?.('/forms'), className: "hover:bg-muted rounded-lg p-2 transition-colors", children: _jsx(ArrowLeft, { className: "text-muted-foreground h-5 w-5" }) }), _jsx("div", { className: "flex-1", children: _jsx("h1", { className: "text-foreground text-xl font-medium", children: isNew ? 'New Form' : 'Edit Form' }) }), _jsxs("button", { onClick: handleSave, disabled: saving || !name.trim(), className: "bg-primary text-primary-foreground hover:bg-primary/90 flex items-center gap-2 rounded-lg px-4 py-2 text-sm transition-colors disabled:opacity-50", children: [saving ? _jsx(Loader2, { className: "h-4 w-4 animate-spin" }) : _jsx(Save, { className: "h-4 w-4" }), saving ? 'Saving...' : 'Save'] })] }), _jsx("div", { className: "border-border bg-card mb-4 rounded-lg border p-4", children: _jsxs("div", { className: "grid gap-4", children: [_jsxs("div", { children: [_jsx("label", { className: "text-foreground mb-1 block text-sm font-medium", children: "Form Name" }), _jsx("input", { type: "text", value: name, onChange: (e) => setName(e.target.value), placeholder: "e.g. Contact Form", className: "border-border focus-visible:ring-ring/50 w-full rounded-lg border px-3 py-2 text-sm focus:ring-2 focus:outline-none" })] }), _jsxs("div", { children: [_jsx("label", { className: "text-foreground mb-1 block text-sm font-medium", children: "Description" }), _jsx("input", { type: "text", value: description, onChange: (e) => setDescription(e.target.value), placeholder: "Brief description of this form", className: "border-border focus-visible:ring-ring/50 w-full rounded-lg border px-3 py-2 text-sm focus:ring-2 focus:outline-none" })] }), _jsxs("div", { children: [_jsx("label", { className: "text-foreground mb-1 block text-sm font-medium", children: "Status" }), _jsxs("select", { value: status, onChange: (e) => setStatus(e.target.value), className: "border-border focus-visible:ring-ring/50 rounded-lg border px-3 py-2 text-sm focus:ring-2 focus:outline-none", children: [_jsx("option", { value: "active", children: "Active" }), _jsx("option", { value: "inactive", children: "Inactive" })] })] })] }) }), _jsxs("div", { className: "border-border bg-card mb-4 rounded-lg border", children: [_jsx("button", { onClick: () => toggleSection('fields'), className: "hover:bg-muted flex w-full items-center justify-between p-4 transition-colors", children: _jsxs("div", { className: "flex items-center gap-2", children: [expandedSection === 'fields' ? (_jsx(ChevronDown, { className: "h-4 w-4" })) : (_jsx(ChevronRight, { className: "h-4 w-4" })), _jsx("span", { className: "text-foreground font-medium", children: "Form Fields" }), _jsxs("span", { className: "text-muted-foreground text-sm", children: ["(", fields.length, ")"] })] }) }), expandedSection === 'fields' && (_jsxs("div", { className: "border-border border-t p-4", children: [_jsx("div", { className: "mb-4 flex flex-wrap gap-2", children: FIELD_TYPES.map((ft) => (_jsxs("button", { onClick: () => addField(ft.value), className: "border-border hover:bg-muted flex items-center gap-1 rounded-lg border px-3 py-1.5 text-xs transition-colors", children: [_jsx(Plus, { className: "h-3 w-3" }), " ", ft.label] }, ft.value))) }), fields.length === 0 ? (_jsx("p", { className: "text-muted-foreground py-6 text-center text-sm", children: "Click a field type above to add it to your form." })) : (_jsx("div", { className: "flex flex-col gap-2", children: fields.map((field, index) => (_jsxs("div", { draggable: true, onDragStart: (e) => e.dataTransfer.setData('text/plain', String(index)), onDragOver: (e) => e.preventDefault(), onDrop: (e) => {
123
- const from = Number(e.dataTransfer.getData('text/plain'));
124
- moveField(from, index);
125
- }, className: "border-border bg-muted hover:bg-card flex items-center gap-3 rounded-lg border p-3 transition-colors", children: [_jsx(GripVertical, { className: "text-muted-foreground h-4 w-4 shrink-0 cursor-grab" }), _jsx("input", { type: "text", value: field.label, onChange: (e) => updateField(field.id, { label: e.target.value }), className: "border-border focus-visible:ring-ring/50 flex-1 rounded border px-2 py-1 text-sm focus:ring-1 focus:outline-none" }), _jsx("span", { className: "bg-muted text-muted-foreground shrink-0 rounded px-2 py-0.5 text-xs", children: field.type }), _jsxs("label", { className: "text-muted-foreground flex shrink-0 items-center gap-1 text-xs", children: [_jsx("input", { type: "checkbox", checked: field.required, onChange: (e) => updateField(field.id, { required: e.target.checked }), className: "rounded" }), "Required"] }), _jsx("button", { onClick: () => removeField(field.id), className: "text-destructive hover:bg-destructive/10 shrink-0 rounded p-1 transition-colors", children: _jsx(Trash2, { className: "h-4 w-4" }) })] }, field.id))) }))] }))] }), _jsxs("div", { className: "border-border bg-card mb-4 rounded-lg border", children: [_jsx("button", { onClick: () => toggleSection('confirmation'), className: "hover:bg-muted flex w-full items-center justify-between p-4 transition-colors", children: _jsxs("div", { className: "flex items-center gap-2", children: [expandedSection === 'confirmation' ? (_jsx(ChevronDown, { className: "h-4 w-4" })) : (_jsx(ChevronRight, { className: "h-4 w-4" })), _jsx(MessageSquare, { className: "text-success h-4 w-4" }), _jsx("span", { className: "text-foreground font-medium", children: "Confirmation" }), _jsx("span", { className: "bg-muted text-muted-foreground rounded px-2 py-0.5 text-xs", children: confirmation.type === 'message' ? 'Show Message' : 'Redirect' })] }) }), expandedSection === 'confirmation' && (_jsxs("div", { className: "border-border border-t p-4", children: [_jsxs("div", { className: "mb-4", children: [_jsx("label", { className: "text-foreground mb-2 block text-sm font-medium", children: "After submission" }), _jsxs("div", { className: "flex gap-3", children: [_jsxs("label", { className: `flex cursor-pointer items-center gap-2 rounded-lg border px-4 py-2 transition-colors ${confirmation.type === 'message'
126
- ? 'border-primary bg-accent'
127
- : 'border-border hover:bg-muted bg-transparent'}`, children: [_jsx("input", { type: "radio", name: "confirmationType", value: "message", checked: confirmation.type === 'message', onChange: () => setConfirmation((c) => ({ ...c, type: 'message' })), className: "text-primary" }), _jsx(MessageSquare, { className: "h-4 w-4" }), _jsx("span", { className: "text-sm", children: "Show Message" })] }), _jsxs("label", { className: `flex cursor-pointer items-center gap-2 rounded-lg border px-4 py-2 transition-colors ${confirmation.type === 'redirect'
128
- ? 'border-primary bg-accent'
129
- : 'border-border hover:bg-muted bg-transparent'}`, children: [_jsx("input", { type: "radio", name: "confirmationType", value: "redirect", checked: confirmation.type === 'redirect', onChange: () => setConfirmation((c) => ({ ...c, type: 'redirect' })), className: "text-primary" }), _jsx(ExternalLink, { className: "h-4 w-4" }), _jsx("span", { className: "text-sm", children: "Redirect to Page" })] })] })] }), confirmation.type === 'message' ? (_jsxs("div", { children: [_jsx("label", { className: "text-foreground mb-1 block text-sm font-medium", children: "Success Message" }), _jsx("textarea", { value: confirmation.message, onChange: (e) => setConfirmation((c) => ({ ...c, message: e.target.value })), rows: 3, className: "border-border focus-visible:ring-ring/50 w-full rounded-lg border px-3 py-2 text-sm focus:ring-2 focus:outline-none", placeholder: "Thank you! Your submission has been received." })] })) : (_jsxs("div", { className: "grid gap-3", children: [_jsxs("div", { children: [_jsx("label", { className: "text-foreground mb-1 block text-sm font-medium", children: "Redirect URL" }), _jsx("input", { type: "url", value: confirmation.redirectUrl, onChange: (e) => setConfirmation((c) => ({ ...c, redirectUrl: e.target.value })), placeholder: "https://example.com/thank-you", className: "border-border focus-visible:ring-ring/50 w-full rounded-lg border px-3 py-2 text-sm focus:ring-2 focus:outline-none" })] }), _jsxs("div", { children: [_jsx("label", { className: "text-foreground mb-1 block text-sm font-medium", children: "Redirect Delay (ms)" }), _jsx("input", { type: "number", value: confirmation.redirectDelay, onChange: (e) => setConfirmation((c) => ({ ...c, redirectDelay: Number(e.target.value) })), min: 0, step: 500, className: "border-border focus-visible:ring-ring/50 w-32 rounded-lg border px-3 py-2 text-sm focus:ring-2 focus:outline-none" }), _jsx("p", { className: "text-muted-foreground mt-1 text-xs", children: "0 = instant redirect" })] })] }))] }))] }), _jsxs("div", { className: "border-border bg-card mb-4 rounded-lg border", children: [_jsx("button", { onClick: () => toggleSection('analytics'), className: "hover:bg-muted flex w-full items-center justify-between p-4 transition-colors", children: _jsxs("div", { className: "flex items-center gap-2", children: [expandedSection === 'analytics' ? (_jsx(ChevronDown, { className: "h-4 w-4" })) : (_jsx(ChevronRight, { className: "h-4 w-4" })), _jsx(BarChart3, { className: "text-brand h-4 w-4" }), _jsx("span", { className: "text-foreground font-medium", children: "GA4 Analytics" }), _jsx("span", { className: `rounded px-2 py-0.5 text-xs ${analytics.enabled ? 'bg-success/10 text-success' : 'bg-muted text-muted-foreground'}`, children: analytics.enabled ? 'Enabled' : 'Disabled' })] }) }), expandedSection === 'analytics' && (_jsxs("div", { className: "border-border border-t p-4", children: [_jsxs("div", { className: "mb-4 flex items-center gap-3", children: [_jsx(Toggle, { checked: analytics.enabled, onCheckedChange: (v) => setAnalytics((a) => ({ ...a, enabled: v })), "aria-label": "Push events to Google Analytics 4" }), _jsx("span", { className: "text-foreground text-sm font-medium", children: "Push events to Google Analytics 4" })] }), analytics.enabled && (_jsxs("div", { className: "grid gap-4 pl-12", children: [_jsxs("div", { children: [_jsxs("label", { className: "text-foreground mb-1 block text-sm font-medium", children: ["GA4 Measurement ID", _jsx("span", { className: "text-muted-foreground font-normal", children: " (optional)" })] }), _jsx("input", { type: "text", value: analytics.measurementId, onChange: (e) => setAnalytics((a) => ({ ...a, measurementId: e.target.value })), placeholder: "G-XXXXXXXXXX", className: "border-border focus-visible:ring-ring/50 w-64 rounded-lg border px-3 py-2 text-sm focus:ring-2 focus:outline-none" }), _jsx("p", { className: "text-muted-foreground mt-1 text-xs", children: "Leave blank to use your site's default GA4 tag" })] }), _jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsxs("div", { children: [_jsx("label", { className: "text-foreground mb-1 block text-sm font-medium", children: "Submit Event Name" }), _jsx("input", { type: "text", value: analytics.submitEventName, onChange: (e) => setAnalytics((a) => ({ ...a, submitEventName: e.target.value })), className: "border-border focus-visible:ring-ring/50 w-full rounded-lg border px-3 py-2 text-sm focus:ring-2 focus:outline-none" })] }), _jsxs("div", { children: [_jsx("label", { className: "text-foreground mb-1 block text-sm font-medium", children: "Start Event Name" }), _jsx("input", { type: "text", value: analytics.startEventName, onChange: (e) => setAnalytics((a) => ({ ...a, startEventName: e.target.value })), className: "border-border focus-visible:ring-ring/50 w-full rounded-lg border px-3 py-2 text-sm focus:ring-2 focus:outline-none" })] })] }), _jsxs("div", { className: "border-border border-t pt-4", children: [_jsxs("div", { className: "mb-3 flex items-center gap-3", children: [_jsx("input", { type: "checkbox", id: "trackConversion", checked: analytics.trackAsConversion, onChange: (e) => setAnalytics((a) => ({ ...a, trackAsConversion: e.target.checked })), className: "rounded" }), _jsx("label", { htmlFor: "trackConversion", className: "text-foreground text-sm font-medium", children: "Track as conversion event" })] }), analytics.trackAsConversion && (_jsxs("div", { className: "ml-6 grid grid-cols-2 gap-4", children: [_jsxs("div", { children: [_jsx("label", { className: "text-foreground mb-1 block text-sm font-medium", children: "Conversion Value" }), _jsx("input", { type: "number", value: analytics.conversionValue, onChange: (e) => setAnalytics((a) => ({ ...a, conversionValue: Number(e.target.value) })), min: 0, step: 0.01, className: "border-border focus-visible:ring-ring/50 w-full rounded-lg border px-3 py-2 text-sm focus:ring-2 focus:outline-none" })] }), _jsxs("div", { children: [_jsx("label", { className: "text-foreground mb-1 block text-sm font-medium", children: "Currency" }), _jsxs("select", { value: analytics.conversionCurrency, onChange: (e) => setAnalytics((a) => ({ ...a, conversionCurrency: e.target.value })), className: "border-border focus-visible:ring-ring/50 w-full rounded-lg border px-3 py-2 text-sm focus:ring-2 focus:outline-none", children: [_jsx("option", { value: "USD", children: "USD" }), _jsx("option", { value: "EUR", children: "EUR" }), _jsx("option", { value: "GBP", children: "GBP" }), _jsx("option", { value: "CAD", children: "CAD" }), _jsx("option", { value: "AUD", children: "AUD" })] })] })] }))] }), _jsx("div", { className: "border-info/30 bg-info/10 rounded-lg border p-3", children: _jsxs("p", { className: "text-foreground text-xs", children: [_jsx("strong", { children: "Note:" }), " Your site must have the GA4 snippet or GTM container installed. Actuate pushes events via", ' ', _jsx("code", { className: "bg-info/10 rounded px-1", children: "gtag()" }), " /", _jsx("code", { className: "bg-info/10 rounded px-1", children: "dataLayer" }), " \u2014 it does not load the GA4 script."] }) })] }))] }))] })] }));
172
+ return (_jsxs("div", { className: "max-w-4xl p-3 pr-6 sm:p-4 sm:pr-8", children: [_jsxs("div", { className: "mb-6 flex items-center gap-3", children: [_jsx("button", { onClick: () => onNavigate?.('/forms'), "aria-label": "Back to forms", className: "hover:bg-muted focus-visible:ring-ring rounded-lg p-2 transition-colors focus-visible:ring-2 focus-visible:outline-none", children: _jsx(ArrowLeft, { className: "text-muted-foreground h-5 w-5", "aria-hidden": true }) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("h1", { className: "text-foreground truncate text-xl font-medium", children: form.name }), _jsx(FormStatusBadge, { status: form.status })] }), _jsxs("p", { className: "text-muted-foreground truncate font-mono text-xs", children: ["/", form.slug] })] }), _jsxs("button", { onClick: () => onNavigate?.(`/forms/${formId}/submissions`), className: btnSecondary, children: [_jsx(Inbox, { className: "h-4 w-4", "aria-hidden": true }), "View Entries"] })] }), _jsxs(Tabs.Root, { value: tab, onValueChange: setTab, children: [_jsx(Tabs.List, { className: "border-border mb-4 flex gap-0.5 overflow-x-auto border-b", "aria-label": "Form settings sections", children: TABS.map((t) => (_jsx(Tabs.Trigger, { value: t.id, className: "text-muted-foreground hover:text-foreground focus-visible:ring-ring data-[state=active]:border-primary data-[state=active]:text-foreground -mb-px border-b-2 border-transparent px-3 py-2 text-sm font-medium whitespace-nowrap transition-colors focus-visible:ring-2 focus-visible:outline-none", children: t.label }, t.id))) }), _jsx(Tabs.Content, { value: "details", tabIndex: -1, children: _jsx(DetailsTab, { details: details, onPatch: patchDetails, onSave: () => void saveDetails(), saving: savingDetails }) }), _jsx(Tabs.Content, { value: "fields", tabIndex: -1, children: _jsxs("div", { className: "border-border bg-card space-y-4 rounded-lg border p-4", children: [_jsx(FieldsPanel, { fields: fields, onChange: (next) => {
173
+ setFields(next);
174
+ setFieldsDirty(true);
175
+ }, hasSubmissions: (form.totalEntries ?? 0) > 0 }), _jsx("div", { className: "flex justify-end", children: _jsxs("button", { className: btnPrimary, onClick: () => void saveFields(), disabled: savingFields || !fieldsDirty, children: [savingFields ? (_jsx(Loader2, { className: "h-4 w-4 animate-spin", "aria-hidden": true })) : (_jsx(Save, { className: "h-4 w-4", "aria-hidden": true })), savingFields ? 'Saving…' : 'Save Schema'] }) })] }) }), _jsx(Tabs.Content, { value: "notifications", tabIndex: -1, children: _jsx("div", { className: "border-border bg-card rounded-lg border p-4", children: _jsx(NotificationsPanel, { formId: formId }) }) }), _jsx(Tabs.Content, { value: "analytics", tabIndex: -1, children: _jsx(AnalyticsTab, { analytics: analytics, onPatch: patchAnalytics, onSave: () => void saveAnalytics(), saving: savingAnalytics }) }), _jsx(Tabs.Content, { value: "embed", tabIndex: -1, children: _jsx("div", { className: "border-border bg-card rounded-lg border p-4", children: _jsx(EmbedPanel, { formId: formId, slug: form.slug, status: form.status }) }) }), _jsx(Tabs.Content, { value: "integrations", tabIndex: -1, children: _jsx("div", { className: "border-border bg-card rounded-lg border p-4", children: _jsx(WebhooksPanel, { formId: formId, formSlug: form.slug }) }) })] })] }));
176
+ }
177
+ // ─── Details tab ────────────────────────────────────────────────────────────
178
+ function DetailsTab({ details, onPatch, onSave, saving, }) {
179
+ return (_jsxs("div", { className: "space-y-4", children: [_jsx("div", { className: "border-border bg-card rounded-lg border p-4", children: _jsxs("div", { className: "grid gap-4", children: [_jsx(Field, { label: "Form Name", children: _jsx("input", { type: "text", value: details.name, onChange: (e) => onPatch({ name: e.target.value }), placeholder: "e.g. Contact Form", className: inputCls }) }), _jsx(Field, { label: "Description", children: _jsx("input", { type: "text", value: details.description, onChange: (e) => onPatch({ description: e.target.value }), placeholder: "Brief description of this form", className: inputCls }) }), _jsx(Field, { label: "Status", hint: "Only active forms accept submissions; archived forms are hidden from embed pickers.", children: _jsxs("select", { value: details.status, onChange: (e) => onPatch({ status: e.target.value }), className: "border-border bg-input-background text-foreground focus-visible:ring-ring rounded-lg border px-3 py-2 text-sm focus-visible:ring-2 focus-visible:outline-none", children: [_jsx("option", { value: "active", children: "Active" }), _jsx("option", { value: "draft", children: "Draft" }), _jsx("option", { value: "archived", children: "Archived" })] }) })] }) }), _jsxs("div", { className: "border-border bg-card rounded-lg border p-4", children: [_jsx("h2", { className: "text-foreground mb-3 text-base font-medium", children: "Confirmation" }), _jsxs("fieldset", { className: "mb-4", children: [_jsx("legend", { className: "text-foreground mb-2 block text-sm font-medium", children: "After submission" }), _jsxs("div", { className: "flex flex-wrap gap-3", children: [_jsxs("label", { className: `flex cursor-pointer items-center gap-2 rounded-lg border px-4 py-2 transition-colors ${details.confirmationType === 'message'
180
+ ? 'border-primary bg-accent'
181
+ : 'border-border hover:bg-muted bg-transparent'}`, children: [_jsx("input", { type: "radio", name: "confirmationType", value: "message", checked: details.confirmationType === 'message', onChange: () => onPatch({ confirmationType: 'message' }), className: "text-primary" }), _jsx(MessageSquare, { className: "h-4 w-4", "aria-hidden": true }), _jsx("span", { className: "text-sm", children: "Show Message" })] }), _jsxs("label", { className: `flex cursor-pointer items-center gap-2 rounded-lg border px-4 py-2 transition-colors ${details.confirmationType === 'redirect'
182
+ ? 'border-primary bg-accent'
183
+ : 'border-border hover:bg-muted bg-transparent'}`, children: [_jsx("input", { type: "radio", name: "confirmationType", value: "redirect", checked: details.confirmationType === 'redirect', onChange: () => onPatch({ confirmationType: 'redirect' }), className: "text-primary" }), _jsx(ExternalLink, { className: "h-4 w-4", "aria-hidden": true }), _jsx("span", { className: "text-sm", children: "Redirect to Page" })] })] })] }), details.confirmationType === 'message' ? (_jsx(Field, { label: "Success Message", children: _jsx("textarea", { value: details.successMessage, onChange: (e) => onPatch({ successMessage: e.target.value }), rows: 3, placeholder: "Thank you! Your submission has been received.", className: inputCls }) })) : (_jsx(Field, { label: "Redirect URL", children: _jsx("input", { type: "url", value: details.redirectUrl, onChange: (e) => onPatch({ redirectUrl: e.target.value }), placeholder: "https://example.com/thank-you", className: inputCls }) }))] }), _jsx("div", { className: "flex justify-end", children: _jsxs("button", { className: btnPrimary, onClick: onSave, disabled: saving || !details.name.trim(), children: [saving ? (_jsx(Loader2, { className: "h-4 w-4 animate-spin", "aria-hidden": true })) : (_jsx(Save, { className: "h-4 w-4", "aria-hidden": true })), saving ? 'Saving…' : 'Save Details'] }) })] }));
184
+ }
185
+ // ─── Analytics tab ──────────────────────────────────────────────────────────
186
+ function AnalyticsTab({ analytics, onPatch, onSave, saving, }) {
187
+ return (_jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "border-border bg-card rounded-lg border p-4", children: [_jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsxs("span", { className: "min-w-0", children: [_jsx("span", { className: "text-foreground block text-sm font-medium", children: "Push events to Google Analytics 4" }), _jsx("span", { className: "text-muted-foreground block text-sm", children: "Fires form start, submit, and error events on the public site." })] }), _jsx(Toggle, { checked: analytics.enabled, onCheckedChange: (v) => onPatch({ enabled: v }), "aria-label": "Push events to Google Analytics 4" })] }), analytics.enabled && (_jsxs("div", { className: "mt-4 grid gap-4", children: [_jsx(Field, { label: "GA4 Measurement ID", hint: "Leave blank to use your site's default GA4 tag", children: _jsx("input", { type: "text", value: analytics.measurementId ?? '', onChange: (e) => onPatch({ measurementId: e.target.value }), placeholder: "G-XXXXXXXXXX", className: `${inputCls} max-w-64` }) }), _jsxs("div", { className: "grid gap-4 sm:grid-cols-2", children: [_jsx(Field, { label: "Submit Event Name", children: _jsx("input", { type: "text", value: analytics.submitEventName ?? '', onChange: (e) => onPatch({ submitEventName: e.target.value }), placeholder: "form_submit", className: inputCls }) }), _jsx(Field, { label: "Start Event Name", children: _jsx("input", { type: "text", value: analytics.startEventName ?? '', onChange: (e) => onPatch({ startEventName: e.target.value }), placeholder: "form_start", className: inputCls }) })] }), _jsxs("div", { className: "border-border border-t pt-4", children: [_jsxs("div", { className: "mb-3 flex items-center gap-3", children: [_jsx("input", { type: "checkbox", id: "trackConversion", checked: analytics.trackAsConversion ?? false, onChange: (e) => onPatch({ trackAsConversion: e.target.checked }), className: "rounded" }), _jsx("label", { htmlFor: "trackConversion", className: "text-foreground text-sm font-medium", children: "Track as conversion event" })] }), analytics.trackAsConversion && (_jsxs("div", { className: "grid gap-4 sm:grid-cols-2", children: [_jsx(Field, { label: "Conversion Value", children: _jsx("input", { type: "number", value: analytics.conversionValue ?? 0, onChange: (e) => onPatch({ conversionValue: Number(e.target.value) }), min: 0, step: 0.01, className: inputCls }) }), _jsx(Field, { label: "Currency", children: _jsxs("select", { value: analytics.conversionCurrency ?? 'USD', onChange: (e) => onPatch({ conversionCurrency: e.target.value }), className: inputCls, children: [_jsx("option", { value: "USD", children: "USD" }), _jsx("option", { value: "EUR", children: "EUR" }), _jsx("option", { value: "GBP", children: "GBP" }), _jsx("option", { value: "CAD", children: "CAD" }), _jsx("option", { value: "AUD", children: "AUD" })] }) })] }))] }), _jsx("div", { className: "border-info/30 bg-info/10 rounded-lg border p-3", children: _jsxs("p", { className: "text-foreground text-xs", children: [_jsx("strong", { children: "Note:" }), " Your site must have the GA4 snippet or GTM container installed. Actuate pushes events via", ' ', _jsx("code", { className: "bg-info/10 rounded px-1", children: "gtag()" }), " /", _jsx("code", { className: "bg-info/10 rounded px-1", children: "dataLayer" }), " \u2014 it does not load the GA4 script."] }) })] }))] }), _jsx("div", { className: "flex justify-end", children: _jsxs("button", { className: btnPrimary, onClick: onSave, disabled: saving, children: [saving ? (_jsx(Loader2, { className: "h-4 w-4 animate-spin", "aria-hidden": true })) : (_jsx(Save, { className: "h-4 w-4", "aria-hidden": true })), saving ? 'Saving…' : 'Save Analytics'] }) })] }));
188
+ }
189
+ // ─── New form ───────────────────────────────────────────────────────────────
190
+ function NewFormEditor({ onNavigate }) {
191
+ const [name, setName] = useState('');
192
+ const [description, setDescription] = useState('');
193
+ const [status, setStatus] = useState('active');
194
+ const [fields, setFields] = useState([]);
195
+ const [saving, setSaving] = useState(false);
196
+ const [dirty, setDirty] = useState(false);
197
+ useNavigationBlocker(dirty && !saving);
198
+ async function handleCreate() {
199
+ setSaving(true);
200
+ const res = await createForm({ name, description, status, fields });
201
+ setSaving(false);
202
+ if (res.error || !res.data) {
203
+ toast.error(res.error ?? 'Failed to create form');
204
+ return;
205
+ }
206
+ setDirty(false);
207
+ toast.success('Form created. Configure notifications, embed, and integrations here.');
208
+ emitFormsChanged();
209
+ onNavigate?.(`/forms/${res.data.id}/edit`);
210
+ }
211
+ return (_jsxs("div", { className: "max-w-4xl p-3 pr-6 sm:p-4 sm:pr-8", children: [_jsxs("div", { className: "mb-6 flex items-center gap-3", children: [_jsx("button", { onClick: () => onNavigate?.('/forms'), "aria-label": "Back to forms", className: "hover:bg-muted focus-visible:ring-ring rounded-lg p-2 transition-colors focus-visible:ring-2 focus-visible:outline-none", children: _jsx(ArrowLeft, { className: "text-muted-foreground h-5 w-5", "aria-hidden": true }) }), _jsx("h1", { className: "text-foreground flex-1 text-xl font-medium", children: "New Form" }), _jsxs("button", { onClick: () => void handleCreate(), disabled: saving || !name.trim(), className: btnPrimary, children: [saving ? (_jsx(Loader2, { className: "h-4 w-4 animate-spin", "aria-hidden": true })) : (_jsx(Save, { className: "h-4 w-4", "aria-hidden": true })), saving ? 'Creating…' : 'Create Form'] })] }), _jsx("div", { className: "border-border bg-card mb-4 rounded-lg border p-4", children: _jsxs("div", { className: "grid gap-4", children: [_jsx(Field, { label: "Form Name", children: _jsx("input", { type: "text", value: name, onChange: (e) => {
212
+ setName(e.target.value);
213
+ setDirty(true);
214
+ }, placeholder: "e.g. Contact Form", className: inputCls }) }), _jsx(Field, { label: "Description", children: _jsx("input", { type: "text", value: description, onChange: (e) => {
215
+ setDescription(e.target.value);
216
+ setDirty(true);
217
+ }, placeholder: "Brief description of this form", className: inputCls }) }), _jsx(Field, { label: "Status", children: _jsxs("select", { value: status, onChange: (e) => setStatus(e.target.value), className: "border-border bg-input-background text-foreground focus-visible:ring-ring rounded-lg border px-3 py-2 text-sm focus-visible:ring-2 focus-visible:outline-none", children: [_jsx("option", { value: "active", children: "Active" }), _jsx("option", { value: "draft", children: "Draft" })] }) })] }) }), _jsxs("div", { className: "border-border bg-card rounded-lg border p-4", children: [_jsx("h2", { className: "text-foreground mb-3 text-base font-medium", children: "Fields" }), _jsx(FieldsPanel, { fields: fields, onChange: (next) => {
218
+ setFields(next);
219
+ setDirty(true);
220
+ }, hasSubmissions: false })] }), _jsx("p", { className: "text-muted-foreground mt-4 text-sm", children: "Confirmation, notifications, analytics, embed, and integrations are configured after the form is created." })] }));
221
+ }
222
+ // ─── Shared bits ────────────────────────────────────────────────────────────
223
+ function Field({ label, hint, children, }) {
224
+ return (_jsxs("label", { className: "block", children: [_jsx("span", { className: "text-foreground mb-1 block text-sm font-medium", children: label }), children, hint && _jsx("span", { className: "text-muted-foreground mt-1 block text-xs", children: hint })] }));
130
225
  }
131
226
  //# sourceMappingURL=FormEditor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FormEditor.js","sourceRoot":"","sources":["../../src/views/FormEditor.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FormEditor.js","sourceRoot":"","sources":["../../src/views/FormEditor.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"FormEntries.d.ts","sourceRoot":"","sources":["../../src/views/FormEntries.tsx"],"names":[],"mappings":"AAsCA,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACpC;AAyDD,wBAAgB,WAAW,CAAC,EAAE,UAAU,EAAE,EAAE,gBAAgB,2CA8W3D"}
1
+ {"version":3,"file":"FormEntries.d.ts","sourceRoot":"","sources":["../../src/views/FormEntries.tsx"],"names":[],"mappings":"AAsCA,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACpC;AA0BD,wBAAgB,WAAW,CAAC,EAAE,UAAU,EAAE,EAAE,gBAAgB,2CAsW3D"}
@@ -2,21 +2,22 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  /**
4
4
  * All Entries — a cross-form submissions inbox. Same token-only table, search,
5
- * status pills (All / Unread / Starred / Archived), bulk actions, CSV export,
6
- * pagination, and inline detail pane as the per-form Submissions view, plus a
7
- * Form filter and a Form column so editors can triage every form from one
8
- * place.
5
+ * status pills (All / Unread / Starred / Archived), bulk actions, server-side
6
+ * CSV/Excel export, pagination, and inline detail pane as the per-form
7
+ * Submissions view, plus a Form filter and a Form column so editors can
8
+ * triage every form from one place.
9
9
  */
10
10
  import { useCallback, useEffect, useState } from 'react';
11
- import { Download, Inbox, Search } from 'lucide-react';
11
+ import { Inbox, Search } from 'lucide-react';
12
12
  import { toast } from 'sonner';
13
13
  import { bulkUpdateEntries, deleteEntry, fetchEntries, fetchEntryCounts, fetchForms, updateEntry, } from '../lib/forms-service.js';
14
14
  import { emitFormsChanged, onFormsChanged } from '../lib/forms-events.js';
15
15
  import { FormEntryDetailPane } from '../components/forms/FormEntryDetailPane.js';
16
16
  import { EntriesTable } from '../components/forms/EntriesTable.js';
17
+ import { ExportMenu } from '../components/forms/ExportMenu.js';
17
18
  import { ConfirmDialog } from '../components/ui/ConfirmDialog.js';
18
19
  import { InspectorPane, SplitPaneLayout, SplitPaneList } from '../components/ui/InspectorPane.js';
19
- import { FormsEmptyState, FormsErrorState, FormsLoading, FormsPagination, SummaryChip, btnSecondary, } from '../components/forms/primitives.js';
20
+ import { FormsEmptyState, FormsErrorState, FormsLoading, FormsPagination, SummaryChip, } from '../components/forms/primitives.js';
20
21
  const FILTERS = [
21
22
  { id: 'all', label: 'All' },
22
23
  { id: 'unread', label: 'Unread' },
@@ -36,35 +37,6 @@ function filterToParams(filter) {
36
37
  return {};
37
38
  }
38
39
  }
39
- function csvEscape(value) {
40
- const s = value == null ? '' : typeof value === 'object' ? JSON.stringify(value) : String(value);
41
- return /[",\n]/.test(s) ? `"${s.replace(/"/g, '""')}"` : s;
42
- }
43
- function exportCsv(entries) {
44
- const dataKeys = [...new Set(entries.flatMap((e) => Object.keys(e.data ?? {})))];
45
- const header = ['Entry', 'Form', 'Submitted', 'Name', 'Email', 'Phone', 'Status', ...dataKeys];
46
- const lines = [header.map(csvEscape).join(',')];
47
- for (const e of entries) {
48
- const row = [
49
- e.entryNumber ?? '',
50
- e.formName ?? '',
51
- e.submittedAt,
52
- e.senderName ?? '',
53
- e.senderEmail ?? '',
54
- e.senderPhone ?? '',
55
- e.unread ? 'unread' : 'read',
56
- ...dataKeys.map((k) => e.data?.[k]),
57
- ];
58
- lines.push(row.map(csvEscape).join(','));
59
- }
60
- const blob = new Blob([lines.join('\n')], { type: 'text/csv;charset=utf-8' });
61
- const url = URL.createObjectURL(blob);
62
- const a = document.createElement('a');
63
- a.href = url;
64
- a.download = 'all-entries.csv';
65
- a.click();
66
- URL.revokeObjectURL(url);
67
- }
68
40
  export function FormEntries({ onNavigate }) {
69
41
  const [entries, setEntries] = useState([]);
70
42
  const [total, setTotal] = useState(0);
@@ -189,7 +161,7 @@ export function FormEntries({ onNavigate }) {
189
161
  }, [selected, refresh]);
190
162
  const showEmpty = !loading && !error && entries.length === 0;
191
163
  const isFiltered = filter !== 'all' || formFilter !== 'all' || search.trim().length > 0;
192
- return (_jsxs("div", { className: "space-y-5 p-6", children: [_jsxs("div", { className: "flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-foreground", children: "All Entries" }), _jsxs("p", { className: "text-muted-foreground mt-1 text-sm", children: [total, " ", total === 1 ? 'submission' : 'submissions', " across your forms"] })] }), _jsxs("button", { type: "button", className: btnSecondary, onClick: () => exportCsv(entries), disabled: entries.length === 0, children: [_jsx(Download, { className: "h-4 w-4", "aria-hidden": true }), "Export CSV"] })] }), counts && (_jsxs("div", { className: "flex flex-wrap gap-2", children: [_jsx(SummaryChip, { value: counts.total, label: "total" }), _jsx(SummaryChip, { value: counts.unread, label: "unread", tone: counts.unread > 0 ? 'destructive' : 'neutral' }), _jsx(SummaryChip, { value: counts.starred, label: "starred", tone: "warning" }), _jsx(SummaryChip, { value: counts.thisWeek, label: "this week" })] })), _jsxs("div", { className: "flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between", children: [_jsxs("div", { className: "flex flex-1 flex-col gap-3 sm:flex-row sm:items-center", children: [_jsxs("div", { className: "relative w-full sm:max-w-xs", children: [_jsx(Search, { className: "text-muted-foreground absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2", "aria-hidden": true }), _jsx("input", { type: "search", placeholder: "Search entries\u2026", value: search, onChange: (e) => {
164
+ return (_jsxs("div", { className: "space-y-5 p-6", children: [_jsxs("div", { className: "flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-foreground", children: "All Entries" }), _jsxs("p", { className: "text-muted-foreground mt-1 text-sm", children: [total, " ", total === 1 ? 'submission' : 'submissions', " across your forms"] })] }), _jsx(ExportMenu, { formId: scopedFormId, disabled: counts !== null && counts.total === 0 })] }), counts && (_jsxs("div", { className: "flex flex-wrap gap-2", children: [_jsx(SummaryChip, { value: counts.total, label: "total" }), _jsx(SummaryChip, { value: counts.unread, label: "unread", tone: counts.unread > 0 ? 'destructive' : 'neutral' }), _jsx(SummaryChip, { value: counts.starred, label: "starred", tone: "warning" }), _jsx(SummaryChip, { value: counts.thisWeek, label: "this week" })] })), _jsxs("div", { className: "flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between", children: [_jsxs("div", { className: "flex flex-1 flex-col gap-3 sm:flex-row sm:items-center", children: [_jsxs("div", { className: "relative w-full sm:max-w-xs", children: [_jsx(Search, { className: "text-muted-foreground absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2", "aria-hidden": true }), _jsx("input", { type: "search", placeholder: "Search entries\u2026", value: search, onChange: (e) => {
193
165
  setSearch(e.target.value);
194
166
  setPage(1);
195
167
  }, "aria-label": "Search entries", className: "border-border bg-input-background text-foreground focus-visible:ring-ring w-full rounded-lg border py-2 pr-3 pl-9 text-sm focus-visible:ring-2 focus-visible:outline-none" })] }), _jsxs("select", { value: formFilter, onChange: (e) => {