@payloadcms/ui 4.0.0-canary.26 → 4.0.0-canary.27

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 (26) hide show
  1. package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.d.ts.map +1 -1
  2. package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.js +10 -3
  3. package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.js.map +1 -1
  4. package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.spec.js +345 -1
  5. package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.spec.js.map +1 -1
  6. package/dist/elements/WhereBuilder/conditionValue.d.ts +32 -0
  7. package/dist/elements/WhereBuilder/conditionValue.d.ts.map +1 -0
  8. package/dist/elements/WhereBuilder/conditionValue.js +32 -0
  9. package/dist/elements/WhereBuilder/conditionValue.js.map +1 -0
  10. package/dist/elements/WhereBuilder/conditionValue.spec.js +65 -0
  11. package/dist/elements/WhereBuilder/conditionValue.spec.js.map +1 -0
  12. package/dist/elements/WhereBuilder/index.d.ts.map +1 -1
  13. package/dist/elements/WhereBuilder/index.js +15 -4
  14. package/dist/elements/WhereBuilder/index.js.map +1 -1
  15. package/dist/utilities/formatMetadata.d.ts.map +1 -1
  16. package/dist/utilities/formatMetadata.js +0 -5
  17. package/dist/utilities/formatMetadata.js.map +1 -1
  18. package/dist/views/Root/getCustomCollectionViewByRoute.d.ts.map +1 -1
  19. package/dist/views/Root/getCustomCollectionViewByRoute.js.map +1 -1
  20. package/dist/views/Root/getCustomGlobalViewByRoute.d.ts.map +1 -1
  21. package/dist/views/Root/getCustomGlobalViewByRoute.js.map +1 -1
  22. package/dist/views/Root/getCustomViewByKey.d.ts.map +1 -1
  23. package/dist/views/Root/getCustomViewByKey.js.map +1 -1
  24. package/dist/views/Version/generateVersionViewMetadata.js.map +1 -1
  25. package/dist/views/Versions/generateVersionsViewMetadata.js.map +1 -1
  26. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"mergeFormStateFromClipboard.spec.js","names":["ObjectIdImport","describe","expect","it","mergeFormStateFromClipboard","ObjectId","default","copiedBlockID","toHexString","formState","layout","valid","value","initialValue","rows","clipboardData","type","path","blocks","data","rowIndex","result","dataFromClipboard","toBeDefined","not","toEqual","isValid","toBe","toHaveLength","id","copiedNestedBlockID","duplicate","copiedArrayItemID1","copiedArrayItemID2","copiedArrayItemID3","targetBlockID","ctas","blockType","isLoading","copiedArrayID","items","fields","copiedNestedArrayID","disableSort"],"sources":["../../../src/elements/ClipboardAction/mergeFormStateFromClipboard.spec.ts"],"sourcesContent":["import type { FormState } from 'payload'\n\nimport ObjectIdImport from 'bson-objectid'\nimport { describe, expect, it } from 'vitest'\n\nimport { mergeFormStateFromClipboard } from './mergeFormStateFromClipboard.js'\nimport type { ClipboardPasteData } from './types.js'\n\nconst ObjectId = (\n 'default' in ObjectIdImport ? ObjectIdImport.default : ObjectIdImport\n) as typeof ObjectIdImport\n\ndescribe('mergeFormStateFromClipboard', () => {\n describe('block ID regeneration', () => {\n it('should generate new IDs when pasting blocks to prevent duplicates', () => {\n const copiedBlockID = new ObjectId().toHexString()\n\n const formState: FormState = {\n layout: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n const clipboardData: ClipboardPasteData = {\n type: 'blocks',\n path: 'layout',\n blocks: [],\n data: {\n 'layout.0.id': {\n value: copiedBlockID,\n valid: true,\n },\n 'layout.0.blockType': {\n value: 'content',\n valid: true,\n },\n 'layout.0.text': {\n value: 'test content',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'layout',\n })\n\n // Check that a new ID was generated\n expect(result['layout.0.id']).toBeDefined()\n expect(result['layout.0.id'].value).toBeDefined()\n expect(result['layout.0.id'].value).not.toEqual(copiedBlockID)\n expect(ObjectId.isValid(result['layout.0.id'].value as string)).toBe(true)\n\n // Check that the row metadata also has the new ID\n expect(result.layout.rows).toHaveLength(1)\n expect(result.layout.rows?.[0]?.id).not.toEqual(copiedBlockID)\n expect(result.layout.rows?.[0]?.id).toEqual(result['layout.0.id'].value)\n })\n\n it('should generate new IDs for nested blocks', () => {\n const copiedBlockID = new ObjectId().toHexString()\n const copiedNestedBlockID = new ObjectId().toHexString()\n\n const formState: FormState = {\n layout: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n const clipboardData: ClipboardPasteData = {\n type: 'blocks',\n path: 'layout',\n blocks: [],\n data: {\n 'layout.0.id': {\n value: copiedBlockID,\n valid: true,\n },\n 'layout.0.blockType': {\n value: 'container',\n valid: true,\n },\n 'layout.0.subBlocks': {\n value: 1,\n valid: true,\n rows: [{ id: copiedNestedBlockID }],\n },\n 'layout.0.subBlocks.0.id': {\n value: copiedNestedBlockID,\n valid: true,\n },\n 'layout.0.subBlocks.0.blockType': {\n value: 'content',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'layout',\n })\n\n // Check that parent block got new ID\n expect(result['layout.0.id'].value).not.toEqual(copiedBlockID)\n expect(ObjectId.isValid(result['layout.0.id'].value as string)).toBe(true)\n\n // Check that nested block got new ID\n expect(result['layout.0.subBlocks.0.id'].value).not.toEqual(copiedNestedBlockID)\n expect(ObjectId.isValid(result['layout.0.subBlocks.0.id'].value as string)).toBe(true)\n\n // Check that parent and nested IDs are different\n expect(result['layout.0.id'].value).not.toEqual(result['layout.0.subBlocks.0.id'].value)\n\n // Check that parent row metadata has new ID\n expect(result.layout.rows?.[0]?.id).toEqual(result['layout.0.id'].value)\n\n // Check that nested row metadata has new ID\n expect(result['layout.0.subBlocks'].rows?.[0]?.id).toEqual(\n result['layout.0.subBlocks.0.id'].value,\n )\n })\n\n it('should preserve non-ID field values when pasting', () => {\n const copiedBlockID = new ObjectId().toHexString()\n\n const formState: FormState = {\n layout: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n const clipboardData: ClipboardPasteData = {\n type: 'blocks',\n path: 'layout',\n blocks: [],\n data: {\n 'layout.0.id': {\n value: copiedBlockID,\n valid: true,\n },\n 'layout.0.blockType': {\n value: 'content',\n valid: true,\n },\n 'layout.0.text': {\n value: 'preserved text content',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'layout',\n })\n\n // Non-ID fields should be preserved\n expect(result['layout.0.blockType'].value).toEqual('content')\n expect(result['layout.0.text'].value).toEqual('preserved text content')\n })\n\n it('should generate new ID when pasting from row to field', () => {\n const copiedBlockID = new ObjectId().toHexString()\n\n const formState: FormState = {\n duplicate: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n // Simulating copying from blocks.1 and pasting into duplicate field\n const clipboardData = {\n type: 'blocks' as const,\n path: 'blocks',\n blocks: [],\n data: {\n 'blocks.1.id': {\n value: copiedBlockID,\n valid: true,\n },\n 'blocks.1.blockType': {\n value: 'number',\n valid: true,\n },\n 'blocks.1.number': {\n value: 342,\n valid: true,\n },\n },\n rowIndex: 1,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'duplicate',\n })\n\n // Check that a new ID was generated\n expect(result['duplicate.0.id']).toBeDefined()\n expect(result['duplicate.0.id'].value).toBeDefined()\n expect(result['duplicate.0.id'].value).not.toEqual(copiedBlockID)\n expect(ObjectId.isValid(result['duplicate.0.id'].value as string)).toBe(true)\n\n // Check that the row metadata has the new ID (not the copied ID)\n expect(result.duplicate.rows).toBeDefined()\n expect(result.duplicate.rows).toHaveLength(1)\n expect(result.duplicate.rows![0].id).not.toEqual(copiedBlockID)\n expect(result.duplicate.rows![0].id).toEqual(result['duplicate.0.id'].value)\n\n // Check that other fields were preserved\n expect(result['duplicate.0.number'].value).toEqual(342)\n })\n })\n\n describe('block row paste with nested array', () => {\n it('should regenerate nested array item IDs when pasting a block row', () => {\n const copiedBlockID = new ObjectId().toHexString()\n const copiedArrayItemID1 = new ObjectId().toHexString()\n const copiedArrayItemID2 = new ObjectId().toHexString()\n const copiedArrayItemID3 = new ObjectId().toHexString()\n const targetBlockID = new ObjectId().toHexString()\n\n // Target form state: block at index 1 with empty buttons array\n const formState: FormState = {\n ctas: {\n valid: true,\n value: 2,\n initialValue: 2,\n rows: [\n { id: copiedBlockID, blockType: 'callToAction', isLoading: false },\n { id: targetBlockID, blockType: 'callToAction', isLoading: false },\n ],\n },\n 'ctas.0': { value: 'callToAction', valid: true },\n 'ctas.0.id': { value: copiedBlockID, valid: true },\n 'ctas.0.buttons': {\n valid: true,\n value: 3,\n rows: [\n { id: copiedArrayItemID1, isLoading: false },\n { id: copiedArrayItemID2, isLoading: false },\n { id: copiedArrayItemID3, isLoading: false },\n ],\n },\n 'ctas.0.buttons.0.id': { value: copiedArrayItemID1, valid: true },\n 'ctas.0.buttons.1.id': { value: copiedArrayItemID2, valid: true },\n 'ctas.0.buttons.2.id': { value: copiedArrayItemID3, valid: true },\n 'ctas.1': { value: 'callToAction', valid: true },\n 'ctas.1.id': { value: targetBlockID, valid: true },\n 'ctas.1.buttons': {\n valid: true,\n value: 0,\n rows: [],\n },\n }\n\n // Clipboard: block row 0 (source) with 3 buttons\n const clipboardData: ClipboardPasteData = {\n type: 'blocks',\n path: 'ctas',\n blocks: [],\n rowIndex: 0,\n data: {\n 'ctas.0': { value: 'callToAction', valid: true },\n 'ctas.0.id': { value: copiedBlockID, valid: true },\n 'ctas.0.buttons': {\n valid: true,\n value: 3,\n rows: [\n { id: copiedArrayItemID1, isLoading: false },\n { id: copiedArrayItemID2, isLoading: false },\n { id: copiedArrayItemID3, isLoading: false },\n ],\n },\n 'ctas.0.buttons.0.id': { value: copiedArrayItemID1, valid: true },\n 'ctas.0.buttons.0.label': { value: 'Button 1', valid: true },\n 'ctas.0.buttons.1.id': { value: copiedArrayItemID2, valid: true },\n 'ctas.0.buttons.1.label': { value: 'Button 2', valid: true },\n 'ctas.0.buttons.2.id': { value: copiedArrayItemID3, valid: true },\n 'ctas.0.buttons.2.label': { value: 'Button 3', valid: true },\n },\n }\n\n // Paste into block row 1 (target)\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'ctas',\n rowIndex: 1,\n })\n\n // Target block ID should NOT be overwritten\n expect(result['ctas.1.id'].value).toEqual(targetBlockID)\n\n // Nested array items should have NEW IDs (not the source IDs)\n expect(result['ctas.1.buttons.0.id']).toBeDefined()\n expect(result['ctas.1.buttons.0.id'].value).not.toEqual(copiedArrayItemID1)\n expect(ObjectId.isValid(result['ctas.1.buttons.0.id'].value as string)).toBe(true)\n\n expect(result['ctas.1.buttons.1.id']).toBeDefined()\n expect(result['ctas.1.buttons.1.id'].value).not.toEqual(copiedArrayItemID2)\n\n expect(result['ctas.1.buttons.2.id']).toBeDefined()\n expect(result['ctas.1.buttons.2.id'].value).not.toEqual(copiedArrayItemID3)\n\n // The rows metadata in ctas.1.buttons should have the new IDs\n expect(result['ctas.1.buttons'].rows).toHaveLength(3)\n expect(result['ctas.1.buttons'].rows![0].id).toEqual(result['ctas.1.buttons.0.id'].value)\n expect(result['ctas.1.buttons'].rows![1].id).toEqual(result['ctas.1.buttons.1.id'].value)\n expect(result['ctas.1.buttons'].rows![2].id).toEqual(result['ctas.1.buttons.2.id'].value)\n\n // Field values should be copied\n expect(result['ctas.1.buttons.0.label'].value).toEqual('Button 1')\n expect(result['ctas.1.buttons.1.label'].value).toEqual('Button 2')\n expect(result['ctas.1.buttons.2.label'].value).toEqual('Button 3')\n\n // Source block should be untouched\n expect(result['ctas.0.id'].value).toEqual(copiedBlockID)\n expect(result['ctas.0.buttons'].rows).toHaveLength(3)\n })\n })\n\n describe('array ID regeneration', () => {\n it('should generate new IDs when pasting arrays to prevent duplicates', () => {\n const copiedArrayID = new ObjectId().toHexString()\n\n const formState: FormState = {\n items: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n const clipboardData: ClipboardPasteData = {\n type: 'array',\n path: 'items',\n fields: [],\n data: {\n 'items.0.id': {\n value: copiedArrayID,\n valid: true,\n },\n 'items.0.text': {\n value: 'test content',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'items',\n })\n\n // Check that a new ID was generated\n expect(result['items.0.id']).toBeDefined()\n expect(result['items.0.id'].value).toBeDefined()\n expect(result['items.0.id'].value).not.toEqual(copiedArrayID)\n expect(ObjectId.isValid(result['items.0.id'].value as string)).toBe(true)\n\n // Check that the row metadata also has the new ID\n expect(result.items.rows).toHaveLength(1)\n expect(result.items.rows?.[0]?.id).not.toEqual(copiedArrayID)\n expect(result.items.rows?.[0]?.id).toEqual(result['items.0.id'].value)\n })\n\n it('should generate new IDs for nested arrays', () => {\n const copiedArrayID = new ObjectId().toHexString()\n const copiedNestedArrayID = new ObjectId().toHexString()\n\n const formState: FormState = {\n items: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n const clipboardData: ClipboardPasteData = {\n type: 'array',\n path: 'items',\n fields: [],\n data: {\n 'items.0.id': {\n value: copiedArrayID,\n valid: true,\n },\n 'items.0.text': {\n value: 'parent array',\n valid: true,\n },\n 'items.0.subArray': {\n value: 1,\n valid: true,\n rows: [{ id: copiedNestedArrayID }],\n },\n 'items.0.subArray.0.id': {\n value: copiedNestedArrayID,\n valid: true,\n },\n 'items.0.subArray.0.text': {\n value: 'nested array',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'items',\n })\n\n // Check that parent array got new ID\n expect(result['items.0.id'].value).not.toEqual(copiedArrayID)\n expect(ObjectId.isValid(result['items.0.id'].value as string)).toBe(true)\n\n // Check that nested array got new ID\n expect(result['items.0.subArray.0.id'].value).not.toEqual(copiedNestedArrayID)\n expect(ObjectId.isValid(result['items.0.subArray.0.id'].value as string)).toBe(true)\n\n // Check that parent and nested IDs are different\n expect(result['items.0.id'].value).not.toEqual(result['items.0.subArray.0.id'].value)\n\n // Check that parent row metadata has new ID\n expect(result.items.rows?.[0]?.id).toEqual(result['items.0.id'].value)\n\n // Check that nested row metadata has new ID\n expect(result['items.0.subArray'].rows?.[0]?.id).toEqual(\n result['items.0.subArray.0.id'].value,\n )\n })\n\n it('should preserve non-ID field values when pasting arrays', () => {\n const copiedArrayID = new ObjectId().toHexString()\n\n const formState: FormState = {\n items: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n const clipboardData: ClipboardPasteData = {\n type: 'array',\n path: 'items',\n fields: [],\n data: {\n 'items.0.id': {\n value: copiedArrayID,\n valid: true,\n },\n 'items.0.text': {\n value: 'preserved array text',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'items',\n })\n\n // Non-ID fields should be preserved\n expect(result['items.0.text'].value).toEqual('preserved array text')\n })\n\n it('should generate new ID when pasting from array row to field', () => {\n const copiedArrayID = new ObjectId().toHexString()\n\n const formState: FormState = {\n disableSort: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n // Simulating copying from items.0 and pasting into disableSort field\n const clipboardData = {\n type: 'array' as const,\n path: 'items',\n fields: [],\n data: {\n 'items.0.id': {\n value: copiedArrayID,\n valid: true,\n },\n 'items.0.text': {\n value: 'row one',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'disableSort',\n })\n\n // Check that a new ID was generated\n expect(result['disableSort.0.id']).toBeDefined()\n expect(result['disableSort.0.id'].value).toBeDefined()\n expect(result['disableSort.0.id'].value).not.toEqual(copiedArrayID)\n expect(ObjectId.isValid(result['disableSort.0.id'].value as string)).toBe(true)\n\n // Check that the row metadata has the new ID (not the copied ID)\n expect(result.disableSort.rows).toBeDefined()\n expect(result.disableSort.rows).toHaveLength(1)\n expect(result.disableSort.rows![0].id).not.toEqual(copiedArrayID)\n expect(result.disableSort.rows![0].id).toEqual(result['disableSort.0.id'].value)\n\n // Check that other fields were preserved\n expect(result['disableSort.0.text'].value).toEqual('row one')\n })\n })\n})\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"mergeFormStateFromClipboard.spec.js","names":["ObjectIdImport","describe","expect","it","mergeFormStateFromClipboard","reduceFormStateByPath","ObjectId","default","copiedBlockID","toHexString","formState","layout","valid","value","initialValue","rows","clipboardData","type","path","blocks","data","rowIndex","result","dataFromClipboard","toBeDefined","not","toEqual","isValid","toBe","toHaveLength","id","copiedNestedBlockID","duplicate","copiedArrayItemID1","copiedArrayItemID2","copiedArrayItemID3","targetBlockID","ctas","blockType","isLoading","copiedArrayID","items","fields","copiedNestedArrayID","disableSort","children","Array","from","length","filtered","filteredKeys","Object","keys","sort","toBeUndefined","childrenOther","sourceID","sourceBlockID"],"sources":["../../../src/elements/ClipboardAction/mergeFormStateFromClipboard.spec.ts"],"sourcesContent":["import type { FormState } from 'payload'\n\nimport ObjectIdImport from 'bson-objectid'\nimport { describe, expect, it } from 'vitest'\n\nimport {\n mergeFormStateFromClipboard,\n reduceFormStateByPath,\n} from './mergeFormStateFromClipboard.js'\nimport type { ClipboardPasteData } from './types.js'\n\nconst ObjectId = (\n 'default' in ObjectIdImport ? ObjectIdImport.default : ObjectIdImport\n) as typeof ObjectIdImport\n\ndescribe('mergeFormStateFromClipboard', () => {\n describe('block ID regeneration', () => {\n it('should generate new IDs when pasting blocks to prevent duplicates', () => {\n const copiedBlockID = new ObjectId().toHexString()\n\n const formState: FormState = {\n layout: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n const clipboardData: ClipboardPasteData = {\n type: 'blocks',\n path: 'layout',\n blocks: [],\n data: {\n 'layout.0.id': {\n value: copiedBlockID,\n valid: true,\n },\n 'layout.0.blockType': {\n value: 'content',\n valid: true,\n },\n 'layout.0.text': {\n value: 'test content',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'layout',\n })\n\n // Check that a new ID was generated\n expect(result['layout.0.id']).toBeDefined()\n expect(result['layout.0.id'].value).toBeDefined()\n expect(result['layout.0.id'].value).not.toEqual(copiedBlockID)\n expect(ObjectId.isValid(result['layout.0.id'].value as string)).toBe(true)\n\n // Check that the row metadata also has the new ID\n expect(result.layout.rows).toHaveLength(1)\n expect(result.layout.rows?.[0]?.id).not.toEqual(copiedBlockID)\n expect(result.layout.rows?.[0]?.id).toEqual(result['layout.0.id'].value)\n })\n\n it('should generate new IDs for nested blocks', () => {\n const copiedBlockID = new ObjectId().toHexString()\n const copiedNestedBlockID = new ObjectId().toHexString()\n\n const formState: FormState = {\n layout: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n const clipboardData: ClipboardPasteData = {\n type: 'blocks',\n path: 'layout',\n blocks: [],\n data: {\n 'layout.0.id': {\n value: copiedBlockID,\n valid: true,\n },\n 'layout.0.blockType': {\n value: 'container',\n valid: true,\n },\n 'layout.0.subBlocks': {\n value: 1,\n valid: true,\n rows: [{ id: copiedNestedBlockID }],\n },\n 'layout.0.subBlocks.0.id': {\n value: copiedNestedBlockID,\n valid: true,\n },\n 'layout.0.subBlocks.0.blockType': {\n value: 'content',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'layout',\n })\n\n // Check that parent block got new ID\n expect(result['layout.0.id'].value).not.toEqual(copiedBlockID)\n expect(ObjectId.isValid(result['layout.0.id'].value as string)).toBe(true)\n\n // Check that nested block got new ID\n expect(result['layout.0.subBlocks.0.id'].value).not.toEqual(copiedNestedBlockID)\n expect(ObjectId.isValid(result['layout.0.subBlocks.0.id'].value as string)).toBe(true)\n\n // Check that parent and nested IDs are different\n expect(result['layout.0.id'].value).not.toEqual(result['layout.0.subBlocks.0.id'].value)\n\n // Check that parent row metadata has new ID\n expect(result.layout.rows?.[0]?.id).toEqual(result['layout.0.id'].value)\n\n // Check that nested row metadata has new ID\n expect(result['layout.0.subBlocks'].rows?.[0]?.id).toEqual(\n result['layout.0.subBlocks.0.id'].value,\n )\n })\n\n it('should preserve non-ID field values when pasting', () => {\n const copiedBlockID = new ObjectId().toHexString()\n\n const formState: FormState = {\n layout: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n const clipboardData: ClipboardPasteData = {\n type: 'blocks',\n path: 'layout',\n blocks: [],\n data: {\n 'layout.0.id': {\n value: copiedBlockID,\n valid: true,\n },\n 'layout.0.blockType': {\n value: 'content',\n valid: true,\n },\n 'layout.0.text': {\n value: 'preserved text content',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'layout',\n })\n\n // Non-ID fields should be preserved\n expect(result['layout.0.blockType'].value).toEqual('content')\n expect(result['layout.0.text'].value).toEqual('preserved text content')\n })\n\n it('should generate new ID when pasting from row to field', () => {\n const copiedBlockID = new ObjectId().toHexString()\n\n const formState: FormState = {\n duplicate: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n // Simulating copying from blocks.1 and pasting into duplicate field\n const clipboardData = {\n type: 'blocks' as const,\n path: 'blocks',\n blocks: [],\n data: {\n 'blocks.1.id': {\n value: copiedBlockID,\n valid: true,\n },\n 'blocks.1.blockType': {\n value: 'number',\n valid: true,\n },\n 'blocks.1.number': {\n value: 342,\n valid: true,\n },\n },\n rowIndex: 1,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'duplicate',\n })\n\n // Check that a new ID was generated\n expect(result['duplicate.0.id']).toBeDefined()\n expect(result['duplicate.0.id'].value).toBeDefined()\n expect(result['duplicate.0.id'].value).not.toEqual(copiedBlockID)\n expect(ObjectId.isValid(result['duplicate.0.id'].value as string)).toBe(true)\n\n // Check that the row metadata has the new ID (not the copied ID)\n expect(result.duplicate.rows).toBeDefined()\n expect(result.duplicate.rows).toHaveLength(1)\n expect(result.duplicate.rows![0].id).not.toEqual(copiedBlockID)\n expect(result.duplicate.rows![0].id).toEqual(result['duplicate.0.id'].value)\n\n // Check that other fields were preserved\n expect(result['duplicate.0.number'].value).toEqual(342)\n })\n })\n\n describe('block row paste with nested array', () => {\n it('should regenerate nested array item IDs when pasting a block row', () => {\n const copiedBlockID = new ObjectId().toHexString()\n const copiedArrayItemID1 = new ObjectId().toHexString()\n const copiedArrayItemID2 = new ObjectId().toHexString()\n const copiedArrayItemID3 = new ObjectId().toHexString()\n const targetBlockID = new ObjectId().toHexString()\n\n // Target form state: block at index 1 with empty buttons array\n const formState: FormState = {\n ctas: {\n valid: true,\n value: 2,\n initialValue: 2,\n rows: [\n { id: copiedBlockID, blockType: 'callToAction', isLoading: false },\n { id: targetBlockID, blockType: 'callToAction', isLoading: false },\n ],\n },\n 'ctas.0': { value: 'callToAction', valid: true },\n 'ctas.0.id': { value: copiedBlockID, valid: true },\n 'ctas.0.buttons': {\n valid: true,\n value: 3,\n rows: [\n { id: copiedArrayItemID1, isLoading: false },\n { id: copiedArrayItemID2, isLoading: false },\n { id: copiedArrayItemID3, isLoading: false },\n ],\n },\n 'ctas.0.buttons.0.id': { value: copiedArrayItemID1, valid: true },\n 'ctas.0.buttons.1.id': { value: copiedArrayItemID2, valid: true },\n 'ctas.0.buttons.2.id': { value: copiedArrayItemID3, valid: true },\n 'ctas.1': { value: 'callToAction', valid: true },\n 'ctas.1.id': { value: targetBlockID, valid: true },\n 'ctas.1.buttons': {\n valid: true,\n value: 0,\n rows: [],\n },\n }\n\n // Clipboard: block row 0 (source) with 3 buttons\n const clipboardData: ClipboardPasteData = {\n type: 'blocks',\n path: 'ctas',\n blocks: [],\n rowIndex: 0,\n data: {\n 'ctas.0': { value: 'callToAction', valid: true },\n 'ctas.0.id': { value: copiedBlockID, valid: true },\n 'ctas.0.buttons': {\n valid: true,\n value: 3,\n rows: [\n { id: copiedArrayItemID1, isLoading: false },\n { id: copiedArrayItemID2, isLoading: false },\n { id: copiedArrayItemID3, isLoading: false },\n ],\n },\n 'ctas.0.buttons.0.id': { value: copiedArrayItemID1, valid: true },\n 'ctas.0.buttons.0.label': { value: 'Button 1', valid: true },\n 'ctas.0.buttons.1.id': { value: copiedArrayItemID2, valid: true },\n 'ctas.0.buttons.1.label': { value: 'Button 2', valid: true },\n 'ctas.0.buttons.2.id': { value: copiedArrayItemID3, valid: true },\n 'ctas.0.buttons.2.label': { value: 'Button 3', valid: true },\n },\n }\n\n // Paste into block row 1 (target)\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'ctas',\n rowIndex: 1,\n })\n\n // Target block ID should NOT be overwritten\n expect(result['ctas.1.id'].value).toEqual(targetBlockID)\n\n // Nested array items should have NEW IDs (not the source IDs)\n expect(result['ctas.1.buttons.0.id']).toBeDefined()\n expect(result['ctas.1.buttons.0.id'].value).not.toEqual(copiedArrayItemID1)\n expect(ObjectId.isValid(result['ctas.1.buttons.0.id'].value as string)).toBe(true)\n\n expect(result['ctas.1.buttons.1.id']).toBeDefined()\n expect(result['ctas.1.buttons.1.id'].value).not.toEqual(copiedArrayItemID2)\n\n expect(result['ctas.1.buttons.2.id']).toBeDefined()\n expect(result['ctas.1.buttons.2.id'].value).not.toEqual(copiedArrayItemID3)\n\n // The rows metadata in ctas.1.buttons should have the new IDs\n expect(result['ctas.1.buttons'].rows).toHaveLength(3)\n expect(result['ctas.1.buttons'].rows![0].id).toEqual(result['ctas.1.buttons.0.id'].value)\n expect(result['ctas.1.buttons'].rows![1].id).toEqual(result['ctas.1.buttons.1.id'].value)\n expect(result['ctas.1.buttons'].rows![2].id).toEqual(result['ctas.1.buttons.2.id'].value)\n\n // Field values should be copied\n expect(result['ctas.1.buttons.0.label'].value).toEqual('Button 1')\n expect(result['ctas.1.buttons.1.label'].value).toEqual('Button 2')\n expect(result['ctas.1.buttons.2.label'].value).toEqual('Button 3')\n\n // Source block should be untouched\n expect(result['ctas.0.id'].value).toEqual(copiedBlockID)\n expect(result['ctas.0.buttons'].rows).toHaveLength(3)\n })\n })\n\n describe('array ID regeneration', () => {\n it('should generate new IDs when pasting arrays to prevent duplicates', () => {\n const copiedArrayID = new ObjectId().toHexString()\n\n const formState: FormState = {\n items: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n const clipboardData: ClipboardPasteData = {\n type: 'array',\n path: 'items',\n fields: [],\n data: {\n 'items.0.id': {\n value: copiedArrayID,\n valid: true,\n },\n 'items.0.text': {\n value: 'test content',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'items',\n })\n\n // Check that a new ID was generated\n expect(result['items.0.id']).toBeDefined()\n expect(result['items.0.id'].value).toBeDefined()\n expect(result['items.0.id'].value).not.toEqual(copiedArrayID)\n expect(ObjectId.isValid(result['items.0.id'].value as string)).toBe(true)\n\n // Check that the row metadata also has the new ID\n expect(result.items.rows).toHaveLength(1)\n expect(result.items.rows?.[0]?.id).not.toEqual(copiedArrayID)\n expect(result.items.rows?.[0]?.id).toEqual(result['items.0.id'].value)\n })\n\n it('should generate new IDs for nested arrays', () => {\n const copiedArrayID = new ObjectId().toHexString()\n const copiedNestedArrayID = new ObjectId().toHexString()\n\n const formState: FormState = {\n items: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n const clipboardData: ClipboardPasteData = {\n type: 'array',\n path: 'items',\n fields: [],\n data: {\n 'items.0.id': {\n value: copiedArrayID,\n valid: true,\n },\n 'items.0.text': {\n value: 'parent array',\n valid: true,\n },\n 'items.0.subArray': {\n value: 1,\n valid: true,\n rows: [{ id: copiedNestedArrayID }],\n },\n 'items.0.subArray.0.id': {\n value: copiedNestedArrayID,\n valid: true,\n },\n 'items.0.subArray.0.text': {\n value: 'nested array',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'items',\n })\n\n // Check that parent array got new ID\n expect(result['items.0.id'].value).not.toEqual(copiedArrayID)\n expect(ObjectId.isValid(result['items.0.id'].value as string)).toBe(true)\n\n // Check that nested array got new ID\n expect(result['items.0.subArray.0.id'].value).not.toEqual(copiedNestedArrayID)\n expect(ObjectId.isValid(result['items.0.subArray.0.id'].value as string)).toBe(true)\n\n // Check that parent and nested IDs are different\n expect(result['items.0.id'].value).not.toEqual(result['items.0.subArray.0.id'].value)\n\n // Check that parent row metadata has new ID\n expect(result.items.rows?.[0]?.id).toEqual(result['items.0.id'].value)\n\n // Check that nested row metadata has new ID\n expect(result['items.0.subArray'].rows?.[0]?.id).toEqual(\n result['items.0.subArray.0.id'].value,\n )\n })\n\n it('should preserve non-ID field values when pasting arrays', () => {\n const copiedArrayID = new ObjectId().toHexString()\n\n const formState: FormState = {\n items: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n const clipboardData: ClipboardPasteData = {\n type: 'array',\n path: 'items',\n fields: [],\n data: {\n 'items.0.id': {\n value: copiedArrayID,\n valid: true,\n },\n 'items.0.text': {\n value: 'preserved array text',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'items',\n })\n\n // Non-ID fields should be preserved\n expect(result['items.0.text'].value).toEqual('preserved array text')\n })\n\n it('should generate new ID when pasting from array row to field', () => {\n const copiedArrayID = new ObjectId().toHexString()\n\n const formState: FormState = {\n disableSort: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n // Simulating copying from items.0 and pasting into disableSort field\n const clipboardData = {\n type: 'array' as const,\n path: 'items',\n fields: [],\n data: {\n 'items.0.id': {\n value: copiedArrayID,\n valid: true,\n },\n 'items.0.text': {\n value: 'row one',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'disableSort',\n })\n\n // Check that a new ID was generated\n expect(result['disableSort.0.id']).toBeDefined()\n expect(result['disableSort.0.id'].value).toBeDefined()\n expect(result['disableSort.0.id'].value).not.toEqual(copiedArrayID)\n expect(ObjectId.isValid(result['disableSort.0.id'].value as string)).toBe(true)\n\n // Check that the row metadata has the new ID (not the copied ID)\n expect(result.disableSort.rows).toBeDefined()\n expect(result.disableSort.rows).toHaveLength(1)\n expect(result.disableSort.rows![0].id).not.toEqual(copiedArrayID)\n expect(result.disableSort.rows![0].id).toEqual(result['disableSort.0.id'].value)\n\n // Check that other fields were preserved\n expect(result['disableSort.0.text'].value).toEqual('row one')\n })\n })\n\n describe('prefix collision with multi-digit sibling indices', () => {\n it('reduceFormStateByPath should not leak siblings whose indices share a digit prefix', () => {\n // Array with 13 rows. Copying row 1 must filter out rows 10/11/12, whose\n // paths all begin with the substring `children.1`.\n const formState: FormState = {\n children: {\n valid: true,\n value: 13,\n rows: Array.from({ length: 13 }, () => ({ isLoading: false })),\n },\n 'children.1.id': { value: 'id-1', valid: true },\n 'children.1.title': { value: 'Row 1', valid: true },\n 'children.10.id': { value: 'id-10', valid: true },\n 'children.10.title': { value: 'Row 10', valid: true },\n 'children.11.id': { value: 'id-11', valid: true },\n 'children.11.title': { value: 'Row 11', valid: true },\n 'children.12.id': { value: 'id-12', valid: true },\n 'children.12.title': { value: 'Row 12', valid: true },\n }\n\n const filtered = reduceFormStateByPath({\n formState,\n path: 'children',\n rowIndex: 1,\n })\n\n const filteredKeys = Object.keys(filtered).sort()\n expect(filteredKeys).toEqual(['children.1.id', 'children.1.title'])\n expect(filtered['children.10.id']).toBeUndefined()\n expect(filtered['children.11.id']).toBeUndefined()\n expect(filtered['children.12.id']).toBeUndefined()\n })\n\n it('reduceFormStateByPath should not leak field-name siblings sharing a textual prefix', () => {\n // `children` vs `childrenOther`: loose prefix matching pulls the wrong field's state.\n const formState: FormState = {\n children: { valid: true, value: 1, rows: [{ isLoading: false }] },\n 'children.0.id': { value: 'children-row', valid: true },\n childrenOther: { valid: true, value: 1, rows: [{ isLoading: false }] },\n 'childrenOther.0.id': { value: 'other-row', valid: true },\n }\n\n const filtered = reduceFormStateByPath({ formState, path: 'children' })\n\n // The field's own key carries `rows` and `value`, so it must survive the filter.\n expect(filtered.children).toBeDefined()\n expect(filtered['children.0.id']).toBeDefined()\n expect(filtered.childrenOther).toBeUndefined()\n expect(filtered['childrenOther.0.id']).toBeUndefined()\n })\n\n it('paste should not create out-of-bounds rows from a leaked clipboard payload', () => {\n // Simulates the end-to-end Copy/Paste flow against an array with 13 rows. Even if a\n // pre-fix clipboard leaked sibling rows (.10/.11/.12) when copying row 1, the merge\n // filter must drop them rather than rewriting them to .50/.51/.52 when pasting into\n // row 5.\n const formState: FormState = {\n children: {\n valid: true,\n value: 13,\n rows: Array.from({ length: 13 }, () => ({\n id: new ObjectId().toHexString(),\n isLoading: false,\n })),\n },\n 'children.5.id': { value: new ObjectId().toHexString(), valid: true },\n }\n\n const sourceID = new ObjectId().toHexString()\n const clipboardData: ClipboardPasteData = {\n type: 'array',\n path: 'children',\n fields: [],\n rowIndex: 1,\n data: {\n 'children.1.id': { value: sourceID, valid: true },\n 'children.1.title': { value: 'Row 1 title', valid: true },\n // Leaked siblings — these must be dropped, not rewritten to .50/.51/.52.\n 'children.10.id': { value: new ObjectId().toHexString(), valid: true },\n 'children.10.title': { value: 'Leaked Row 10', valid: true },\n 'children.11.id': { value: new ObjectId().toHexString(), valid: true },\n 'children.11.title': { value: 'Leaked Row 11', valid: true },\n 'children.12.id': { value: new ObjectId().toHexString(), valid: true },\n 'children.12.title': { value: 'Leaked Row 12', valid: true },\n },\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'children',\n rowIndex: 5,\n })\n\n // Target row populated from the source row.\n expect(result['children.5.title']?.value).toEqual('Row 1 title')\n\n // No phantom out-of-bounds rows. These would correspond to `.10`/`.11`/`.12` being\n // rewritten through `String.replace('children.1', 'children.5')`.\n expect(result['children.50']).toBeUndefined()\n expect(result['children.51']).toBeUndefined()\n expect(result['children.52']).toBeUndefined()\n expect(result['children.50.id']).toBeUndefined()\n expect(result['children.51.id']).toBeUndefined()\n expect(result['children.52.id']).toBeUndefined()\n expect(result['children.50.title']).toBeUndefined()\n expect(result['children.51.title']).toBeUndefined()\n expect(result['children.52.title']).toBeUndefined()\n })\n\n it('row-to-field cleanup should not delete unrelated fields with a textual prefix collision', () => {\n // `path` = 'children', `lastRenderedPath` = 'children.0'. A sibling field\n // `childrenOther.0.title` must NOT be deleted by the cleanup loop.\n const formState: FormState = {\n children: { valid: true, value: 0, rows: [{ isLoading: false }] },\n 'children.0.id': { value: new ObjectId().toHexString(), valid: true },\n childrenOther: { valid: true, value: 1, rows: [{ isLoading: false }] },\n 'childrenOther.0.id': { value: new ObjectId().toHexString(), valid: true },\n 'childrenOther.0.title': { value: 'Unrelated field', valid: true },\n }\n\n const sourceID = new ObjectId().toHexString()\n const clipboardData: ClipboardPasteData = {\n type: 'array',\n path: 'someOtherArray',\n fields: [],\n rowIndex: 0,\n data: {\n 'someOtherArray.0.id': { value: sourceID, valid: true },\n 'someOtherArray.0.title': { value: 'Pasted row', valid: true },\n },\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'children',\n })\n\n // Unrelated `childrenOther.*` paths survive the cleanup.\n expect(result.childrenOther).toBeDefined()\n expect(result['childrenOther.0.id']).toBeDefined()\n expect(result['childrenOther.0.title']?.value).toEqual('Unrelated field')\n })\n })\n\n describe('exact path matches', () => {\n // Blocks store the block type under the row key itself (`ctas.1`), with no trailing\n // segment. Tightening the prefix check must keep matching that exact key, otherwise\n // copy drops the block type and paste never restores it.\n it('reduceFormStateByPath should keep the exact row key while filtering digit-prefix siblings', () => {\n const formState: FormState = {\n ctas: {\n valid: true,\n value: 13,\n rows: Array.from({ length: 13 }, () => ({\n blockType: 'callToAction',\n isLoading: false,\n })),\n },\n 'ctas.1': { value: 'callToAction', valid: true },\n 'ctas.1.id': { value: 'id-1', valid: true },\n 'ctas.10': { value: 'callToAction', valid: true },\n 'ctas.10.id': { value: 'id-10', valid: true },\n 'ctas.11': { value: 'callToAction', valid: true },\n 'ctas.11.id': { value: 'id-11', valid: true },\n }\n\n const filtered = reduceFormStateByPath({ formState, path: 'ctas', rowIndex: 1 })\n\n const filteredKeys = Object.keys(filtered).sort()\n expect(filteredKeys).toEqual(['ctas.1', 'ctas.1.id'])\n expect(filtered['ctas.1']?.value).toEqual('callToAction')\n })\n\n it('paste should copy the exact row key across to the target row', () => {\n const sourceBlockID = new ObjectId().toHexString()\n const targetBlockID = new ObjectId().toHexString()\n\n const formState: FormState = {\n ctas: {\n valid: true,\n value: 2,\n initialValue: 2,\n rows: [\n { id: sourceBlockID, blockType: 'callToAction', isLoading: false },\n { id: targetBlockID, blockType: 'content', isLoading: false },\n ],\n },\n 'ctas.1': { value: 'content', valid: true },\n 'ctas.1.id': { value: targetBlockID, valid: true },\n }\n\n const clipboardData: ClipboardPasteData = {\n type: 'blocks',\n path: 'ctas',\n blocks: [],\n rowIndex: 0,\n data: {\n 'ctas.0': { value: 'callToAction', valid: true },\n 'ctas.0.id': { value: sourceBlockID, valid: true },\n 'ctas.0.label': { value: 'Source label', valid: true },\n },\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'ctas',\n rowIndex: 1,\n })\n\n // The block type lives at the exact row key, so pasting must overwrite it.\n expect(result['ctas.1']?.value).toEqual('callToAction')\n expect(result['ctas.1.label']?.value).toEqual('Source label')\n })\n })\n})\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,32 @@
1
+ import type { UpdateCondition } from './types.js';
2
+ type UpdateType = Parameters<UpdateCondition>[0]['type'];
3
+ /**
4
+ * A row that holds no value yet. Empty arrives as `''` from the URL, `null` from a cleared
5
+ * select, or `undefined` from a row that was added but never filled in.
6
+ */
7
+ export declare const isEmptyConditionValue: ({ value }: {
8
+ value: unknown;
9
+ }) => boolean;
10
+ /**
11
+ * The value a row renders with. Only a missing value becomes `undefined`. `0` and `false` are
12
+ * real filter values, so they must survive.
13
+ */
14
+ export declare const getDisplayedConditionValue: <T>({ value }: {
15
+ value: T;
16
+ }) => T | undefined;
17
+ /**
18
+ * Whether an edit leaves the row unchanged, and so must not be committed.
19
+ *
20
+ * An empty row renders blank and reports `undefined` back up as soon as it mounts. Committing
21
+ * that stores `{ [operator]: undefined }`, which `qs.stringify` drops when the query is written
22
+ * to the URL — so the row is gone on the next parse.
23
+ *
24
+ * Field and operator edits change the row even while it holds no value, so they always commit.
25
+ */
26
+ export declare const isNoOpConditionValueUpdate: ({ type, incomingValue, storedValue, }: {
27
+ incomingValue: unknown;
28
+ storedValue: unknown;
29
+ type: UpdateType;
30
+ }) => boolean;
31
+ export {};
32
+ //# sourceMappingURL=conditionValue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conditionValue.d.ts","sourceRoot":"","sources":["../../../src/elements/WhereBuilder/conditionValue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD,KAAK,UAAU,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;AAExD;;;GAGG;AACH,eAAO,MAAM,qBAAqB,cAAe;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,KAAG,OACf,CAAA;AAEvD;;;GAGG;AACH,eAAO,MAAM,0BAA0B,GAAI,CAAC,aAAa;IAAE,KAAK,EAAE,CAAC,CAAA;CAAE,KAAG,CAAC,GAAG,SACxD,CAAA;AAEpB;;;;;;;;GAQG;AACH,eAAO,MAAM,0BAA0B,0CAIpC;IACD,aAAa,EAAE,OAAO,CAAA;IACtB,WAAW,EAAE,OAAO,CAAA;IACpB,IAAI,EAAE,UAAU,CAAA;CACjB,KAAG,OAG6C,CAAA"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * A row that holds no value yet. Empty arrives as `''` from the URL, `null` from a cleared
3
+ * select, or `undefined` from a row that was added but never filled in.
4
+ */export const isEmptyConditionValue = ({
5
+ value
6
+ }) => value === undefined || value === null || value === '';
7
+ /**
8
+ * The value a row renders with. Only a missing value becomes `undefined`. `0` and `false` are
9
+ * real filter values, so they must survive.
10
+ */
11
+ export const getDisplayedConditionValue = ({
12
+ value
13
+ }) => value ?? undefined;
14
+ /**
15
+ * Whether an edit leaves the row unchanged, and so must not be committed.
16
+ *
17
+ * An empty row renders blank and reports `undefined` back up as soon as it mounts. Committing
18
+ * that stores `{ [operator]: undefined }`, which `qs.stringify` drops when the query is written
19
+ * to the URL — so the row is gone on the next parse.
20
+ *
21
+ * Field and operator edits change the row even while it holds no value, so they always commit.
22
+ */
23
+ export const isNoOpConditionValueUpdate = ({
24
+ type,
25
+ incomingValue,
26
+ storedValue
27
+ }) => type === 'value' && isEmptyConditionValue({
28
+ value: storedValue
29
+ }) && isEmptyConditionValue({
30
+ value: incomingValue
31
+ });
32
+ //# sourceMappingURL=conditionValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conditionValue.js","names":["isEmptyConditionValue","value","undefined","getDisplayedConditionValue","isNoOpConditionValueUpdate","type","incomingValue","storedValue"],"sources":["../../../src/elements/WhereBuilder/conditionValue.ts"],"sourcesContent":["import type { UpdateCondition } from './types.js'\n\ntype UpdateType = Parameters<UpdateCondition>[0]['type']\n\n/**\n * A row that holds no value yet. Empty arrives as `''` from the URL, `null` from a cleared\n * select, or `undefined` from a row that was added but never filled in.\n */\nexport const isEmptyConditionValue = ({ value }: { value: unknown }): boolean =>\n value === undefined || value === null || value === ''\n\n/**\n * The value a row renders with. Only a missing value becomes `undefined`. `0` and `false` are\n * real filter values, so they must survive.\n */\nexport const getDisplayedConditionValue = <T>({ value }: { value: T }): T | undefined =>\n value ?? undefined\n\n/**\n * Whether an edit leaves the row unchanged, and so must not be committed.\n *\n * An empty row renders blank and reports `undefined` back up as soon as it mounts. Committing\n * that stores `{ [operator]: undefined }`, which `qs.stringify` drops when the query is written\n * to the URL — so the row is gone on the next parse.\n *\n * Field and operator edits change the row even while it holds no value, so they always commit.\n */\nexport const isNoOpConditionValueUpdate = ({\n type,\n incomingValue,\n storedValue,\n}: {\n incomingValue: unknown\n storedValue: unknown\n type: UpdateType\n}): boolean =>\n type === 'value' &&\n isEmptyConditionValue({ value: storedValue }) &&\n isEmptyConditionValue({ value: incomingValue })\n"],"mappings":"AAIA;;;GAIA,OAAO,MAAMA,qBAAA,GAAwBA,CAAC;EAAEC;AAAK,CAAsB,KACjEA,KAAA,KAAUC,SAAA,IAAaD,KAAA,KAAU,QAAQA,KAAA,KAAU;AAErD;;;;AAIA,OAAO,MAAME,0BAAA,GAA6BA,CAAI;EAAEF;AAAK,CAAgB,KACnEA,KAAA,IAASC,SAAA;AAEX;;;;;;;;;AASA,OAAO,MAAME,0BAAA,GAA6BA,CAAC;EACzCC,IAAI;EACJC,aAAa;EACbC;AAAW,CAKZ,KACCF,IAAA,KAAS,WACTL,qBAAA,CAAsB;EAAEC,KAAA,EAAOM;AAAY,MAC3CP,qBAAA,CAAsB;EAAEC,KAAA,EAAOK;AAAc","ignoreList":[]}
@@ -0,0 +1,65 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { getDisplayedConditionValue, isEmptyConditionValue, isNoOpConditionValueUpdate } from './conditionValue.js';
3
+ describe('isEmptyConditionValue', () => {
4
+ it.each([['undefined', undefined], ['null', null], ['an empty string', '']])('should treat %s as empty', (_label, value) => {
5
+ expect(isEmptyConditionValue({
6
+ value
7
+ })).toBe(true);
8
+ });
9
+ it.each([['a string', 'option1'], ['zero', 0], ['false', false]])('should treat %s as a real value', (_label, value) => {
10
+ expect(isEmptyConditionValue({
11
+ value
12
+ })).toBe(false);
13
+ });
14
+ });
15
+ describe('getDisplayedConditionValue', () => {
16
+ it.each([['undefined', undefined], ['null', null]])('should display %s as no value', (_label, value) => {
17
+ expect(getDisplayedConditionValue({
18
+ value
19
+ })).toBeUndefined();
20
+ });
21
+ it.each([['zero', 0], ['false', false], ['an empty string', ''], ['a string', 'option1']])('should display %s as itself', (_label, value) => {
22
+ expect(getDisplayedConditionValue({
23
+ value
24
+ })).toBe(value);
25
+ });
26
+ });
27
+ describe('isNoOpConditionValueUpdate', () => {
28
+ it('should skip the empty value a row reports back for a stored empty string', () => {
29
+ // The row this covers comes from a URL such as `?where[or][0][and][0][field][equals]=`.
30
+ expect(isNoOpConditionValueUpdate({
31
+ incomingValue: undefined,
32
+ storedValue: '',
33
+ type: 'value'
34
+ })).toBe(true);
35
+ });
36
+ it.each([['undefined', 'an empty string', undefined, ''], ['null', 'undefined', null, undefined], ['undefined', 'undefined', undefined, undefined]])('should skip a %s value stored as %s', (_incomingLabel, _storedLabel, incomingValue, storedValue) => {
37
+ expect(isNoOpConditionValueUpdate({
38
+ incomingValue,
39
+ storedValue,
40
+ type: 'value'
41
+ })).toBe(true);
42
+ });
43
+ it('should commit a value typed into an empty row', () => {
44
+ expect(isNoOpConditionValueUpdate({
45
+ incomingValue: 'option1',
46
+ storedValue: '',
47
+ type: 'value'
48
+ })).toBe(false);
49
+ });
50
+ it('should commit a row the user cleared', () => {
51
+ expect(isNoOpConditionValueUpdate({
52
+ incomingValue: undefined,
53
+ storedValue: 'option1',
54
+ type: 'value'
55
+ })).toBe(false);
56
+ });
57
+ it.each([['field'], ['operator']])('should commit a %s edit on a row that holds no value', type => {
58
+ expect(isNoOpConditionValueUpdate({
59
+ incomingValue: undefined,
60
+ storedValue: '',
61
+ type
62
+ })).toBe(false);
63
+ });
64
+ });
65
+ //# sourceMappingURL=conditionValue.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conditionValue.spec.js","names":["describe","expect","it","getDisplayedConditionValue","isEmptyConditionValue","isNoOpConditionValueUpdate","each","undefined","_label","value","toBe","toBeUndefined","incomingValue","storedValue","type","_incomingLabel","_storedLabel"],"sources":["../../../src/elements/WhereBuilder/conditionValue.spec.ts"],"sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport {\n getDisplayedConditionValue,\n isEmptyConditionValue,\n isNoOpConditionValueUpdate,\n} from './conditionValue.js'\n\ndescribe('isEmptyConditionValue', () => {\n it.each([\n ['undefined', undefined],\n ['null', null],\n ['an empty string', ''],\n ])('should treat %s as empty', (_label, value) => {\n expect(isEmptyConditionValue({ value })).toBe(true)\n })\n\n it.each([\n ['a string', 'option1'],\n ['zero', 0],\n ['false', false],\n ])('should treat %s as a real value', (_label, value) => {\n expect(isEmptyConditionValue({ value })).toBe(false)\n })\n})\n\ndescribe('getDisplayedConditionValue', () => {\n it.each([\n ['undefined', undefined],\n ['null', null],\n ])('should display %s as no value', (_label, value) => {\n expect(getDisplayedConditionValue({ value })).toBeUndefined()\n })\n\n it.each([\n ['zero', 0],\n ['false', false],\n ['an empty string', ''],\n ['a string', 'option1'],\n ])('should display %s as itself', (_label, value) => {\n expect(getDisplayedConditionValue({ value })).toBe(value)\n })\n})\n\ndescribe('isNoOpConditionValueUpdate', () => {\n it('should skip the empty value a row reports back for a stored empty string', () => {\n // The row this covers comes from a URL such as `?where[or][0][and][0][field][equals]=`.\n expect(\n isNoOpConditionValueUpdate({ incomingValue: undefined, storedValue: '', type: 'value' }),\n ).toBe(true)\n })\n\n it.each([\n ['undefined', 'an empty string', undefined, ''],\n ['null', 'undefined', null, undefined],\n ['undefined', 'undefined', undefined, undefined],\n ])(\n 'should skip a %s value stored as %s',\n (_incomingLabel, _storedLabel, incomingValue, storedValue) => {\n expect(isNoOpConditionValueUpdate({ incomingValue, storedValue, type: 'value' })).toBe(true)\n },\n )\n\n it('should commit a value typed into an empty row', () => {\n expect(\n isNoOpConditionValueUpdate({ incomingValue: 'option1', storedValue: '', type: 'value' }),\n ).toBe(false)\n })\n\n it('should commit a row the user cleared', () => {\n expect(\n isNoOpConditionValueUpdate({\n incomingValue: undefined,\n storedValue: 'option1',\n type: 'value',\n }),\n ).toBe(false)\n })\n\n it.each([['field'], ['operator']] as const)(\n 'should commit a %s edit on a row that holds no value',\n (type) => {\n expect(isNoOpConditionValueUpdate({ incomingValue: undefined, storedValue: '', type })).toBe(\n false,\n )\n },\n )\n})\n"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ;AAErC,SACEC,0BAA0B,EAC1BC,qBAAqB,EACrBC,0BAA0B,QACrB;AAEPL,QAAA,CAAS,yBAAyB;EAChCE,EAAA,CAAGI,IAAI,CAAC,CACN,CAAC,aAAaC,SAAA,CAAU,EACxB,CAAC,QAAQ,KAAK,EACd,CAAC,mBAAmB,GAAG,CACxB,EAAE,4BAA4B,CAACC,MAAA,EAAQC,KAAA;IACtCR,MAAA,CAAOG,qBAAA,CAAsB;MAAEK;IAAM,IAAIC,IAAI,CAAC;EAChD;EAEAR,EAAA,CAAGI,IAAI,CAAC,CACN,CAAC,YAAY,UAAU,EACvB,CAAC,QAAQ,EAAE,EACX,CAAC,SAAS,MAAM,CACjB,EAAE,mCAAmC,CAACE,MAAA,EAAQC,KAAA;IAC7CR,MAAA,CAAOG,qBAAA,CAAsB;MAAEK;IAAM,IAAIC,IAAI,CAAC;EAChD;AACF;AAEAV,QAAA,CAAS,8BAA8B;EACrCE,EAAA,CAAGI,IAAI,CAAC,CACN,CAAC,aAAaC,SAAA,CAAU,EACxB,CAAC,QAAQ,KAAK,CACf,EAAE,iCAAiC,CAACC,MAAA,EAAQC,KAAA;IAC3CR,MAAA,CAAOE,0BAAA,CAA2B;MAAEM;IAAM,IAAIE,aAAa;EAC7D;EAEAT,EAAA,CAAGI,IAAI,CAAC,CACN,CAAC,QAAQ,EAAE,EACX,CAAC,SAAS,MAAM,EAChB,CAAC,mBAAmB,GAAG,EACvB,CAAC,YAAY,UAAU,CACxB,EAAE,+BAA+B,CAACE,MAAA,EAAQC,KAAA;IACzCR,MAAA,CAAOE,0BAAA,CAA2B;MAAEM;IAAM,IAAIC,IAAI,CAACD,KAAA;EACrD;AACF;AAEAT,QAAA,CAAS,8BAA8B;EACrCE,EAAA,CAAG,4EAA4E;IAC7E;IACAD,MAAA,CACEI,0BAAA,CAA2B;MAAEO,aAAA,EAAeL,SAAA;MAAWM,WAAA,EAAa;MAAIC,IAAA,EAAM;IAAQ,IACtFJ,IAAI,CAAC;EACT;EAEAR,EAAA,CAAGI,IAAI,CAAC,CACN,CAAC,aAAa,mBAAmBC,SAAA,EAAW,GAAG,EAC/C,CAAC,QAAQ,aAAa,MAAMA,SAAA,CAAU,EACtC,CAAC,aAAa,aAAaA,SAAA,EAAWA,SAAA,CAAU,CACjD,EACC,uCACA,CAACQ,cAAA,EAAgBC,YAAA,EAAcJ,aAAA,EAAeC,WAAA;IAC5CZ,MAAA,CAAOI,0BAAA,CAA2B;MAAEO,aAAA;MAAeC,WAAA;MAAaC,IAAA,EAAM;IAAQ,IAAIJ,IAAI,CAAC;EACzF;EAGFR,EAAA,CAAG,iDAAiD;IAClDD,MAAA,CACEI,0BAAA,CAA2B;MAAEO,aAAA,EAAe;MAAWC,WAAA,EAAa;MAAIC,IAAA,EAAM;IAAQ,IACtFJ,IAAI,CAAC;EACT;EAEAR,EAAA,CAAG,wCAAwC;IACzCD,MAAA,CACEI,0BAAA,CAA2B;MACzBO,aAAA,EAAeL,SAAA;MACfM,WAAA,EAAa;MACbC,IAAA,EAAM;IACR,IACAJ,IAAI,CAAC;EACT;EAEAR,EAAA,CAAGI,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,EAC/B,wDACCQ,IAAA;IACCb,MAAA,CAAOI,0BAAA,CAA2B;MAAEO,aAAA,EAAeL,SAAA;MAAWM,WAAA,EAAa;MAAIC;IAAK,IAAIJ,IAAI,CAC1F;EAEJ;AAEJ","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/WhereBuilder/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAkB,MAAM,OAAO,CAAA;AAEtC,OAAO,KAAK,EAKV,iBAAiB,EAClB,MAAM,YAAY,CAAA;AAQnB,OAAO,aAAa,CAAA;AAKpB,OAAO,EAAE,iBAAiB,EAAE,CAAA;AAE5B;;;;;GAKG;AACH,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAsRpD,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/WhereBuilder/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAkB,MAAM,OAAO,CAAA;AAEtC,OAAO,KAAK,EAKV,iBAAiB,EAClB,MAAM,YAAY,CAAA;AAanB,OAAO,aAAa,CAAA;AAKpB,OAAO,EAAE,iBAAiB,EAAE,CAAA;AAE5B;;;;;GAKG;AACH,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CA6RpD,CAAA"}
@@ -10,6 +10,7 @@ import { useTranslation } from '../../providers/Translation/index.js';
10
10
  import { reduceFieldsToOptions } from '../../utilities/reduceFieldsToOptions.js';
11
11
  import { Button } from '../Button/index.js';
12
12
  import { Condition } from './Condition/index.js';
13
+ import { getDisplayedConditionValue, isEmptyConditionValue, isNoOpConditionValueUpdate } from './conditionValue.js';
13
14
  import './index.css';
14
15
  import { fieldTypeConditions, getValidFieldOperators } from './field-types.js';
15
16
  const baseClass = 'where-builder';
@@ -92,9 +93,10 @@ export const WhereBuilder = props => {
92
93
  }) => {
93
94
  // Virtual first row: conditions not yet committed, build from scratch
94
95
  if (conditions.length === 0) {
95
- // Ignore empty value edits so a cleared row doesn't re-commit itself. Field and
96
- // operator picks carry empty values too, but must fall through to build the row.
97
- if (type === 'value' && (value_0 === undefined || value_0 === null || value_0 === '')) {
96
+ // Field and operator picks carry empty values too, but must fall through to build the row.
97
+ if (type === 'value' && isEmptyConditionValue({
98
+ value: value_0
99
+ })) {
98
100
  return;
99
101
  }
100
102
  const {
@@ -127,6 +129,13 @@ export const WhereBuilder = props => {
127
129
  if (typeof existingValue !== 'undefined' && existingValue === value_0) {
128
130
  return;
129
131
  }
132
+ if (isNoOpConditionValueUpdate({
133
+ type,
134
+ incomingValue: value_0,
135
+ storedValue: existingValue
136
+ })) {
137
+ return;
138
+ }
130
139
  const newRowCondition = {
131
140
  [String(field_0.fieldPath)]: {
132
141
  [validOperator_0]: value_0
@@ -250,7 +259,9 @@ export const WhereBuilder = props => {
250
259
  const condition = displayConditions[orIndex_3].and[andIndex_3];
251
260
  const fieldPath = Object.keys(condition)[0];
252
261
  const operator = Object.keys(condition?.[fieldPath] || {})?.[0] || undefined;
253
- const value_1 = condition?.[fieldPath]?.[operator] || undefined;
262
+ const value_1 = getDisplayedConditionValue({
263
+ value: condition?.[fieldPath]?.[operator]
264
+ });
254
265
  const isFirstCondition = orIndex_3 === 0 && andIndex_3 === 0;
255
266
  const join_0 = andIndex_3 === 0 ? 'or' : 'and';
256
267
  return /*#__PURE__*/_jsx(Condition, {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["dequal","isFieldDisabled","transformWhereQuery","validateWhereQuery","React","useMemo","CirclePlusIcon","useAuth","useTranslation","reduceFieldsToOptions","Button","Condition","fieldTypeConditions","getValidFieldOperators","baseClass","WhereBuilder","props","collectionSlug","fields","onChange","handleWhereChange","onEmptyRemove","renderedFilters","undefined","resolvedFilterOptions","value","i18n","t","permissions","fieldPermissions","collections","reducedFields","firstField","find","f","field","conditions","or","transformedWhere","addCondition","useCallback","andIndex","orIndex","relation","newConditions","structuredClone","defaultOperator","type","operators","and","splice","String","fieldPath","push","updateCondition","operator","incomingOperator","length","validOperator","existingCondition","existingValue","newRowCondition","removeCondition","updateJoin","join","flattened","forEach","orGroup","oIdx","cond","aIdx","isTarget","currentJoin","itemJoin","index","addFirstFilter","makeRow","displayConditions","disableRemoveButton","_jsx","className","_jsxs","map","compoundOrKey","Array","isArray","_","condition","Object","keys","isFirstCondition","filterOptions","get","RenderedFilter","buttonStyle","icon","size","iconPosition","onClick"],"sources":["../../../src/elements/WhereBuilder/index.tsx"],"sourcesContent":["'use client'\nimport type { Operator } from 'payload'\n\nimport { dequal } from 'dequal/lite'\nimport { isFieldDisabled, transformWhereQuery, validateWhereQuery } from 'payload/shared'\nimport React, { useMemo } from 'react'\n\nimport type {\n AddCondition,\n RemoveCondition,\n UpdateCondition,\n UpdateJoin,\n WhereBuilderProps,\n} from './types.js'\n\nimport { CirclePlusIcon } from '../../icons/CirclePlus/index.js'\nimport { useAuth } from '../../providers/Auth/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { reduceFieldsToOptions } from '../../utilities/reduceFieldsToOptions.js'\nimport { Button } from '../Button/index.js'\nimport { Condition } from './Condition/index.js'\nimport './index.css'\nimport { fieldTypeConditions, getValidFieldOperators } from './field-types.js'\n\nconst baseClass = 'where-builder'\n\nexport { WhereBuilderProps }\n\n/**\n * Presentational filter builder. It renders the conditions described by `value` and\n * reports edits through `onChange`. It is unaware of where its value is stored — the\n * list view wires it to list query state via {@link ListWhereBuilder}, and the Query\n * Presets drawer wires it to form state.\n */\nexport const WhereBuilder: React.FC<WhereBuilderProps> = (props) => {\n const {\n collectionSlug,\n fields,\n onChange: handleWhereChange,\n onEmptyRemove,\n renderedFilters = undefined,\n resolvedFilterOptions = undefined,\n value,\n } = props\n const { i18n, t } = useTranslation()\n const { permissions } = useAuth()\n\n const fieldPermissions = permissions?.collections?.[collectionSlug]?.fields\n\n const reducedFields = useMemo(\n () =>\n reduceFieldsToOptions({\n fieldPermissions,\n fields: fields ?? [],\n i18n,\n }),\n [fieldPermissions, fields, i18n],\n )\n\n const firstField = useMemo(\n () => reducedFields.find((f) => !isFieldDisabled(f.field, 'filter')),\n [reducedFields],\n )\n\n const conditions = useMemo(() => {\n if (value) {\n if (validateWhereQuery(value)) {\n return value.or ?? []\n }\n\n const transformedWhere = transformWhereQuery(value)\n if (validateWhereQuery(transformedWhere)) {\n return transformedWhere.or ?? []\n }\n }\n\n return []\n }, [value])\n\n const addCondition: AddCondition = React.useCallback(\n ({ andIndex, field, orIndex, relation }) => {\n const newConditions = structuredClone(conditions)\n\n const defaultOperator = fieldTypeConditions[field.field.type].operators[0].value\n\n if (relation === 'and') {\n newConditions[orIndex].and.splice(andIndex, 0, {\n [String(field.fieldPath)]: {\n [defaultOperator]: undefined,\n },\n })\n } else {\n newConditions.push({\n and: [\n {\n [String(field.fieldPath)]: {\n [defaultOperator]: undefined,\n },\n },\n ],\n })\n }\n\n void handleWhereChange({ or: newConditions })\n },\n [conditions, handleWhereChange],\n )\n\n const updateCondition: UpdateCondition = React.useCallback(\n ({ type, andIndex, field, operator: incomingOperator, orIndex, value }) => {\n // Virtual first row: conditions not yet committed, build from scratch\n if (conditions.length === 0) {\n // Ignore empty value edits so a cleared row doesn't re-commit itself. Field and\n // operator picks carry empty values too, but must fall through to build the row.\n if (type === 'value' && (value === undefined || value === null || value === '')) {\n return\n }\n\n const { validOperator } = getValidFieldOperators({\n field: field.field,\n operator: incomingOperator,\n })\n void handleWhereChange({\n or: [{ and: [{ [String(field.fieldPath)]: { [validOperator]: value } }] }],\n })\n return\n }\n\n const existingCondition = conditions[orIndex].and[andIndex]\n\n if (typeof existingCondition === 'object' && field?.fieldPath) {\n const { validOperator } = getValidFieldOperators({\n field: field.field,\n operator: incomingOperator,\n })\n\n // Skip if nothing changed\n const existingValue = existingCondition[String(field.fieldPath)]?.[validOperator]\n if (typeof existingValue !== 'undefined' && existingValue === value) {\n return\n }\n\n const newRowCondition = {\n [String(field.fieldPath)]: { [validOperator]: value },\n }\n\n if (dequal(existingCondition, newRowCondition)) {\n return\n }\n\n const newConditions = structuredClone(conditions)\n newConditions[orIndex].and[andIndex] = newRowCondition\n\n void handleWhereChange({ or: newConditions })\n }\n },\n [conditions, handleWhereChange],\n )\n\n const removeCondition: RemoveCondition = React.useCallback(\n ({ andIndex, orIndex }) => {\n // Virtual first row: removing it just closes the panel\n if (conditions.length === 0) {\n onEmptyRemove?.()\n return\n }\n\n const newConditions = structuredClone(conditions)\n newConditions[orIndex].and.splice(andIndex, 1)\n\n if (newConditions[orIndex].and.length === 0) {\n newConditions.splice(orIndex, 1)\n }\n\n void handleWhereChange({ or: newConditions })\n\n // Removing the last remaining condition closes the filters panel.\n if (newConditions.length === 0) {\n onEmptyRemove?.()\n }\n },\n [conditions, handleWhereChange, onEmptyRemove],\n )\n\n const updateJoin: UpdateJoin = React.useCallback(\n ({ andIndex, join, orIndex }) => {\n // Flatten the nested or/and structure into a single ordered list, tracking\n // the join relation that connects each condition to the previous one.\n const flattened: { cond: (typeof conditions)[number]['and'][number]; join: 'and' | 'or' }[] =\n []\n\n conditions.forEach((orGroup, oIdx) => {\n orGroup.and.forEach((cond, aIdx) => {\n const isTarget = oIdx === orIndex && aIdx === andIndex\n const currentJoin = flattened.length === 0 ? null : aIdx === 0 ? 'or' : 'and'\n\n flattened.push({ cond, join: isTarget ? join : currentJoin })\n })\n })\n\n // Rebuild the or/and structure from the flattened list using the join relations.\n const newConditions: typeof conditions = []\n\n flattened.forEach(({ cond, join: itemJoin }, index) => {\n if (index === 0 || itemJoin === 'or') {\n newConditions.push({ and: [cond] })\n } else {\n newConditions[newConditions.length - 1].and.push(cond)\n }\n })\n\n void handleWhereChange({ or: newConditions })\n },\n [conditions, handleWhereChange],\n )\n\n const addFirstFilter = React.useCallback(() => {\n if (!firstField) {\n return\n }\n\n // With no committed conditions, only the virtual placeholder row is shown. Commit it\n // and append a new row so a second row appears on the first click.\n if (conditions.length === 0) {\n const defaultOperator = firstField.operators[0].value\n const makeRow = () => ({\n and: [{ [String(firstField.fieldPath)]: { [defaultOperator]: undefined } }],\n })\n\n void handleWhereChange({ or: [makeRow(), makeRow()] })\n return\n }\n\n void addCondition({\n andIndex: 0,\n field: firstField,\n orIndex: conditions.length,\n relation: 'or',\n })\n }, [addCondition, conditions.length, firstField, handleWhereChange])\n\n // When conditions is empty, show a virtual first row so the panel never opens blank.\n const displayConditions =\n conditions.length === 0 && firstField\n ? ([\n { and: [{ [firstField.fieldPath]: { [firstField.operators[0].value]: undefined } }] },\n ] as typeof conditions)\n : conditions\n\n // Disable the remove button only when there are no committed conditions and this host\n // doesn't provide an empty-state removal handler.\n const disableRemoveButton = conditions.length === 0 && !onEmptyRemove\n\n return (\n <div className={baseClass}>\n <div className={`${baseClass}__or-filters`}>\n {displayConditions.map((or, orIndex) => {\n const compoundOrKey = `${orIndex}_${Array.isArray(or?.and) ? or.and.length : ''}`\n\n return (\n <div className={`${baseClass}__and-filters`} key={compoundOrKey}>\n {Array.isArray(or?.and) &&\n or.and.map((_, andIndex) => {\n const condition = displayConditions[orIndex].and[andIndex]\n const fieldPath = Object.keys(condition)[0]\n\n const operator =\n (Object.keys(condition?.[fieldPath] || {})?.[0] as Operator) || undefined\n\n const value = condition?.[fieldPath]?.[operator] || undefined\n\n const isFirstCondition = orIndex === 0 && andIndex === 0\n const join: 'and' | 'or' = andIndex === 0 ? 'or' : 'and'\n\n return (\n <Condition\n addCondition={addCondition}\n andIndex={andIndex}\n disableRemoveButton={disableRemoveButton}\n fieldPath={fieldPath}\n filterOptions={resolvedFilterOptions?.get(fieldPath)}\n isFirstCondition={isFirstCondition}\n join={join}\n key={andIndex}\n operator={operator}\n orIndex={orIndex}\n reducedFields={reducedFields}\n removeCondition={removeCondition}\n RenderedFilter={renderedFilters?.get(fieldPath)}\n updateCondition={updateCondition}\n updateJoin={updateJoin}\n value={value}\n />\n )\n })}\n </div>\n )\n })}\n <div className={`${baseClass}__add-or-row`}>\n <Button\n buttonStyle=\"ghost\"\n className={`${baseClass}__add-or`}\n icon={<CirclePlusIcon size={24} />}\n iconPosition=\"left\"\n onClick={addFirstFilter}\n >\n {t('general:addFilter')}\n </Button>\n </div>\n </div>\n </div>\n )\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["dequal","isFieldDisabled","transformWhereQuery","validateWhereQuery","React","useMemo","CirclePlusIcon","useAuth","useTranslation","reduceFieldsToOptions","Button","Condition","getDisplayedConditionValue","isEmptyConditionValue","isNoOpConditionValueUpdate","fieldTypeConditions","getValidFieldOperators","baseClass","WhereBuilder","props","collectionSlug","fields","onChange","handleWhereChange","onEmptyRemove","renderedFilters","undefined","resolvedFilterOptions","value","i18n","t","permissions","fieldPermissions","collections","reducedFields","firstField","find","f","field","conditions","or","transformedWhere","addCondition","useCallback","andIndex","orIndex","relation","newConditions","structuredClone","defaultOperator","type","operators","and","splice","String","fieldPath","push","updateCondition","operator","incomingOperator","length","validOperator","existingCondition","existingValue","incomingValue","storedValue","newRowCondition","removeCondition","updateJoin","join","flattened","forEach","orGroup","oIdx","cond","aIdx","isTarget","currentJoin","itemJoin","index","addFirstFilter","makeRow","displayConditions","disableRemoveButton","_jsx","className","_jsxs","map","compoundOrKey","Array","isArray","_","condition","Object","keys","isFirstCondition","filterOptions","get","RenderedFilter","buttonStyle","icon","size","iconPosition","onClick"],"sources":["../../../src/elements/WhereBuilder/index.tsx"],"sourcesContent":["'use client'\nimport type { Operator } from 'payload'\n\nimport { dequal } from 'dequal/lite'\nimport { isFieldDisabled, transformWhereQuery, validateWhereQuery } from 'payload/shared'\nimport React, { useMemo } from 'react'\n\nimport type {\n AddCondition,\n RemoveCondition,\n UpdateCondition,\n UpdateJoin,\n WhereBuilderProps,\n} from './types.js'\n\nimport { CirclePlusIcon } from '../../icons/CirclePlus/index.js'\nimport { useAuth } from '../../providers/Auth/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { reduceFieldsToOptions } from '../../utilities/reduceFieldsToOptions.js'\nimport { Button } from '../Button/index.js'\nimport { Condition } from './Condition/index.js'\nimport {\n getDisplayedConditionValue,\n isEmptyConditionValue,\n isNoOpConditionValueUpdate,\n} from './conditionValue.js'\nimport './index.css'\nimport { fieldTypeConditions, getValidFieldOperators } from './field-types.js'\n\nconst baseClass = 'where-builder'\n\nexport { WhereBuilderProps }\n\n/**\n * Presentational filter builder. It renders the conditions described by `value` and\n * reports edits through `onChange`. It is unaware of where its value is stored — the\n * list view wires it to list query state via {@link ListWhereBuilder}, and the Query\n * Presets drawer wires it to form state.\n */\nexport const WhereBuilder: React.FC<WhereBuilderProps> = (props) => {\n const {\n collectionSlug,\n fields,\n onChange: handleWhereChange,\n onEmptyRemove,\n renderedFilters = undefined,\n resolvedFilterOptions = undefined,\n value,\n } = props\n const { i18n, t } = useTranslation()\n const { permissions } = useAuth()\n\n const fieldPermissions = permissions?.collections?.[collectionSlug]?.fields\n\n const reducedFields = useMemo(\n () =>\n reduceFieldsToOptions({\n fieldPermissions,\n fields: fields ?? [],\n i18n,\n }),\n [fieldPermissions, fields, i18n],\n )\n\n const firstField = useMemo(\n () => reducedFields.find((f) => !isFieldDisabled(f.field, 'filter')),\n [reducedFields],\n )\n\n const conditions = useMemo(() => {\n if (value) {\n if (validateWhereQuery(value)) {\n return value.or ?? []\n }\n\n const transformedWhere = transformWhereQuery(value)\n if (validateWhereQuery(transformedWhere)) {\n return transformedWhere.or ?? []\n }\n }\n\n return []\n }, [value])\n\n const addCondition: AddCondition = React.useCallback(\n ({ andIndex, field, orIndex, relation }) => {\n const newConditions = structuredClone(conditions)\n\n const defaultOperator = fieldTypeConditions[field.field.type].operators[0].value\n\n if (relation === 'and') {\n newConditions[orIndex].and.splice(andIndex, 0, {\n [String(field.fieldPath)]: {\n [defaultOperator]: undefined,\n },\n })\n } else {\n newConditions.push({\n and: [\n {\n [String(field.fieldPath)]: {\n [defaultOperator]: undefined,\n },\n },\n ],\n })\n }\n\n void handleWhereChange({ or: newConditions })\n },\n [conditions, handleWhereChange],\n )\n\n const updateCondition: UpdateCondition = React.useCallback(\n ({ type, andIndex, field, operator: incomingOperator, orIndex, value }) => {\n // Virtual first row: conditions not yet committed, build from scratch\n if (conditions.length === 0) {\n // Field and operator picks carry empty values too, but must fall through to build the row.\n if (type === 'value' && isEmptyConditionValue({ value })) {\n return\n }\n\n const { validOperator } = getValidFieldOperators({\n field: field.field,\n operator: incomingOperator,\n })\n void handleWhereChange({\n or: [{ and: [{ [String(field.fieldPath)]: { [validOperator]: value } }] }],\n })\n return\n }\n\n const existingCondition = conditions[orIndex].and[andIndex]\n\n if (typeof existingCondition === 'object' && field?.fieldPath) {\n const { validOperator } = getValidFieldOperators({\n field: field.field,\n operator: incomingOperator,\n })\n\n // Skip if nothing changed\n const existingValue = existingCondition[String(field.fieldPath)]?.[validOperator]\n if (typeof existingValue !== 'undefined' && existingValue === value) {\n return\n }\n\n if (\n isNoOpConditionValueUpdate({ type, incomingValue: value, storedValue: existingValue })\n ) {\n return\n }\n\n const newRowCondition = {\n [String(field.fieldPath)]: { [validOperator]: value },\n }\n\n if (dequal(existingCondition, newRowCondition)) {\n return\n }\n\n const newConditions = structuredClone(conditions)\n newConditions[orIndex].and[andIndex] = newRowCondition\n\n void handleWhereChange({ or: newConditions })\n }\n },\n [conditions, handleWhereChange],\n )\n\n const removeCondition: RemoveCondition = React.useCallback(\n ({ andIndex, orIndex }) => {\n // Virtual first row: removing it just closes the panel\n if (conditions.length === 0) {\n onEmptyRemove?.()\n return\n }\n\n const newConditions = structuredClone(conditions)\n newConditions[orIndex].and.splice(andIndex, 1)\n\n if (newConditions[orIndex].and.length === 0) {\n newConditions.splice(orIndex, 1)\n }\n\n void handleWhereChange({ or: newConditions })\n\n // Removing the last remaining condition closes the filters panel.\n if (newConditions.length === 0) {\n onEmptyRemove?.()\n }\n },\n [conditions, handleWhereChange, onEmptyRemove],\n )\n\n const updateJoin: UpdateJoin = React.useCallback(\n ({ andIndex, join, orIndex }) => {\n // Flatten the nested or/and structure into a single ordered list, tracking\n // the join relation that connects each condition to the previous one.\n const flattened: { cond: (typeof conditions)[number]['and'][number]; join: 'and' | 'or' }[] =\n []\n\n conditions.forEach((orGroup, oIdx) => {\n orGroup.and.forEach((cond, aIdx) => {\n const isTarget = oIdx === orIndex && aIdx === andIndex\n const currentJoin = flattened.length === 0 ? null : aIdx === 0 ? 'or' : 'and'\n\n flattened.push({ cond, join: isTarget ? join : currentJoin })\n })\n })\n\n // Rebuild the or/and structure from the flattened list using the join relations.\n const newConditions: typeof conditions = []\n\n flattened.forEach(({ cond, join: itemJoin }, index) => {\n if (index === 0 || itemJoin === 'or') {\n newConditions.push({ and: [cond] })\n } else {\n newConditions[newConditions.length - 1].and.push(cond)\n }\n })\n\n void handleWhereChange({ or: newConditions })\n },\n [conditions, handleWhereChange],\n )\n\n const addFirstFilter = React.useCallback(() => {\n if (!firstField) {\n return\n }\n\n // With no committed conditions, only the virtual placeholder row is shown. Commit it\n // and append a new row so a second row appears on the first click.\n if (conditions.length === 0) {\n const defaultOperator = firstField.operators[0].value\n const makeRow = () => ({\n and: [{ [String(firstField.fieldPath)]: { [defaultOperator]: undefined } }],\n })\n\n void handleWhereChange({ or: [makeRow(), makeRow()] })\n return\n }\n\n void addCondition({\n andIndex: 0,\n field: firstField,\n orIndex: conditions.length,\n relation: 'or',\n })\n }, [addCondition, conditions.length, firstField, handleWhereChange])\n\n // When conditions is empty, show a virtual first row so the panel never opens blank.\n const displayConditions =\n conditions.length === 0 && firstField\n ? ([\n { and: [{ [firstField.fieldPath]: { [firstField.operators[0].value]: undefined } }] },\n ] as typeof conditions)\n : conditions\n\n // Disable the remove button only when there are no committed conditions and this host\n // doesn't provide an empty-state removal handler.\n const disableRemoveButton = conditions.length === 0 && !onEmptyRemove\n\n return (\n <div className={baseClass}>\n <div className={`${baseClass}__or-filters`}>\n {displayConditions.map((or, orIndex) => {\n const compoundOrKey = `${orIndex}_${Array.isArray(or?.and) ? or.and.length : ''}`\n\n return (\n <div className={`${baseClass}__and-filters`} key={compoundOrKey}>\n {Array.isArray(or?.and) &&\n or.and.map((_, andIndex) => {\n const condition = displayConditions[orIndex].and[andIndex]\n const fieldPath = Object.keys(condition)[0]\n\n const operator =\n (Object.keys(condition?.[fieldPath] || {})?.[0] as Operator) || undefined\n\n const value = getDisplayedConditionValue({\n value: condition?.[fieldPath]?.[operator],\n })\n\n const isFirstCondition = orIndex === 0 && andIndex === 0\n const join: 'and' | 'or' = andIndex === 0 ? 'or' : 'and'\n\n return (\n <Condition\n addCondition={addCondition}\n andIndex={andIndex}\n disableRemoveButton={disableRemoveButton}\n fieldPath={fieldPath}\n filterOptions={resolvedFilterOptions?.get(fieldPath)}\n isFirstCondition={isFirstCondition}\n join={join}\n key={andIndex}\n operator={operator}\n orIndex={orIndex}\n reducedFields={reducedFields}\n removeCondition={removeCondition}\n RenderedFilter={renderedFilters?.get(fieldPath)}\n updateCondition={updateCondition}\n updateJoin={updateJoin}\n value={value}\n />\n )\n })}\n </div>\n )\n })}\n <div className={`${baseClass}__add-or-row`}>\n <Button\n buttonStyle=\"ghost\"\n className={`${baseClass}__add-or`}\n icon={<CirclePlusIcon size={24} />}\n iconPosition=\"left\"\n onClick={addFirstFilter}\n >\n {t('general:addFilter')}\n </Button>\n </div>\n </div>\n </div>\n )\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"formatMetadata.d.ts","sourceRoot":"","sources":["../../src/utilities/formatMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AA4DzC,eAAO,MAAM,cAAc,SACnB;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,KACxC,OAAO,CAAC,UAAU,CA2FpB,CAAA"}
1
+ {"version":3,"file":"formatMetadata.d.ts","sourceRoot":"","sources":["../../src/utilities/formatMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AA4DzC,eAAO,MAAM,cAAc,SACnB;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,KACxC,OAAO,CAAC,UAAU,CAqFpB,CAAA"}
@@ -47,11 +47,6 @@ export const formatMetadata = async args => {
47
47
  titleSuffix,
48
48
  ...rest
49
49
  } = args;
50
- /**
51
- * @todo find a way to remove the type assertion here.
52
- * It is a result of needing to `DeepCopy` the `MetaConfig` type from Payload.
53
- * This is required for the `DeepRequired` from `Config` to `SanitizedConfig`.
54
- */
55
50
  const incomingMetadata = rest;
56
51
  const faviconDark = payloadFaviconDark;
57
52
  const faviconLight = payloadFaviconLight;
@@ -1 +1 @@
1
- {"version":3,"file":"formatMetadata.js","names":["qs","payloadFaviconDark","payloadFaviconLight","staticOGImage","appendTitleSuffix","title","suffix","undefined","default","template","absolute","getTitleString","defaultOpenGraph","description","siteName","formatMetadata","args","defaultOGImageType","serverURL","titleSuffix","rest","incomingMetadata","faviconDark","faviconLight","ogImage","icons","type","rel","sizes","url","src","media","metaTitle","titleStringForOg","openGraph","ogTitle","filter","Boolean","join","mergedOpenGraph","images","alt","height","stringify","addQueryPrefix","width","Promise","resolve","metadataBase","URL","process","env","PAYLOAD_PUBLIC_SERVER_URL","PORT"],"sources":["../../src/utilities/formatMetadata.ts"],"sourcesContent":["import type { MetaConfig } from 'payload'\n\nimport * as qs from 'qs-esm'\n\nimport { payloadFaviconDark, payloadFaviconLight, staticOGImage } from '../assets/index.js'\n\n// Replicates the Icon type structure from next/dist/lib/metadata/types/metadata-types\ntype Icon = {\n media?: string\n rel?: string\n sizes?: string\n type?: string\n url: string\n}\n\nconst appendTitleSuffix = (\n title: MetaConfig['title'],\n suffix: string | undefined,\n): MetaConfig['title'] => {\n if (!suffix || !title) {\n return title ?? undefined\n }\n if (typeof title === 'string') {\n return `${title} ${suffix}`\n }\n\n if ('default' in title) {\n return { default: `${title.default} ${suffix}`, template: `${title.template} ${suffix}` }\n }\n\n if ('template' in title) {\n return {\n absolute: `${title.absolute} ${suffix}`,\n template: title.template !== null ? `${title.template} ${suffix}` : null,\n }\n }\n\n return { absolute: `${title.absolute} ${suffix}` }\n}\n\nconst getTitleString = (title: MetaConfig['title']): string | undefined => {\n if (!title) {\n return undefined\n }\n if (typeof title === 'string') {\n return title\n }\n if ('absolute' in title) {\n return title.absolute\n }\n return title.default\n}\n\nconst defaultOpenGraph: MetaConfig['openGraph'] = {\n description:\n 'Payload is a headless CMS and application framework built with TypeScript, Node.js, and React.',\n siteName: 'Payload App',\n title: 'Payload App',\n}\n\nexport const formatMetadata = async (\n args: { serverURL?: string } & MetaConfig,\n): Promise<MetaConfig> => {\n const { defaultOGImageType, serverURL, titleSuffix, ...rest } = args\n\n /**\n * @todo find a way to remove the type assertion here.\n * It is a result of needing to `DeepCopy` the `MetaConfig` type from Payload.\n * This is required for the `DeepRequired` from `Config` to `SanitizedConfig`.\n */\n const incomingMetadata = rest as MetaConfig\n\n const faviconDark = payloadFaviconDark as { src: string } | string\n const faviconLight = payloadFaviconLight as { src: string } | string\n const ogImage = staticOGImage as { src: string } | string\n\n const icons: MetaConfig['icons'] =\n incomingMetadata.icons ||\n ([\n {\n type: 'image/png',\n rel: 'icon',\n sizes: '32x32',\n url: typeof faviconDark === 'object' ? faviconDark.src : faviconDark,\n },\n {\n type: 'image/png',\n media: '(prefers-color-scheme: dark)',\n rel: 'icon',\n sizes: '32x32',\n url: typeof faviconLight === 'object' ? faviconLight.src : faviconLight,\n },\n ] satisfies Array<Icon>)\n\n const metaTitle: MetaConfig['title'] = appendTitleSuffix(incomingMetadata.title, titleSuffix)\n\n const titleStringForOg: string | undefined =\n typeof incomingMetadata.openGraph?.title === 'string'\n ? incomingMetadata.openGraph.title\n : getTitleString(incomingMetadata.title)\n\n const ogTitle = [titleStringForOg, titleSuffix].filter(Boolean).join(' ')\n\n const mergedOpenGraph: MetaConfig['openGraph'] = {\n ...(defaultOpenGraph || {}),\n ...(defaultOGImageType === 'dynamic'\n ? {\n images: [\n {\n alt: ogTitle,\n height: 630,\n url: `/api/og${qs.stringify(\n {\n description:\n incomingMetadata.openGraph?.description || defaultOpenGraph.description,\n title: ogTitle,\n },\n {\n addQueryPrefix: true,\n },\n )}`,\n width: 1200,\n },\n ],\n }\n : {}),\n ...(defaultOGImageType === 'static'\n ? {\n images: [\n {\n alt: ogTitle,\n height: 480,\n url: typeof ogImage === 'object' ? ogImage.src : ogImage,\n width: 640,\n },\n ],\n }\n : {}),\n title: ogTitle,\n ...(incomingMetadata.openGraph || {}),\n }\n\n return Promise.resolve({\n ...incomingMetadata,\n icons,\n metadataBase: new URL(\n serverURL ||\n process.env.PAYLOAD_PUBLIC_SERVER_URL ||\n `http://localhost:${process.env.PORT || 3000}`,\n ),\n openGraph: mergedOpenGraph,\n title: metaTitle,\n })\n}\n"],"mappings":"AAEA,YAAYA,EAAA,MAAQ;AAEpB,SAASC,kBAAkB,EAAEC,mBAAmB,EAAEC,aAAa,QAAQ;AAWvE,MAAMC,iBAAA,GAAoBA,CACxBC,KAAA,EACAC,MAAA;EAEA,IAAI,CAACA,MAAA,IAAU,CAACD,KAAA,EAAO;IACrB,OAAOA,KAAA,IAASE,SAAA;EAClB;EACA,IAAI,OAAOF,KAAA,KAAU,UAAU;IAC7B,OAAO,GAAGA,KAAA,IAASC,MAAA,EAAQ;EAC7B;EAEA,IAAI,aAAaD,KAAA,EAAO;IACtB,OAAO;MAAEG,OAAA,EAAS,GAAGH,KAAA,CAAMG,OAAO,IAAIF,MAAA,EAAQ;MAAEG,QAAA,EAAU,GAAGJ,KAAA,CAAMI,QAAQ,IAAIH,MAAA;IAAS;EAC1F;EAEA,IAAI,cAAcD,KAAA,EAAO;IACvB,OAAO;MACLK,QAAA,EAAU,GAAGL,KAAA,CAAMK,QAAQ,IAAIJ,MAAA,EAAQ;MACvCG,QAAA,EAAUJ,KAAA,CAAMI,QAAQ,KAAK,OAAO,GAAGJ,KAAA,CAAMI,QAAQ,IAAIH,MAAA,EAAQ,GAAG;IACtE;EACF;EAEA,OAAO;IAAEI,QAAA,EAAU,GAAGL,KAAA,CAAMK,QAAQ,IAAIJ,MAAA;EAAS;AACnD;AAEA,MAAMK,cAAA,GAAkBN,KAAA;EACtB,IAAI,CAACA,KAAA,EAAO;IACV,OAAOE,SAAA;EACT;EACA,IAAI,OAAOF,KAAA,KAAU,UAAU;IAC7B,OAAOA,KAAA;EACT;EACA,IAAI,cAAcA,KAAA,EAAO;IACvB,OAAOA,KAAA,CAAMK,QAAQ;EACvB;EACA,OAAOL,KAAA,CAAMG,OAAO;AACtB;AAEA,MAAMI,gBAAA,GAA4C;EAChDC,WAAA,EACE;EACFC,QAAA,EAAU;EACVT,KAAA,EAAO;AACT;AAEA,OAAO,MAAMU,cAAA,GAAiB,MAC5BC,IAAA;EAEA,MAAM;IAAEC,kBAAkB;IAAEC,SAAS;IAAEC,WAAW;IAAE,GAAGC;EAAA,CAAM,GAAGJ,IAAA;EAEhE;;;;;EAKA,MAAMK,gBAAA,GAAmBD,IAAA;EAEzB,MAAME,WAAA,GAAcrB,kBAAA;EACpB,MAAMsB,YAAA,GAAerB,mBAAA;EACrB,MAAMsB,OAAA,GAAUrB,aAAA;EAEhB,MAAMsB,KAAA,GACJJ,gBAAA,CAAiBI,KAAK,IACrB,CACC;IACEC,IAAA,EAAM;IACNC,GAAA,EAAK;IACLC,KAAA,EAAO;IACPC,GAAA,EAAK,OAAOP,WAAA,KAAgB,WAAWA,WAAA,CAAYQ,GAAG,GAAGR;EAC3D,GACA;IACEI,IAAA,EAAM;IACNK,KAAA,EAAO;IACPJ,GAAA,EAAK;IACLC,KAAA,EAAO;IACPC,GAAA,EAAK,OAAON,YAAA,KAAiB,WAAWA,YAAA,CAAaO,GAAG,GAAGP;EAC7D,EACD;EAEH,MAAMS,SAAA,GAAiC5B,iBAAA,CAAkBiB,gBAAA,CAAiBhB,KAAK,EAAEc,WAAA;EAEjF,MAAMc,gBAAA,GACJ,OAAOZ,gBAAA,CAAiBa,SAAS,EAAE7B,KAAA,KAAU,WACzCgB,gBAAA,CAAiBa,SAAS,CAAC7B,KAAK,GAChCM,cAAA,CAAeU,gBAAA,CAAiBhB,KAAK;EAE3C,MAAM8B,OAAA,GAAU,CAACF,gBAAA,EAAkBd,WAAA,CAAY,CAACiB,MAAM,CAACC,OAAA,EAASC,IAAI,CAAC;EAErE,MAAMC,eAAA,GAA2C;IAC/C,IAAI3B,gBAAA,IAAoB,CAAC,CAAC;IAC1B,IAAIK,kBAAA,KAAuB,YACvB;MACEuB,MAAA,EAAQ,CACN;QACEC,GAAA,EAAKN,OAAA;QACLO,MAAA,EAAQ;QACRb,GAAA,EAAK,UAAU7B,EAAA,CAAG2C,SAAS,CACzB;UACE9B,WAAA,EACEQ,gBAAA,CAAiBa,SAAS,EAAErB,WAAA,IAAeD,gBAAA,CAAiBC,WAAW;UACzER,KAAA,EAAO8B;QACT,GACA;UACES,cAAA,EAAgB;QAClB,IACC;QACHC,KAAA,EAAO;MACT;IAEJ,IACA,CAAC,CAAC;IACN,IAAI5B,kBAAA,KAAuB,WACvB;MACEuB,MAAA,EAAQ,CACN;QACEC,GAAA,EAAKN,OAAA;QACLO,MAAA,EAAQ;QACRb,GAAA,EAAK,OAAOL,OAAA,KAAY,WAAWA,OAAA,CAAQM,GAAG,GAAGN,OAAA;QACjDqB,KAAA,EAAO;MACT;IAEJ,IACA,CAAC,CAAC;IACNxC,KAAA,EAAO8B,OAAA;IACP,IAAId,gBAAA,CAAiBa,SAAS,IAAI,CAAC,CAAC;EACtC;EAEA,OAAOY,OAAA,CAAQC,OAAO,CAAC;IACrB,GAAG1B,gBAAgB;IACnBI,KAAA;IACAuB,YAAA,EAAc,IAAIC,GAAA,CAChB/B,SAAA,IACEgC,OAAA,CAAQC,GAAG,CAACC,yBAAyB,IACrC,oBAAoBF,OAAA,CAAQC,GAAG,CAACE,IAAI,IAAI,MAAM;IAElDnB,SAAA,EAAWK,eAAA;IACXlC,KAAA,EAAO2B;EACT;AACF","ignoreList":[]}
1
+ {"version":3,"file":"formatMetadata.js","names":["qs","payloadFaviconDark","payloadFaviconLight","staticOGImage","appendTitleSuffix","title","suffix","undefined","default","template","absolute","getTitleString","defaultOpenGraph","description","siteName","formatMetadata","args","defaultOGImageType","serverURL","titleSuffix","rest","incomingMetadata","faviconDark","faviconLight","ogImage","icons","type","rel","sizes","url","src","media","metaTitle","titleStringForOg","openGraph","ogTitle","filter","Boolean","join","mergedOpenGraph","images","alt","height","stringify","addQueryPrefix","width","Promise","resolve","metadataBase","URL","process","env","PAYLOAD_PUBLIC_SERVER_URL","PORT"],"sources":["../../src/utilities/formatMetadata.ts"],"sourcesContent":["import type { MetaConfig } from 'payload'\n\nimport * as qs from 'qs-esm'\n\nimport { payloadFaviconDark, payloadFaviconLight, staticOGImage } from '../assets/index.js'\n\n// Replicates the Icon type structure from next/dist/lib/metadata/types/metadata-types\ntype Icon = {\n media?: string\n rel?: string\n sizes?: string\n type?: string\n url: string\n}\n\nconst appendTitleSuffix = (\n title: MetaConfig['title'],\n suffix: string | undefined,\n): MetaConfig['title'] => {\n if (!suffix || !title) {\n return title ?? undefined\n }\n if (typeof title === 'string') {\n return `${title} ${suffix}`\n }\n\n if ('default' in title) {\n return { default: `${title.default} ${suffix}`, template: `${title.template} ${suffix}` }\n }\n\n if ('template' in title) {\n return {\n absolute: `${title.absolute} ${suffix}`,\n template: title.template !== null ? `${title.template} ${suffix}` : null,\n }\n }\n\n return { absolute: `${title.absolute} ${suffix}` }\n}\n\nconst getTitleString = (title: MetaConfig['title']): string | undefined => {\n if (!title) {\n return undefined\n }\n if (typeof title === 'string') {\n return title\n }\n if ('absolute' in title) {\n return title.absolute\n }\n return title.default\n}\n\nconst defaultOpenGraph: MetaConfig['openGraph'] = {\n description:\n 'Payload is a headless CMS and application framework built with TypeScript, Node.js, and React.',\n siteName: 'Payload App',\n title: 'Payload App',\n}\n\nexport const formatMetadata = async (\n args: { serverURL?: string } & MetaConfig,\n): Promise<MetaConfig> => {\n const { defaultOGImageType, serverURL, titleSuffix, ...rest } = args\n const incomingMetadata: MetaConfig = rest\n\n const faviconDark = payloadFaviconDark as { src: string } | string\n const faviconLight = payloadFaviconLight as { src: string } | string\n const ogImage = staticOGImage as { src: string } | string\n\n const icons: MetaConfig['icons'] =\n incomingMetadata.icons ||\n ([\n {\n type: 'image/png',\n rel: 'icon',\n sizes: '32x32',\n url: typeof faviconDark === 'object' ? faviconDark.src : faviconDark,\n },\n {\n type: 'image/png',\n media: '(prefers-color-scheme: dark)',\n rel: 'icon',\n sizes: '32x32',\n url: typeof faviconLight === 'object' ? faviconLight.src : faviconLight,\n },\n ] satisfies Array<Icon>)\n\n const metaTitle: MetaConfig['title'] = appendTitleSuffix(incomingMetadata.title, titleSuffix)\n\n const titleStringForOg: string | undefined =\n typeof incomingMetadata.openGraph?.title === 'string'\n ? incomingMetadata.openGraph.title\n : getTitleString(incomingMetadata.title)\n\n const ogTitle = [titleStringForOg, titleSuffix].filter(Boolean).join(' ')\n\n const mergedOpenGraph: MetaConfig['openGraph'] = {\n ...(defaultOpenGraph || {}),\n ...(defaultOGImageType === 'dynamic'\n ? {\n images: [\n {\n alt: ogTitle,\n height: 630,\n url: `/api/og${qs.stringify(\n {\n description:\n incomingMetadata.openGraph?.description || defaultOpenGraph.description,\n title: ogTitle,\n },\n {\n addQueryPrefix: true,\n },\n )}`,\n width: 1200,\n },\n ],\n }\n : {}),\n ...(defaultOGImageType === 'static'\n ? {\n images: [\n {\n alt: ogTitle,\n height: 480,\n url: typeof ogImage === 'object' ? ogImage.src : ogImage,\n width: 640,\n },\n ],\n }\n : {}),\n title: ogTitle,\n ...(incomingMetadata.openGraph || {}),\n }\n\n return Promise.resolve({\n ...incomingMetadata,\n icons,\n metadataBase: new URL(\n serverURL ||\n process.env.PAYLOAD_PUBLIC_SERVER_URL ||\n `http://localhost:${process.env.PORT || 3000}`,\n ),\n openGraph: mergedOpenGraph,\n title: metaTitle,\n })\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"getCustomCollectionViewByRoute.d.ts","sourceRoot":"","sources":["../../../src/views/Root/getCustomCollectionViewByRoute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,yBAAyB,EAC1B,MAAM,SAAS,CAAA;AAEhB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAI/D,eAAO,MAAM,8BAA8B,2EAKxC;IACD,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,yBAAyB,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAA;CACjE,KAAG;IACF,IAAI,EAAE,cAAc,CAAA;IACpB,OAAO,EAAE,IAAI,GAAG,MAAM,CAAA;CA0DvB,CAAA"}
1
+ {"version":3,"file":"getCustomCollectionViewByRoute.d.ts","sourceRoot":"","sources":["../../../src/views/Root/getCustomCollectionViewByRoute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,yBAAyB,EAAE,MAAM,SAAS,CAAA;AAEzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAI/D,eAAO,MAAM,8BAA8B,2EAKxC;IACD,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,yBAAyB,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAA;CACjE,KAAG;IACF,IAAI,EAAE,cAAc,CAAA;IACpB,OAAO,EAAE,IAAI,GAAG,MAAM,CAAA;CA0DvB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"getCustomCollectionViewByRoute.js","names":["isPathMatchingRoute","getCustomCollectionViewByRoute","adminRoute","baseRoute","currentRoute","currentRouteWithAdmin","views","startsWith","slice","length","foundEntry","Object","entries","find","key","view","isAdminViewConfig","path","adminView","viewPath","exact","sensitive","strict","viewKey","foundViewConfig","payloadComponent","Component"],"sources":["../../../src/views/Root/getCustomCollectionViewByRoute.ts"],"sourcesContent":["import type {\n AdminViewConfig,\n AdminViewServerProps,\n PayloadComponent,\n SanitizedCollectionConfig,\n} from 'payload'\n\nimport type { ViewFromConfig } from './getCustomViewByRoute.js'\n\nimport { isPathMatchingRoute } from '../../utilities/isPathMatchingRoute.js'\n\nexport const getCustomCollectionViewByRoute = ({\n adminRoute,\n baseRoute,\n currentRoute: currentRouteWithAdmin,\n views,\n}: {\n adminRoute: string\n baseRoute: string\n currentRoute: string\n views: SanitizedCollectionConfig['admin']['components']['views']\n}): {\n view: ViewFromConfig\n viewKey: null | string\n} => {\n const currentRoute =\n adminRoute === '/'\n ? currentRouteWithAdmin\n : currentRouteWithAdmin.startsWith(adminRoute)\n ? currentRouteWithAdmin.slice(adminRoute.length)\n : currentRouteWithAdmin\n\n if (views && typeof views === 'object') {\n const foundEntry = Object.entries(views).find(([key, view]) => {\n // Skip the known collection view types: edit and list\n if (key === 'edit' || key === 'list') {\n return false\n }\n\n // Type guard: custom views should be AdminViewConfig with path and Component\n const isAdminViewConfig =\n typeof view === 'object' &&\n view !== null &&\n 'path' in view &&\n 'Component' in view &&\n typeof view.path === 'string'\n\n if (isAdminViewConfig) {\n const adminView = view as AdminViewConfig\n const viewPath = `${baseRoute}${adminView.path}`\n\n return isPathMatchingRoute({\n currentRoute,\n exact: adminView.exact,\n path: viewPath,\n sensitive: adminView.sensitive,\n strict: adminView.strict,\n })\n }\n\n return false\n })\n\n if (foundEntry) {\n const [viewKey, foundViewConfig] = foundEntry\n const adminView = foundViewConfig as AdminViewConfig\n return {\n view: {\n payloadComponent: adminView.Component as PayloadComponent<AdminViewServerProps>,\n },\n viewKey,\n }\n }\n }\n\n return {\n view: {\n Component: null,\n },\n viewKey: null,\n }\n}\n"],"mappings":"AASA,SAASA,mBAAmB,QAAQ;AAEpC,OAAO,MAAMC,8BAAA,GAAiCA,CAAC;EAC7CC,UAAU;EACVC,SAAS;EACTC,YAAA,EAAcC,qBAAqB;EACnCC;AAAK,CAMN;EAIC,MAAMF,YAAA,GACJF,UAAA,KAAe,MACXG,qBAAA,GACAA,qBAAA,CAAsBE,UAAU,CAACL,UAAA,IAC/BG,qBAAA,CAAsBG,KAAK,CAACN,UAAA,CAAWO,MAAM,IAC7CJ,qBAAA;EAER,IAAIC,KAAA,IAAS,OAAOA,KAAA,KAAU,UAAU;IACtC,MAAMI,UAAA,GAAaC,MAAA,CAAOC,OAAO,CAACN,KAAA,EAAOO,IAAI,CAAC,CAAC,CAACC,GAAA,EAAKC,IAAA,CAAK;MACxD;MACA,IAAID,GAAA,KAAQ,UAAUA,GAAA,KAAQ,QAAQ;QACpC,OAAO;MACT;MAEA;MACA,MAAME,iBAAA,GACJ,OAAOD,IAAA,KAAS,YAChBA,IAAA,KAAS,QACT,UAAUA,IAAA,IACV,eAAeA,IAAA,IACf,OAAOA,IAAA,CAAKE,IAAI,KAAK;MAEvB,IAAID,iBAAA,EAAmB;QACrB,MAAME,SAAA,GAAYH,IAAA;QAClB,MAAMI,QAAA,GAAW,GAAGhB,SAAA,GAAYe,SAAA,CAAUD,IAAI,EAAE;QAEhD,OAAOjB,mBAAA,CAAoB;UACzBI,YAAA;UACAgB,KAAA,EAAOF,SAAA,CAAUE,KAAK;UACtBH,IAAA,EAAME,QAAA;UACNE,SAAA,EAAWH,SAAA,CAAUG,SAAS;UAC9BC,MAAA,EAAQJ,SAAA,CAAUI;QACpB;MACF;MAEA,OAAO;IACT;IAEA,IAAIZ,UAAA,EAAY;MACd,MAAM,CAACa,OAAA,EAASC,eAAA,CAAgB,GAAGd,UAAA;MACnC,MAAMQ,SAAA,GAAYM,eAAA;MAClB,OAAO;QACLT,IAAA,EAAM;UACJU,gBAAA,EAAkBP,SAAA,CAAUQ;QAC9B;QACAH;MACF;IACF;EACF;EAEA,OAAO;IACLR,IAAA,EAAM;MACJW,SAAA,EAAW;IACb;IACAH,OAAA,EAAS;EACX;AACF","ignoreList":[]}
1
+ {"version":3,"file":"getCustomCollectionViewByRoute.js","names":["isPathMatchingRoute","getCustomCollectionViewByRoute","adminRoute","baseRoute","currentRoute","currentRouteWithAdmin","views","startsWith","slice","length","foundEntry","Object","entries","find","key","view","isAdminViewConfig","path","adminView","viewPath","exact","sensitive","strict","viewKey","foundViewConfig","payloadComponent","Component"],"sources":["../../../src/views/Root/getCustomCollectionViewByRoute.ts"],"sourcesContent":["import type { AdminViewConfig, SanitizedCollectionConfig } from 'payload'\n\nimport type { ViewFromConfig } from './getCustomViewByRoute.js'\n\nimport { isPathMatchingRoute } from '../../utilities/isPathMatchingRoute.js'\n\nexport const getCustomCollectionViewByRoute = ({\n adminRoute,\n baseRoute,\n currentRoute: currentRouteWithAdmin,\n views,\n}: {\n adminRoute: string\n baseRoute: string\n currentRoute: string\n views: SanitizedCollectionConfig['admin']['components']['views']\n}): {\n view: ViewFromConfig\n viewKey: null | string\n} => {\n const currentRoute =\n adminRoute === '/'\n ? currentRouteWithAdmin\n : currentRouteWithAdmin.startsWith(adminRoute)\n ? currentRouteWithAdmin.slice(adminRoute.length)\n : currentRouteWithAdmin\n\n if (views && typeof views === 'object') {\n const foundEntry = Object.entries(views).find(([key, view]) => {\n // Skip the known collection view types: edit and list\n if (key === 'edit' || key === 'list') {\n return false\n }\n\n // Type guard: custom views should be AdminViewConfig with path and Component\n const isAdminViewConfig =\n typeof view === 'object' &&\n view !== null &&\n 'path' in view &&\n 'Component' in view &&\n typeof view.path === 'string'\n\n if (isAdminViewConfig) {\n const adminView = view as AdminViewConfig\n const viewPath = `${baseRoute}${adminView.path}`\n\n return isPathMatchingRoute({\n currentRoute,\n exact: adminView.exact,\n path: viewPath,\n sensitive: adminView.sensitive,\n strict: adminView.strict,\n })\n }\n\n return false\n })\n\n if (foundEntry) {\n const [viewKey, foundViewConfig] = foundEntry\n const adminView = foundViewConfig as AdminViewConfig\n return {\n view: {\n payloadComponent: adminView.Component,\n },\n viewKey,\n }\n }\n }\n\n return {\n view: {\n Component: null,\n },\n viewKey: null,\n }\n}\n"],"mappings":"AAIA,SAASA,mBAAmB,QAAQ;AAEpC,OAAO,MAAMC,8BAAA,GAAiCA,CAAC;EAC7CC,UAAU;EACVC,SAAS;EACTC,YAAA,EAAcC,qBAAqB;EACnCC;AAAK,CAMN;EAIC,MAAMF,YAAA,GACJF,UAAA,KAAe,MACXG,qBAAA,GACAA,qBAAA,CAAsBE,UAAU,CAACL,UAAA,IAC/BG,qBAAA,CAAsBG,KAAK,CAACN,UAAA,CAAWO,MAAM,IAC7CJ,qBAAA;EAER,IAAIC,KAAA,IAAS,OAAOA,KAAA,KAAU,UAAU;IACtC,MAAMI,UAAA,GAAaC,MAAA,CAAOC,OAAO,CAACN,KAAA,EAAOO,IAAI,CAAC,CAAC,CAACC,GAAA,EAAKC,IAAA,CAAK;MACxD;MACA,IAAID,GAAA,KAAQ,UAAUA,GAAA,KAAQ,QAAQ;QACpC,OAAO;MACT;MAEA;MACA,MAAME,iBAAA,GACJ,OAAOD,IAAA,KAAS,YAChBA,IAAA,KAAS,QACT,UAAUA,IAAA,IACV,eAAeA,IAAA,IACf,OAAOA,IAAA,CAAKE,IAAI,KAAK;MAEvB,IAAID,iBAAA,EAAmB;QACrB,MAAME,SAAA,GAAYH,IAAA;QAClB,MAAMI,QAAA,GAAW,GAAGhB,SAAA,GAAYe,SAAA,CAAUD,IAAI,EAAE;QAEhD,OAAOjB,mBAAA,CAAoB;UACzBI,YAAA;UACAgB,KAAA,EAAOF,SAAA,CAAUE,KAAK;UACtBH,IAAA,EAAME,QAAA;UACNE,SAAA,EAAWH,SAAA,CAAUG,SAAS;UAC9BC,MAAA,EAAQJ,SAAA,CAAUI;QACpB;MACF;MAEA,OAAO;IACT;IAEA,IAAIZ,UAAA,EAAY;MACd,MAAM,CAACa,OAAA,EAASC,eAAA,CAAgB,GAAGd,UAAA;MACnC,MAAMQ,SAAA,GAAYM,eAAA;MAClB,OAAO;QACLT,IAAA,EAAM;UACJU,gBAAA,EAAkBP,SAAA,CAAUQ;QAC9B;QACAH;MACF;IACF;EACF;EAEA,OAAO;IACLR,IAAA,EAAM;MACJW,SAAA,EAAW;IACb;IACAH,OAAA,EAAS;EACX;AACF","ignoreList":[]}