@wix/bex-core 2.329.0 → 2.331.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/dist/cjs/assets/visual-e2e-locale/messages_visuale2e.json +1 -0
  2. package/dist/cjs/hooks/useImport.js +2 -0
  3. package/dist/cjs/hooks/useImport.js.map +1 -1
  4. package/dist/cjs/hooks/useImportConfig.js.map +1 -1
  5. package/dist/cjs/index.js +5 -2
  6. package/dist/cjs/index.js.map +1 -1
  7. package/dist/cjs/services/DataExtensionFieldOperationsService.js +3 -3
  8. package/dist/cjs/services/DataExtensionFieldOperationsService.js.map +1 -1
  9. package/dist/cjs/state/ArchiveFieldModalState.js +5 -8
  10. package/dist/cjs/state/ArchiveFieldModalState.js.map +1 -1
  11. package/dist/cjs/state/CustomFieldModalBiReporter.js +5 -9
  12. package/dist/cjs/state/CustomFieldModalBiReporter.js.map +1 -1
  13. package/dist/cjs/state/CustomFieldModalState.js +32 -71
  14. package/dist/cjs/state/CustomFieldModalState.js.map +1 -1
  15. package/dist/cjs/state/DataExtensionState.js +0 -12
  16. package/dist/cjs/state/DataExtensionState.js.map +1 -1
  17. package/dist/cjs/state/DeleteFieldModalState.js +9 -11
  18. package/dist/cjs/state/DeleteFieldModalState.js.map +1 -1
  19. package/dist/cjs/state/{DataExtensionStateBIReporter.js → FieldOperationsBIReporter.js} +7 -32
  20. package/dist/cjs/state/FieldOperationsBIReporter.js.map +1 -0
  21. package/dist/cjs/state/ImportState/ImportState.js +47 -3
  22. package/dist/cjs/state/ImportState/ImportState.js.map +1 -1
  23. package/dist/cjs/state/ImportState/__tests__/ImportState.engine.spec.js +139 -0
  24. package/dist/cjs/state/ImportState/__tests__/ImportState.engine.spec.js.map +1 -1
  25. package/dist/cjs/state/formatPermissionsForBi.js +36 -0
  26. package/dist/cjs/state/formatPermissionsForBi.js.map +1 -0
  27. package/dist/cjs/types/FieldsSource.js +4 -0
  28. package/dist/cjs/types/FieldsSource.js.map +1 -0
  29. package/dist/cjs/types/Schema.js.map +1 -1
  30. package/dist/cjs/types/SchemaSource.js +81 -0
  31. package/dist/cjs/types/SchemaSource.js.map +1 -0
  32. package/dist/esm/assets/visual-e2e-locale/messages_visuale2e.json +1 -0
  33. package/dist/esm/hooks/useImport.js +2 -1
  34. package/dist/esm/hooks/useImport.js.map +1 -1
  35. package/dist/esm/hooks/useImportConfig.js.map +1 -1
  36. package/dist/esm/index.js +1 -0
  37. package/dist/esm/index.js.map +1 -1
  38. package/dist/esm/services/DataExtensionFieldOperationsService.js +3 -3
  39. package/dist/esm/services/DataExtensionFieldOperationsService.js.map +1 -1
  40. package/dist/esm/state/ArchiveFieldModalState.js +4 -7
  41. package/dist/esm/state/ArchiveFieldModalState.js.map +1 -1
  42. package/dist/esm/state/CustomFieldModalBiReporter.js +5 -8
  43. package/dist/esm/state/CustomFieldModalBiReporter.js.map +1 -1
  44. package/dist/esm/state/CustomFieldModalState.js +28 -52
  45. package/dist/esm/state/CustomFieldModalState.js.map +1 -1
  46. package/dist/esm/state/DataExtensionState.js +0 -10
  47. package/dist/esm/state/DataExtensionState.js.map +1 -1
  48. package/dist/esm/state/DeleteFieldModalState.js +7 -10
  49. package/dist/esm/state/DeleteFieldModalState.js.map +1 -1
  50. package/dist/esm/state/{DataExtensionStateBIReporter.js → FieldOperationsBIReporter.js} +5 -25
  51. package/dist/esm/state/FieldOperationsBIReporter.js.map +1 -0
  52. package/dist/esm/state/ImportState/ImportState.js +43 -3
  53. package/dist/esm/state/ImportState/ImportState.js.map +1 -1
  54. package/dist/esm/state/ImportState/__tests__/ImportState.engine.spec.js +89 -0
  55. package/dist/esm/state/ImportState/__tests__/ImportState.engine.spec.js.map +1 -1
  56. package/dist/esm/state/formatPermissionsForBi.js +26 -0
  57. package/dist/esm/state/formatPermissionsForBi.js.map +1 -0
  58. package/dist/esm/types/FieldsSource.js +2 -0
  59. package/dist/esm/types/FieldsSource.js.map +1 -0
  60. package/dist/esm/types/SchemaSource.js +52 -0
  61. package/dist/esm/types/SchemaSource.js.map +1 -0
  62. package/dist/types/hooks/useImport.d.ts +11 -2
  63. package/dist/types/hooks/useImport.d.ts.map +1 -1
  64. package/dist/types/hooks/useImportConfig.d.ts +13 -2
  65. package/dist/types/hooks/useImportConfig.d.ts.map +1 -1
  66. package/dist/types/index.d.ts +4 -1
  67. package/dist/types/index.d.ts.map +1 -1
  68. package/dist/types/state/ArchiveFieldModalState.d.ts +7 -5
  69. package/dist/types/state/ArchiveFieldModalState.d.ts.map +1 -1
  70. package/dist/types/state/CustomFieldModalBiReporter.d.ts +4 -3
  71. package/dist/types/state/CustomFieldModalBiReporter.d.ts.map +1 -1
  72. package/dist/types/state/CustomFieldModalState.d.ts +12 -6
  73. package/dist/types/state/CustomFieldModalState.d.ts.map +1 -1
  74. package/dist/types/state/DataExtensionState.d.ts +0 -2
  75. package/dist/types/state/DataExtensionState.d.ts.map +1 -1
  76. package/dist/types/state/DeleteFieldModalState.d.ts +8 -5
  77. package/dist/types/state/DeleteFieldModalState.d.ts.map +1 -1
  78. package/dist/types/state/{DataExtensionStateBIReporter.d.ts → FieldOperationsBIReporter.d.ts} +4 -5
  79. package/dist/types/state/FieldOperationsBIReporter.d.ts.map +1 -0
  80. package/dist/types/state/ImportState/ImportState.d.ts +32 -4
  81. package/dist/types/state/ImportState/ImportState.d.ts.map +1 -1
  82. package/dist/types/state/formatPermissionsForBi.d.ts +7 -0
  83. package/dist/types/state/formatPermissionsForBi.d.ts.map +1 -0
  84. package/dist/types/types/FieldsSource.d.ts +116 -0
  85. package/dist/types/types/FieldsSource.d.ts.map +1 -0
  86. package/dist/types/types/Schema.d.ts +28 -11
  87. package/dist/types/types/Schema.d.ts.map +1 -1
  88. package/dist/types/types/SchemaSource.d.ts +60 -0
  89. package/dist/types/types/SchemaSource.d.ts.map +1 -0
  90. package/package.json +4 -4
  91. package/dist/cjs/state/DataExtensionStateBIReporter.js.map +0 -1
  92. package/dist/esm/state/DataExtensionStateBIReporter.js.map +0 -1
  93. package/dist/types/state/DataExtensionStateBIReporter.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"names":["_util","require","_mobx","_ImportState","_types","_hubJobClient","globalScope","global","TextEncoder","TextDecoder","jest","mock","COMPLETED_JOB","id","status","JobStatus","COMPLETED","progress","itemsSuccessful","itemsRejected","total","current","setup","clientOverrides","extraProps","client","uploadFile","fn","_file","submitImportJob","getJob","terminateJob","undefined","listMovementLogs","createHubJobClient","mockReturnValue","importModalState","close","collection","clearResultAndMoveToStart","showToast","downloadCsv","translate","key","params","JSON","stringify","props","fields","header","collectionId","httpClient","request","errorHandler","withErrorHandler","state","ImportState","runInAction","fileName","csvHeaders","csvRows","mappingByHeader","Name","kind","fieldId","describe","beforeEach","useRealTimers","it","startImport","expect","toHaveBeenCalledTimes","calls","toBeInstanceOf","File","toHaveBeenCalledWith","fileId","name","destination","wixDataCollection","result","toEqual","succeeded","failed","importStatus","toBe","toHaveBeenCalled","force","PARTIALLY_SUCCESSFUL","objectContaining","type","logs","sourceItemId","failure","code","description","pagingMetadata","hasNext","Notes","toast","action","onClick","content","toContain","not","_error$response","FAILED","error","response","data","details","applicationError","_error$response2","onJobError","run","mockImplementation","IN_PROGRESS","dispose","init","restoreFn","mockResolvedValue","backup","restore","flush","Promise","resolve","setTimeout","promise","isSuccess","currentStep","seedIdMapping","ID","idMappedHeader","toBeNull","writePolicy","WritePolicy","OVERWRITE","setWritePolicy","SKIP_EXISTING","reset","csv","file","arrayBuffer","encode","buffer","onFileSelected","setMapping"],"sources":["../../../../../src/state/ImportState/__tests__/ImportState.engine.spec.ts"],"sourcesContent":["import { TextDecoder, TextEncoder } from 'util';\nimport { runInAction } from 'mobx';\n\n// The jsdom test env doesn't expose these globals, but `onFileSelected` decodes\n// the uploaded bytes with `TextDecoder` (and the test encodes CSV with\n// `TextEncoder`). Polyfill from Node's `util`.\nconst globalScope = global as unknown as {\n TextEncoder: typeof TextEncoder;\n TextDecoder: typeof TextDecoder;\n};\nglobalScope.TextEncoder = globalScope.TextEncoder ?? TextEncoder;\nglobalScope.TextDecoder = globalScope.TextDecoder ?? TextDecoder;\nimport {\n ImportState,\n ImportStateProps,\n ImportCollection,\n} from '../ImportState';\nimport {\n JobStatus,\n WritePolicy,\n type DataMovementJob,\n} from '@wix/bex-utils/@wix/ambassador-hub-v1-job/types';\nimport { createHubJobClient, HubJobClient } from '../hubJobClient';\n\njest.mock('../hubJobClient');\n\nconst COMPLETED_JOB: DataMovementJob = {\n id: 'job-1',\n status: JobStatus.COMPLETED,\n progress: { itemsSuccessful: 2, itemsRejected: 0, total: 2, current: 2 },\n};\n\nfunction setup(\n clientOverrides: Record<string, jest.Mock> = {},\n extraProps: Partial<ImportStateProps> = {},\n) {\n const client = {\n uploadFile: jest.fn(async (_file: File) => 'file-1'),\n submitImportJob: jest.fn(async () => 'job-1'),\n getJob: jest.fn(async () => COMPLETED_JOB),\n terminateJob: jest.fn(async () => undefined),\n listMovementLogs: jest.fn(),\n ...clientOverrides,\n };\n (createHubJobClient as jest.Mock).mockReturnValue(\n client as unknown as HubJobClient,\n );\n\n const importModalState = { close: jest.fn() };\n const collection: ImportCollection = {\n clearResultAndMoveToStart: jest.fn(),\n };\n const showToast = jest.fn();\n const downloadCsv = jest.fn();\n const translate = (key: string, params?: Record<string, string>) =>\n params ? `${key}:${JSON.stringify(params)}` : key;\n\n const props: ImportStateProps = {\n fields: [{ id: 'name', header: 'Name' }],\n collectionId: 'Movies',\n httpClient: {\n request: jest.fn(),\n } as unknown as ImportStateProps['httpClient'],\n collection,\n importModalState:\n importModalState as unknown as ImportStateProps['importModalState'],\n translate: translate as unknown as ImportStateProps['translate'],\n errorHandler: {\n withErrorHandler: (fn: () => unknown) => fn(),\n } as unknown as ImportStateProps['errorHandler'],\n showToast: showToast as unknown as ImportStateProps['showToast'],\n downloadCsv,\n ...extraProps,\n };\n\n const state = new ImportState(props);\n\n // Seed a parsed CSV mapped to an existing field.\n runInAction(() => {\n state.fileName = 'data.csv';\n state.csvHeaders = ['Name'];\n state.csvRows = [['Apple'], ['Pear']];\n state.mappingByHeader = { Name: { kind: 'existing', fieldId: 'name' } };\n });\n\n return {\n state,\n client,\n importModalState,\n collection,\n showToast,\n downloadCsv,\n };\n}\n\ndescribe('ImportState engine (data-hub job)', () => {\n beforeEach(() => {\n // The success path awaits a real setTimeout (completion linger); make sure\n // timers are real even if the preset defaults to fake ones.\n jest.useRealTimers();\n });\n\n it('uploads the aligned file, submits a job, and reports success', async () => {\n const { state, client, importModalState, collection } = setup();\n\n await state.startImport();\n\n expect(client.uploadFile).toHaveBeenCalledTimes(1);\n expect(client.uploadFile.mock.calls[0][0]).toBeInstanceOf(File);\n\n expect(client.submitImportJob).toHaveBeenCalledWith({\n fileId: 'file-1',\n name: 'data.csv',\n destination: { wixDataCollection: { collectionId: 'Movies' } },\n });\n\n expect(state.result).toEqual({ succeeded: 2, failed: 0 });\n expect(state.importStatus.status).toBe('success');\n expect(importModalState.close).toHaveBeenCalled();\n expect(collection.clearResultAndMoveToStart).toHaveBeenCalledWith({\n force: true,\n });\n });\n\n it('shows a partial-success toast when some rows are rejected', async () => {\n const { state, showToast, importModalState } = setup({\n getJob: jest.fn(\n async () =>\n ({\n id: 'job-1',\n status: JobStatus.PARTIALLY_SUCCESSFUL,\n progress: {\n itemsSuccessful: 1,\n itemsRejected: 1,\n total: 2,\n current: 2,\n },\n } as DataMovementJob),\n ),\n });\n\n await state.startImport();\n\n expect(state.result).toEqual({ succeeded: 1, failed: 1 });\n expect(showToast).toHaveBeenCalledWith(\n expect.objectContaining({ type: 'WARNING' }),\n );\n expect(importModalState.close).toHaveBeenCalled();\n });\n\n it('maps the failed \"row N\" by record (unaffected by an embedded-newline cell)', async () => {\n const { state, downloadCsv, showToast } = setup({\n getJob: jest.fn(\n async () =>\n ({\n id: 'job-1',\n status: JobStatus.PARTIALLY_SUCCESSFUL,\n progress: { itemsSuccessful: 2, itemsRejected: 1 },\n } as DataMovementJob),\n ),\n // data-hub numbers records (csv-parse, RFC-4180): the 3rd data record is\n // \"row 4\" regardless of the multi-line cell in the 1st record.\n listMovementLogs: jest.fn(async () => ({\n logs: [\n { sourceItemId: 'row 4', failure: { code: 'x', description: 'y' } },\n ],\n pagingMetadata: { hasNext: false },\n })),\n });\n\n // Row 0 has a quoted embedded newline; the failed record is row 2 (Mango).\n runInAction(() => {\n state.fileName = 'data.csv';\n state.csvHeaders = ['Name', 'Notes'];\n state.csvRows = [\n ['Apple', 'line1\\nline2'],\n ['Pear', 'ok'],\n ['Mango', 'bad'],\n ];\n state.mappingByHeader = {\n Name: { kind: 'existing', fieldId: 'name' },\n Notes: { kind: 'existing', fieldId: 'notes' },\n };\n });\n\n await state.startImport();\n const toast = showToast.mock.calls[0][0];\n await toast.action.onClick();\n\n // \"row 4\" → csvRows[2] (Mango), NOT shifted by the embedded newline in row 0.\n const [content] = downloadCsv.mock.calls[0];\n expect(content).toContain('Mango');\n expect(content).not.toContain('Apple');\n });\n\n it('downloads a re-importable CSV of the failed rows from the partial toast action', async () => {\n const { state, client, showToast, downloadCsv } = setup({\n getJob: jest.fn(\n async () =>\n ({\n id: 'job-1',\n status: JobStatus.PARTIALLY_SUCCESSFUL,\n progress: { itemsSuccessful: 1, itemsRejected: 1 },\n } as DataMovementJob),\n ),\n // csvRows[1] (the \"Pear\" row) failed → file line 3 → \"row 3\".\n listMovementLogs: jest.fn(async () => ({\n logs: [\n { sourceItemId: 'row 3', failure: { code: 'bad', description: 'x' } },\n ],\n pagingMetadata: { hasNext: false },\n })),\n });\n\n await state.startImport();\n\n // Trigger the toast's download action.\n const toast = showToast.mock.calls[0][0];\n await toast.action.onClick();\n\n expect(client.listMovementLogs).toHaveBeenCalledWith('job-1', undefined);\n // Original headers + only the failed row, ready to fix and re-upload.\n expect(downloadCsv).toHaveBeenCalledWith('Name\\r\\nPear', 'failed-data.csv');\n });\n\n it('surfaces an error state with an application-error-shaped error when the job fails', async () => {\n const { state, importModalState, collection } = setup({\n getJob: jest.fn(\n async () =>\n ({\n id: 'job-1',\n status: JobStatus.FAILED,\n error: { code: 'import_failed', description: 'Bad rows' },\n } as DataMovementJob),\n ),\n });\n\n await state.startImport();\n\n expect(state.importStatus.status).toBe('error');\n // HTTP-error-shaped so the UI resolves the message via\n // errorHandler.getResolvedError rather than reading the raw server string.\n // The handler reads the code from `response.data.details.applicationError`.\n const error = state.importStatus.error as {\n response?: {\n data?: { details?: { applicationError?: { code?: string } } };\n };\n };\n expect(error.response?.data?.details?.applicationError?.code).toBe(\n 'import_failed',\n );\n expect(importModalState.close).not.toHaveBeenCalled();\n expect(collection.clearResultAndMoveToStart).not.toHaveBeenCalled();\n });\n\n it('hands a failed job to onJobError, which surfaces the wrapped error', async () => {\n // Wiring only: the consumer forwards `run` to their withErrorHandler exactly\n // as documented, and the error it re-rejects is the one surfaced to the UI\n // (with the application-error-shaped code intact). End-to-end resolution\n // against the real error handler is covered in the cairo\n // Table.importButton spec, which has a real errorHandler instance.\n // Mirror `(run) => errorHandler.withErrorHandler(run, errorCodesMap)`;\n // a passthrough stub, so this just runs `run` and re-rejects.\n const withErrorHandler = (fn: () => Promise<unknown>) => fn();\n const onJobError = jest.fn((run: () => Promise<unknown>) =>\n withErrorHandler(run),\n );\n\n const { state } = setup(\n {\n getJob: jest.fn(\n async () =>\n ({\n id: 'job-1',\n status: JobStatus.FAILED,\n error: { code: 'duplicate_key', description: 'Bad rows' },\n } as DataMovementJob),\n ),\n },\n { onJobError },\n );\n\n await state.startImport();\n\n expect(onJobError).toHaveBeenCalledTimes(1);\n expect(typeof onJobError.mock.calls[0][0]).toBe('function');\n expect(state.importStatus.status).toBe('error');\n const error = state.importStatus.error as {\n response?: {\n data?: { details?: { applicationError?: { code?: string } } };\n };\n };\n expect(error.response?.data?.details?.applicationError?.code).toBe(\n 'duplicate_key',\n );\n });\n\n it('terminates the job when closed mid-import', async () => {\n const { state, client, importModalState } = setup();\n // Cancel during the first poll, before the job is terminal.\n client.getJob.mockImplementation(async () => {\n await state.close();\n return { id: 'job-1', status: JobStatus.IN_PROGRESS };\n });\n\n await state.startImport();\n\n expect(client.terminateJob).toHaveBeenCalledWith('job-1');\n expect(importModalState.close).toHaveBeenCalled();\n });\n\n it('terminates the job when cancelled while submitImportJob is in flight', async () => {\n const { state, client } = setup();\n // The user cancels while submit is still in flight: close() runs before\n // _jobId is set (so it can't terminate), then submit resolves.\n client.submitImportJob.mockImplementation(async () => {\n await state.close();\n return 'job-1';\n });\n\n await state.startImport();\n\n // The late-cancel path must terminate the orphaned job, and polling never starts.\n expect(client.terminateJob).toHaveBeenCalledWith('job-1');\n expect(client.getJob).not.toHaveBeenCalled();\n });\n\n it('aborts the poll loop when disposed (unmounted) mid-import', async () => {\n const { state, client } = setup();\n const dispose = state.init();\n // Simulate the component unmounting during the first poll.\n client.getJob.mockImplementation(async () => {\n dispose();\n return { id: 'job-1', status: JobStatus.IN_PROGRESS };\n });\n\n await state.startImport();\n\n // Without the disposer the loop would keep polling the IN_PROGRESS job\n // forever; it must stop after the first fetch.\n expect(client.getJob).toHaveBeenCalledTimes(1);\n });\n\n it('does not restore when closed during the success completion linger', async () => {\n const restoreFn = jest.fn().mockResolvedValue(undefined);\n const { state, importModalState, collection } = setup(\n {},\n { backup: async () => ({ restore: restoreFn }) },\n );\n\n // A 0ms macrotask drains the pending async chain without firing the 600ms\n // linger timer.\n const flush = () => new Promise((resolve) => setTimeout(resolve, 0));\n\n const promise = state.startImport();\n // Run backup → upload → submit → poll (terminal) → success, parking on the\n // 600ms completion linger (still on the 'progress' step) without firing it.\n await flush();\n await flush();\n await flush();\n\n expect(state.importStatus.isSuccess).toBe(true);\n expect(state.currentStep).toBe('progress');\n\n // User closes the modal mid-linger.\n await state.close();\n await promise;\n\n // A successful import must not be reverted; the modal closes and the\n // collection refreshes.\n expect(restoreFn).not.toHaveBeenCalled();\n expect(importModalState.close).toHaveBeenCalled();\n expect(collection.clearResultAndMoveToStart).toHaveBeenCalledWith({\n force: true,\n });\n });\n});\n\ndescribe('ImportState writePolicy (id-collision handling)', () => {\n beforeEach(() => {\n jest.useRealTimers();\n });\n\n // Seed a CSV column mapped to the `_id` field so collisions are possible.\n function seedIdMapping(state: ImportState) {\n runInAction(() => {\n state.fileName = 'data.csv';\n state.csvHeaders = ['ID', 'Name'];\n state.csvRows = [\n ['1', 'Apple'],\n ['2', 'Pear'],\n ];\n state.mappingByHeader = {\n ID: { kind: 'existing', fieldId: '_id' },\n Name: { kind: 'existing', fieldId: 'name' },\n };\n });\n }\n\n it('exposes the header mapped to `_id` via idMappedHeader', () => {\n const { state } = setup();\n expect(state.idMappedHeader).toBeNull();\n\n seedIdMapping(state);\n expect(state.idMappedHeader).toBe('ID');\n });\n\n it('omits writePolicy when no column is mapped to `_id`', async () => {\n const { state, client } = setup();\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: { wixDataCollection: { collectionId: 'Movies' } },\n }),\n );\n });\n\n it('sends the default OVERWRITE policy when a column maps to `_id`', async () => {\n const { state, client } = setup();\n seedIdMapping(state);\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: {\n wixDataCollection: {\n collectionId: 'Movies',\n writePolicy: WritePolicy.OVERWRITE,\n },\n },\n }),\n );\n });\n\n it('sends SKIP_EXISTING after the user switches the policy', async () => {\n const { state, client } = setup();\n seedIdMapping(state);\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: {\n wixDataCollection: {\n collectionId: 'Movies',\n writePolicy: WritePolicy.SKIP_EXISTING,\n },\n },\n }),\n );\n });\n\n it('resets the policy back to OVERWRITE', () => {\n const { state } = setup();\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n expect(state.writePolicy).toBe(WritePolicy.SKIP_EXISTING);\n\n state.reset();\n expect(state.writePolicy).toBe(WritePolicy.OVERWRITE);\n });\n\n it('resets the policy to OVERWRITE when a new file is uploaded mid-session', async () => {\n const { state } = setup();\n seedIdMapping(state);\n // The user switched to Skip for the first file.\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n expect(state.writePolicy).toBe(WritePolicy.SKIP_EXISTING);\n\n // Uploading a different CSV in the same modal session must start from the\n // documented default — otherwise the prior Skip silently carries over and\n // rows with a colliding `_id` are skipped instead of updated.\n const csv = 'ID,Name\\nid-9,Zed\\n';\n const file = {\n name: 'file-b.csv',\n arrayBuffer: async () => new TextEncoder().encode(csv).buffer,\n } as unknown as File;\n await state.onFileSelected(file);\n\n expect(state.writePolicy).toBe(WritePolicy.OVERWRITE);\n });\n\n it('keeps the chosen policy when the `_id` mapping is removed and re-added', () => {\n const { state } = setup();\n seedIdMapping(state);\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n\n // Remap the ID column away: the control hides and the destination drops\n // writePolicy, but the user's choice is intentionally retained (editing\n // mappings within a file never resets it — only a new file does).\n state.setMapping('ID', null);\n expect(state.idMappedHeader).toBeNull();\n expect(state.writePolicy).toBe(WritePolicy.SKIP_EXISTING);\n\n // Map `_id` again — the prior choice is still in effect.\n state.setMapping('ID', '_id');\n expect(state.idMappedHeader).toBe('ID');\n expect(state.writePolicy).toBe(WritePolicy.SKIP_EXISTING);\n });\n\n it('omits writePolicy when the `_id` column is remapped away mid-session', async () => {\n const { state, client } = setup();\n seedIdMapping(state);\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n // No column maps to `_id` anymore → no collisions possible → omit it.\n state.setMapping('ID', null);\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: { wixDataCollection: { collectionId: 'Movies' } },\n }),\n );\n });\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_util","require","_mobx","_ImportState","_types","_hubJobClient","globalScope","global","TextEncoder","TextDecoder","jest","mock","COMPLETED_JOB","id","status","JobStatus","COMPLETED","progress","itemsSuccessful","itemsRejected","total","current","setup","clientOverrides","extraProps","client","uploadFile","fn","_file","submitImportJob","getJob","terminateJob","undefined","listMovementLogs","createHubJobClient","mockReturnValue","importModalState","close","collection","clearResultAndMoveToStart","showToast","downloadCsv","translate","key","params","JSON","stringify","props","fields","header","collectionId","httpClient","request","errorHandler","withErrorHandler","state","ImportState","runInAction","fileName","csvHeaders","csvRows","mappingByHeader","Name","kind","fieldId","describe","beforeEach","useRealTimers","it","startImport","expect","toHaveBeenCalledTimes","calls","toBeInstanceOf","File","toHaveBeenCalledWith","fileId","name","destination","wixDataCollection","result","toEqual","succeeded","failed","importStatus","toBe","toHaveBeenCalled","force","PARTIALLY_SUCCESSFUL","objectContaining","type","logs","sourceItemId","failure","code","description","pagingMetadata","hasNext","Notes","toast","action","onClick","content","toContain","not","_error$response","FAILED","error","response","data","details","applicationError","_error$response2","onJobError","run","mockImplementation","IN_PROGRESS","dispose","init","restoreFn","mockResolvedValue","backup","restore","flush","Promise","resolve","setTimeout","promise","isSuccess","currentStep","seedIdMapping","ID","idMappedHeader","toBeNull","writePolicy","WritePolicy","OVERWRITE","setWritePolicy","SKIP_EXISTING","reset","csv","file","arrayBuffer","encode","buffer","onFileSelected","setMapping","parseWithIdColumn","orderedHeaders","storesCatalogProducts","storesCatalogInventory","platformized","canConfigureWritePolicy","wixData"],"sources":["../../../../../src/state/ImportState/__tests__/ImportState.engine.spec.ts"],"sourcesContent":["import { TextDecoder, TextEncoder } from 'util';\nimport { runInAction } from 'mobx';\n\n// The jsdom test env doesn't expose these globals, but `onFileSelected` decodes\n// the uploaded bytes with `TextDecoder` (and the test encodes CSV with\n// `TextEncoder`). Polyfill from Node's `util`.\nconst globalScope = global as unknown as {\n TextEncoder: typeof TextEncoder;\n TextDecoder: typeof TextDecoder;\n};\nglobalScope.TextEncoder = globalScope.TextEncoder ?? TextEncoder;\nglobalScope.TextDecoder = globalScope.TextDecoder ?? TextDecoder;\nimport {\n ImportState,\n ImportStateProps,\n ImportCollection,\n} from '../ImportState';\nimport {\n JobStatus,\n WritePolicy,\n type DataMovementJob,\n} from '@wix/bex-utils/@wix/ambassador-hub-v1-job/types';\nimport { createHubJobClient, HubJobClient } from '../hubJobClient';\n\njest.mock('../hubJobClient');\n\nconst COMPLETED_JOB: DataMovementJob = {\n id: 'job-1',\n status: JobStatus.COMPLETED,\n progress: { itemsSuccessful: 2, itemsRejected: 0, total: 2, current: 2 },\n};\n\nfunction setup(\n clientOverrides: Record<string, jest.Mock> = {},\n extraProps: Partial<ImportStateProps> = {},\n) {\n const client = {\n uploadFile: jest.fn(async (_file: File) => 'file-1'),\n submitImportJob: jest.fn(async () => 'job-1'),\n getJob: jest.fn(async () => COMPLETED_JOB),\n terminateJob: jest.fn(async () => undefined),\n listMovementLogs: jest.fn(),\n ...clientOverrides,\n };\n (createHubJobClient as jest.Mock).mockReturnValue(\n client as unknown as HubJobClient,\n );\n\n const importModalState = { close: jest.fn() };\n const collection: ImportCollection = {\n clearResultAndMoveToStart: jest.fn(),\n };\n const showToast = jest.fn();\n const downloadCsv = jest.fn();\n const translate = (key: string, params?: Record<string, string>) =>\n params ? `${key}:${JSON.stringify(params)}` : key;\n\n const props: ImportStateProps = {\n fields: [{ id: 'name', header: 'Name' }],\n collectionId: 'Movies',\n httpClient: {\n request: jest.fn(),\n } as unknown as ImportStateProps['httpClient'],\n collection,\n importModalState:\n importModalState as unknown as ImportStateProps['importModalState'],\n translate: translate as unknown as ImportStateProps['translate'],\n errorHandler: {\n withErrorHandler: (fn: () => unknown) => fn(),\n } as unknown as ImportStateProps['errorHandler'],\n showToast: showToast as unknown as ImportStateProps['showToast'],\n downloadCsv,\n ...extraProps,\n };\n\n const state = new ImportState(props);\n\n // Seed a parsed CSV mapped to an existing field.\n runInAction(() => {\n state.fileName = 'data.csv';\n state.csvHeaders = ['Name'];\n state.csvRows = [['Apple'], ['Pear']];\n state.mappingByHeader = { Name: { kind: 'existing', fieldId: 'name' } };\n });\n\n return {\n state,\n client,\n importModalState,\n collection,\n showToast,\n downloadCsv,\n };\n}\n\ndescribe('ImportState engine (data-hub job)', () => {\n beforeEach(() => {\n // The success path awaits a real setTimeout (completion linger); make sure\n // timers are real even if the preset defaults to fake ones.\n jest.useRealTimers();\n });\n\n it('uploads the aligned file, submits a job, and reports success', async () => {\n const { state, client, importModalState, collection } = setup();\n\n await state.startImport();\n\n expect(client.uploadFile).toHaveBeenCalledTimes(1);\n expect(client.uploadFile.mock.calls[0][0]).toBeInstanceOf(File);\n\n expect(client.submitImportJob).toHaveBeenCalledWith({\n fileId: 'file-1',\n name: 'data.csv',\n destination: { wixDataCollection: { collectionId: 'Movies' } },\n });\n\n expect(state.result).toEqual({ succeeded: 2, failed: 0 });\n expect(state.importStatus.status).toBe('success');\n expect(importModalState.close).toHaveBeenCalled();\n expect(collection.clearResultAndMoveToStart).toHaveBeenCalledWith({\n force: true,\n });\n });\n\n it('shows a partial-success toast when some rows are rejected', async () => {\n const { state, showToast, importModalState } = setup({\n getJob: jest.fn(\n async () =>\n ({\n id: 'job-1',\n status: JobStatus.PARTIALLY_SUCCESSFUL,\n progress: {\n itemsSuccessful: 1,\n itemsRejected: 1,\n total: 2,\n current: 2,\n },\n } as DataMovementJob),\n ),\n });\n\n await state.startImport();\n\n expect(state.result).toEqual({ succeeded: 1, failed: 1 });\n expect(showToast).toHaveBeenCalledWith(\n expect.objectContaining({ type: 'WARNING' }),\n );\n expect(importModalState.close).toHaveBeenCalled();\n });\n\n it('maps the failed \"row N\" by record (unaffected by an embedded-newline cell)', async () => {\n const { state, downloadCsv, showToast } = setup({\n getJob: jest.fn(\n async () =>\n ({\n id: 'job-1',\n status: JobStatus.PARTIALLY_SUCCESSFUL,\n progress: { itemsSuccessful: 2, itemsRejected: 1 },\n } as DataMovementJob),\n ),\n // data-hub numbers records (csv-parse, RFC-4180): the 3rd data record is\n // \"row 4\" regardless of the multi-line cell in the 1st record.\n listMovementLogs: jest.fn(async () => ({\n logs: [\n { sourceItemId: 'row 4', failure: { code: 'x', description: 'y' } },\n ],\n pagingMetadata: { hasNext: false },\n })),\n });\n\n // Row 0 has a quoted embedded newline; the failed record is row 2 (Mango).\n runInAction(() => {\n state.fileName = 'data.csv';\n state.csvHeaders = ['Name', 'Notes'];\n state.csvRows = [\n ['Apple', 'line1\\nline2'],\n ['Pear', 'ok'],\n ['Mango', 'bad'],\n ];\n state.mappingByHeader = {\n Name: { kind: 'existing', fieldId: 'name' },\n Notes: { kind: 'existing', fieldId: 'notes' },\n };\n });\n\n await state.startImport();\n const toast = showToast.mock.calls[0][0];\n await toast.action.onClick();\n\n // \"row 4\" → csvRows[2] (Mango), NOT shifted by the embedded newline in row 0.\n const [content] = downloadCsv.mock.calls[0];\n expect(content).toContain('Mango');\n expect(content).not.toContain('Apple');\n });\n\n it('downloads a re-importable CSV of the failed rows from the partial toast action', async () => {\n const { state, client, showToast, downloadCsv } = setup({\n getJob: jest.fn(\n async () =>\n ({\n id: 'job-1',\n status: JobStatus.PARTIALLY_SUCCESSFUL,\n progress: { itemsSuccessful: 1, itemsRejected: 1 },\n } as DataMovementJob),\n ),\n // csvRows[1] (the \"Pear\" row) failed → file line 3 → \"row 3\".\n listMovementLogs: jest.fn(async () => ({\n logs: [\n { sourceItemId: 'row 3', failure: { code: 'bad', description: 'x' } },\n ],\n pagingMetadata: { hasNext: false },\n })),\n });\n\n await state.startImport();\n\n // Trigger the toast's download action.\n const toast = showToast.mock.calls[0][0];\n await toast.action.onClick();\n\n expect(client.listMovementLogs).toHaveBeenCalledWith('job-1', undefined);\n // Original headers + only the failed row, ready to fix and re-upload.\n expect(downloadCsv).toHaveBeenCalledWith('Name\\r\\nPear', 'failed-data.csv');\n });\n\n it('surfaces an error state with an application-error-shaped error when the job fails', async () => {\n const { state, importModalState, collection } = setup({\n getJob: jest.fn(\n async () =>\n ({\n id: 'job-1',\n status: JobStatus.FAILED,\n error: { code: 'import_failed', description: 'Bad rows' },\n } as DataMovementJob),\n ),\n });\n\n await state.startImport();\n\n expect(state.importStatus.status).toBe('error');\n // HTTP-error-shaped so the UI resolves the message via\n // errorHandler.getResolvedError rather than reading the raw server string.\n // The handler reads the code from `response.data.details.applicationError`.\n const error = state.importStatus.error as {\n response?: {\n data?: { details?: { applicationError?: { code?: string } } };\n };\n };\n expect(error.response?.data?.details?.applicationError?.code).toBe(\n 'import_failed',\n );\n expect(importModalState.close).not.toHaveBeenCalled();\n expect(collection.clearResultAndMoveToStart).not.toHaveBeenCalled();\n });\n\n it('hands a failed job to onJobError, which surfaces the wrapped error', async () => {\n // Wiring only: the consumer forwards `run` to their withErrorHandler exactly\n // as documented, and the error it re-rejects is the one surfaced to the UI\n // (with the application-error-shaped code intact). End-to-end resolution\n // against the real error handler is covered in the cairo\n // Table.importButton spec, which has a real errorHandler instance.\n // Mirror `(run) => errorHandler.withErrorHandler(run, errorCodesMap)`;\n // a passthrough stub, so this just runs `run` and re-rejects.\n const withErrorHandler = (fn: () => Promise<unknown>) => fn();\n const onJobError = jest.fn((run: () => Promise<unknown>) =>\n withErrorHandler(run),\n );\n\n const { state } = setup(\n {\n getJob: jest.fn(\n async () =>\n ({\n id: 'job-1',\n status: JobStatus.FAILED,\n error: { code: 'duplicate_key', description: 'Bad rows' },\n } as DataMovementJob),\n ),\n },\n { onJobError },\n );\n\n await state.startImport();\n\n expect(onJobError).toHaveBeenCalledTimes(1);\n expect(typeof onJobError.mock.calls[0][0]).toBe('function');\n expect(state.importStatus.status).toBe('error');\n const error = state.importStatus.error as {\n response?: {\n data?: { details?: { applicationError?: { code?: string } } };\n };\n };\n expect(error.response?.data?.details?.applicationError?.code).toBe(\n 'duplicate_key',\n );\n });\n\n it('terminates the job when closed mid-import', async () => {\n const { state, client, importModalState } = setup();\n // Cancel during the first poll, before the job is terminal.\n client.getJob.mockImplementation(async () => {\n await state.close();\n return { id: 'job-1', status: JobStatus.IN_PROGRESS };\n });\n\n await state.startImport();\n\n expect(client.terminateJob).toHaveBeenCalledWith('job-1');\n expect(importModalState.close).toHaveBeenCalled();\n });\n\n it('terminates the job when cancelled while submitImportJob is in flight', async () => {\n const { state, client } = setup();\n // The user cancels while submit is still in flight: close() runs before\n // _jobId is set (so it can't terminate), then submit resolves.\n client.submitImportJob.mockImplementation(async () => {\n await state.close();\n return 'job-1';\n });\n\n await state.startImport();\n\n // The late-cancel path must terminate the orphaned job, and polling never starts.\n expect(client.terminateJob).toHaveBeenCalledWith('job-1');\n expect(client.getJob).not.toHaveBeenCalled();\n });\n\n it('aborts the poll loop when disposed (unmounted) mid-import', async () => {\n const { state, client } = setup();\n const dispose = state.init();\n // Simulate the component unmounting during the first poll.\n client.getJob.mockImplementation(async () => {\n dispose();\n return { id: 'job-1', status: JobStatus.IN_PROGRESS };\n });\n\n await state.startImport();\n\n // Without the disposer the loop would keep polling the IN_PROGRESS job\n // forever; it must stop after the first fetch.\n expect(client.getJob).toHaveBeenCalledTimes(1);\n });\n\n it('does not restore when closed during the success completion linger', async () => {\n const restoreFn = jest.fn().mockResolvedValue(undefined);\n const { state, importModalState, collection } = setup(\n {},\n { backup: async () => ({ restore: restoreFn }) },\n );\n\n // A 0ms macrotask drains the pending async chain without firing the 600ms\n // linger timer.\n const flush = () => new Promise((resolve) => setTimeout(resolve, 0));\n\n const promise = state.startImport();\n // Run backup → upload → submit → poll (terminal) → success, parking on the\n // 600ms completion linger (still on the 'progress' step) without firing it.\n await flush();\n await flush();\n await flush();\n\n expect(state.importStatus.isSuccess).toBe(true);\n expect(state.currentStep).toBe('progress');\n\n // User closes the modal mid-linger.\n await state.close();\n await promise;\n\n // A successful import must not be reverted; the modal closes and the\n // collection refreshes.\n expect(restoreFn).not.toHaveBeenCalled();\n expect(importModalState.close).toHaveBeenCalled();\n expect(collection.clearResultAndMoveToStart).toHaveBeenCalledWith({\n force: true,\n });\n });\n});\n\ndescribe('ImportState writePolicy (id-collision handling)', () => {\n beforeEach(() => {\n jest.useRealTimers();\n });\n\n // Seed a CSV column mapped to the `_id` field so collisions are possible.\n function seedIdMapping(state: ImportState) {\n runInAction(() => {\n state.fileName = 'data.csv';\n state.csvHeaders = ['ID', 'Name'];\n state.csvRows = [\n ['1', 'Apple'],\n ['2', 'Pear'],\n ];\n state.mappingByHeader = {\n ID: { kind: 'existing', fieldId: '_id' },\n Name: { kind: 'existing', fieldId: 'name' },\n };\n });\n }\n\n it('exposes the header mapped to `_id` via idMappedHeader', () => {\n const { state } = setup();\n expect(state.idMappedHeader).toBeNull();\n\n seedIdMapping(state);\n expect(state.idMappedHeader).toBe('ID');\n });\n\n it('omits writePolicy when no column is mapped to `_id`', async () => {\n const { state, client } = setup();\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: { wixDataCollection: { collectionId: 'Movies' } },\n }),\n );\n });\n\n it('sends the default OVERWRITE policy when a column maps to `_id`', async () => {\n const { state, client } = setup();\n seedIdMapping(state);\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: {\n wixDataCollection: {\n collectionId: 'Movies',\n writePolicy: WritePolicy.OVERWRITE,\n },\n },\n }),\n );\n });\n\n it('sends SKIP_EXISTING after the user switches the policy', async () => {\n const { state, client } = setup();\n seedIdMapping(state);\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: {\n wixDataCollection: {\n collectionId: 'Movies',\n writePolicy: WritePolicy.SKIP_EXISTING,\n },\n },\n }),\n );\n });\n\n it('resets the policy back to OVERWRITE', () => {\n const { state } = setup();\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n expect(state.writePolicy).toBe(WritePolicy.SKIP_EXISTING);\n\n state.reset();\n expect(state.writePolicy).toBe(WritePolicy.OVERWRITE);\n });\n\n it('resets the policy to OVERWRITE when a new file is uploaded mid-session', async () => {\n const { state } = setup();\n seedIdMapping(state);\n // The user switched to Skip for the first file.\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n expect(state.writePolicy).toBe(WritePolicy.SKIP_EXISTING);\n\n // Uploading a different CSV in the same modal session must start from the\n // documented default — otherwise the prior Skip silently carries over and\n // rows with a colliding `_id` are skipped instead of updated.\n const csv = 'ID,Name\\nid-9,Zed\\n';\n const file = {\n name: 'file-b.csv',\n arrayBuffer: async () => new TextEncoder().encode(csv).buffer,\n } as unknown as File;\n await state.onFileSelected(file);\n\n expect(state.writePolicy).toBe(WritePolicy.OVERWRITE);\n });\n\n it('keeps the chosen policy when the `_id` mapping is removed and re-added', () => {\n const { state } = setup();\n seedIdMapping(state);\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n\n // Remap the ID column away: the control hides and the destination drops\n // writePolicy, but the user's choice is intentionally retained (editing\n // mappings within a file never resets it — only a new file does).\n state.setMapping('ID', null);\n expect(state.idMappedHeader).toBeNull();\n expect(state.writePolicy).toBe(WritePolicy.SKIP_EXISTING);\n\n // Map `_id` again — the prior choice is still in effect.\n state.setMapping('ID', '_id');\n expect(state.idMappedHeader).toBe('ID');\n expect(state.writePolicy).toBe(WritePolicy.SKIP_EXISTING);\n });\n\n it('omits writePolicy when the `_id` column is remapped away mid-session', async () => {\n const { state, client } = setup();\n seedIdMapping(state);\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n // No column maps to `_id` anymore → no collisions possible → omit it.\n state.setMapping('ID', null);\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: { wixDataCollection: { collectionId: 'Movies' } },\n }),\n );\n });\n});\n\ndescribe('ImportState orderedHeaders (row order stability)', () => {\n beforeEach(() => {\n jest.useRealTimers();\n });\n\n // Parse a CSV whose `ID` column auto-maps to `_id` (a field with that id\n // exists), so the `_id` row floats to the top of the ordered list.\n async function parseWithIdColumn(state: ImportState) {\n const csv = 'Name,ID,Handle\\nApple,id-1,a\\nPear,id-2,p\\n';\n const file = {\n name: 'data.csv',\n arrayBuffer: async () => new TextEncoder().encode(csv).buffer,\n } as unknown as File;\n await state.onFileSelected(file);\n }\n\n it('floats the `_id`-mapped column to the top for a freshly parsed file', async () => {\n const { state } = setup({}, { fields: [{ id: '_id', header: 'ID' }] });\n\n await parseWithIdColumn(state);\n\n expect(state.idMappedHeader).toBe('ID');\n expect(state.orderedHeaders).toEqual(['ID', 'Name', 'Handle']);\n });\n\n it('keeps row order stable when the `_id` mapping is cleared and re-added', async () => {\n const { state } = setup({}, { fields: [{ id: '_id', header: 'ID' }] });\n await parseWithIdColumn(state);\n\n // Clearing the `_id` dropdown must not reorder the row under the cursor:\n // the snapshot stays fixed even though `idMappedHeader` becomes null.\n state.setMapping('ID', null);\n expect(state.idMappedHeader).toBeNull();\n expect(state.orderedHeaders).toEqual(['ID', 'Name', 'Handle']);\n\n // Re-mapping `_id` also leaves the order untouched.\n state.setMapping('ID', '_id');\n expect(state.idMappedHeader).toBe('ID');\n expect(state.orderedHeaders).toEqual(['ID', 'Name', 'Handle']);\n });\n\n it('re-snapshots the order for a new file and clears it on reset', async () => {\n const { state } = setup({}, { fields: [{ id: '_id', header: 'ID' }] });\n await parseWithIdColumn(state);\n expect(state.orderedHeaders).toEqual(['ID', 'Name', 'Handle']);\n\n // A file with no `_id` column keeps plain CSV order.\n const csv = 'First,Second\\n1,2\\n';\n const file = {\n name: 'other.csv',\n arrayBuffer: async () => new TextEncoder().encode(csv).buffer,\n } as unknown as File;\n await state.onFileSelected(file);\n expect(state.orderedHeaders).toEqual(['First', 'Second']);\n\n state.reset();\n expect(state.orderedHeaders).toEqual([]);\n });\n});\n\ndescribe('ImportState platformized destination (non–Wix-Data)', () => {\n beforeEach(() => {\n jest.useRealTimers();\n });\n\n it('sends a consumer-supplied destination verbatim, ignoring collectionId', async () => {\n const { state, client } = setup(\n {},\n { destination: { storesCatalogProducts: {} } },\n );\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: { storesCatalogProducts: {} },\n }),\n );\n });\n\n it('does not add writePolicy to a platformized destination even when `_id` is mapped', async () => {\n const { state, client } = setup(\n {},\n { destination: { storesCatalogInventory: {} } },\n );\n // Map a column to `_id` and pick a non-default policy — for a platformized\n // destination this must NOT leak into the destination (writePolicy is a\n // wixDataCollection-only concern).\n runInAction(() => {\n state.csvHeaders = ['Name', 'ID'];\n state.csvRows = [\n ['Apple', '1'],\n ['Pear', '2'],\n ];\n state.mappingByHeader = {\n Name: { kind: 'existing', fieldId: 'name' },\n ID: { kind: 'existing', fieldId: '_id' },\n };\n });\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: { storesCatalogInventory: {} },\n }),\n );\n });\n\n it('reports canConfigureWritePolicy=false for a custom destination (control hidden), true for the default path', () => {\n const platformized = setup(\n {},\n { destination: { storesCatalogProducts: {} } },\n ).state;\n expect(platformized.canConfigureWritePolicy).toBe(false);\n\n const wixData = setup().state;\n expect(wixData.canConfigureWritePolicy).toBe(true);\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.formatPermissionsForBi = void 0;
5
+ /**
6
+ * Turns a field's read/write selections into the string the BI `permissions`
7
+ * param expects, e.g. {"Installed apps":"Read and Write","Site visitors":null}.
8
+ */
9
+ const formatPermissionsForBi = formValues => {
10
+ const {
11
+ readApps,
12
+ readUsers,
13
+ writeApps,
14
+ writeUsers
15
+ } = formValues;
16
+ const apps = [];
17
+ const users = [];
18
+ if (readApps) {
19
+ apps.push('Read');
20
+ }
21
+ if (writeApps) {
22
+ apps.push('Write');
23
+ }
24
+ if (readUsers) {
25
+ users.push('Read');
26
+ }
27
+ if (writeUsers) {
28
+ users.push('Write');
29
+ }
30
+ return JSON.stringify({
31
+ 'Installed apps': apps.length !== 0 ? apps.join(' and ') : null,
32
+ 'Site visitors': users.length !== 0 ? users.join(' and ') : null
33
+ });
34
+ };
35
+ exports.formatPermissionsForBi = formatPermissionsForBi;
36
+ //# sourceMappingURL=formatPermissionsForBi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["formatPermissionsForBi","formValues","readApps","readUsers","writeApps","writeUsers","apps","users","push","JSON","stringify","length","join","exports"],"sources":["../../../src/state/formatPermissionsForBi.ts"],"sourcesContent":["import { FieldDraft } from '../types/FieldsSource';\n\n/**\n * Turns a field's read/write selections into the string the BI `permissions`\n * param expects, e.g. {\"Installed apps\":\"Read and Write\",\"Site visitors\":null}.\n */\nexport const formatPermissionsForBi = (formValues: FieldDraft): string => {\n const { readApps, readUsers, writeApps, writeUsers } = formValues;\n const apps = [];\n const users = [];\n\n if (readApps) {\n apps.push('Read');\n }\n\n if (writeApps) {\n apps.push('Write');\n }\n\n if (readUsers) {\n users.push('Read');\n }\n\n if (writeUsers) {\n users.push('Write');\n }\n\n return JSON.stringify({\n 'Installed apps': apps.length !== 0 ? apps.join(' and ') : null,\n 'Site visitors': users.length !== 0 ? users.join(' and ') : null,\n });\n};\n"],"mappings":";;;;AAEA;AACA;AACA;AACA;AACO,MAAMA,sBAAsB,GAAIC,UAAsB,IAAa;EACxE,MAAM;IAAEC,QAAQ;IAAEC,SAAS;IAAEC,SAAS;IAAEC;EAAW,CAAC,GAAGJ,UAAU;EACjE,MAAMK,IAAI,GAAG,EAAE;EACf,MAAMC,KAAK,GAAG,EAAE;EAEhB,IAAIL,QAAQ,EAAE;IACZI,IAAI,CAACE,IAAI,CAAC,MAAM,CAAC;EACnB;EAEA,IAAIJ,SAAS,EAAE;IACbE,IAAI,CAACE,IAAI,CAAC,OAAO,CAAC;EACpB;EAEA,IAAIL,SAAS,EAAE;IACbI,KAAK,CAACC,IAAI,CAAC,MAAM,CAAC;EACpB;EAEA,IAAIH,UAAU,EAAE;IACdE,KAAK,CAACC,IAAI,CAAC,OAAO,CAAC;EACrB;EAEA,OAAOC,IAAI,CAACC,SAAS,CAAC;IACpB,gBAAgB,EAAEJ,IAAI,CAACK,MAAM,KAAK,CAAC,GAAGL,IAAI,CAACM,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI;IAC/D,eAAe,EAAEL,KAAK,CAACI,MAAM,KAAK,CAAC,GAAGJ,KAAK,CAACK,IAAI,CAAC,OAAO,CAAC,GAAG;EAC9D,CAAC,CAAC;AACJ,CAAC;AAACC,OAAA,CAAAb,sBAAA,GAAAA,sBAAA","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ //# sourceMappingURL=FieldsSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["../../../src/types/FieldsSource.ts"],"sourcesContent":["import type { Field, PatternsFieldType } from './Field';\nimport type { FieldActions } from './Schema';\n\n/** A field the source has archived. Sources without archiving omit `archive`. */\nexport interface ArchivedFieldItem {\n id: string;\n label: string;\n isPii?: boolean;\n}\n\n/** A field type a source allows creating, with display metadata for the modal. */\nexport interface FieldTypeOption {\n /** Stored on the draft; the source maps it back to its native type. */\n id: string;\n label: string;\n namePlaceholder?: string;\n /** Drives the type icon in the modal. */\n patternsType: PatternsFieldType;\n}\n\n/** Read/write permission defaults a source supports, per audience. */\nexport interface FieldPermissions {\n installedApps?: {\n hide?: boolean;\n defaultRead?: boolean;\n defaultWrite?: boolean;\n };\n siteVisitors?: {\n hide?: boolean;\n defaultRead?: boolean;\n defaultWrite?: boolean;\n };\n}\n\n/** The values the add/edit field modal collects, source-neutral. */\nexport interface FieldDraft {\n type?: string;\n key: string;\n name: string;\n readApps: boolean;\n readUsers: boolean;\n writeApps: boolean;\n writeUsers: boolean;\n containsPii: boolean;\n}\n\n/** Add/edit/delete capability a source exposes. Present ⇒ field management UI shows. */\nexport interface FieldManagement {\n /** False ⇒ the add-field CTA is hidden entirely. */\n canAddFields: boolean;\n /** True ⇒ the add-field CTA renders but is disabled. */\n addFieldDisabled: boolean;\n /** Hint text shown beneath the add-field CTA while it is disabled. */\n addFieldDisabledHint?: string;\n canEditField(field: Field): boolean;\n /** `origin` is the UI surface the delete was triggered from; used for BI. */\n deleteField(fieldId: string, origin: string): Promise<void>;\n\n /** Field types the source allows creating, shown in the add/edit modal. */\n creatableFieldTypes: FieldTypeOption[];\n /** Existing field keys, used by the add modal to reject duplicates. */\n existingFieldKeys: string[];\n /** True when no more fields can be added because a limit is reached. */\n maxReached?: boolean;\n /** Permission defaults; absent ⇒ the modal hides the permissions section. */\n permissions?: FieldPermissions;\n /** True when the source supports marking a field as PII. */\n supportsPii?: boolean;\n addField(draft: FieldDraft): Promise<void>;\n editField(fieldId: string, draft: FieldDraft): Promise<void>;\n /** Current values for an existing field, to prefill the edit modal. */\n getFieldDraft(fieldId: string): FieldDraft | undefined;\n}\n\n/** Archiving capability a source exposes. Present ⇒ archive/restore UI shows. */\nexport interface FieldArchive {\n items: ArchivedFieldItem[];\n shouldDisplay: boolean;\n /** Whether the archived-items panel is currently open. */\n isOpen: boolean;\n openPanel(): void;\n closePanel(): void;\n /** `origin` is the UI surface the action was triggered from; used for BI. */\n archiveField(fieldId: string, origin: string): Promise<void>;\n restoreField(fieldId: string, origin: string): Promise<void>;\n /** Display name for a field, for the confirm-dialog copy. */\n fieldName(fieldId: string): string;\n}\n\n/**\n * The source-neutral fields data a collection reads, implemented by each source\n * adapter. Rendering — field modals, filter elements — is not here; it lives in\n * the collection-page layer.\n */\nexport interface FieldsSource {\n /** Loads the fields (schema/data). The collection runs this once, tracks its\n * status, and shows a retry toast on failure. */\n load(): Promise<void>;\n\n fields: Field[];\n filterableFields: Field[];\n /** The fields the manage-fields panel lists — the source's editable fields. */\n manageableFields: Field[];\n /** Column id for a field. Sources that group fields prefix the group; flat sources use the field key. */\n columnIdForField(field: Field): string;\n /** WQL field path for a filter. Sources that group fields prefix the group; flat sources use the field key. */\n queryFieldId(field: Field): string;\n /** The value to display for a field on a row. */\n getCellValue(row: unknown, field: Field): unknown;\n /** Writes a new value for a field on a row, returning the updated row. Present when cells can be edited in place. */\n setCellValue?(row: unknown, field: Field, value: unknown): unknown;\n\n /** Present when fields can be added/edited/deleted. */\n fieldManagement?: FieldManagement;\n\n /** The collection's field-mutation actions (delete/makePrimary/duplicate/…),\n * driving the shared FieldActions menu. Absent ⇒ no per-field action menu. */\n fieldActions?: FieldActions;\n\n /** Present when the source supports archiving fields. */\n archive?: FieldArchive;\n\n /** Present when fields are grouped. Absent ⇒ flat list. */\n groups?: {\n all: string[];\n fieldsForGroup(group: string): Field[];\n };\n}\n"],"mappings":"","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["../../../src/types/Schema.ts"],"sourcesContent":["import type { Field } from './Field';\nimport type { FiltersMap, OptionalFiltersMap } from '../model';\nimport type {\n OffsetFetchDataFn,\n CursorFetchDataFn,\n FetchTotalFn,\n} from '../hooks/paginationModeConfig';\n\n/** Field-management permissions. Absent when the schema's fields cannot be edited. */\nexport interface SchemaPermissions {\n createField: boolean;\n updateField: boolean;\n deleteField: boolean;\n}\n\n/** Item-level CRUD permissions. */\nexport interface ItemPermissions {\n createItem: boolean;\n updateItem: boolean;\n deleteItem: boolean;\n}\n\n/**\n * A source-neutral description of a collection — data only, no behavior.\n * Item access is in `CollectionBackend`, field mutations in `FieldActions`.\n */\nexport interface Schema {\n id: string;\n fields: Record<string, Field | undefined>;\n /** The field that best represents the entity (titles/selections). */\n displayField: string;\n /** The identifier field (e.g. '_id'). */\n idField: string;\n /** Absent when the schema's fields cannot be edited. */\n schemaPermissions?: SchemaPermissions;\n itemPermissions?: ItemPermissions;\n}\n\nexport interface BackupConfig {\n create: () => Promise<{ backupId: string }>;\n waitForCompletion: (\n backupId: string,\n options?: { signal?: AbortSignal },\n ) => Promise<void>;\n cancel?: (backupId: string) => Promise<void>;\n restore?: (backupId: string) => Promise<{ restorationId: string }>;\n waitForRestoration?: (\n restorationId: string,\n options?: { signal?: AbortSignal },\n ) => Promise<void>;\n}\n\nexport interface BulkInsertError {\n rowIndex: number;\n message?: string;\n code?: string;\n}\n\nexport interface BulkInsertResult {\n succeeded?: number;\n failed?: number;\n errors?: BulkInsertError[];\n}\n\n/** Item data access shared by both pagination modes. */\nexport interface CollectionBackendBase<T = Record<string, unknown>> {\n get: (entityId: string) => Promise<T>;\n create: (entity: Partial<T>) => Promise<T>;\n update: (entity: T) => Promise<T>;\n delete: (entityId: string) => Promise<void>;\n bulkDelete: (entityIds: string[]) => Promise<void>;\n move?: (\n id: string,\n params: { moveAfterId: string | null | undefined },\n ) => Promise<void>;\n backup?: BackupConfig;\n bulkInsert?: (entities: Partial<T>[]) => Promise<BulkInsertResult>;\n}\n\n/**\n * A source's item data access. The source declares its `paginationMode`\n * (offset by default) together with the matching `find`, same as core's\n * `PaginationModeConfig`.\n */\nexport type CollectionBackend<\n T = Record<string, unknown>,\n F extends FiltersMap = OptionalFiltersMap,\n> = CollectionBackendBase<T> &\n (\n | { paginationMode?: 'offset'; find: OffsetFetchDataFn<T, F> }\n | {\n paginationMode: 'cursor';\n find: CursorFetchDataFn<T, F>;\n fetchTotal?: FetchTotalFn;\n }\n );\n\n/** Field-management actions. All optional — a read-only source provides none. */\nexport interface FieldActions {\n addField?: (field: Field) => Promise<void>;\n editField?: (fieldId: string, updates: Partial<Field>) => Promise<void>;\n deleteField?: (fieldId: string) => Promise<void>;\n renameField?: (fieldId: string, newName: string) => Promise<void>;\n makePrimary?: (fieldId: string) => Promise<void>;\n duplicateField?: (fieldId: string) => Promise<void>;\n duplicateFieldWithContent?: (fieldId: string) => Promise<void>;\n}\n\n/** Everything a source provides for a collection. */\nexport interface LoadedSchema<T = Record<string, unknown>> {\n schema: Schema;\n backend: CollectionBackend<T>;\n fieldActions?: FieldActions;\n}\n\n/**\n * Loads a collection's `LoadedSchema`. Sources that need dependencies expose a\n * factory that returns this type (e.g. `createCmsSchemaLoader(deps)`).\n */\nexport type SchemaLoader<\n T extends Record<string, unknown> = Record<string, unknown>,\n> = (collectionId: string) => Promise<LoadedSchema<T>>;\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["../../../src/types/Schema.ts"],"sourcesContent":["import type { Field } from './Field';\nimport type { FiltersMap, OptionalFiltersMap } from '../model';\nimport type {\n OffsetQuery,\n OffsetQueryResult,\n CursorQuery,\n CursorQueryResult,\n FetchTotalFn,\n} from '../hooks/paginationModeConfig';\n\n/** Field-management permissions. Absent when the schema's fields cannot be edited. */\nexport interface SchemaPermissions {\n createField: boolean;\n updateField: boolean;\n deleteField: boolean;\n}\n\n/** Item-level CRUD permissions. */\nexport interface ItemPermissions {\n createItem: boolean;\n updateItem: boolean;\n deleteItem: boolean;\n}\n\n/**\n * A source-neutral description of a collection — data only, no behavior.\n * Item access is in `CollectionBackend`, field mutations in `FieldActions`.\n */\nexport interface Schema {\n id: string;\n fields: Record<string, Field | undefined>;\n /** The field that best represents the entity (titles/selections). */\n displayField: string;\n /** The identifier field. */\n idField: string;\n /** Absent when the schema's fields cannot be edited. */\n schemaPermissions?: SchemaPermissions;\n itemPermissions?: ItemPermissions;\n}\n\nexport interface BackupConfig {\n create: () => Promise<{ backupId: string }>;\n waitForCompletion: (\n backupId: string,\n options?: { signal?: AbortSignal },\n ) => Promise<void>;\n cancel?: (backupId: string) => Promise<void>;\n restore?: (backupId: string) => Promise<{ restorationId: string }>;\n waitForRestoration?: (\n restorationId: string,\n options?: { signal?: AbortSignal },\n ) => Promise<void>;\n}\n\nexport interface BulkInsertError {\n rowIndex: number;\n message?: string;\n code?: string;\n}\n\nexport interface BulkInsertResult {\n succeeded?: number;\n failed?: number;\n errors?: BulkInsertError[];\n}\n\n/** Item data access shared by both pagination modes. */\nexport interface CollectionBackendBase<T = Record<string, unknown>> {\n get: (entityId: string) => Promise<T>;\n create: (entity: Partial<T>) => Promise<T>;\n update: (entity: T) => Promise<T>;\n delete: (entityId: string) => Promise<void>;\n bulkDelete: (entityIds: string[]) => Promise<void>;\n move?: (\n id: string,\n params: { moveAfterId: string | null | undefined },\n ) => Promise<void>;\n backup?: BackupConfig;\n bulkInsert?: (entities: Partial<T>[]) => Promise<BulkInsertResult>;\n}\n\n/** Per-call search scope the query layer passes to a backend's `find`. */\nexport interface FindOptions {\n searchableFieldIds?: string[];\n}\n\n/**\n * The query-layer fetch-data fns plus the optional `find` options the runtime\n * already accepts. Kept separate so the shared `OffsetFetchDataFn`/\n * `CursorFetchDataFn` used by `fetchData` stay unchanged.\n */\ntype OffsetFindFn<T, F extends FiltersMap> = (\n query: OffsetQuery<F>,\n options?: FindOptions,\n) => Promise<OffsetQueryResult<T>>;\ntype CursorFindFn<T, F extends FiltersMap> = (\n query: CursorQuery<F>,\n options?: FindOptions,\n) => Promise<CursorQueryResult<T>>;\n\n/**\n * A source's item data access. The source declares its `paginationMode`\n * (offset by default) together with the matching `find`, same as core's\n * `PaginationModeConfig`.\n */\nexport type CollectionBackend<\n T = Record<string, unknown>,\n F extends FiltersMap = OptionalFiltersMap,\n> = CollectionBackendBase<T> &\n (\n | { paginationMode?: 'offset'; find: OffsetFindFn<T, F> }\n | {\n paginationMode: 'cursor';\n find: CursorFindFn<T, F>;\n fetchTotal?: FetchTotalFn;\n }\n );\n\n/** Field-management actions. All optional — a read-only source provides none. */\nexport interface FieldActions {\n /**\n * Field-mutating actions return the collection's updated fields map so the\n * caller can merge its local state from the response, without reloading the\n * schema. (`renameField` is the exception — nothing consumes its result yet.)\n */\n addField?: (field: Field) => Promise<Schema['fields']>;\n editField?: (\n fieldId: string,\n updates: Partial<Field>,\n ) => Promise<Schema['fields']>;\n deleteField?: (fieldId: string) => Promise<Schema['fields']>;\n renameField?: (fieldId: string, newName: string) => Promise<void>;\n makePrimary?: (fieldId: string) => Promise<Schema['fields']>;\n duplicateField?: (fieldId: string) => Promise<Schema['fields']>;\n duplicateFieldWithContent?: (fieldId: string) => Promise<Schema['fields']>;\n}\n\n/** Everything a source provides for a collection. */\nexport interface LoadedSchema<T = Record<string, unknown>> {\n schema: Schema;\n backend: CollectionBackend<T>;\n fieldActions?: FieldActions;\n}\n\n/**\n * Loads a collection's `LoadedSchema`. Sources that need dependencies expose a\n * factory that returns this type.\n */\nexport type SchemaLoader<\n T extends Record<string, unknown> = Record<string, unknown>,\n> = (collectionId: string) => Promise<LoadedSchema<T>>;\n"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.defineSchemaSource = defineSchemaSource;
5
+ /** A field type a source allows creating. The label keys are resolved to text by the UI. */
6
+
7
+ /** Collection-query config derived from a source, ready to spread into a collection hook. */
8
+
9
+ /** What a caller passes. Only `collectionId` and `loadSchema` are required. */
10
+
11
+ /** The resolved source: defaults filled, `loadSchema` memoized. */
12
+
13
+ /** Fills source-neutral defaults over `input` and memoizes the load so the collection
14
+ * query and the table columns share a single fetch. */
15
+ function defineSchemaSource(input) {
16
+ const {
17
+ collectionId,
18
+ paginationMode = 'offset',
19
+ creatableFieldTypes = [],
20
+ fieldPermissions,
21
+ supportsPii = false
22
+ } = input;
23
+ let loaded;
24
+ let schema;
25
+ const loadSchema = () => loaded ?? (loaded = input.loadSchema().then(result => {
26
+ schema = result.schema;
27
+ return result;
28
+ }).catch(error => {
29
+ loaded = undefined;
30
+ throw error;
31
+ }));
32
+ const searchableFieldIds = input.searchableFieldIds ?? (s => [s.displayField]);
33
+ const itemKey = input.itemKey ?? (item => {
34
+ var _schema;
35
+ return String(item[((_schema = schema) == null ? void 0 : _schema.idField) ?? '_id'] ?? '');
36
+ });
37
+ const itemName = input.itemName ?? (item => {
38
+ var _schema2;
39
+ return String(item[((_schema2 = schema) == null ? void 0 : _schema2.displayField) ?? '_id'] ?? '');
40
+ });
41
+ const canAddFields = input.canAddFields ?? (s => {
42
+ var _s$schemaPermissions;
43
+ return ((_s$schemaPermissions = s.schemaPermissions) == null ? void 0 : _s$schemaPermissions.createField) ?? false;
44
+ });
45
+ const canEditField = input.canEditField ?? ((field, s) => {
46
+ var _s$schemaPermissions2;
47
+ return (((_s$schemaPermissions2 = s.schemaPermissions) == null ? void 0 : _s$schemaPermissions2.updateField) ?? false) && !field.isSystem;
48
+ });
49
+ const canDeleteField = input.canDeleteField ?? ((field, s) => {
50
+ var _s$schemaPermissions3;
51
+ return (((_s$schemaPermissions3 = s.schemaPermissions) == null ? void 0 : _s$schemaPermissions3.deleteField) ?? false) && !field.isSystem;
52
+ });
53
+ const fetchData = async query => {
54
+ const {
55
+ backend,
56
+ schema: loadedSchema
57
+ } = await loadSchema();
58
+ return backend.find(query, {
59
+ searchableFieldIds: searchableFieldIds(loadedSchema)
60
+ });
61
+ };
62
+ return {
63
+ collectionId,
64
+ loadSchema,
65
+ collectionConfig: {
66
+ queryName: collectionId,
67
+ paginationMode,
68
+ fetchData,
69
+ itemKey,
70
+ itemName
71
+ },
72
+ creatableFieldTypes,
73
+ searchableFieldIds,
74
+ canAddFields,
75
+ canEditField,
76
+ canDeleteField,
77
+ fieldPermissions,
78
+ supportsPii
79
+ };
80
+ }
81
+ //# sourceMappingURL=SchemaSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["defineSchemaSource","input","collectionId","paginationMode","creatableFieldTypes","fieldPermissions","supportsPii","loaded","schema","loadSchema","then","result","catch","error","undefined","searchableFieldIds","s","displayField","itemKey","item","_schema","String","idField","itemName","_schema2","canAddFields","_s$schemaPermissions","schemaPermissions","createField","canEditField","field","_s$schemaPermissions2","updateField","isSystem","canDeleteField","_s$schemaPermissions3","deleteField","fetchData","query","backend","loadedSchema","find","collectionConfig","queryName"],"sources":["../../../src/types/SchemaSource.ts"],"sourcesContent":["import type { Field, PatternsFieldType } from './Field';\nimport type { Schema, LoadedSchema, FindOptions } from './Schema';\nimport type { FieldPermissions } from './FieldsSource';\nimport type {\n OffsetQuery,\n OffsetQueryResult,\n} from '../hooks/paginationModeConfig';\nimport type { TranslationsKeys } from '../services/translations';\n\n/** A field type a source allows creating. The label keys are resolved to text by the UI. */\nexport interface CreatableFieldType {\n patternsType: PatternsFieldType;\n labelKey: TranslationsKeys;\n namePlaceholderKey?: TranslationsKeys;\n}\n\n/** Collection-query config derived from a source, ready to spread into a collection hook. */\nexport interface SchemaCollectionConfig<T> {\n queryName: string;\n paginationMode: 'offset';\n fetchData: (query: OffsetQuery) => Promise<OffsetQueryResult<T>>;\n itemKey: (item: T) => string;\n itemName: (item: T) => string;\n}\n\n/** What a caller passes. Only `collectionId` and `loadSchema` are required. */\nexport interface SchemaSourceInput<T> {\n collectionId: string;\n loadSchema: () => Promise<LoadedSchema<T>>;\n paginationMode?: 'offset';\n /** Stable row identity. Default: `row[idField]`. */\n itemKey?: (item: T) => string;\n /** Row display label. Default: `row[displayField]`. */\n itemName?: (item: T) => string;\n /** Fields free-text search runs against. Default: `[displayField]`. */\n searchableFieldIds?: (schema: Schema) => string[];\n /** Field types the add-field modal offers. Default: none. */\n creatableFieldTypes?: CreatableFieldType[];\n /** Default: `schemaPermissions.createField`. */\n canAddFields?: (schema: Schema) => boolean;\n /** Default: `schemaPermissions.updateField && !field.isSystem`. */\n canEditField?: (field: Field, schema: Schema) => boolean;\n /** Default: `schemaPermissions.deleteField && !field.isSystem`. */\n canDeleteField?: (field: Field, schema: Schema) => boolean;\n /** Permission defaults shown in the modal. Absent ⇒ no permissions section. */\n fieldPermissions?: FieldPermissions;\n /** Default: `false`. */\n supportsPii?: boolean;\n}\n\n/** The resolved source: defaults filled, `loadSchema` memoized. */\nexport interface SchemaSource<T> {\n readonly collectionId: string;\n loadSchema: () => Promise<LoadedSchema<T>>;\n readonly collectionConfig: SchemaCollectionConfig<T>;\n readonly creatableFieldTypes: CreatableFieldType[];\n searchableFieldIds: (schema: Schema) => string[];\n canAddFields: (schema: Schema) => boolean;\n canEditField: (field: Field, schema: Schema) => boolean;\n canDeleteField: (field: Field, schema: Schema) => boolean;\n readonly fieldPermissions?: FieldPermissions;\n readonly supportsPii: boolean;\n}\n\ntype OffsetFind<T> = (\n query: OffsetQuery,\n options?: FindOptions,\n) => Promise<OffsetQueryResult<T>>;\n\n/** Fills source-neutral defaults over `input` and memoizes the load so the collection\n * query and the table columns share a single fetch. */\nexport function defineSchemaSource<T>(\n input: SchemaSourceInput<T>,\n): SchemaSource<T> {\n const {\n collectionId,\n paginationMode = 'offset',\n creatableFieldTypes = [],\n fieldPermissions,\n supportsPii = false,\n } = input;\n\n let loaded: Promise<LoadedSchema<T>> | undefined;\n let schema: Schema | undefined;\n\n const loadSchema = () =>\n (loaded ??= input\n .loadSchema()\n .then((result) => {\n schema = result.schema;\n return result;\n })\n .catch((error) => {\n loaded = undefined;\n throw error;\n }));\n\n const searchableFieldIds =\n input.searchableFieldIds ?? ((s) => [s.displayField]);\n\n const itemKey =\n input.itemKey ??\n ((item) =>\n String(\n (item as Record<string, unknown>)[schema?.idField ?? '_id'] ?? '',\n ));\n const itemName =\n input.itemName ??\n ((item) =>\n String(\n (item as Record<string, unknown>)[schema?.displayField ?? '_id'] ?? '',\n ));\n const canAddFields =\n input.canAddFields ?? ((s) => s.schemaPermissions?.createField ?? false);\n const canEditField =\n input.canEditField ??\n ((field, s) =>\n (s.schemaPermissions?.updateField ?? false) && !field.isSystem);\n const canDeleteField =\n input.canDeleteField ??\n ((field, s) =>\n (s.schemaPermissions?.deleteField ?? false) && !field.isSystem);\n\n const fetchData = async (\n query: OffsetQuery,\n ): Promise<OffsetQueryResult<T>> => {\n const { backend, schema: loadedSchema } = await loadSchema();\n return (backend.find as OffsetFind<T>)(query, {\n searchableFieldIds: searchableFieldIds(loadedSchema),\n });\n };\n\n return {\n collectionId,\n loadSchema,\n collectionConfig: {\n queryName: collectionId,\n paginationMode,\n fetchData,\n itemKey,\n itemName,\n },\n creatableFieldTypes,\n searchableFieldIds,\n canAddFields,\n canEditField,\n canDeleteField,\n fieldPermissions,\n supportsPii,\n };\n}\n"],"mappings":";;;;AASA;;AAOA;;AASA;;AAyBA;;AAmBA;AACA;AACO,SAASA,kBAAkBA,CAChCC,KAA2B,EACV;EACjB,MAAM;IACJC,YAAY;IACZC,cAAc,GAAG,QAAQ;IACzBC,mBAAmB,GAAG,EAAE;IACxBC,gBAAgB;IAChBC,WAAW,GAAG;EAChB,CAAC,GAAGL,KAAK;EAET,IAAIM,MAA4C;EAChD,IAAIC,MAA0B;EAE9B,MAAMC,UAAU,GAAGA,CAAA,KAChBF,MAAM,KAANA,MAAM,GAAKN,KAAK,CACdQ,UAAU,CAAC,CAAC,CACZC,IAAI,CAAEC,MAAM,IAAK;IAChBH,MAAM,GAAGG,MAAM,CAACH,MAAM;IACtB,OAAOG,MAAM;EACf,CAAC,CAAC,CACDC,KAAK,CAAEC,KAAK,IAAK;IAChBN,MAAM,GAAGO,SAAS;IAClB,MAAMD,KAAK;EACb,CAAC,CAAC,CAAC;EAEP,MAAME,kBAAkB,GACtBd,KAAK,CAACc,kBAAkB,KAAMC,CAAC,IAAK,CAACA,CAAC,CAACC,YAAY,CAAC,CAAC;EAEvD,MAAMC,OAAO,GACXjB,KAAK,CAACiB,OAAO,KACXC,IAAI;IAAA,IAAAC,OAAA;IAAA,OACJC,MAAM,CACHF,IAAI,CAA6B,EAAAC,OAAA,GAAAZ,MAAM,qBAANY,OAAA,CAAQE,OAAO,KAAI,KAAK,CAAC,IAAI,EACjE,CAAC;EAAA,EAAC;EACN,MAAMC,QAAQ,GACZtB,KAAK,CAACsB,QAAQ,KACZJ,IAAI;IAAA,IAAAK,QAAA;IAAA,OACJH,MAAM,CACHF,IAAI,CAA6B,EAAAK,QAAA,GAAAhB,MAAM,qBAANgB,QAAA,CAAQP,YAAY,KAAI,KAAK,CAAC,IAAI,EACtE,CAAC;EAAA,EAAC;EACN,MAAMQ,YAAY,GAChBxB,KAAK,CAACwB,YAAY,KAAMT,CAAC;IAAA,IAAAU,oBAAA;IAAA,OAAK,EAAAA,oBAAA,GAAAV,CAAC,CAACW,iBAAiB,qBAAnBD,oBAAA,CAAqBE,WAAW,KAAI,KAAK;EAAA,EAAC;EAC1E,MAAMC,YAAY,GAChB5B,KAAK,CAAC4B,YAAY,KACjB,CAACC,KAAK,EAAEd,CAAC;IAAA,IAAAe,qBAAA;IAAA,OACR,CAAC,EAAAA,qBAAA,GAAAf,CAAC,CAACW,iBAAiB,qBAAnBI,qBAAA,CAAqBC,WAAW,KAAI,KAAK,KAAK,CAACF,KAAK,CAACG,QAAQ;EAAA,EAAC;EACnE,MAAMC,cAAc,GAClBjC,KAAK,CAACiC,cAAc,KACnB,CAACJ,KAAK,EAAEd,CAAC;IAAA,IAAAmB,qBAAA;IAAA,OACR,CAAC,EAAAA,qBAAA,GAAAnB,CAAC,CAACW,iBAAiB,qBAAnBQ,qBAAA,CAAqBC,WAAW,KAAI,KAAK,KAAK,CAACN,KAAK,CAACG,QAAQ;EAAA,EAAC;EAEnE,MAAMI,SAAS,GAAG,MAChBC,KAAkB,IACgB;IAClC,MAAM;MAAEC,OAAO;MAAE/B,MAAM,EAAEgC;IAAa,CAAC,GAAG,MAAM/B,UAAU,CAAC,CAAC;IAC5D,OAAQ8B,OAAO,CAACE,IAAI,CAAmBH,KAAK,EAAE;MAC5CvB,kBAAkB,EAAEA,kBAAkB,CAACyB,YAAY;IACrD,CAAC,CAAC;EACJ,CAAC;EAED,OAAO;IACLtC,YAAY;IACZO,UAAU;IACViC,gBAAgB,EAAE;MAChBC,SAAS,EAAEzC,YAAY;MACvBC,cAAc;MACdkC,SAAS;MACTnB,OAAO;MACPK;IACF,CAAC;IACDnB,mBAAmB;IACnBW,kBAAkB;IAClBU,YAAY;IACZI,YAAY;IACZK,cAAc;IACd7B,gBAAgB;IAChBC;EACF,CAAC;AACH","ignoreList":[]}
@@ -193,6 +193,7 @@
193
193
  "cairo.archivedFields.more-actions.restore": "Restore",
194
194
  "cairo.archivedFields.more-actions.delete": "Delete",
195
195
  "cairo.customFields.delete.modal.title": "Delete {selectedField}",
196
+ "cairo.customFields.delete.modal.description": "<bold>{selectedField}</bold> and its information will be permanently deleted and can't be restored.",
196
197
  "cairo.customFields.delete.modal.delete.CTA": "Delete",
197
198
  "cairo.customFields.delete.modal.cancel.CTA": "Cancel",
198
199
  "cairo.table.custom-columns.section-divider": "Archived fields",
@@ -2,13 +2,14 @@ import { useCallback } from 'react';
2
2
  import { useWixPatternsContainer, useCollectionContext } from '../providers';
3
3
  import { ImportState, } from '../state';
4
4
  export function useCreateImport(params) {
5
- const { fields, collectionId, backup, updateSchema, detectColumnType, importModalState, onJobError, } = params;
5
+ const { fields, collectionId, destination, backup, updateSchema, detectColumnType, importModalState, onJobError, } = params;
6
6
  const { showToast, translate, errorHandler, window, httpClient } = useWixPatternsContainer();
7
7
  const collection = useCollectionContext();
8
8
  return useCallback(() => {
9
9
  return new ImportState({
10
10
  fields,
11
11
  collectionId,
12
+ destination,
12
13
  httpClient,
13
14
  backup,
14
15
  updateSchema,
@@ -1 +1 @@
1
- {"version":3,"file":"useImport.js","sourceRoot":"","sources":["../../../src/hooks/useImport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EAEL,WAAW,GAKZ,MAAM,UAAU,CAAC;AAgBlB,MAAM,UAAU,eAAe,CAC7B,MAAuB;IAEvB,MAAM,EACJ,MAAM,EACN,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,GACX,GAAG,MAAM,CAAC;IACX,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,GAC9D,uBAAuB,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAG,oBAAoB,EAAQ,CAAC;IAEhD,OAAO,WAAW,CAAC,GAAG,EAAE;QACtB,OAAO,IAAI,WAAW,CAAC;YACrB,MAAM;YACN,YAAY;YACZ,UAAU;YACV,MAAM;YACN,YAAY;YACZ,gBAAgB;YAChB,UAAU;YACV,gBAAgB;YAChB,UAAU;YACV,SAAS;YACT,SAAS;YACT,YAAY;YACZ,WAAW,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE;gBACjC,MAAM,CAAC,QAAQ,CACb,+BAA+B,kBAAkB,CAAC,OAAO,CAAC,EAAE,EAC5D,QAAQ,CACT,CAAC;YACJ,CAAC;SACF,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC"}
1
+ {"version":3,"file":"useImport.js","sourceRoot":"","sources":["../../../src/hooks/useImport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EAEL,WAAW,GAKZ,MAAM,UAAU,CAAC;AAyBlB,MAAM,UAAU,eAAe,CAC7B,MAAuB;IAEvB,MAAM,EACJ,MAAM,EACN,YAAY,EACZ,WAAW,EACX,MAAM,EACN,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,GACX,GAAG,MAAM,CAAC;IACX,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,GAC9D,uBAAuB,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAG,oBAAoB,EAAQ,CAAC;IAEhD,OAAO,WAAW,CAAC,GAAG,EAAE;QACtB,OAAO,IAAI,WAAW,CAAC;YACrB,MAAM;YACN,YAAY;YACZ,WAAW;YACX,UAAU;YACV,MAAM;YACN,YAAY;YACZ,gBAAgB;YAChB,UAAU;YACV,gBAAgB;YAChB,UAAU;YACV,SAAS;YACT,SAAS;YACT,YAAY;YACZ,WAAW,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE;gBACjC,MAAM,CAAC,QAAQ,CACb,+BAA+B,kBAAkB,CAAC,OAAO,CAAC,EAAE,EAC5D,QAAQ,CACT,CAAC;YACJ,CAAC;SACF,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useImportConfig.js","sourceRoot":"","sources":["../../../src/hooks/useImportConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAWjC,MAAM,UAAU,eAAe,CAAC,MAA6B;IAC3D,MAAM,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC;IAExC,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"useImportConfig.js","sourceRoot":"","sources":["../../../src/hooks/useImportConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAsBjC,MAAM,UAAU,eAAe,CAAC,MAA6B;IAC3D,MAAM,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC;IAExC,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/dist/esm/index.js CHANGED
@@ -9,4 +9,5 @@ export * from './hooks/createCollection';
9
9
  export * from './hooks/useCollectionDatasetSync';
10
10
  export { useSyncProps, useSelector, } from './hooks';
11
11
  export { QueryCache } from 'react-query/core';
12
+ export { defineSchemaSource } from './types/SchemaSource';
12
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC;AACvB,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AACjD,OAAO,EAGL,YAAY,EACZ,WAAW,GACZ,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC;AACvB,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AACjD,OAAO,EAGL,YAAY,EACZ,WAAW,GACZ,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAqC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -1,4 +1,4 @@
1
- import { DataExtensionStateBIReporter } from '../state/DataExtensionStateBIReporter';
1
+ import { FieldOperationsBIReporter } from '../state/FieldOperationsBIReporter';
2
2
  /**
3
3
  * Service for handling archive, restore, and delete operations on custom fields.
4
4
  * This service is lazily loaded to reduce bundle size for consumers who don't use these features.
@@ -29,7 +29,7 @@ export class DataExtensionFieldOperationsService {
29
29
  const { dataExtensionService, userSchema, fqdnString, extractFieldValuesFromSchema, upsertSchema, container, enableArchive, openArchivedPanel, } = this.context;
30
30
  const fieldValues = extractFieldValuesFromSchema(id);
31
31
  const fieldName = fieldValues?.name || '';
32
- const biReporter = new DataExtensionStateBIReporter({ reportBi });
32
+ const biReporter = new FieldOperationsBIReporter({ reportBi });
33
33
  try {
34
34
  const { dataExtensionSchema } = await dataExtensionService.archiveCustomField({
35
35
  schema: userSchema,
@@ -78,7 +78,7 @@ export class DataExtensionFieldOperationsService {
78
78
  const { dataExtensionService, userSchema, fqdnString, extractFieldValuesFromSchema, upsertSchema, container, } = this.context;
79
79
  const fieldValues = extractFieldValuesFromSchema(id);
80
80
  const fieldName = fieldValues?.name || '';
81
- const biReporter = new DataExtensionStateBIReporter({ reportBi });
81
+ const biReporter = new FieldOperationsBIReporter({ reportBi });
82
82
  try {
83
83
  const { dataExtensionSchema } = await dataExtensionService.restoreCustomField({
84
84
  schema: userSchema,
@@ -1 +1 @@
1
- {"version":3,"file":"DataExtensionFieldOperationsService.js","sourceRoot":"","sources":["../../../src/services/DataExtensionFieldOperationsService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DataExtensionFieldOperationsService.js","sourceRoot":"","sources":["../../../src/services/DataExtensionFieldOperationsService.ts"],"names":[],"mappings":"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"}
@@ -1,27 +1,24 @@
1
1
  import { makeAutoObservable } from 'mobx';
2
2
  import { ConditionalModalState } from './ConditionalModalState';
3
- import { DataExtensionStateBIReporter } from './DataExtensionStateBIReporter';
3
+ import { FieldOperationsBIReporter } from './FieldOperationsBIReporter';
4
4
  export class ArchiveFieldModalState {
5
5
  constructor(params) {
6
- this.biReporter = new DataExtensionStateBIReporter({
6
+ this.biReporter = new FieldOperationsBIReporter({
7
7
  reportBi: params.reportBi,
8
8
  });
9
+ this.archiver = params.archiver;
9
10
  this.modal = new ConditionalModalState({
10
11
  onConfirm: async () => {
11
12
  if (!this.modal.value) {
12
13
  return;
13
14
  }
14
15
  this.biReporter.reportArchiveFieldModalCtaClicked('Archive');
15
- await this.dataExtension.archiveField({
16
- ...this.modal.value,
17
- reportBi: this.biReporter.reportBi,
18
- });
16
+ await this.archiver.archiveField(this.modal.value.id, this.modal.value.origin);
19
17
  },
20
18
  onClose: () => {
21
19
  this.biReporter.reportArchiveFieldModalCtaClicked('Cancel');
22
20
  },
23
21
  });
24
- this.dataExtension = params.dataExtension;
25
22
  makeAutoObservable(this);
26
23
  }
27
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ArchiveFieldModalState.js","sourceRoot":"","sources":["../../../src/state/ArchiveFieldModalState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAE1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAQ9E,MAAM,OAAO,sBAAsB;IAKjC,YAAY,MAAoC;QAC9C,IAAI,CAAC,UAAU,GAAG,IAAI,4BAA4B,CAAC;YACjD,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,IAAI,qBAAqB,CAGnC;YACD,SAAS,EAAE,KAAK,IAAI,EAAE;gBACpB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;oBACrB,OAAO;iBACR;gBAED,IAAI,CAAC,UAAU,CAAC,iCAAiC,CAAC,SAAS,CAAC,CAAC;gBAC7D,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC;oBACpC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK;oBACnB,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ;iBACnC,CAAC,CAAC;YACL,CAAC;YACD,OAAO,EAAE,GAAG,EAAE;gBACZ,IAAI,CAAC,UAAU,CAAC,iCAAiC,CAAC,QAAQ,CAAC,CAAC;YAC9D,CAAC;SACF,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;QAC1C,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;CACF"}
1
+ {"version":3,"file":"ArchiveFieldModalState.js","sourceRoot":"","sources":["../../../src/state/ArchiveFieldModalState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAE1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAQxE,MAAM,OAAO,sBAAsB;IAKjC,YAAY,MAAoC;QAC9C,IAAI,CAAC,UAAU,GAAG,IAAI,yBAAyB,CAAC;YAC9C,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,KAAK,GAAG,IAAI,qBAAqB,CAKnC;YACD,SAAS,EAAE,KAAK,IAAI,EAAE;gBACpB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;oBACrB,OAAO;iBACR;gBAED,IAAI,CAAC,UAAU,CAAC,iCAAiC,CAAC,SAAS,CAAC,CAAC;gBAC7D,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAC9B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EACnB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CACxB,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,GAAG,EAAE;gBACZ,IAAI,CAAC,UAAU,CAAC,iCAAiC,CAAC,QAAQ,CAAC,CAAC;YAC9D,CAAC;SACF,CAAC,CAAC;QACH,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;CACF"}
@@ -1,7 +1,7 @@
1
1
  import { withoutDefaults } from '../util';
2
2
  import { cairoChangesBeforeApply, cairoDataExAddCustomField, cairoDataExCustomFieldAdvancesSettings, cairoDataExCustomFieldEndProcess, cairoDataExtensionUnsuccessfulUpdateInServer, cairoLearnMore, } from '@wix/bex-utils/@wix/bi-logger-os-data/v2';
3
3
  import { reaction } from 'mobx';
4
- import { DataExtensionStateBIReporter } from './DataExtensionStateBIReporter';
4
+ import { formatPermissionsForBi } from './formatPermissionsForBi';
5
5
  export class CustomFieldModalBiReporter {
6
6
  constructor(params) {
7
7
  this.formSnapshot = null;
@@ -25,14 +25,14 @@ export class CustomFieldModalBiReporter {
25
25
  this.reportModalEndProcess = (params) => {
26
26
  const { endType } = params;
27
27
  const { $: { name, type, key }, } = this.form;
28
- const { customFieldModalState: { origin, customOrigin, dataExtensionState }, } = this;
28
+ const { customFieldModalState: { origin, customOrigin }, } = this;
29
29
  this.reportBi(withoutDefaults(cairoDataExCustomFieldEndProcess)({
30
30
  actionName: this.mode === 'new' ? 'Add' : 'Edit',
31
31
  endType,
32
32
  fieldName: name.value,
33
33
  fieldType: type.value,
34
34
  key: key.value,
35
- numAdded: dataExtensionState.availableUserCustomFields.length,
35
+ numAdded: this.customFieldModalState.fieldCount(),
36
36
  changedFields: this.getBiChangedFields(),
37
37
  permissions: this.getBiPermissions(),
38
38
  origin,
@@ -85,7 +85,7 @@ export class CustomFieldModalBiReporter {
85
85
  : 'Edit Custom Field Modal';
86
86
  }
87
87
  createReportFormFieldChange({ fieldName, fieldValue, }) {
88
- const { lodash: { debounce }, } = this.customFieldModalState.dataExtensionState.container;
88
+ const { lodash: { debounce }, } = this.customFieldModalState.container;
89
89
  return debounce(() => this.reportBi(withoutDefaults(cairoChangesBeforeApply)({
90
90
  feature: this.mode === 'new' ? 'Add Custom Field' : 'Edit Custom Field',
91
91
  fieldName,
@@ -115,10 +115,7 @@ export class CustomFieldModalBiReporter {
115
115
  return 'No changes';
116
116
  }
117
117
  getBiPermissions() {
118
- const biReporter = new DataExtensionStateBIReporter({
119
- reportBi: this.reportBi,
120
- });
121
- return biReporter.getBiPermissions(this.customFieldModalState.getFormValues());
118
+ return formatPermissionsForBi(this.customFieldModalState.getFormValues());
122
119
  }
123
120
  init() {
124
121
  const { customFieldModalState: { form }, } = this;