@payloadcms/ui 4.0.0-internal.f851106 → 4.0.0-internal.fa183d3

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/dist/elements/ArrayAction/index.d.ts +0 -2
  2. package/dist/elements/ArrayAction/index.d.ts.map +1 -1
  3. package/dist/elements/ArrayAction/index.js +24 -65
  4. package/dist/elements/ArrayAction/index.js.map +1 -1
  5. package/dist/elements/ClipboardAction/clipboardUtilities.d.ts +1 -8
  6. package/dist/elements/ClipboardAction/clipboardUtilities.d.ts.map +1 -1
  7. package/dist/elements/ClipboardAction/clipboardUtilities.js +8 -40
  8. package/dist/elements/ClipboardAction/clipboardUtilities.js.map +1 -1
  9. package/dist/elements/ClipboardAction/index.d.ts.map +1 -1
  10. package/dist/elements/ClipboardAction/index.js +1 -17
  11. package/dist/elements/ClipboardAction/index.js.map +1 -1
  12. package/dist/elements/ClipboardAction/types.d.ts +0 -3
  13. package/dist/elements/ClipboardAction/types.d.ts.map +1 -1
  14. package/dist/elements/ClipboardAction/types.js.map +1 -1
  15. package/dist/exports/layouts.d.ts +1 -0
  16. package/dist/exports/layouts.d.ts.map +1 -1
  17. package/dist/exports/layouts.js +1 -0
  18. package/dist/exports/layouts.js.map +1 -1
  19. package/dist/exports/shared/index.d.ts +1 -0
  20. package/dist/exports/shared/index.d.ts.map +1 -1
  21. package/dist/exports/shared/index.js +2 -2
  22. package/dist/exports/shared/index.js.map +4 -4
  23. package/dist/fields/Array/ArrayRow.d.ts.map +1 -1
  24. package/dist/fields/Array/ArrayRow.js +160 -97
  25. package/dist/fields/Array/ArrayRow.js.map +1 -1
  26. package/dist/fields/Blocks/BlockRow.d.ts.map +1 -1
  27. package/dist/fields/Blocks/BlockRow.js +195 -134
  28. package/dist/fields/Blocks/BlockRow.js.map +1 -1
  29. package/dist/fields/Blocks/RowActions.d.ts +0 -2
  30. package/dist/fields/Blocks/RowActions.d.ts.map +1 -1
  31. package/dist/fields/Blocks/RowActions.js +20 -23
  32. package/dist/fields/Blocks/RowActions.js.map +1 -1
  33. package/dist/forms/RenderFields/index.css +2 -16
  34. package/dist/layouts/Root/viewport.d.ts +1 -0
  35. package/dist/layouts/Root/viewport.d.ts.map +1 -1
  36. package/dist/layouts/Root/viewport.js +4 -1
  37. package/dist/layouts/Root/viewport.js.map +1 -1
  38. package/dist/styles.css +1 -1
  39. package/package.json +5 -5
  40. package/dist/elements/ClipboardAction/clipboardUtilities.spec.js +0 -120
  41. package/dist/elements/ClipboardAction/clipboardUtilities.spec.js.map +0 -1
  42. package/dist/elements/ClipboardAction/isClipboardDataValid.spec.js +0 -144
  43. package/dist/elements/ClipboardAction/isClipboardDataValid.spec.js.map +0 -1
  44. package/dist/elements/ClipboardAction/useCanPasteClipboard.d.ts +0 -10
  45. package/dist/elements/ClipboardAction/useCanPasteClipboard.d.ts.map +0 -1
  46. package/dist/elements/ClipboardAction/useCanPasteClipboard.js +0 -21
  47. package/dist/elements/ClipboardAction/useCanPasteClipboard.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/ui",
3
- "version": "4.0.0-internal.f851106",
3
+ "version": "4.0.0-internal.fa183d3",
4
4
  "homepage": "https://payloadcms.com",
5
5
  "repository": {
6
6
  "type": "git",
@@ -294,7 +294,7 @@
294
294
  "ts-essentials": "10.0.3",
295
295
  "use-context-selector": "2.0.0",
296
296
  "uuid": "14.0.0",
297
- "@payloadcms/translations": "4.0.0-internal.f851106"
297
+ "@payloadcms/translations": "4.0.0-internal.fa183d3"
298
298
  },
299
299
  "devDependencies": {
300
300
  "@babel/cli": "7.27.2",
@@ -308,13 +308,13 @@
308
308
  "babel-plugin-react-compiler": "19.1.0-rc.3",
309
309
  "esbuild": "0.27.1",
310
310
  "esbuild-sass-plugin": "3.3.1",
311
- "payload": "4.0.0-internal.f851106",
312
- "@payloadcms/eslint-config": "3.28.0"
311
+ "@payloadcms/eslint-config": "3.28.0",
312
+ "payload": "4.0.0-internal.fa183d3"
313
313
  },
314
314
  "peerDependencies": {
315
315
  "react": "^19.0.1 || ^19.1.2 || ^19.2.1",
316
316
  "react-dom": "^19.0.1 || ^19.1.2 || ^19.2.1",
317
- "payload": "4.0.0-internal.f851106"
317
+ "payload": "4.0.0-internal.fa183d3"
318
318
  },
319
319
  "engines": {
320
320
  "node": ">=24.15.0"
@@ -1,120 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
2
- import { canPasteClipboardData } from './clipboardUtilities.js';
3
- const localStorageClipboardKey = '_payloadClipboard';
4
- const textField = {
5
- name: 'text',
6
- type: 'text'
7
- };
8
- const numberField = {
9
- name: 'num',
10
- type: 'number'
11
- };
12
- const ctaBlock = {
13
- slug: 'cta',
14
- fields: [textField]
15
- };
16
- const otherBlock = {
17
- slug: 'other',
18
- fields: [numberField]
19
- };
20
- const arrayClipboard = {
21
- type: 'array',
22
- data: {
23
- 'items.0.text': {
24
- valid: true,
25
- value: 'hi'
26
- }
27
- },
28
- fields: [textField],
29
- path: 'items',
30
- rowIndex: 0
31
- };
32
- const blocksClipboard = {
33
- type: 'blocks',
34
- blocks: [ctaBlock],
35
- data: {
36
- 'layout.0.blockType': {
37
- valid: true,
38
- value: 'cta'
39
- }
40
- },
41
- path: 'layout',
42
- rowIndex: 0
43
- };
44
- class LocalStorageMock {
45
- store = {};
46
- clear() {
47
- this.store = {};
48
- }
49
- getItem(key) {
50
- return key in this.store ? this.store[key] : null;
51
- }
52
- removeItem(key) {
53
- delete this.store[key];
54
- }
55
- setItem(key, value) {
56
- this.store[key] = String(value);
57
- }
58
- }
59
- describe('canPasteClipboardData', () => {
60
- let localStorageMock;
61
- beforeEach(() => {
62
- localStorageMock = new LocalStorageMock();
63
- vi.stubGlobal('localStorage', localStorageMock);
64
- });
65
- afterEach(() => {
66
- vi.unstubAllGlobals();
67
- });
68
- const writeClipboard = data => {
69
- localStorageMock.setItem(localStorageClipboardKey, JSON.stringify(data));
70
- };
71
- it('should return false when the clipboard is empty', () => {
72
- expect(canPasteClipboardData({
73
- path: 'items',
74
- schemaFields: [textField]
75
- })).toBe(false);
76
- });
77
- it('should return false when the clipboard contains invalid JSON', () => {
78
- localStorageMock.setItem(localStorageClipboardKey, 'not-json');
79
- expect(canPasteClipboardData({
80
- path: 'items',
81
- schemaFields: [textField]
82
- })).toBe(false);
83
- });
84
- it('should return true for an array field with a matching schema', () => {
85
- writeClipboard(arrayClipboard);
86
- expect(canPasteClipboardData({
87
- path: 'items',
88
- schemaFields: [textField]
89
- })).toBe(true);
90
- });
91
- it('should return false for an array field with an incompatible schema', () => {
92
- writeClipboard(arrayClipboard);
93
- expect(canPasteClipboardData({
94
- path: 'items',
95
- schemaFields: [numberField]
96
- })).toBe(false);
97
- });
98
- it('should return true for a blocks field with a matching schema', () => {
99
- writeClipboard(blocksClipboard);
100
- expect(canPasteClipboardData({
101
- path: 'layout',
102
- schemaBlocks: [ctaBlock]
103
- })).toBe(true);
104
- });
105
- it('should return false for a blocks field with an incompatible schema', () => {
106
- writeClipboard(blocksClipboard);
107
- expect(canPasteClipboardData({
108
- path: 'layout',
109
- schemaBlocks: [otherBlock]
110
- })).toBe(false);
111
- });
112
- it('should return false when pasting array data into a blocks field', () => {
113
- writeClipboard(arrayClipboard);
114
- expect(canPasteClipboardData({
115
- path: 'layout',
116
- schemaBlocks: [ctaBlock]
117
- })).toBe(false);
118
- });
119
- });
120
- //# sourceMappingURL=clipboardUtilities.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clipboardUtilities.spec.js","names":["afterEach","beforeEach","describe","expect","it","vi","canPasteClipboardData","localStorageClipboardKey","textField","name","type","numberField","ctaBlock","slug","fields","otherBlock","arrayClipboard","data","valid","value","path","rowIndex","blocksClipboard","blocks","LocalStorageMock","store","clear","getItem","key","removeItem","setItem","String","localStorageMock","stubGlobal","unstubAllGlobals","writeClipboard","JSON","stringify","schemaFields","toBe","schemaBlocks"],"sources":["../../../src/elements/ClipboardAction/clipboardUtilities.spec.ts"],"sourcesContent":["import type { ClientBlock, ClientField } from 'payload'\n\nimport { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'\n\nimport type { ClipboardPasteData } from './types.js'\n\nimport { canPasteClipboardData } from './clipboardUtilities.js'\n\nconst localStorageClipboardKey = '_payloadClipboard'\n\nconst textField = { name: 'text', type: 'text' } as ClientField\nconst numberField = { name: 'num', type: 'number' } as ClientField\n\nconst ctaBlock = { slug: 'cta', fields: [textField] } as ClientBlock\nconst otherBlock = { slug: 'other', fields: [numberField] } as ClientBlock\n\nconst arrayClipboard: ClipboardPasteData = {\n type: 'array',\n data: { 'items.0.text': { valid: true, value: 'hi' } },\n fields: [textField],\n path: 'items',\n rowIndex: 0,\n}\n\nconst blocksClipboard: ClipboardPasteData = {\n type: 'blocks',\n blocks: [ctaBlock],\n data: { 'layout.0.blockType': { valid: true, value: 'cta' } },\n path: 'layout',\n rowIndex: 0,\n}\n\nclass LocalStorageMock {\n private store: Record<string, string> = {}\n\n clear() {\n this.store = {}\n }\n\n getItem(key: string): null | string {\n return key in this.store ? this.store[key] : null\n }\n\n removeItem(key: string) {\n delete this.store[key]\n }\n\n setItem(key: string, value: string) {\n this.store[key] = String(value)\n }\n}\n\ndescribe('canPasteClipboardData', () => {\n let localStorageMock: LocalStorageMock\n\n beforeEach(() => {\n localStorageMock = new LocalStorageMock()\n vi.stubGlobal('localStorage', localStorageMock)\n })\n\n afterEach(() => {\n vi.unstubAllGlobals()\n })\n\n const writeClipboard = (data: ClipboardPasteData) => {\n localStorageMock.setItem(localStorageClipboardKey, JSON.stringify(data))\n }\n\n it('should return false when the clipboard is empty', () => {\n expect(canPasteClipboardData({ path: 'items', schemaFields: [textField] })).toBe(false)\n })\n\n it('should return false when the clipboard contains invalid JSON', () => {\n localStorageMock.setItem(localStorageClipboardKey, 'not-json')\n\n expect(canPasteClipboardData({ path: 'items', schemaFields: [textField] })).toBe(false)\n })\n\n it('should return true for an array field with a matching schema', () => {\n writeClipboard(arrayClipboard)\n\n expect(canPasteClipboardData({ path: 'items', schemaFields: [textField] })).toBe(true)\n })\n\n it('should return false for an array field with an incompatible schema', () => {\n writeClipboard(arrayClipboard)\n\n expect(canPasteClipboardData({ path: 'items', schemaFields: [numberField] })).toBe(false)\n })\n\n it('should return true for a blocks field with a matching schema', () => {\n writeClipboard(blocksClipboard)\n\n expect(canPasteClipboardData({ path: 'layout', schemaBlocks: [ctaBlock] })).toBe(true)\n })\n\n it('should return false for a blocks field with an incompatible schema', () => {\n writeClipboard(blocksClipboard)\n\n expect(canPasteClipboardData({ path: 'layout', schemaBlocks: [otherBlock] })).toBe(false)\n })\n\n it('should return false when pasting array data into a blocks field', () => {\n writeClipboard(arrayClipboard)\n\n expect(canPasteClipboardData({ path: 'layout', schemaBlocks: [ctaBlock] })).toBe(false)\n })\n})\n"],"mappings":"AAEA,SAASA,SAAS,EAAEC,UAAU,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,EAAEC,EAAE,QAAQ;AAIhE,SAASC,qBAAqB,QAAQ;AAEtC,MAAMC,wBAAA,GAA2B;AAEjC,MAAMC,SAAA,GAAY;EAAEC,IAAA,EAAM;EAAQC,IAAA,EAAM;AAAO;AAC/C,MAAMC,WAAA,GAAc;EAAEF,IAAA,EAAM;EAAOC,IAAA,EAAM;AAAS;AAElD,MAAME,QAAA,GAAW;EAAEC,IAAA,EAAM;EAAOC,MAAA,EAAQ,CAACN,SAAA;AAAW;AACpD,MAAMO,UAAA,GAAa;EAAEF,IAAA,EAAM;EAASC,MAAA,EAAQ,CAACH,WAAA;AAAa;AAE1D,MAAMK,cAAA,GAAqC;EACzCN,IAAA,EAAM;EACNO,IAAA,EAAM;IAAE,gBAAgB;MAAEC,KAAA,EAAO;MAAMC,KAAA,EAAO;IAAK;EAAE;EACrDL,MAAA,EAAQ,CAACN,SAAA,CAAU;EACnBY,IAAA,EAAM;EACNC,QAAA,EAAU;AACZ;AAEA,MAAMC,eAAA,GAAsC;EAC1CZ,IAAA,EAAM;EACNa,MAAA,EAAQ,CAACX,QAAA,CAAS;EAClBK,IAAA,EAAM;IAAE,sBAAsB;MAAEC,KAAA,EAAO;MAAMC,KAAA,EAAO;IAAM;EAAE;EAC5DC,IAAA,EAAM;EACNC,QAAA,EAAU;AACZ;AAEA,MAAMG,gBAAA;EACIC,KAAA,GAAgC,CAAC;EAEzCC,MAAA,EAAQ;IACN,IAAI,CAACD,KAAK,GAAG,CAAC;EAChB;EAEAE,QAAQC,GAAW,EAAiB;IAClC,OAAOA,GAAA,IAAO,IAAI,CAACH,KAAK,GAAG,IAAI,CAACA,KAAK,CAACG,GAAA,CAAI,GAAG;EAC/C;EAEAC,WAAWD,GAAW,EAAE;IACtB,OAAO,IAAI,CAACH,KAAK,CAACG,GAAA,CAAI;EACxB;EAEAE,QAAQF,GAAW,EAAET,KAAa,EAAE;IAClC,IAAI,CAACM,KAAK,CAACG,GAAA,CAAI,GAAGG,MAAA,CAAOZ,KAAA;EAC3B;AACF;AAEAjB,QAAA,CAAS,yBAAyB;EAChC,IAAI8B,gBAAA;EAEJ/B,UAAA,CAAW;IACT+B,gBAAA,GAAmB,IAAIR,gBAAA;IACvBnB,EAAA,CAAG4B,UAAU,CAAC,gBAAgBD,gBAAA;EAChC;EAEAhC,SAAA,CAAU;IACRK,EAAA,CAAG6B,gBAAgB;EACrB;EAEA,MAAMC,cAAA,GAAkBlB,IAAA;IACtBe,gBAAA,CAAiBF,OAAO,CAACvB,wBAAA,EAA0B6B,IAAA,CAAKC,SAAS,CAACpB,IAAA;EACpE;EAEAb,EAAA,CAAG,mDAAmD;IACpDD,MAAA,CAAOG,qBAAA,CAAsB;MAAEc,IAAA,EAAM;MAASkB,YAAA,EAAc,CAAC9B,SAAA;IAAW,IAAI+B,IAAI,CAAC;EACnF;EAEAnC,EAAA,CAAG,gEAAgE;IACjE4B,gBAAA,CAAiBF,OAAO,CAACvB,wBAAA,EAA0B;IAEnDJ,MAAA,CAAOG,qBAAA,CAAsB;MAAEc,IAAA,EAAM;MAASkB,YAAA,EAAc,CAAC9B,SAAA;IAAW,IAAI+B,IAAI,CAAC;EACnF;EAEAnC,EAAA,CAAG,gEAAgE;IACjE+B,cAAA,CAAenB,cAAA;IAEfb,MAAA,CAAOG,qBAAA,CAAsB;MAAEc,IAAA,EAAM;MAASkB,YAAA,EAAc,CAAC9B,SAAA;IAAW,IAAI+B,IAAI,CAAC;EACnF;EAEAnC,EAAA,CAAG,sEAAsE;IACvE+B,cAAA,CAAenB,cAAA;IAEfb,MAAA,CAAOG,qBAAA,CAAsB;MAAEc,IAAA,EAAM;MAASkB,YAAA,EAAc,CAAC3B,WAAA;IAAa,IAAI4B,IAAI,CAAC;EACrF;EAEAnC,EAAA,CAAG,gEAAgE;IACjE+B,cAAA,CAAeb,eAAA;IAEfnB,MAAA,CAAOG,qBAAA,CAAsB;MAAEc,IAAA,EAAM;MAAUoB,YAAA,EAAc,CAAC5B,QAAA;IAAU,IAAI2B,IAAI,CAAC;EACnF;EAEAnC,EAAA,CAAG,sEAAsE;IACvE+B,cAAA,CAAeb,eAAA;IAEfnB,MAAA,CAAOG,qBAAA,CAAsB;MAAEc,IAAA,EAAM;MAAUoB,YAAA,EAAc,CAACzB,UAAA;IAAY,IAAIwB,IAAI,CAAC;EACrF;EAEAnC,EAAA,CAAG,mEAAmE;IACpE+B,cAAA,CAAenB,cAAA;IAEfb,MAAA,CAAOG,qBAAA,CAAsB;MAAEc,IAAA,EAAM;MAAUoB,YAAA,EAAc,CAAC5B,QAAA;IAAU,IAAI2B,IAAI,CAAC;EACnF;AACF","ignoreList":[]}
@@ -1,144 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { isClipboardDataValid } from './isClipboardDataValid.js';
3
- const textField = {
4
- name: 'text',
5
- type: 'text'
6
- };
7
- const numberField = {
8
- name: 'num',
9
- type: 'number'
10
- };
11
- const renamedTextField = {
12
- name: 'title',
13
- type: 'text'
14
- };
15
- const subArrayField = {
16
- name: 'sub',
17
- type: 'array',
18
- fields: [textField]
19
- };
20
- const subArrayFieldMismatch = {
21
- name: 'sub',
22
- type: 'array',
23
- fields: [numberField]
24
- };
25
- const ctaBlock = {
26
- slug: 'cta',
27
- fields: [textField]
28
- };
29
- const otherBlock = {
30
- slug: 'other',
31
- fields: [numberField]
32
- };
33
- const baseData = {
34
- 'items.0.text': {
35
- valid: true,
36
- value: 'hi'
37
- }
38
- };
39
- const buildArrayArgs = ({
40
- fields,
41
- schemaFields,
42
- ...overrides
43
- }) => ({
44
- type: 'array',
45
- data: baseData,
46
- fieldPath: 'items',
47
- fields,
48
- path: 'items',
49
- rowIndex: 0,
50
- schemaFields,
51
- ...overrides
52
- });
53
- const buildBlocksArgs = ({
54
- blocks,
55
- schemaBlocks
56
- }) => ({
57
- type: 'blocks',
58
- blocks,
59
- data: {
60
- 'layout.0.blockType': {
61
- valid: true,
62
- value: 'cta'
63
- }
64
- },
65
- fieldPath: 'layout',
66
- path: 'layout',
67
- rowIndex: 0,
68
- schemaBlocks
69
- });
70
- describe('isClipboardDataValid', () => {
71
- it('should return false when data is undefined', () => {
72
- expect(isClipboardDataValid(buildArrayArgs({
73
- data: undefined,
74
- fields: [textField],
75
- schemaFields: [textField]
76
- }))).toBe(false);
77
- });
78
- it('should return false when path is missing', () => {
79
- expect(isClipboardDataValid(buildArrayArgs({
80
- fields: [textField],
81
- path: '',
82
- schemaFields: [textField]
83
- }))).toBe(false);
84
- });
85
- describe('array fields', () => {
86
- it('should return true for a matching schema', () => {
87
- expect(isClipboardDataValid(buildArrayArgs({
88
- fields: [textField],
89
- schemaFields: [textField]
90
- }))).toBe(true);
91
- });
92
- it('should return false when field types differ', () => {
93
- expect(isClipboardDataValid(buildArrayArgs({
94
- fields: [textField],
95
- schemaFields: [numberField]
96
- }))).toBe(false);
97
- });
98
- it('should return false when field names differ', () => {
99
- expect(isClipboardDataValid(buildArrayArgs({
100
- fields: [textField],
101
- schemaFields: [renamedTextField]
102
- }))).toBe(false);
103
- });
104
- it('should return false when field counts differ', () => {
105
- expect(isClipboardDataValid(buildArrayArgs({
106
- fields: [textField],
107
- schemaFields: [textField, numberField]
108
- }))).toBe(false);
109
- });
110
- it('should return true for matching nested sub-fields', () => {
111
- expect(isClipboardDataValid(buildArrayArgs({
112
- fields: [subArrayField],
113
- schemaFields: [subArrayField]
114
- }))).toBe(true);
115
- });
116
- it('should return false for mismatching nested sub-fields', () => {
117
- expect(isClipboardDataValid(buildArrayArgs({
118
- fields: [subArrayField],
119
- schemaFields: [subArrayFieldMismatch]
120
- }))).toBe(false);
121
- });
122
- });
123
- describe('blocks fields', () => {
124
- it('should return true for a matching block schema', () => {
125
- expect(isClipboardDataValid(buildBlocksArgs({
126
- blocks: [ctaBlock],
127
- schemaBlocks: [ctaBlock]
128
- }))).toBe(true);
129
- });
130
- it('should return false when a copied block slug is not in the target config', () => {
131
- expect(isClipboardDataValid(buildBlocksArgs({
132
- blocks: [ctaBlock],
133
- schemaBlocks: [otherBlock]
134
- }))).toBe(false);
135
- });
136
- it('should return false when the target has no blocks configured', () => {
137
- expect(isClipboardDataValid(buildBlocksArgs({
138
- blocks: [ctaBlock],
139
- schemaBlocks: []
140
- }))).toBe(false);
141
- });
142
- });
143
- });
144
- //# sourceMappingURL=isClipboardDataValid.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"isClipboardDataValid.spec.js","names":["describe","expect","it","isClipboardDataValid","textField","name","type","numberField","renamedTextField","subArrayField","fields","subArrayFieldMismatch","ctaBlock","slug","otherBlock","baseData","valid","value","buildArrayArgs","schemaFields","overrides","data","fieldPath","path","rowIndex","buildBlocksArgs","blocks","schemaBlocks","undefined","toBe"],"sources":["../../../src/elements/ClipboardAction/isClipboardDataValid.spec.ts"],"sourcesContent":["import type { ClientBlock, ClientField } from 'payload'\n\nimport { describe, expect, it } from 'vitest'\n\nimport type { ClipboardPasteActionValidateArgs, ClipboardPasteData } from './types.js'\n\nimport { isClipboardDataValid } from './isClipboardDataValid.js'\n\nconst textField = { name: 'text', type: 'text' } as ClientField\nconst numberField = { name: 'num', type: 'number' } as ClientField\nconst renamedTextField = { name: 'title', type: 'text' } as ClientField\n\nconst subArrayField = { name: 'sub', type: 'array', fields: [textField] } as ClientField\nconst subArrayFieldMismatch = { name: 'sub', type: 'array', fields: [numberField] } as ClientField\n\nconst ctaBlock = { slug: 'cta', fields: [textField] } as ClientBlock\nconst otherBlock = { slug: 'other', fields: [numberField] } as ClientBlock\n\nconst baseData: ClipboardPasteData['data'] = { 'items.0.text': { valid: true, value: 'hi' } }\n\nconst buildArrayArgs = ({\n fields,\n schemaFields,\n ...overrides\n}: {\n fields: ClientField[]\n schemaFields: ClientField[]\n} & Partial<ClipboardPasteActionValidateArgs>): ClipboardPasteActionValidateArgs =>\n ({\n type: 'array',\n data: baseData,\n fieldPath: 'items',\n fields,\n path: 'items',\n rowIndex: 0,\n schemaFields,\n ...overrides,\n }) as ClipboardPasteActionValidateArgs\n\nconst buildBlocksArgs = ({\n blocks,\n schemaBlocks,\n}: {\n blocks: ClientBlock[]\n schemaBlocks: ClientBlock[]\n}): ClipboardPasteActionValidateArgs =>\n ({\n type: 'blocks',\n blocks,\n data: { 'layout.0.blockType': { valid: true, value: 'cta' } },\n fieldPath: 'layout',\n path: 'layout',\n rowIndex: 0,\n schemaBlocks,\n }) as ClipboardPasteActionValidateArgs\n\ndescribe('isClipboardDataValid', () => {\n it('should return false when data is undefined', () => {\n expect(\n isClipboardDataValid(\n buildArrayArgs({ data: undefined, fields: [textField], schemaFields: [textField] }),\n ),\n ).toBe(false)\n })\n\n it('should return false when path is missing', () => {\n expect(\n isClipboardDataValid(\n buildArrayArgs({ fields: [textField], path: '', schemaFields: [textField] }),\n ),\n ).toBe(false)\n })\n\n describe('array fields', () => {\n it('should return true for a matching schema', () => {\n expect(\n isClipboardDataValid(buildArrayArgs({ fields: [textField], schemaFields: [textField] })),\n ).toBe(true)\n })\n\n it('should return false when field types differ', () => {\n expect(\n isClipboardDataValid(buildArrayArgs({ fields: [textField], schemaFields: [numberField] })),\n ).toBe(false)\n })\n\n it('should return false when field names differ', () => {\n expect(\n isClipboardDataValid(\n buildArrayArgs({ fields: [textField], schemaFields: [renamedTextField] }),\n ),\n ).toBe(false)\n })\n\n it('should return false when field counts differ', () => {\n expect(\n isClipboardDataValid(\n buildArrayArgs({ fields: [textField], schemaFields: [textField, numberField] }),\n ),\n ).toBe(false)\n })\n\n it('should return true for matching nested sub-fields', () => {\n expect(\n isClipboardDataValid(\n buildArrayArgs({ fields: [subArrayField], schemaFields: [subArrayField] }),\n ),\n ).toBe(true)\n })\n\n it('should return false for mismatching nested sub-fields', () => {\n expect(\n isClipboardDataValid(\n buildArrayArgs({ fields: [subArrayField], schemaFields: [subArrayFieldMismatch] }),\n ),\n ).toBe(false)\n })\n })\n\n describe('blocks fields', () => {\n it('should return true for a matching block schema', () => {\n expect(\n isClipboardDataValid(buildBlocksArgs({ blocks: [ctaBlock], schemaBlocks: [ctaBlock] })),\n ).toBe(true)\n })\n\n it('should return false when a copied block slug is not in the target config', () => {\n expect(\n isClipboardDataValid(buildBlocksArgs({ blocks: [ctaBlock], schemaBlocks: [otherBlock] })),\n ).toBe(false)\n })\n\n it('should return false when the target has no blocks configured', () => {\n expect(isClipboardDataValid(buildBlocksArgs({ blocks: [ctaBlock], schemaBlocks: [] }))).toBe(\n false,\n )\n })\n })\n})\n"],"mappings":"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","ignoreList":[]}
@@ -1,10 +0,0 @@
1
- import type { ClipboardPasteEligibilityArgs } from './types.js';
2
- /**
3
- * Tracks whether the clipboard contents can be pasted into the target field.
4
- * Call `refresh` when a paste menu opens to re-check against the field's schema.
5
- */
6
- export declare function useCanPasteClipboard(args: ClipboardPasteEligibilityArgs): {
7
- canPaste: boolean;
8
- refresh: () => void;
9
- };
10
- //# sourceMappingURL=useCanPasteClipboard.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useCanPasteClipboard.d.ts","sourceRoot":"","sources":["../../../src/elements/ClipboardAction/useCanPasteClipboard.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAA;AAI/D;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,6BAA6B,GAAG;IACzE,QAAQ,EAAE,OAAO,CAAA;IACjB,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB,CAWA"}
@@ -1,21 +0,0 @@
1
- 'use client';
2
-
3
- import { useCallback, useRef, useState } from 'react';
4
- import { canPasteClipboardData } from './clipboardUtilities.js';
5
- /**
6
- * Tracks whether the clipboard contents can be pasted into the target field.
7
- * Call `refresh` when a paste menu opens to re-check against the field's schema.
8
- */
9
- export function useCanPasteClipboard(args) {
10
- const [canPaste, setCanPaste] = useState(false);
11
- const argsRef = useRef(args);
12
- argsRef.current = args;
13
- const refresh = useCallback(() => {
14
- setCanPaste(canPasteClipboardData(argsRef.current));
15
- }, []);
16
- return {
17
- canPaste,
18
- refresh
19
- };
20
- }
21
- //# sourceMappingURL=useCanPasteClipboard.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useCanPasteClipboard.js","names":["useCallback","useRef","useState","canPasteClipboardData","useCanPasteClipboard","args","canPaste","setCanPaste","argsRef","current","refresh"],"sources":["../../../src/elements/ClipboardAction/useCanPasteClipboard.ts"],"sourcesContent":["'use client'\nimport { useCallback, useRef, useState } from 'react'\n\nimport type { ClipboardPasteEligibilityArgs } from './types.js'\n\nimport { canPasteClipboardData } from './clipboardUtilities.js'\n\n/**\n * Tracks whether the clipboard contents can be pasted into the target field.\n * Call `refresh` when a paste menu opens to re-check against the field's schema.\n */\nexport function useCanPasteClipboard(args: ClipboardPasteEligibilityArgs): {\n canPaste: boolean\n refresh: () => void\n} {\n const [canPaste, setCanPaste] = useState<boolean>(false)\n\n const argsRef = useRef(args)\n argsRef.current = args\n\n const refresh = useCallback(() => {\n setCanPaste(canPasteClipboardData(argsRef.current))\n }, [])\n\n return { canPaste, refresh }\n}\n"],"mappings":"AAAA;;AACA,SAASA,WAAW,EAAEC,MAAM,EAAEC,QAAQ,QAAQ;AAI9C,SAASC,qBAAqB,QAAQ;AAEtC;;;;AAIA,OAAO,SAASC,qBAAqBC,IAAmC;EAItE,MAAM,CAACC,QAAA,EAAUC,WAAA,CAAY,GAAGL,QAAA,CAAkB;EAElD,MAAMM,OAAA,GAAUP,MAAA,CAAOI,IAAA;EACvBG,OAAA,CAAQC,OAAO,GAAGJ,IAAA;EAElB,MAAMK,OAAA,GAAUV,WAAA,CAAY;IAC1BO,WAAA,CAAYJ,qBAAA,CAAsBK,OAAA,CAAQC,OAAO;EACnD,GAAG,EAAE;EAEL,OAAO;IAAEH,QAAA;IAAUI;EAAQ;AAC7B","ignoreList":[]}