@actuate-media/cms-admin 0.70.0 → 0.71.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 +6 -0
- package/dist/__tests__/views/script-tags.render.test.d.ts +2 -0
- package/dist/__tests__/views/script-tags.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/script-tags.render.test.js +148 -0
- package/dist/__tests__/views/script-tags.render.test.js.map +1 -0
- package/dist/actuate-admin.css +1 -1
- package/dist/components/script-tags/ScriptTagEditorPane.d.ts +10 -0
- package/dist/components/script-tags/ScriptTagEditorPane.d.ts.map +1 -1
- package/dist/components/script-tags/ScriptTagEditorPane.js +21 -2
- package/dist/components/script-tags/ScriptTagEditorPane.js.map +1 -1
- package/dist/views/ScriptTags.d.ts.map +1 -1
- package/dist/views/ScriptTags.js +121 -15
- package/dist/views/ScriptTags.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/views/script-tags.render.test.tsx +178 -0
- package/src/components/script-tags/ScriptTagEditorPane.tsx +40 -4
- package/src/views/ScriptTags.tsx +257 -23
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# @actuate-media/cms-admin
|
|
2
2
|
|
|
3
|
+
## 0.71.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 85ddc19: Script Tags design parity: colored location badges (head=accent, body start=success, body end=info), per-category consent badges with dots, circular priority badge, Consent-gated stat pill, search box, location + consent filter pills with live count, row checkboxes with select-all, created-date meta line under script names, hover duplicate/delete row actions with confirm dialog, and the design subtitle. The editor pane header now uses the same colored badges and the consent hint reflects granular consent categories.
|
|
8
|
+
|
|
3
9
|
## 0.70.0
|
|
4
10
|
|
|
5
11
|
### Minor Changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script-tags.render.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/views/script-tags.render.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,148 @@
|
|
|
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 Script Tags list through a mocked cmsApi so the test owns the
|
|
6
|
+
// data and can assert the design-parity surface: stat pills, search,
|
|
7
|
+
// location/consent filter pills, badges, and row actions.
|
|
8
|
+
function makeTag(over = {}) {
|
|
9
|
+
return {
|
|
10
|
+
id: 't1',
|
|
11
|
+
name: 'Google Analytics 4',
|
|
12
|
+
code: '<script>/* ga */</script>',
|
|
13
|
+
placement: 'head',
|
|
14
|
+
scope: 'site',
|
|
15
|
+
targetPaths: [],
|
|
16
|
+
priority: 1,
|
|
17
|
+
enabled: true,
|
|
18
|
+
loadAsync: true,
|
|
19
|
+
disableInPreview: true,
|
|
20
|
+
consentCategory: 'analytics',
|
|
21
|
+
createdAt: '2026-05-20T10:00:00.000Z',
|
|
22
|
+
updatedAt: '2026-05-20T10:00:00.000Z',
|
|
23
|
+
...over,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const TAGS = [
|
|
27
|
+
makeTag(),
|
|
28
|
+
makeTag({
|
|
29
|
+
id: 't2',
|
|
30
|
+
name: 'Live Chat Widget',
|
|
31
|
+
placement: 'body_close',
|
|
32
|
+
priority: 5,
|
|
33
|
+
consentCategory: 'functional',
|
|
34
|
+
}),
|
|
35
|
+
makeTag({
|
|
36
|
+
id: 't3',
|
|
37
|
+
name: 'Org Schema',
|
|
38
|
+
placement: 'head',
|
|
39
|
+
priority: 3,
|
|
40
|
+
enabled: false,
|
|
41
|
+
consentCategory: 'none',
|
|
42
|
+
}),
|
|
43
|
+
];
|
|
44
|
+
const cmsApi = vi.fn(async (endpoint, init) => {
|
|
45
|
+
if (!init?.method)
|
|
46
|
+
return { data: TAGS };
|
|
47
|
+
if (init.method === 'POST')
|
|
48
|
+
return { data: makeTag({ id: 'new-copy' }) };
|
|
49
|
+
return { data: {} };
|
|
50
|
+
});
|
|
51
|
+
vi.mock('../../lib/api.js', () => ({
|
|
52
|
+
cmsApi: (endpoint, init) => cmsApi(endpoint, init),
|
|
53
|
+
}));
|
|
54
|
+
vi.mock('sonner', () => ({ toast: { success: vi.fn(), error: vi.fn(), loading: vi.fn() } }));
|
|
55
|
+
const { ScriptTags } = await import('../../views/ScriptTags.js');
|
|
56
|
+
beforeEach(() => {
|
|
57
|
+
cmsApi.mockClear();
|
|
58
|
+
});
|
|
59
|
+
describe('ScriptTags list', () => {
|
|
60
|
+
it('renders rows, stat pills (incl. consent-gated), and colored badges', async () => {
|
|
61
|
+
render(_jsx(ScriptTags, {}));
|
|
62
|
+
expect(await screen.findByText('Google Analytics 4')).toBeTruthy();
|
|
63
|
+
expect(screen.getByText('Live Chat Widget')).toBeTruthy();
|
|
64
|
+
// Stat pills: 3 total, 2 active, 1 inactive, 2 consent-gated.
|
|
65
|
+
expect(screen.getByText('Consent-gated')).toBeTruthy();
|
|
66
|
+
expect(screen.getByText('Consent-gated').closest('span')?.textContent).toContain('2');
|
|
67
|
+
// Location badges use the design palette (head=accent, body_close=info).
|
|
68
|
+
// Note: "Body end" also matches the filter pill, so pick the badge chip.
|
|
69
|
+
const headBadge = screen.getAllByText('Head').find((el) => el.className.includes('--acc-l'));
|
|
70
|
+
expect(headBadge).toBeTruthy();
|
|
71
|
+
const bodyEndBadge = screen
|
|
72
|
+
.getAllByText('Body end')
|
|
73
|
+
.find((el) => el.className.includes('--info-l'));
|
|
74
|
+
expect(bodyEndBadge).toBeTruthy();
|
|
75
|
+
// Consent badges are per-category colored chips.
|
|
76
|
+
const analyticsBadge = screen
|
|
77
|
+
.getAllByText('Analytics')
|
|
78
|
+
.find((el) => el.className.includes('--acc-l'));
|
|
79
|
+
expect(analyticsBadge).toBeTruthy();
|
|
80
|
+
const functionalBadge = screen
|
|
81
|
+
.getAllByText('Functional')
|
|
82
|
+
.find((el) => el.className.includes('--suc-l'));
|
|
83
|
+
expect(functionalBadge).toBeTruthy();
|
|
84
|
+
});
|
|
85
|
+
it('filters by location pill and shows the filtered count', async () => {
|
|
86
|
+
render(_jsx(ScriptTags, {}));
|
|
87
|
+
await screen.findByText('Google Analytics 4');
|
|
88
|
+
expect(screen.getByText('3 scripts')).toBeTruthy();
|
|
89
|
+
fireEvent.click(screen.getByRole('button', { name: 'Body end', pressed: false }));
|
|
90
|
+
await waitFor(() => {
|
|
91
|
+
expect(screen.getByText('Live Chat Widget')).toBeTruthy();
|
|
92
|
+
expect(screen.queryByText('Google Analytics 4')).toBeNull();
|
|
93
|
+
expect(screen.getByText('1 script')).toBeTruthy();
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
it('filters by consent pill', async () => {
|
|
97
|
+
render(_jsx(ScriptTags, {}));
|
|
98
|
+
await screen.findByText('Google Analytics 4');
|
|
99
|
+
fireEvent.click(screen.getByRole('button', { name: 'No consent', pressed: false }));
|
|
100
|
+
await waitFor(() => {
|
|
101
|
+
expect(screen.getByText('Org Schema')).toBeTruthy();
|
|
102
|
+
expect(screen.queryByText('Google Analytics 4')).toBeNull();
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
it('searches by name and offers clear-filters from the empty state', async () => {
|
|
106
|
+
render(_jsx(ScriptTags, {}));
|
|
107
|
+
await screen.findByText('Google Analytics 4');
|
|
108
|
+
fireEvent.change(screen.getByPlaceholderText('Search scripts…'), {
|
|
109
|
+
target: { value: 'zzz-no-match' },
|
|
110
|
+
});
|
|
111
|
+
expect(await screen.findByText('No scripts match your filters')).toBeTruthy();
|
|
112
|
+
fireEvent.click(screen.getByRole('button', { name: 'Clear filters' }));
|
|
113
|
+
expect(await screen.findByText('Google Analytics 4')).toBeTruthy();
|
|
114
|
+
});
|
|
115
|
+
it('select-all checks visible rows and shows selected count with clear', async () => {
|
|
116
|
+
render(_jsx(ScriptTags, {}));
|
|
117
|
+
await screen.findByText('Google Analytics 4');
|
|
118
|
+
fireEvent.click(screen.getByLabelText('Select all scripts'));
|
|
119
|
+
expect(await screen.findByText(/3 selected/)).toBeTruthy();
|
|
120
|
+
fireEvent.click(screen.getByRole('button', { name: 'Clear' }));
|
|
121
|
+
await waitFor(() => expect(screen.queryByText(/selected/)).toBeNull());
|
|
122
|
+
});
|
|
123
|
+
it('row duplicate posts a disabled copy and refetches', async () => {
|
|
124
|
+
render(_jsx(ScriptTags, {}));
|
|
125
|
+
await screen.findByText('Google Analytics 4');
|
|
126
|
+
fireEvent.click(screen.getByRole('button', { name: 'Duplicate Google Analytics 4' }));
|
|
127
|
+
await waitFor(() => {
|
|
128
|
+
const post = cmsApi.mock.calls.find((c) => c[1]?.method === 'POST');
|
|
129
|
+
expect(post).toBeTruthy();
|
|
130
|
+
const body = JSON.parse(String(post[1].body));
|
|
131
|
+
expect(body.name).toBe('Google Analytics 4 (Copy)');
|
|
132
|
+
expect(body.enabled).toBe(false);
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
it('row delete asks for confirmation, then issues DELETE', async () => {
|
|
136
|
+
render(_jsx(ScriptTags, {}));
|
|
137
|
+
await screen.findByText('Org Schema');
|
|
138
|
+
fireEvent.click(screen.getByRole('button', { name: 'Delete Org Schema' }));
|
|
139
|
+
expect(await screen.findByText('Delete script?')).toBeTruthy();
|
|
140
|
+
fireEvent.click(screen.getByRole('button', { name: 'Delete' }));
|
|
141
|
+
await waitFor(() => {
|
|
142
|
+
const del = cmsApi.mock.calls.find((c) => c[1]?.method === 'DELETE');
|
|
143
|
+
expect(del).toBeTruthy();
|
|
144
|
+
expect(del[0]).toBe('/script-tags/t3');
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
//# sourceMappingURL=script-tags.render.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script-tags.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/script-tags.render.test.tsx"],"names":[],"mappings":"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"}
|