@prenta/admin 1.17.17 → 1.17.19

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 (47) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/__tests__/components/virtual-window.test.d.ts +2 -0
  3. package/dist/__tests__/components/virtual-window.test.d.ts.map +1 -0
  4. package/dist/__tests__/components/virtual-window.test.js +22 -0
  5. package/dist/__tests__/components/virtual-window.test.js.map +1 -0
  6. package/dist/__tests__/views/autosave.test.d.ts +2 -0
  7. package/dist/__tests__/views/autosave.test.d.ts.map +1 -0
  8. package/dist/__tests__/views/autosave.test.js +51 -0
  9. package/dist/__tests__/views/autosave.test.js.map +1 -0
  10. package/dist/components/virtual-window.d.ts +28 -0
  11. package/dist/components/virtual-window.d.ts.map +1 -0
  12. package/dist/components/virtual-window.js +62 -0
  13. package/dist/components/virtual-window.js.map +1 -0
  14. package/dist/prenta-admin.css +1 -1
  15. package/dist/views/CollectionList.d.ts.map +1 -1
  16. package/dist/views/CollectionList.js +25 -14
  17. package/dist/views/CollectionList.js.map +1 -1
  18. package/dist/views/MediaBrowser.d.ts.map +1 -1
  19. package/dist/views/MediaBrowser.js +80 -23
  20. package/dist/views/MediaBrowser.js.map +1 -1
  21. package/dist/views/Pages/PagesListView.d.ts.map +1 -1
  22. package/dist/views/Pages/PagesListView.js +35 -2
  23. package/dist/views/Pages/PagesListView.js.map +1 -1
  24. package/dist/views/Posts/PostsListView.d.ts.map +1 -1
  25. package/dist/views/Posts/PostsListView.js +14 -2
  26. package/dist/views/Posts/PostsListView.js.map +1 -1
  27. package/dist/views/page-editor/PageSectionEditor.d.ts.map +1 -1
  28. package/dist/views/page-editor/PageSectionEditor.js +26 -6
  29. package/dist/views/page-editor/PageSectionEditor.js.map +1 -1
  30. package/dist/views/page-editor/autosave.d.ts +16 -0
  31. package/dist/views/page-editor/autosave.d.ts.map +1 -0
  32. package/dist/views/page-editor/autosave.js +23 -0
  33. package/dist/views/page-editor/autosave.js.map +1 -0
  34. package/dist/views/post-editor/PostSectionEditor.d.ts.map +1 -1
  35. package/dist/views/post-editor/PostSectionEditor.js +23 -6
  36. package/dist/views/post-editor/PostSectionEditor.js.map +1 -1
  37. package/package.json +4 -3
  38. package/src/__tests__/components/virtual-window.test.tsx +29 -0
  39. package/src/__tests__/views/autosave.test.tsx +66 -0
  40. package/src/components/virtual-window.tsx +81 -0
  41. package/src/views/CollectionList.tsx +14 -1
  42. package/src/views/MediaBrowser.tsx +155 -90
  43. package/src/views/Pages/PagesListView.tsx +67 -27
  44. package/src/views/Posts/PostsListView.tsx +29 -12
  45. package/src/views/page-editor/PageSectionEditor.tsx +28 -7
  46. package/src/views/page-editor/autosave.ts +30 -0
  47. package/src/views/post-editor/PostSectionEditor.tsx +25 -7
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @actuate-media/cms-admin
2
2
 
3
+ ## 1.17.19
4
+
5
+ ### Patch Changes
6
+
7
+ - 1b8d43c: Debounce draft saves in the page and post section editors so a quiet pause writes the draft and the existing status shows Saved.
8
+
9
+ ## 1.17.18
10
+
11
+ ### Patch Changes
12
+
13
+ - be0b1a3: Window the media browser and the page, post, and collection tables so a long list mounts only the visible rows.
14
+
3
15
  ## 1.17.17
4
16
 
5
17
  ### Patch Changes
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=virtual-window.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual-window.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/components/virtual-window.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // @vitest-environment happy-dom
3
+ import { useRef } from 'react';
4
+ import { describe, expect, it } from 'vitest';
5
+ import { render, screen } from '@testing-library/react';
6
+ import { useVirtualWindow } from '../../components/virtual-window.js';
7
+ function Probe({ count, height }) {
8
+ const scrollRef = useRef(null);
9
+ const windowed = useVirtualWindow({ count, scrollRef, estimateSize: 40, overscan: 2 });
10
+ return (_jsxs("div", { ref: scrollRef, style: { height, overflow: 'auto' }, children: [_jsx("span", { "data-testid": "rendered", children: windowed.rows.length }), windowed.rows.map((row) => (_jsxs("div", { children: ["row ", row.index] }, row.key)))] }));
11
+ }
12
+ describe('useVirtualWindow', () => {
13
+ it('mounts a window of a 1k-row list instead of every row', () => {
14
+ render(_jsx(Probe, { count: 1000, height: 200 }));
15
+ const rendered = Number(screen.getByTestId('rendered').textContent);
16
+ expect(rendered).toBeGreaterThan(0);
17
+ expect(rendered).toBeLessThan(40);
18
+ expect(screen.getByText('row 0')).toBeTruthy();
19
+ expect(screen.queryByText('row 999')).toBeNull();
20
+ });
21
+ });
22
+ //# sourceMappingURL=virtual-window.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual-window.test.js","sourceRoot":"","sources":["../../../src/__tests__/components/virtual-window.test.tsx"],"names":[],"mappings":";AAAA,gCAAgC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAA;AAErE,SAAS,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,EAAqC;IACjE,MAAM,SAAS,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAA;IAC9C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAA;IACtF,OAAO,CACL,eAAK,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,aACtD,8BAAkB,UAAU,YAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAQ,EACzD,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAC1B,kCAAwB,GAAG,CAAC,KAAK,KAAvB,GAAG,CAAC,GAAG,CAAuB,CACzC,CAAC,IACE,CACP,CAAA;AACH,CAAC;AAED,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,KAAC,KAAK,IAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAI,CAAC,CAAA;QAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,CAAA;QACnE,MAAM,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QACnC,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;QACjC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;QAC9C,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IAClD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=autosave.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autosave.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/views/autosave.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,51 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ // @vitest-environment happy-dom
3
+ import { act } from 'react';
4
+ import { afterEach, describe, expect, it, vi } from 'vitest';
5
+ import { render } from '@testing-library/react';
6
+ import { AUTOSAVE_DELAY_MS, useDebouncedAutosave } from '../../views/page-editor/autosave.js';
7
+ function Probe({ dirty, enabled = true, revision, save, }) {
8
+ useDebouncedAutosave({ dirty, enabled, revision, save });
9
+ return null;
10
+ }
11
+ afterEach(() => {
12
+ vi.useRealTimers();
13
+ });
14
+ describe('useDebouncedAutosave', () => {
15
+ it('writes the draft once the edits go quiet', () => {
16
+ vi.useFakeTimers();
17
+ const save = vi.fn();
18
+ const { rerender } = render(_jsx(Probe, { dirty: true, revision: 1, save: save }));
19
+ act(() => {
20
+ vi.advanceTimersByTime(AUTOSAVE_DELAY_MS - 100);
21
+ });
22
+ rerender(_jsx(Probe, { dirty: true, revision: 2, save: save }));
23
+ act(() => {
24
+ vi.advanceTimersByTime(AUTOSAVE_DELAY_MS - 100);
25
+ });
26
+ expect(save).not.toHaveBeenCalled();
27
+ act(() => {
28
+ vi.advanceTimersByTime(100);
29
+ });
30
+ expect(save).toHaveBeenCalledTimes(1);
31
+ });
32
+ it('does not save a clean document', () => {
33
+ vi.useFakeTimers();
34
+ const save = vi.fn();
35
+ render(_jsx(Probe, { dirty: false, revision: 1, save: save }));
36
+ act(() => {
37
+ vi.advanceTimersByTime(AUTOSAVE_DELAY_MS + 50);
38
+ });
39
+ expect(save).not.toHaveBeenCalled();
40
+ });
41
+ it('does not save when autosave is disabled', () => {
42
+ vi.useFakeTimers();
43
+ const save = vi.fn();
44
+ render(_jsx(Probe, { dirty: true, enabled: false, revision: 1, save: save }));
45
+ act(() => {
46
+ vi.advanceTimersByTime(AUTOSAVE_DELAY_MS + 50);
47
+ });
48
+ expect(save).not.toHaveBeenCalled();
49
+ });
50
+ });
51
+ //# sourceMappingURL=autosave.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autosave.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/autosave.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { type RefObject } from 'react';
2
+ export interface VirtualWindowRow {
3
+ index: number;
4
+ key: string | number | bigint;
5
+ start: number;
6
+ size: number;
7
+ }
8
+ /**
9
+ * Window of row indexes for a scroll parent. A measured scroller mounts only
10
+ * the visible range plus overscan. A shell with no layout height (admin
11
+ * render tests) still windows a long list against the initial viewport, and
12
+ * mounts a short list in full so those tests keep finding every row (#422).
13
+ */
14
+ export declare function useVirtualWindow(options: {
15
+ count: number;
16
+ scrollRef: RefObject<HTMLElement | null>;
17
+ estimateSize: number;
18
+ overscan?: number;
19
+ }): {
20
+ rows: VirtualWindowRow[];
21
+ paddingTop: number;
22
+ paddingBottom: number;
23
+ };
24
+ export declare function VirtualTablePadding({ height, columns }: {
25
+ height: number;
26
+ columns: number;
27
+ }): import("react/jsx-runtime").JSX.Element | null;
28
+ //# sourceMappingURL=virtual-window.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual-window.d.ts","sourceRoot":"","sources":["../../src/components/virtual-window.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAGnD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACb;AAYD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IACxC,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;IACxC,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,GAAG;IAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAwC1E;AAED,wBAAgB,mBAAmB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,kDAO3F"}
@@ -0,0 +1,62 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useCallback } from 'react';
3
+ import { useVirtualizer } from '@tanstack/react-virtual';
4
+ const INITIAL_VIEWPORT = 640;
5
+ function rowsInRange(start, end, estimateSize) {
6
+ const rows = [];
7
+ for (let index = start; index < end; index++) {
8
+ rows.push({ index, key: index, start: index * estimateSize, size: estimateSize });
9
+ }
10
+ return rows;
11
+ }
12
+ /**
13
+ * Window of row indexes for a scroll parent. A measured scroller mounts only
14
+ * the visible range plus overscan. A shell with no layout height (admin
15
+ * render tests) still windows a long list against the initial viewport, and
16
+ * mounts a short list in full so those tests keep finding every row (#422).
17
+ */
18
+ export function useVirtualWindow(options) {
19
+ const { count, scrollRef, estimateSize, overscan = 8 } = options;
20
+ const getScrollElement = useCallback(() => scrollRef.current, [scrollRef]);
21
+ const estimate = useCallback(() => estimateSize, [estimateSize]);
22
+ const virtualizer = useVirtualizer({
23
+ count,
24
+ getScrollElement,
25
+ estimateSize: estimate,
26
+ overscan,
27
+ initialRect: { width: 1024, height: 640 },
28
+ });
29
+ const items = virtualizer.getVirtualItems();
30
+ // Zero-height shells (happy-dom) report an empty range. Short lists stay
31
+ // fully mounted. A 1k-row list still windows against the initial viewport
32
+ // so the first paint does not build a node per row.
33
+ if (items.length === 0) {
34
+ if (count === 0 || count * estimateSize <= INITIAL_VIEWPORT) {
35
+ return { rows: rowsInRange(0, count, estimateSize), paddingTop: 0, paddingBottom: 0 };
36
+ }
37
+ const end = Math.min(count, Math.ceil(INITIAL_VIEWPORT / estimateSize) + overscan);
38
+ return {
39
+ rows: rowsInRange(0, end, estimateSize),
40
+ paddingTop: 0,
41
+ paddingBottom: Math.max(0, count * estimateSize - end * estimateSize),
42
+ };
43
+ }
44
+ const first = items[0];
45
+ const last = items[items.length - 1];
46
+ return {
47
+ rows: items.map((item) => ({
48
+ index: item.index,
49
+ key: item.key,
50
+ start: item.start,
51
+ size: item.size,
52
+ })),
53
+ paddingTop: first.start,
54
+ paddingBottom: Math.max(0, virtualizer.getTotalSize() - last.end),
55
+ };
56
+ }
57
+ export function VirtualTablePadding({ height, columns }) {
58
+ if (height <= 0)
59
+ return null;
60
+ return (_jsx("tr", { "aria-hidden": "true", children: _jsx("td", { colSpan: columns, style: { height, padding: 0, border: 0 } }) }));
61
+ }
62
+ //# sourceMappingURL=virtual-window.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual-window.js","sourceRoot":"","sources":["../../src/components/virtual-window.tsx"],"names":[],"mappings":"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"}