@webiny/app-headless-cms 6.5.0-beta.4 → 6.5.0-beta.6

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 (111) hide show
  1. package/admin/components/ContentEntries/BulkActions/ActionDelete.d.ts +2 -2
  2. package/admin/components/ContentEntries/BulkActions/ActionDelete.js.map +1 -1
  3. package/admin/components/ContentEntries/BulkActions/ActionMove.d.ts +2 -2
  4. package/admin/components/ContentEntries/BulkActions/ActionMove.js.map +1 -1
  5. package/admin/components/ContentEntries/BulkActions/ActionPublish.d.ts +2 -2
  6. package/admin/components/ContentEntries/BulkActions/ActionPublish.js.map +1 -1
  7. package/admin/components/ContentEntries/BulkActions/ActionUnpublish.d.ts +2 -2
  8. package/admin/components/ContentEntries/BulkActions/ActionUnpublish.js.map +1 -1
  9. package/admin/components/ContentModelEditor/ContentModelEditor.js +1 -1
  10. package/admin/components/ContentModelEditor/ContentModelEditor.js.map +1 -1
  11. package/admin/components/FieldEditor/EditFieldDialog.d.ts +2 -2
  12. package/admin/components/FieldEditor/Field.js +4 -4
  13. package/admin/components/FieldEditor/Field.js.map +1 -1
  14. package/features/contentEntry/createEntry/CreateEntryGateway.d.ts +0 -1
  15. package/features/contentEntry/createEntry/CreateEntryGateway.js +1 -9
  16. package/features/contentEntry/createEntry/CreateEntryGateway.js.map +1 -1
  17. package/features/contentEntry/createRevisionFrom/CreateRevisionFromGateway.d.ts +3 -1
  18. package/features/contentEntry/createRevisionFrom/CreateRevisionFromGateway.js +6 -2
  19. package/features/contentEntry/createRevisionFrom/CreateRevisionFromGateway.js.map +1 -1
  20. package/features/contentEntry/entryValueGateways.test.d.ts +1 -0
  21. package/features/contentEntry/entryValueGateways.test.js +106 -0
  22. package/features/contentEntry/entryValueGateways.test.js.map +1 -0
  23. package/features/contentEntry/singletonEntry/UpdateSingletonEntryGateway.d.ts +0 -1
  24. package/features/contentEntry/singletonEntry/UpdateSingletonEntryGateway.js +1 -9
  25. package/features/contentEntry/singletonEntry/UpdateSingletonEntryGateway.js.map +1 -1
  26. package/features/contentEntry/updateEntry/UpdateEntryGateway.d.ts +0 -1
  27. package/features/contentEntry/updateEntry/UpdateEntryGateway.js +1 -9
  28. package/features/contentEntry/updateEntry/UpdateEntryGateway.js.map +1 -1
  29. package/features/contentEntry/valueTransformers/EntryDataPreparer.d.ts +9 -0
  30. package/features/contentEntry/valueTransformers/EntryDataPreparer.js +8 -0
  31. package/features/contentEntry/valueTransformers/EntryDataPreparer.js.map +1 -1
  32. package/features/contentEntry/valueTransformers/EntryDataPreparer.test.d.ts +1 -0
  33. package/features/contentEntry/valueTransformers/EntryDataPreparer.test.js +113 -0
  34. package/features/contentEntry/valueTransformers/EntryDataPreparer.test.js.map +1 -0
  35. package/features/contentEntry/valueTransformers/entryValueFixtures.d.ts +146 -0
  36. package/features/contentEntry/valueTransformers/entryValueFixtures.js +171 -0
  37. package/features/contentEntry/valueTransformers/entryValueFixtures.js.map +1 -0
  38. package/features/formModel/CmsFormModelBuilder.d.ts +1 -1
  39. package/features/formModel/CmsFormModelBuilder.js +1 -13
  40. package/features/formModel/CmsFormModelBuilder.js.map +1 -1
  41. package/features/formModel/CmsFormModelBuilder.test.js +141 -0
  42. package/features/formModel/CmsFormModelBuilder.test.js.map +1 -1
  43. package/features/formModel/CmsLayoutMapper.d.ts +8 -1
  44. package/features/formModel/CmsLayoutMapper.js +23 -1
  45. package/features/formModel/CmsLayoutMapper.js.map +1 -1
  46. package/features/formModel/mappers/DynamicZoneFieldMapper.js +4 -0
  47. package/features/formModel/mappers/DynamicZoneFieldMapper.js.map +1 -1
  48. package/features/formModel/mappers/ObjectFieldMapper.js +11 -6
  49. package/features/formModel/mappers/ObjectFieldMapper.js.map +1 -1
  50. package/features/model/exportModels/ExportModelsGateway.d.ts +1 -1
  51. package/features/model/exportModels/ExportModelsGateway.js.map +1 -1
  52. package/features/model/exportModels/ExportModelsUseCase.js +7 -1
  53. package/features/model/exportModels/ExportModelsUseCase.js.map +1 -1
  54. package/features/model/exportModels/abstractions.d.ts +8 -2
  55. package/features/model/exportModels/abstractions.js.map +1 -1
  56. package/package.json +26 -26
  57. package/presentation/contentEntries/trashBin/CmsTrashBin.d.ts +2 -2
  58. package/presentation/contentEntries/views/CmsAdvancedSearch.d.ts +2 -2
  59. package/presentation/contentEntries/views/ContentEntriesListLayout.d.ts +2 -2
  60. package/presentation/contentEntries/views/ContentEntryFormView.d.ts +2 -2
  61. package/presentation/contentEntries/views/OlderRevisionAlert.d.ts +2 -2
  62. package/presentation/contentEntries/views/RevisionDrawer.d.ts +2 -2
  63. package/presentation/contentEntries/views/RevisionsList.d.ts +2 -2
  64. package/presentation/contentEntries/views/SingleEntryLayout.d.ts +2 -2
  65. package/presentation/contentEntries/views/Table/Table.d.ts +2 -2
  66. package/presentation/contentEntries/views/actions/CreateNewRevisionButton.d.ts +2 -2
  67. package/presentation/contentEntries/views/actions/DeleteEntryMenuItem.d.ts +2 -2
  68. package/presentation/contentEntries/views/actions/PublishOnlyButton.d.ts +2 -2
  69. package/presentation/contentEntries/views/actions/RevisionSelector.d.ts +2 -2
  70. package/presentation/contentEntries/views/actions/SaveAndPublishButton.d.ts +2 -2
  71. package/presentation/contentEntries/views/actions/SaveContentButton.d.ts +2 -2
  72. package/presentation/contentEntries/views/actions/ShowRevisionListMenuItem.d.ts +2 -2
  73. package/presentation/contentEntries/views/layout/ContentEntryForm.d.ts +12 -12
  74. package/presentation/contentModels/ContentModelsPresenter.d.ts +5 -5
  75. package/presentation/contentModels/ContentModelsPresenter.js +1 -1
  76. package/presentation/contentModels/ContentModelsPresenter.js.map +1 -1
  77. package/presentation/contentModels/abstractions.d.ts +7 -2
  78. package/presentation/contentModels/abstractions.js.map +1 -1
  79. package/presentation/contentModels/components/CloneContentModelDialog.d.ts +2 -2
  80. package/presentation/contentModels/components/ContentModels.d.ts +2 -2
  81. package/presentation/contentModels/components/ContentModelsDataList.d.ts +2 -2
  82. package/presentation/contentModels/components/ContentModelsDataList.js +6 -5
  83. package/presentation/contentModels/components/ContentModelsDataList.js.map +1 -1
  84. package/presentation/contentModels/components/NewContentModelDialog.d.ts +2 -2
  85. package/presentation/contentModels/components/fullDelete/dialog/Content.js +2 -2
  86. package/presentation/contentModels/components/fullDelete/dialog/Content.js.map +1 -1
  87. package/presentation/contentModels/components/fullDelete/types.js.map +1 -1
  88. package/presentation/fieldRenderers/ref/components/RefFieldOptions.d.ts +2 -2
  89. package/presentation/fieldRenderers/ref/components/RefFieldOptions.js +3 -2
  90. package/presentation/fieldRenderers/ref/components/RefFieldOptions.js.map +1 -1
  91. package/presentation/importContentModels/ImportContentModelsDialog.d.ts +2 -2
  92. package/presentation/importContentModels/ImportContentModelsPresenter.js +1 -1
  93. package/presentation/importContentModels/ImportContentModelsPresenter.js.map +1 -1
  94. package/presentation/importContentModels/components/DataList.d.ts +2 -2
  95. package/presentation/importContentModels/components/FileUpload.d.ts +2 -2
  96. package/presentation/importContentModels/components/FileUpload.js +1 -1
  97. package/presentation/importContentModels/components/FileUpload.js.map +1 -1
  98. package/presentation/importContentModels/components/Model/DataListModelItem.js +3 -3
  99. package/presentation/importContentModels/components/Model/DataListModelItem.js.map +1 -1
  100. package/presentation/importContentModels/components/Model/DataListModelItemInfo.js +2 -2
  101. package/presentation/importContentModels/components/Model/DataListModelItemInfo.js.map +1 -1
  102. package/presentation/importContentModels/components/Model/DataListModels.d.ts +2 -2
  103. package/presentation/menus/ContentGroupsMenuItems.d.ts +2 -2
  104. package/presentation/modelGroup/ModelGroupPresenter.js +1 -2
  105. package/presentation/modelGroup/ModelGroupPresenter.js.map +1 -1
  106. package/presentation/modelGroup/components/ContentModelGroups.d.ts +2 -2
  107. package/presentation/modelGroup/components/ContentModelGroupsDataList.d.ts +6 -2
  108. package/presentation/modelGroup/components/ContentModelGroupsForm.d.ts +8 -2
  109. package/utils/normalizeIcon.d.ts +4 -0
  110. package/utils/normalizeIcon.js +9 -6
  111. package/utils/normalizeIcon.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/contentModels/components/fullDelete/dialog/Content.js","sources":["../../../../../../src/presentation/contentModels/components/fullDelete/dialog/Content.tsx"],"sourcesContent":["import React from \"react\";\nimport type { CmsErrorResponse, CmsModel } from \"~/types.js\";\nimport { FullyDeleteModelStateStatus } from \"../types.js\";\nimport { Information } from \"./Information.js\";\nimport { Confirmation } from \"./Confirmation.js\";\nimport { OverlayLoader } from \"@webiny/admin-ui\";\nimport { Processed } from \"./Processed.js\";\n\nexport interface IContentProps {\n model: CmsModel | null;\n confirmation: string;\n setConfirmation: (value: string) => void;\n error: CmsErrorResponse | null;\n status: FullyDeleteModelStateStatus;\n}\n\nexport const Content = ({ confirmation, setConfirmation, error, model, status }: IContentProps) => {\n if (!model) {\n return <p>Model not found.</p>;\n } else if (status === FullyDeleteModelStateStatus.NONE) {\n return <Information model={model} />;\n } else if (status === FullyDeleteModelStateStatus.PROCESSED) {\n return <Processed model={model} />;\n }\n\n return (\n <>\n {status === FullyDeleteModelStateStatus.CONFIRMED && (\n <OverlayLoader text={\"Starting the deletion process...\"} />\n )}\n <Confirmation\n model={model}\n setConfirmation={setConfirmation}\n confirmation={confirmation}\n error={error}\n />\n </>\n );\n};\n"],"names":["Content","confirmation","setConfirmation","error","model","status","FullyDeleteModelStateStatus","Information","Processed","OverlayLoader","Confirmation"],"mappings":";;;;;;AAgBO,MAAMA,UAAU,CAAC,EAAEC,YAAY,EAAEC,eAAe,EAAEC,KAAK,EAAEC,KAAK,EAAEC,MAAM,EAAiB;IAC1F,IAAI,CAACD,OACD,OAAO,WAAP,GAAO,oBAAC,WAAE;IACP,IAAIC,WAAWC,4BAA4B,IAAI,EAClD,OAAO,WAAP,GAAO,oBAACC,aAAWA;QAAC,OAAOH;;IACxB,IAAIC,WAAWC,4BAA4B,SAAS,EACvD,OAAO,WAAP,GAAO,oBAACE,WAASA;QAAC,OAAOJ;;IAG7B,OAAO,WAAP,GACI,0CACKC,WAAWC,4BAA4B,SAAS,IAAI,WAAJ,GAC7C,oBAACG,eAAaA;QAAC,MAAM;sBAEzB,oBAACC,cAAYA;QACT,OAAON;QACP,iBAAiBF;QACjB,cAAcD;QACd,OAAOE;;AAIvB"}
1
+ {"version":3,"file":"presentation/contentModels/components/fullDelete/dialog/Content.js","sources":["../../../../../../src/presentation/contentModels/components/fullDelete/dialog/Content.tsx"],"sourcesContent":["import React from \"react\";\nimport type { CmsErrorResponse, CmsModel } from \"~/types.js\";\nimport { FullyDeleteModelStateStatus } from \"../types.js\";\nimport { Information } from \"./Information.js\";\nimport { Confirmation } from \"./Confirmation.js\";\nimport { OverlayLoader } from \"@webiny/admin-ui\";\nimport { Processed } from \"./Processed.js\";\n\nexport interface IContentProps {\n model: CmsModel | null;\n confirmation: string;\n setConfirmation: (value: string) => void;\n error: CmsErrorResponse | null;\n status: FullyDeleteModelStateStatus;\n}\n\nexport const Content = ({ confirmation, setConfirmation, error, model, status }: IContentProps) => {\n if (!model) {\n return <p>Model not found.</p>;\n } else if (status === FullyDeleteModelStateStatus.NONE) {\n return <Information model={model} />;\n } else if (status === FullyDeleteModelStateStatus.PROCESSED) {\n return <Processed model={model} />;\n }\n\n return (\n <>\n {status === FullyDeleteModelStateStatus.CONFIRMED && (\n <OverlayLoader text={\"Starting the deletion process...\"} />\n )}\n <Confirmation\n model={model}\n setConfirmation={setConfirmation}\n confirmation={confirmation}\n error={error}\n />\n </>\n );\n};\n"],"names":["Content","confirmation","setConfirmation","error","model","status","FullyDeleteModelStateStatus","Information","Processed","OverlayLoader","Confirmation"],"mappings":";;;;;;AAgBO,MAAMA,UAAU,CAAC,EAAEC,YAAY,EAAEC,eAAe,EAAEC,KAAK,EAAEC,KAAK,EAAEC,MAAM,EAAiB;IAC1F,IAAI,CAACD,OACD,OAAO,WAAP,GAAO,oBAAC,WAAE;SACP,IAAIC,WAAWC,4BAA4B,IAAI,EAClD,OAAO,WAAP,GAAO,oBAACC,aAAWA;QAAC,OAAOH;;SACxB,IAAIC,WAAWC,4BAA4B,SAAS,EACvD,OAAO,WAAP,GAAO,oBAACE,WAASA;QAAC,OAAOJ;;IAG7B,OAAO,WAAP,GACI,0CACKC,WAAWC,4BAA4B,SAAS,IAAI,WAAJ,GAC7C,oBAACG,eAAaA;QAAC,MAAM;sBAEzB,oBAACC,cAAYA;QACT,OAAON;QACP,iBAAiBF;QACjB,cAAcD;QACd,OAAOE;;AAIvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/contentModels/components/fullDelete/types.js","sources":["../../../../../src/presentation/contentModels/components/fullDelete/types.ts"],"sourcesContent":["import type { CmsErrorResponse, CmsModel } from \"~/types.js\";\nimport type { IDeleteCmsModelTask } from \"~/admin/viewsGraphql.js\";\n\nexport enum FullyDeleteModelStateStatus {\n NONE = 0,\n UNDERSTOOD = 1,\n CONFIRMED = 2,\n PROCESSED = 3,\n ERROR = 999\n}\n\nexport interface IFullyDeleteModelState {\n status: FullyDeleteModelStateStatus;\n confirmation: string;\n model: CmsModel;\n error: CmsErrorResponse | null;\n task: IDeleteCmsModelTask | null;\n}\n"],"names":["FullyDeleteModelStateStatus"],"mappings":"AAGO,IAAKA,oCAA2BA,WAAAA,GAAAA,SAA3BA,2BAA2B;;;;;;WAA3BA"}
1
+ {"version":3,"file":"presentation/contentModels/components/fullDelete/types.js","sources":["../../../../../src/presentation/contentModels/components/fullDelete/types.ts"],"sourcesContent":["import type { CmsErrorResponse, CmsModel } from \"~/types.js\";\nimport type { IDeleteCmsModelTask } from \"~/admin/viewsGraphql.js\";\n\nexport enum FullyDeleteModelStateStatus {\n NONE = 0,\n UNDERSTOOD = 1,\n CONFIRMED = 2,\n PROCESSED = 3,\n ERROR = 999\n}\n\nexport interface IFullyDeleteModelState {\n status: FullyDeleteModelStateStatus;\n confirmation: string;\n model: CmsModel;\n error: CmsErrorResponse | null;\n task: IDeleteCmsModelTask | null;\n}\n"],"names":["FullyDeleteModelStateStatus"],"mappings":"AAGO,IAAKA,oCAA2BA,WAAAA,GAAAA,SAA3BA,2BAA2B;sEAC5B;4EACM;2EACD;2EACA;uEACJ;WALAA"}
@@ -5,7 +5,7 @@ interface RefFieldOptionsProps {
5
5
  onNewRecord: (modelId: string) => void;
6
6
  onLinkExistingRecord: (modelId: string) => void;
7
7
  }
8
- export declare const RefFieldOptions: (({ models, onNewRecord, onLinkExistingRecord }: RefFieldOptionsProps) => React.JSX.Element) & {
9
- displayName: string;
8
+ export declare const RefFieldOptions: (({ models, onNewRecord, onLinkExistingRecord }: RefFieldOptionsProps) => React.JSX.Element) & React.NamedExoticComponent<RefFieldOptionsProps> & {
9
+ readonly type: ({ models, onNewRecord, onLinkExistingRecord }: RefFieldOptionsProps) => React.JSX.Element;
10
10
  };
11
11
  export {};
@@ -11,9 +11,10 @@ const ModelListItem = ({ model, onClick: originalOnClick })=>{
11
11
  }, [
12
12
  originalOnClick
13
13
  ]);
14
- const icon = model.icon ? /*#__PURE__*/ react.createElement(Icon, {
14
+ const faIcon = normalizeIcon(model.icon);
15
+ const icon = faIcon ? /*#__PURE__*/ react.createElement(Icon, {
15
16
  icon: /*#__PURE__*/ react.createElement(FontAwesomeIcon, {
16
- icon: normalizeIcon(model.icon)
17
+ icon: faIcon
17
18
  }),
18
19
  label: "Model icon",
19
20
  size: "lg",
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/fieldRenderers/ref/components/RefFieldOptions.js","sources":["../../../../../src/presentation/fieldRenderers/ref/components/RefFieldOptions.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport type { CmsModel } from \"~/types.js\";\nimport { ReactComponent as AddIcon } from \"@webiny/icons/add.svg\";\nimport { ReactComponent as LinkIcon } from \"@webiny/icons/link.svg\";\nimport { Button, DropdownMenu, Text, Icon } from \"@webiny/admin-ui\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport type { IconProp } from \"@fortawesome/fontawesome-svg-core\";\nimport { normalizeIcon } from \"~/utils/normalizeIcon.js\";\nimport { observer } from \"mobx-react-lite\";\n\ninterface ModelListItemProps {\n model: Pick<CmsModel, \"modelId\" | \"name\" | \"description\" | \"icon\">;\n onClick: (modelId: string) => void;\n}\n\nconst ModelListItem = ({ model, onClick: originalOnClick }: ModelListItemProps) => {\n const onClick = useCallback(() => {\n originalOnClick(model.modelId);\n }, [originalOnClick]);\n\n const icon = model.icon ? (\n <Icon\n icon={<FontAwesomeIcon icon={normalizeIcon(model.icon) as IconProp} />}\n label={\"Model icon\"}\n size={\"lg\"}\n className={\"text-neutral-strong\"}\n />\n ) : undefined;\n\n return (\n <DropdownMenu.Item\n onClick={onClick}\n icon={icon}\n text={\n <div>\n <Text as={\"div\"}>{model.name}</Text>\n <Text as={\"div\"} size={\"sm\"} className={\"text-neutral-strong\"}>\n {model.description}\n </Text>\n </div>\n }\n />\n );\n};\n\ninterface RefFieldOptionsProps {\n models: CmsModel[];\n onNewRecord: (modelId: string) => void;\n onLinkExistingRecord: (modelId: string) => void;\n}\n\nexport const RefFieldOptions = observer(\n ({ models, onNewRecord, onLinkExistingRecord }: RefFieldOptionsProps) => {\n const hasMultipleModels = models.length > 1;\n\n const onSingleNewRecord = useCallback(() => {\n if (models.length === 0 || hasMultipleModels) {\n return;\n }\n onNewRecord(models[0].modelId);\n }, [models]);\n\n const onSingleExistingRecord = useCallback(() => {\n if (models.length === 0 || hasMultipleModels) {\n return;\n }\n onLinkExistingRecord(models[0].modelId);\n }, [models]);\n\n if (hasMultipleModels) {\n return (\n <div className={\"flex flex-wrap gap-sm\"}>\n <DropdownMenu\n trigger={\n <Button\n variant={\"tertiary\"}\n text=\"Create a new record\"\n icon={<AddIcon />}\n />\n }\n >\n {models.map(model => (\n <ModelListItem\n key={model.modelId}\n onClick={onNewRecord}\n model={model}\n />\n ))}\n </DropdownMenu>\n <DropdownMenu\n trigger={\n <Button\n variant={\"tertiary\"}\n text=\"Select an existing record\"\n icon={<LinkIcon />}\n />\n }\n >\n {models.map(model => (\n <ModelListItem\n key={model.modelId}\n onClick={onLinkExistingRecord}\n model={model}\n />\n ))}\n </DropdownMenu>\n </div>\n );\n }\n\n return (\n <div className={\"flex flex-wrap gap-sm\"}>\n <Button\n variant={\"tertiary\"}\n text=\"Create a new record\"\n icon={<AddIcon />}\n onClick={onSingleNewRecord}\n />\n <Button\n variant={\"tertiary\"}\n text=\"Select an existing record\"\n icon={<LinkIcon />}\n onClick={onSingleExistingRecord}\n />\n </div>\n );\n }\n);\n"],"names":["ModelListItem","model","originalOnClick","onClick","useCallback","icon","Icon","FontAwesomeIcon","normalizeIcon","undefined","DropdownMenu","Text","RefFieldOptions","observer","models","onNewRecord","onLinkExistingRecord","hasMultipleModels","onSingleNewRecord","onSingleExistingRecord","Button","AddIcon","LinkIcon"],"mappings":";;;;;;;AAeA,MAAMA,gBAAgB,CAAC,EAAEC,KAAK,EAAE,SAASC,eAAe,EAAsB;IAC1E,MAAMC,UAAUC,YAAY;QACxBF,gBAAgBD,MAAM,OAAO;IACjC,GAAG;QAACC;KAAgB;IAEpB,MAAMG,OAAOJ,MAAM,IAAI,GAAG,WAAH,GACnB,oBAACK,MAAIA;QACD,oBAAM,oBAACC,iBAAeA;YAAC,MAAMC,cAAcP,MAAM,IAAI;;QACrD,OAAO;QACP,MAAM;QACN,WAAW;SAEfQ;IAEJ,OAAO,WAAP,GACI,oBAACC,aAAa,IAAI;QACd,SAASP;QACT,MAAME;QACN,oBACI,oBAAC,2BACG,oBAACM,MAAIA;YAAC,IAAI;WAAQV,MAAM,IAAI,iBAC5B,oBAACU,MAAIA;YAAC,IAAI;YAAO,MAAM;YAAM,WAAW;WACnCV,MAAM,WAAW;;AAM1C;AAQO,MAAMW,kBAAkBC,SAC3B,CAAC,EAAEC,MAAM,EAAEC,WAAW,EAAEC,oBAAoB,EAAwB;IAChE,MAAMC,oBAAoBH,OAAO,MAAM,GAAG;IAE1C,MAAMI,oBAAoBd,YAAY;QAClC,IAAIU,AAAkB,MAAlBA,OAAO,MAAM,IAAUG,mBACvB;QAEJF,YAAYD,MAAM,CAAC,EAAE,CAAC,OAAO;IACjC,GAAG;QAACA;KAAO;IAEX,MAAMK,yBAAyBf,YAAY;QACvC,IAAIU,AAAkB,MAAlBA,OAAO,MAAM,IAAUG,mBACvB;QAEJD,qBAAqBF,MAAM,CAAC,EAAE,CAAC,OAAO;IAC1C,GAAG;QAACA;KAAO;IAEX,IAAIG,mBACA,OAAO,WAAP,GACI,oBAAC;QAAI,WAAW;qBACZ,oBAACP,cAAYA;QACT,uBACI,oBAACU,QAAMA;YACH,SAAS;YACT,MAAK;YACL,oBAAM,oBAACC,gBAAOA;;OAIrBP,OAAO,GAAG,CAACb,CAAAA,QAAAA,WAAAA,GACR,oBAACD,eAAaA;YACV,KAAKC,MAAM,OAAO;YAClB,SAASc;YACT,OAAOd;4BAInB,oBAACS,cAAYA;QACT,uBACI,oBAACU,QAAMA;YACH,SAAS;YACT,MAAK;YACL,oBAAM,oBAACE,yBAAQA;;OAItBR,OAAO,GAAG,CAACb,CAAAA,QAAAA,WAAAA,GACR,oBAACD,eAAaA;YACV,KAAKC,MAAM,OAAO;YAClB,SAASe;YACT,OAAOf;;IAQ/B,OAAO,WAAP,GACI,oBAAC;QAAI,WAAW;qBACZ,oBAACmB,QAAMA;QACH,SAAS;QACT,MAAK;QACL,oBAAM,oBAACC,gBAAOA;QACd,SAASH;sBAEb,oBAACE,QAAMA;QACH,SAAS;QACT,MAAK;QACL,oBAAM,oBAACE,yBAAQA;QACf,SAASH;;AAIzB"}
1
+ {"version":3,"file":"presentation/fieldRenderers/ref/components/RefFieldOptions.js","sources":["../../../../../src/presentation/fieldRenderers/ref/components/RefFieldOptions.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport type { CmsModel } from \"~/types.js\";\nimport { ReactComponent as AddIcon } from \"@webiny/icons/add.svg\";\nimport { ReactComponent as LinkIcon } from \"@webiny/icons/link.svg\";\nimport { Button, DropdownMenu, Text, Icon } from \"@webiny/admin-ui\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { normalizeIcon } from \"~/utils/normalizeIcon.js\";\nimport { observer } from \"mobx-react-lite\";\n\ninterface ModelListItemProps {\n model: Pick<CmsModel, \"modelId\" | \"name\" | \"description\" | \"icon\">;\n onClick: (modelId: string) => void;\n}\n\nconst ModelListItem = ({ model, onClick: originalOnClick }: ModelListItemProps) => {\n const onClick = useCallback(() => {\n originalOnClick(model.modelId);\n }, [originalOnClick]);\n\n const faIcon = normalizeIcon(model.icon);\n const icon = faIcon ? (\n <Icon\n icon={<FontAwesomeIcon icon={faIcon} />}\n label={\"Model icon\"}\n size={\"lg\"}\n className={\"text-neutral-strong\"}\n />\n ) : undefined;\n\n return (\n <DropdownMenu.Item\n onClick={onClick}\n icon={icon}\n text={\n <div>\n <Text as={\"div\"}>{model.name}</Text>\n <Text as={\"div\"} size={\"sm\"} className={\"text-neutral-strong\"}>\n {model.description}\n </Text>\n </div>\n }\n />\n );\n};\n\ninterface RefFieldOptionsProps {\n models: CmsModel[];\n onNewRecord: (modelId: string) => void;\n onLinkExistingRecord: (modelId: string) => void;\n}\n\nexport const RefFieldOptions = observer(\n ({ models, onNewRecord, onLinkExistingRecord }: RefFieldOptionsProps) => {\n const hasMultipleModels = models.length > 1;\n\n const onSingleNewRecord = useCallback(() => {\n if (models.length === 0 || hasMultipleModels) {\n return;\n }\n onNewRecord(models[0].modelId);\n }, [models]);\n\n const onSingleExistingRecord = useCallback(() => {\n if (models.length === 0 || hasMultipleModels) {\n return;\n }\n onLinkExistingRecord(models[0].modelId);\n }, [models]);\n\n if (hasMultipleModels) {\n return (\n <div className={\"flex flex-wrap gap-sm\"}>\n <DropdownMenu\n trigger={\n <Button\n variant={\"tertiary\"}\n text=\"Create a new record\"\n icon={<AddIcon />}\n />\n }\n >\n {models.map(model => (\n <ModelListItem\n key={model.modelId}\n onClick={onNewRecord}\n model={model}\n />\n ))}\n </DropdownMenu>\n <DropdownMenu\n trigger={\n <Button\n variant={\"tertiary\"}\n text=\"Select an existing record\"\n icon={<LinkIcon />}\n />\n }\n >\n {models.map(model => (\n <ModelListItem\n key={model.modelId}\n onClick={onLinkExistingRecord}\n model={model}\n />\n ))}\n </DropdownMenu>\n </div>\n );\n }\n\n return (\n <div className={\"flex flex-wrap gap-sm\"}>\n <Button\n variant={\"tertiary\"}\n text=\"Create a new record\"\n icon={<AddIcon />}\n onClick={onSingleNewRecord}\n />\n <Button\n variant={\"tertiary\"}\n text=\"Select an existing record\"\n icon={<LinkIcon />}\n onClick={onSingleExistingRecord}\n />\n </div>\n );\n }\n);\n"],"names":["ModelListItem","model","originalOnClick","onClick","useCallback","faIcon","normalizeIcon","icon","Icon","FontAwesomeIcon","undefined","DropdownMenu","Text","RefFieldOptions","observer","models","onNewRecord","onLinkExistingRecord","hasMultipleModels","onSingleNewRecord","onSingleExistingRecord","Button","AddIcon","LinkIcon"],"mappings":";;;;;;;AAcA,MAAMA,gBAAgB,CAAC,EAAEC,KAAK,EAAE,SAASC,eAAe,EAAsB;IAC1E,MAAMC,UAAUC,YAAY;QACxBF,gBAAgBD,MAAM,OAAO;IACjC,GAAG;QAACC;KAAgB;IAEpB,MAAMG,SAASC,cAAcL,MAAM,IAAI;IACvC,MAAMM,OAAOF,SAAS,WAATA,GACT,oBAACG,MAAIA;QACD,oBAAM,oBAACC,iBAAeA;YAAC,MAAMJ;;QAC7B,OAAO;QACP,MAAM;QACN,WAAW;SAEfK;IAEJ,OAAO,WAAP,GACI,oBAACC,aAAa,IAAI;QACd,SAASR;QACT,MAAMI;QACN,oBACI,oBAAC,2BACG,oBAACK,MAAIA;YAAC,IAAI;WAAQX,MAAM,IAAI,iBAC5B,oBAACW,MAAIA;YAAC,IAAI;YAAO,MAAM;YAAM,WAAW;WACnCX,MAAM,WAAW;;AAM1C;AAQO,MAAMY,kBAAkBC,SAC3B,CAAC,EAAEC,MAAM,EAAEC,WAAW,EAAEC,oBAAoB,EAAwB;IAChE,MAAMC,oBAAoBH,OAAO,MAAM,GAAG;IAE1C,MAAMI,oBAAoBf,YAAY;QAClC,IAAIW,AAAkB,MAAlBA,OAAO,MAAM,IAAUG,mBACvB;QAEJF,YAAYD,MAAM,CAAC,EAAE,CAAC,OAAO;IACjC,GAAG;QAACA;KAAO;IAEX,MAAMK,yBAAyBhB,YAAY;QACvC,IAAIW,AAAkB,MAAlBA,OAAO,MAAM,IAAUG,mBACvB;QAEJD,qBAAqBF,MAAM,CAAC,EAAE,CAAC,OAAO;IAC1C,GAAG;QAACA;KAAO;IAEX,IAAIG,mBACA,OAAO,WAAP,GACI,oBAAC;QAAI,WAAW;qBACZ,oBAACP,cAAYA;QACT,uBACI,oBAACU,QAAMA;YACH,SAAS;YACT,MAAK;YACL,oBAAM,oBAACC,gBAAOA;;OAIrBP,OAAO,GAAG,CAACd,CAAAA,QAAAA,WAAAA,GACR,oBAACD,eAAaA;YACV,KAAKC,MAAM,OAAO;YAClB,SAASe;YACT,OAAOf;4BAInB,oBAACU,cAAYA;QACT,uBACI,oBAACU,QAAMA;YACH,SAAS;YACT,MAAK;YACL,oBAAM,oBAACE,yBAAQA;;OAItBR,OAAO,GAAG,CAACd,CAAAA,QAAAA,WAAAA,GACR,oBAACD,eAAaA;YACV,KAAKC,MAAM,OAAO;YAClB,SAASgB;YACT,OAAOhB;;IAQ/B,OAAO,WAAP,GACI,oBAAC;QAAI,WAAW;qBACZ,oBAACoB,QAAMA;QACH,SAAS;QACT,MAAK;QACL,oBAAM,oBAACC,gBAAOA;QACd,SAASH;sBAEb,oBAACE,QAAMA;QACH,SAAS;QACT,MAAK;QACL,oBAAM,oBAACE,yBAAQA;QACf,SAASH;;AAIzB"}
@@ -2,6 +2,6 @@ import React from "react";
2
2
  export interface ImportContentModelsDialogProps {
3
3
  onClose: () => void;
4
4
  }
5
- export declare const ImportContentModelsDialog: ((props: ImportContentModelsDialogProps) => React.JSX.Element) & {
6
- displayName: string;
5
+ export declare const ImportContentModelsDialog: ((props: ImportContentModelsDialogProps) => React.JSX.Element) & React.NamedExoticComponent<ImportContentModelsDialogProps> & {
6
+ readonly type: (props: ImportContentModelsDialogProps) => React.JSX.Element;
7
7
  };
@@ -9,7 +9,7 @@ const createSelected = (params)=>{
9
9
  for (const id of item.related){
10
10
  const model = models.find((model)=>model.id === id);
11
11
  if (!model) continue;
12
- if (selected.has(model.id) || model.imported) continue;
12
+ else if (selected.has(model.id) || model.imported) continue;
13
13
  const related = createSelected({
14
14
  previous: selected,
15
15
  models,
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/importContentModels/ImportContentModelsPresenter.js","sources":["../../../src/presentation/importContentModels/ImportContentModelsPresenter.ts"],"sourcesContent":["import { makeAutoObservable, runInAction } from \"mobx\";\nimport type { CmsGroup, CmsModel } from \"@webiny/app-headless-cms-common/types/index.js\";\nimport type { ImportGroupData, ImportModelData } from \"./types.js\";\nimport { ImportAction } from \"./types.js\";\nimport type { ImportStructureVariablesGroup, ImportStructureVariablesModel } from \"./graphql.js\";\nimport { ValidateImportUseCase } from \"~/features/model/importModels/abstractions.js\";\nimport { ImportModelsUseCase } from \"~/features/model/importModels/abstractions.js\";\nimport {\n ImportContentModelsPresenter as Abstraction,\n type IImportContentModelsPresenter,\n type IImportContentModelsPresenterViewModel\n} from \"./abstractions.js\";\n\ninterface Data {\n groups: CmsGroup[];\n models: CmsModel[];\n}\n\ntype Selected = Map<string, string[]>;\n\ninterface CreateSelectedParams {\n previous: Selected;\n models: Pick<ImportModelData, \"id\" | \"related\" | \"imported\">[];\n item: Pick<ImportModelData, \"id\" | \"related\">;\n}\n\nconst createSelected = (params: CreateSelectedParams): Selected => {\n const { previous, models, item } = params;\n let selected = new Map(previous);\n\n selected.set(item.id, item.related);\n for (const id of item.related) {\n const model = models.find(model => model.id === id);\n if (!model) {\n continue;\n } else if (selected.has(model.id) || model.imported) {\n continue;\n }\n const related = createSelected({\n previous: selected,\n models,\n item: model\n });\n selected = new Map([...selected, ...related]);\n }\n\n return selected;\n};\n\ninterface DataToImportResult {\n groups: ImportStructureVariablesGroup[];\n models: ImportStructureVariablesModel[];\n}\n\nclass ImportContentModelsPresenterImpl implements IImportContentModelsPresenter {\n private data: Data | null = null;\n private loading = false;\n private groups: ImportGroupData[] = [];\n private models: ImportModelData[] = [];\n private file: File | null = null;\n private errors: string[] = [];\n private validated = false;\n private selected: Selected = new Map();\n\n constructor(\n private validateUseCase: ValidateImportUseCase.Interface,\n private importUseCase: ImportModelsUseCase.Interface\n ) {\n makeAutoObservable<ImportContentModelsPresenterImpl, \"validateUseCase\" | \"importUseCase\">(\n this,\n {\n validateUseCase: false,\n importUseCase: false\n }\n );\n }\n\n get vm(): IImportContentModelsPresenterViewModel {\n return {\n data: this.data,\n loading: this.loading,\n groups: this.groups,\n models: this.models,\n file: this.file,\n errors: this.errors,\n validated: this.validated\n };\n }\n\n hasSelected(): boolean {\n return this.selected.size > 0;\n }\n\n isModelSelected(item: Pick<ImportModelData, \"id\">): boolean {\n return this.selected.has(item.id);\n }\n\n isModelRelated({ id: target }: Pick<ImportModelData, \"id\">): boolean {\n for (const id of this.selected.keys()) {\n if (id === target) {\n continue;\n }\n const related = this.selected.get(id);\n if (related && related.includes(target)) {\n return true;\n }\n }\n return false;\n }\n\n onFile(file: File): void {\n const reader = new FileReader();\n reader.addEventListener(\"load\", event => {\n try {\n const data = this.parseFileContent(event.target?.result);\n runInAction(() => {\n this.models = [];\n this.groups = [];\n this.selected = new Map();\n this.errors = [];\n this.validated = false;\n this.file = file;\n this.data = data;\n });\n } catch (ex: any) {\n runInAction(() => {\n this.file = file;\n this.selected = new Map();\n this.validated = false;\n this.groups = [];\n this.models = [];\n this.data = null;\n this.errors = [ex.message];\n });\n }\n });\n reader.readAsText(file);\n }\n\n onFileError(error: string): void {\n this.file = null;\n this.errors = [error];\n }\n\n toggleModel(item: Pick<ImportModelData, \"id\" | \"name\" | \"related\">): void {\n if (this.isModelSelected(item)) {\n this.removeModel(item);\n } else {\n this.addModel(item);\n }\n }\n\n async handleModelsValidation(): Promise<void> {\n if (!this.data) {\n return;\n }\n\n this.loading = true;\n\n try {\n const data = await this.validateUseCase.execute(this.data as any);\n\n runInAction(() => {\n this.loading = false;\n this.groups = data.groups.map(group => ({\n id: group.group.id,\n name: group.group.name,\n slug: group.group.slug,\n error: group.error,\n action: group.action\n }));\n this.models = data.models.map(model => ({\n id: model.model.modelId,\n name: model.model.name,\n group: model.model.group,\n related: model.related || [],\n error: model.error,\n action: model.action\n }));\n this.validated = true;\n });\n } catch (ex: any) {\n runInAction(() => {\n this.loading = false;\n this.errors = [ex.message];\n });\n }\n }\n\n async handleModelsImport(): Promise<void> {\n if (!this.data || !this.groups.length || !this.models.length || !this.selected.size) {\n return;\n }\n\n this.loading = true;\n\n const dataToImport = this.getDataToImport();\n\n try {\n const data = await this.importUseCase.execute(dataToImport);\n\n runInAction(() => {\n this.loading = false;\n this.selected = new Map();\n this.groups = this.groups.map(group => {\n const result = data.groups.find(item => item.group.id === group.id);\n return {\n id: result?.group.id || group.id,\n name: result?.group.name || group.name,\n slug: result?.group.slug || group.slug,\n error: result?.error || group.error,\n imported: result ? result.imported : group.imported\n };\n });\n this.models = this.models.map(model => {\n const result = data.models.find(item => item.model.modelId === model.id);\n return {\n id: result?.model.modelId || model.id,\n name: result?.model.name || model.name,\n group: result?.model.group || model.group,\n related: result?.related || model.related || [],\n action: result?.action || model.action,\n error: result?.error || model.error,\n imported: result ? result.imported : model.imported\n };\n });\n this.validated = true;\n });\n } catch (ex: any) {\n runInAction(() => {\n this.loading = false;\n this.errors = [ex.message];\n });\n }\n }\n\n reset(): void {\n this.data = null;\n this.loading = false;\n this.groups = [];\n this.models = [];\n this.file = null;\n this.errors = [];\n this.validated = false;\n this.selected = new Map();\n }\n\n private addModel(item: Pick<ImportModelData, \"id\" | \"name\" | \"related\">): void {\n if (this.isModelSelected(item)) {\n return;\n }\n this.selected = createSelected({\n previous: this.selected,\n models: this.models,\n item\n });\n }\n\n private removeModel(item: Pick<ImportModelData, \"id\" | \"name\" | \"related\">): void {\n if (this.isModelRelated(item)) {\n return;\n }\n const selected = new Map(this.selected);\n selected.delete(item.id);\n this.selected = selected;\n }\n\n private getDataToImport(): DataToImportResult {\n const selected = Array.from(this.selected.keys());\n const groups: Map<string, ImportStructureVariablesGroup> = new Map();\n const models: Map<string, ImportStructureVariablesModel> = new Map();\n const noAction = [ImportAction.CODE, ImportAction.NONE];\n\n for (const id of selected) {\n const validatedModel = this.models.find(model => model.id === id);\n if (\n !validatedModel?.action ||\n validatedModel.error ||\n noAction.includes(validatedModel.action)\n ) {\n continue;\n }\n const validatedGroup = this.groups.find(group => group.slug === validatedModel.group);\n if (!validatedGroup?.action || validatedGroup.error) {\n continue;\n }\n\n const model = this.data?.models?.find(model => model.modelId === id);\n if (!model) {\n continue;\n }\n models.set(id, {\n ...model,\n layout: model.layout || [],\n titleFieldId: model.titleFieldId || \"id\",\n descriptionFieldId: model.descriptionFieldId || \"\",\n imageFieldId: model.imageFieldId || \"\",\n group: validatedModel.group\n });\n\n if (noAction.includes(validatedGroup.action)) {\n continue;\n }\n\n const group = this.data?.groups?.find(group => group.slug === validatedModel.group);\n if (!group) {\n continue;\n }\n groups.set(group.id, group);\n }\n\n return {\n groups: Array.from(groups.values()),\n models: Array.from(models.values())\n };\n }\n\n private parseFileContent(content?: string | ArrayBuffer | null): Data {\n if (!content) {\n throw new Error(\"Missing data in uploaded file.\");\n }\n const raw =\n content instanceof ArrayBuffer ? Buffer.from(content).toString(\"utf8\") : content;\n\n let data: Record<string, any> = {};\n try {\n data = JSON.parse(raw);\n } catch {\n throw new Error(\"Could not parse the uploaded file. Make sure it's a valid JSON file.\");\n }\n if (!data.groups?.length && !data.models?.length) {\n throw new Error(\"No groups and models in the uploaded file.\");\n } else if (data.groups.length === 0) {\n throw new Error(\"No groups in the uploaded file. There must be at least one group.\");\n }\n return {\n groups: data.groups,\n models: data.models\n };\n }\n}\n\nexport const ImportContentModelsPresenter = Abstraction.createImplementation({\n implementation: ImportContentModelsPresenterImpl,\n dependencies: [ValidateImportUseCase, ImportModelsUseCase]\n});\n"],"names":["createSelected","params","previous","models","item","selected","Map","id","model","related","ImportContentModelsPresenterImpl","validateUseCase","importUseCase","makeAutoObservable","target","file","reader","FileReader","event","data","runInAction","ex","error","group","dataToImport","result","Array","groups","noAction","ImportAction","validatedModel","validatedGroup","content","Error","raw","ArrayBuffer","Buffer","JSON","ImportContentModelsPresenter","Abstraction","ValidateImportUseCase","ImportModelsUseCase"],"mappings":"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"}
1
+ {"version":3,"file":"presentation/importContentModels/ImportContentModelsPresenter.js","sources":["../../../src/presentation/importContentModels/ImportContentModelsPresenter.ts"],"sourcesContent":["import { makeAutoObservable, runInAction } from \"mobx\";\nimport type { CmsGroup, CmsModel } from \"@webiny/app-headless-cms-common/types/index.js\";\nimport type { ImportGroupData, ImportModelData } from \"./types.js\";\nimport { ImportAction } from \"./types.js\";\nimport type { ImportStructureVariablesGroup, ImportStructureVariablesModel } from \"./graphql.js\";\nimport { ValidateImportUseCase } from \"~/features/model/importModels/abstractions.js\";\nimport { ImportModelsUseCase } from \"~/features/model/importModels/abstractions.js\";\nimport {\n ImportContentModelsPresenter as Abstraction,\n type IImportContentModelsPresenter,\n type IImportContentModelsPresenterViewModel\n} from \"./abstractions.js\";\n\ninterface Data {\n groups: CmsGroup[];\n models: CmsModel[];\n}\n\ntype Selected = Map<string, string[]>;\n\ninterface CreateSelectedParams {\n previous: Selected;\n models: Pick<ImportModelData, \"id\" | \"related\" | \"imported\">[];\n item: Pick<ImportModelData, \"id\" | \"related\">;\n}\n\nconst createSelected = (params: CreateSelectedParams): Selected => {\n const { previous, models, item } = params;\n let selected = new Map(previous);\n\n selected.set(item.id, item.related);\n for (const id of item.related) {\n const model = models.find(model => model.id === id);\n if (!model) {\n continue;\n } else if (selected.has(model.id) || model.imported) {\n continue;\n }\n const related = createSelected({\n previous: selected,\n models,\n item: model\n });\n selected = new Map([...selected, ...related]);\n }\n\n return selected;\n};\n\ninterface DataToImportResult {\n groups: ImportStructureVariablesGroup[];\n models: ImportStructureVariablesModel[];\n}\n\nclass ImportContentModelsPresenterImpl implements IImportContentModelsPresenter {\n private data: Data | null = null;\n private loading = false;\n private groups: ImportGroupData[] = [];\n private models: ImportModelData[] = [];\n private file: File | null = null;\n private errors: string[] = [];\n private validated = false;\n private selected: Selected = new Map();\n\n constructor(\n private validateUseCase: ValidateImportUseCase.Interface,\n private importUseCase: ImportModelsUseCase.Interface\n ) {\n makeAutoObservable<ImportContentModelsPresenterImpl, \"validateUseCase\" | \"importUseCase\">(\n this,\n {\n validateUseCase: false,\n importUseCase: false\n }\n );\n }\n\n get vm(): IImportContentModelsPresenterViewModel {\n return {\n data: this.data,\n loading: this.loading,\n groups: this.groups,\n models: this.models,\n file: this.file,\n errors: this.errors,\n validated: this.validated\n };\n }\n\n hasSelected(): boolean {\n return this.selected.size > 0;\n }\n\n isModelSelected(item: Pick<ImportModelData, \"id\">): boolean {\n return this.selected.has(item.id);\n }\n\n isModelRelated({ id: target }: Pick<ImportModelData, \"id\">): boolean {\n for (const id of this.selected.keys()) {\n if (id === target) {\n continue;\n }\n const related = this.selected.get(id);\n if (related && related.includes(target)) {\n return true;\n }\n }\n return false;\n }\n\n onFile(file: File): void {\n const reader = new FileReader();\n reader.addEventListener(\"load\", event => {\n try {\n const data = this.parseFileContent(event.target?.result);\n runInAction(() => {\n this.models = [];\n this.groups = [];\n this.selected = new Map();\n this.errors = [];\n this.validated = false;\n this.file = file;\n this.data = data;\n });\n } catch (ex: any) {\n runInAction(() => {\n this.file = file;\n this.selected = new Map();\n this.validated = false;\n this.groups = [];\n this.models = [];\n this.data = null;\n this.errors = [ex.message];\n });\n }\n });\n reader.readAsText(file);\n }\n\n onFileError(error: string): void {\n this.file = null;\n this.errors = [error];\n }\n\n toggleModel(item: Pick<ImportModelData, \"id\" | \"name\" | \"related\">): void {\n if (this.isModelSelected(item)) {\n this.removeModel(item);\n } else {\n this.addModel(item);\n }\n }\n\n async handleModelsValidation(): Promise<void> {\n if (!this.data) {\n return;\n }\n\n this.loading = true;\n\n try {\n const data = await this.validateUseCase.execute(this.data as any);\n\n runInAction(() => {\n this.loading = false;\n this.groups = data.groups.map(group => ({\n id: group.group.id,\n name: group.group.name,\n slug: group.group.slug,\n error: group.error,\n action: group.action\n }));\n this.models = data.models.map(model => ({\n id: model.model.modelId,\n name: model.model.name,\n group: model.model.group,\n related: model.related || [],\n error: model.error,\n action: model.action\n }));\n this.validated = true;\n });\n } catch (ex: any) {\n runInAction(() => {\n this.loading = false;\n this.errors = [ex.message];\n });\n }\n }\n\n async handleModelsImport(): Promise<void> {\n if (!this.data || !this.groups.length || !this.models.length || !this.selected.size) {\n return;\n }\n\n this.loading = true;\n\n const dataToImport = this.getDataToImport();\n\n try {\n const data = await this.importUseCase.execute(dataToImport);\n\n runInAction(() => {\n this.loading = false;\n this.selected = new Map();\n this.groups = this.groups.map(group => {\n const result = data.groups.find(item => item.group.id === group.id);\n return {\n id: result?.group.id || group.id,\n name: result?.group.name || group.name,\n slug: result?.group.slug || group.slug,\n error: result?.error || group.error,\n imported: result ? result.imported : group.imported\n };\n });\n this.models = this.models.map(model => {\n const result = data.models.find(item => item.model.modelId === model.id);\n return {\n id: result?.model.modelId || model.id,\n name: result?.model.name || model.name,\n group: result?.model.group || model.group,\n related: result?.related || model.related || [],\n action: result?.action || model.action,\n error: result?.error || model.error,\n imported: result ? result.imported : model.imported\n };\n });\n this.validated = true;\n });\n } catch (ex: any) {\n runInAction(() => {\n this.loading = false;\n this.errors = [ex.message];\n });\n }\n }\n\n reset(): void {\n this.data = null;\n this.loading = false;\n this.groups = [];\n this.models = [];\n this.file = null;\n this.errors = [];\n this.validated = false;\n this.selected = new Map();\n }\n\n private addModel(item: Pick<ImportModelData, \"id\" | \"name\" | \"related\">): void {\n if (this.isModelSelected(item)) {\n return;\n }\n this.selected = createSelected({\n previous: this.selected,\n models: this.models,\n item\n });\n }\n\n private removeModel(item: Pick<ImportModelData, \"id\" | \"name\" | \"related\">): void {\n if (this.isModelRelated(item)) {\n return;\n }\n const selected = new Map(this.selected);\n selected.delete(item.id);\n this.selected = selected;\n }\n\n private getDataToImport(): DataToImportResult {\n const selected = Array.from(this.selected.keys());\n const groups: Map<string, ImportStructureVariablesGroup> = new Map();\n const models: Map<string, ImportStructureVariablesModel> = new Map();\n const noAction = [ImportAction.CODE, ImportAction.NONE];\n\n for (const id of selected) {\n const validatedModel = this.models.find(model => model.id === id);\n if (\n !validatedModel?.action ||\n validatedModel.error ||\n noAction.includes(validatedModel.action)\n ) {\n continue;\n }\n const validatedGroup = this.groups.find(group => group.slug === validatedModel.group);\n if (!validatedGroup?.action || validatedGroup.error) {\n continue;\n }\n\n const model = this.data?.models?.find(model => model.modelId === id);\n if (!model) {\n continue;\n }\n models.set(id, {\n ...model,\n layout: model.layout || [],\n titleFieldId: model.titleFieldId || \"id\",\n descriptionFieldId: model.descriptionFieldId || \"\",\n imageFieldId: model.imageFieldId || \"\",\n group: validatedModel.group\n });\n\n if (noAction.includes(validatedGroup.action)) {\n continue;\n }\n\n const group = this.data?.groups?.find(group => group.slug === validatedModel.group);\n if (!group) {\n continue;\n }\n groups.set(group.id, group);\n }\n\n return {\n groups: Array.from(groups.values()),\n models: Array.from(models.values())\n };\n }\n\n private parseFileContent(content?: string | ArrayBuffer | null): Data {\n if (!content) {\n throw new Error(\"Missing data in uploaded file.\");\n }\n const raw =\n content instanceof ArrayBuffer ? Buffer.from(content).toString(\"utf8\") : content;\n\n let data: Record<string, any> = {};\n try {\n data = JSON.parse(raw);\n } catch {\n throw new Error(\"Could not parse the uploaded file. Make sure it's a valid JSON file.\");\n }\n if (!data.groups?.length && !data.models?.length) {\n throw new Error(\"No groups and models in the uploaded file.\");\n } else if (data.groups.length === 0) {\n throw new Error(\"No groups in the uploaded file. There must be at least one group.\");\n }\n return {\n groups: data.groups,\n models: data.models\n };\n }\n}\n\nexport const ImportContentModelsPresenter = Abstraction.createImplementation({\n implementation: ImportContentModelsPresenterImpl,\n dependencies: [ValidateImportUseCase, ImportModelsUseCase]\n});\n"],"names":["createSelected","params","previous","models","item","selected","Map","id","model","related","ImportContentModelsPresenterImpl","validateUseCase","importUseCase","makeAutoObservable","target","file","reader","FileReader","event","data","runInAction","ex","error","group","dataToImport","result","Array","groups","noAction","ImportAction","validatedModel","validatedGroup","content","Error","raw","ArrayBuffer","Buffer","JSON","ImportContentModelsPresenter","Abstraction","ValidateImportUseCase","ImportModelsUseCase"],"mappings":";;;;AA0BA,MAAMA,iBAAiB,CAACC;IACpB,MAAM,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,IAAI,EAAE,GAAGH;IACnC,IAAII,WAAW,IAAIC,IAAIJ;IAEvBG,SAAS,GAAG,CAACD,KAAK,EAAE,EAAEA,KAAK,OAAO;IAClC,KAAK,MAAMG,MAAMH,KAAK,OAAO,CAAE;QAC3B,MAAMI,QAAQL,OAAO,IAAI,CAACK,CAAAA,QAASA,MAAM,EAAE,KAAKD;QAChD,IAAI,CAACC,OACD;aACG,IAAIH,SAAS,GAAG,CAACG,MAAM,EAAE,KAAKA,MAAM,QAAQ,EAC/C;QAEJ,MAAMC,UAAUT,eAAe;YAC3B,UAAUK;YACVF;YACA,MAAMK;QACV;QACAH,WAAW,IAAIC,IAAI;eAAID;eAAaI;SAAQ;IAChD;IAEA,OAAOJ;AACX;AAOA,MAAMK;IAUF,YACYC,eAAgD,EAChDC,aAA4C,CACtD;aAFUD,eAAe,GAAfA;aACAC,aAAa,GAAbA;aAXJ,IAAI,GAAgB;aACpB,OAAO,GAAG;aACV,MAAM,GAAsB,EAAE;aAC9B,MAAM,GAAsB,EAAE;aAC9B,IAAI,GAAgB;aACpB,MAAM,GAAa,EAAE;aACrB,SAAS,GAAG;aACZ,QAAQ,GAAa,IAAIN;QAM7BO,mBACI,IAAI,EACJ;YACI,iBAAiB;YACjB,eAAe;QACnB;IAER;IAEA,IAAI,KAA6C;QAC7C,OAAO;YACH,MAAM,IAAI,CAAC,IAAI;YACf,SAAS,IAAI,CAAC,OAAO;YACrB,QAAQ,IAAI,CAAC,MAAM;YACnB,QAAQ,IAAI,CAAC,MAAM;YACnB,MAAM,IAAI,CAAC,IAAI;YACf,QAAQ,IAAI,CAAC,MAAM;YACnB,WAAW,IAAI,CAAC,SAAS;QAC7B;IACJ;IAEA,cAAuB;QACnB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG;IAChC;IAEA,gBAAgBT,IAAiC,EAAW;QACxD,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAACA,KAAK,EAAE;IACpC;IAEA,eAAe,EAAE,IAAIU,MAAM,EAA+B,EAAW;QACjE,KAAK,MAAMP,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAI;YACnC,IAAIA,OAAOO,QACP;YAEJ,MAAML,UAAU,IAAI,CAAC,QAAQ,CAAC,GAAG,CAACF;YAClC,IAAIE,WAAWA,QAAQ,QAAQ,CAACK,SAC5B,OAAO;QAEf;QACA,OAAO;IACX;IAEA,OAAOC,IAAU,EAAQ;QACrB,MAAMC,SAAS,IAAIC;QACnBD,OAAO,gBAAgB,CAAC,QAAQE,CAAAA;YAC5B,IAAI;gBACA,MAAMC,OAAO,IAAI,CAAC,gBAAgB,CAACD,MAAM,MAAM,EAAE;gBACjDE,YAAY;oBACR,IAAI,CAAC,MAAM,GAAG,EAAE;oBAChB,IAAI,CAAC,MAAM,GAAG,EAAE;oBAChB,IAAI,CAAC,QAAQ,GAAG,IAAId;oBACpB,IAAI,CAAC,MAAM,GAAG,EAAE;oBAChB,IAAI,CAAC,SAAS,GAAG;oBACjB,IAAI,CAAC,IAAI,GAAGS;oBACZ,IAAI,CAAC,IAAI,GAAGI;gBAChB;YACJ,EAAE,OAAOE,IAAS;gBACdD,YAAY;oBACR,IAAI,CAAC,IAAI,GAAGL;oBACZ,IAAI,CAAC,QAAQ,GAAG,IAAIT;oBACpB,IAAI,CAAC,SAAS,GAAG;oBACjB,IAAI,CAAC,MAAM,GAAG,EAAE;oBAChB,IAAI,CAAC,MAAM,GAAG,EAAE;oBAChB,IAAI,CAAC,IAAI,GAAG;oBACZ,IAAI,CAAC,MAAM,GAAG;wBAACe,GAAG,OAAO;qBAAC;gBAC9B;YACJ;QACJ;QACAL,OAAO,UAAU,CAACD;IACtB;IAEA,YAAYO,KAAa,EAAQ;QAC7B,IAAI,CAAC,IAAI,GAAG;QACZ,IAAI,CAAC,MAAM,GAAG;YAACA;SAAM;IACzB;IAEA,YAAYlB,IAAsD,EAAQ;QACtE,IAAI,IAAI,CAAC,eAAe,CAACA,OACrB,IAAI,CAAC,WAAW,CAACA;aAEjB,IAAI,CAAC,QAAQ,CAACA;IAEtB;IAEA,MAAM,yBAAwC;QAC1C,IAAI,CAAC,IAAI,CAAC,IAAI,EACV;QAGJ,IAAI,CAAC,OAAO,GAAG;QAEf,IAAI;YACA,MAAMe,OAAO,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI;YAEzDC,YAAY;gBACR,IAAI,CAAC,OAAO,GAAG;gBACf,IAAI,CAAC,MAAM,GAAGD,KAAK,MAAM,CAAC,GAAG,CAACI,CAAAA,QAAU;wBACpC,IAAIA,MAAM,KAAK,CAAC,EAAE;wBAClB,MAAMA,MAAM,KAAK,CAAC,IAAI;wBACtB,MAAMA,MAAM,KAAK,CAAC,IAAI;wBACtB,OAAOA,MAAM,KAAK;wBAClB,QAAQA,MAAM,MAAM;oBACxB;gBACA,IAAI,CAAC,MAAM,GAAGJ,KAAK,MAAM,CAAC,GAAG,CAACX,CAAAA,QAAU;wBACpC,IAAIA,MAAM,KAAK,CAAC,OAAO;wBACvB,MAAMA,MAAM,KAAK,CAAC,IAAI;wBACtB,OAAOA,MAAM,KAAK,CAAC,KAAK;wBACxB,SAASA,MAAM,OAAO,IAAI,EAAE;wBAC5B,OAAOA,MAAM,KAAK;wBAClB,QAAQA,MAAM,MAAM;oBACxB;gBACA,IAAI,CAAC,SAAS,GAAG;YACrB;QACJ,EAAE,OAAOa,IAAS;YACdD,YAAY;gBACR,IAAI,CAAC,OAAO,GAAG;gBACf,IAAI,CAAC,MAAM,GAAG;oBAACC,GAAG,OAAO;iBAAC;YAC9B;QACJ;IACJ;IAEA,MAAM,qBAAoC;QACtC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAC/E;QAGJ,IAAI,CAAC,OAAO,GAAG;QAEf,MAAMG,eAAe,IAAI,CAAC,eAAe;QAEzC,IAAI;YACA,MAAML,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAACK;YAE9CJ,YAAY;gBACR,IAAI,CAAC,OAAO,GAAG;gBACf,IAAI,CAAC,QAAQ,GAAG,IAAId;gBACpB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAACiB,CAAAA;oBAC1B,MAAME,SAASN,KAAK,MAAM,CAAC,IAAI,CAACf,CAAAA,OAAQA,KAAK,KAAK,CAAC,EAAE,KAAKmB,MAAM,EAAE;oBAClE,OAAO;wBACH,IAAIE,QAAQ,MAAM,MAAMF,MAAM,EAAE;wBAChC,MAAME,QAAQ,MAAM,QAAQF,MAAM,IAAI;wBACtC,MAAME,QAAQ,MAAM,QAAQF,MAAM,IAAI;wBACtC,OAAOE,QAAQ,SAASF,MAAM,KAAK;wBACnC,UAAUE,SAASA,OAAO,QAAQ,GAAGF,MAAM,QAAQ;oBACvD;gBACJ;gBACA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAACf,CAAAA;oBAC1B,MAAMiB,SAASN,KAAK,MAAM,CAAC,IAAI,CAACf,CAAAA,OAAQA,KAAK,KAAK,CAAC,OAAO,KAAKI,MAAM,EAAE;oBACvE,OAAO;wBACH,IAAIiB,QAAQ,MAAM,WAAWjB,MAAM,EAAE;wBACrC,MAAMiB,QAAQ,MAAM,QAAQjB,MAAM,IAAI;wBACtC,OAAOiB,QAAQ,MAAM,SAASjB,MAAM,KAAK;wBACzC,SAASiB,QAAQ,WAAWjB,MAAM,OAAO,IAAI,EAAE;wBAC/C,QAAQiB,QAAQ,UAAUjB,MAAM,MAAM;wBACtC,OAAOiB,QAAQ,SAASjB,MAAM,KAAK;wBACnC,UAAUiB,SAASA,OAAO,QAAQ,GAAGjB,MAAM,QAAQ;oBACvD;gBACJ;gBACA,IAAI,CAAC,SAAS,GAAG;YACrB;QACJ,EAAE,OAAOa,IAAS;YACdD,YAAY;gBACR,IAAI,CAAC,OAAO,GAAG;gBACf,IAAI,CAAC,MAAM,GAAG;oBAACC,GAAG,OAAO;iBAAC;YAC9B;QACJ;IACJ;IAEA,QAAc;QACV,IAAI,CAAC,IAAI,GAAG;QACZ,IAAI,CAAC,OAAO,GAAG;QACf,IAAI,CAAC,MAAM,GAAG,EAAE;QAChB,IAAI,CAAC,MAAM,GAAG,EAAE;QAChB,IAAI,CAAC,IAAI,GAAG;QACZ,IAAI,CAAC,MAAM,GAAG,EAAE;QAChB,IAAI,CAAC,SAAS,GAAG;QACjB,IAAI,CAAC,QAAQ,GAAG,IAAIf;IACxB;IAEQ,SAASF,IAAsD,EAAQ;QAC3E,IAAI,IAAI,CAAC,eAAe,CAACA,OACrB;QAEJ,IAAI,CAAC,QAAQ,GAAGJ,eAAe;YAC3B,UAAU,IAAI,CAAC,QAAQ;YACvB,QAAQ,IAAI,CAAC,MAAM;YACnBI;QACJ;IACJ;IAEQ,YAAYA,IAAsD,EAAQ;QAC9E,IAAI,IAAI,CAAC,cAAc,CAACA,OACpB;QAEJ,MAAMC,WAAW,IAAIC,IAAI,IAAI,CAAC,QAAQ;QACtCD,SAAS,MAAM,CAACD,KAAK,EAAE;QACvB,IAAI,CAAC,QAAQ,GAAGC;IACpB;IAEQ,kBAAsC;QAC1C,MAAMA,WAAWqB,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI;QAC9C,MAAMC,SAAqD,IAAIrB;QAC/D,MAAMH,SAAqD,IAAIG;QAC/D,MAAMsB,WAAW;YAACC,aAAa,IAAI;YAAEA,aAAa,IAAI;SAAC;QAEvD,KAAK,MAAMtB,MAAMF,SAAU;YACvB,MAAMyB,iBAAiB,IAAI,CAAC,MAAM,CAAC,IAAI,CAACtB,CAAAA,QAASA,MAAM,EAAE,KAAKD;YAC9D,IACI,CAACuB,gBAAgB,UACjBA,eAAe,KAAK,IACpBF,SAAS,QAAQ,CAACE,eAAe,MAAM,GAEvC;YAEJ,MAAMC,iBAAiB,IAAI,CAAC,MAAM,CAAC,IAAI,CAACR,CAAAA,QAASA,MAAM,IAAI,KAAKO,eAAe,KAAK;YACpF,IAAI,CAACC,gBAAgB,UAAUA,eAAe,KAAK,EAC/C;YAGJ,MAAMvB,QAAQ,IAAI,CAAC,IAAI,EAAE,QAAQ,KAAKA,CAAAA,QAASA,MAAM,OAAO,KAAKD;YACjE,IAAI,CAACC,OACD;YAEJL,OAAO,GAAG,CAACI,IAAI;gBACX,GAAGC,KAAK;gBACR,QAAQA,MAAM,MAAM,IAAI,EAAE;gBAC1B,cAAcA,MAAM,YAAY,IAAI;gBACpC,oBAAoBA,MAAM,kBAAkB,IAAI;gBAChD,cAAcA,MAAM,YAAY,IAAI;gBACpC,OAAOsB,eAAe,KAAK;YAC/B;YAEA,IAAIF,SAAS,QAAQ,CAACG,eAAe,MAAM,GACvC;YAGJ,MAAMR,QAAQ,IAAI,CAAC,IAAI,EAAE,QAAQ,KAAKA,CAAAA,QAASA,MAAM,IAAI,KAAKO,eAAe,KAAK;YAClF,IAAKP,OAGLI,OAAO,GAAG,CAACJ,MAAM,EAAE,EAAEA;QACzB;QAEA,OAAO;YACH,QAAQG,MAAM,IAAI,CAACC,OAAO,MAAM;YAChC,QAAQD,MAAM,IAAI,CAACvB,OAAO,MAAM;QACpC;IACJ;IAEQ,iBAAiB6B,OAAqC,EAAQ;QAClE,IAAI,CAACA,SACD,MAAM,IAAIC,MAAM;QAEpB,MAAMC,MACFF,mBAAmBG,cAAcC,OAAO,IAAI,CAACJ,SAAS,QAAQ,CAAC,UAAUA;QAE7E,IAAIb,OAA4B,CAAC;QACjC,IAAI;YACAA,OAAOkB,KAAK,KAAK,CAACH;QACtB,EAAE,OAAM;YACJ,MAAM,IAAID,MAAM;QACpB;QACA,IAAI,AAACd,KAAK,MAAM,EAAE,UAAWA,KAAK,MAAM,EAAE,QAEnC;YAAA,IAAIA,AAAuB,MAAvBA,KAAK,MAAM,CAAC,MAAM,EACzB,MAAM,IAAIc,MAAM;QACpB,OAHI,MAAM,IAAIA,MAAM;QAIpB,OAAO;YACH,QAAQd,KAAK,MAAM;YACnB,QAAQA,KAAK,MAAM;QACvB;IACJ;AACJ;AAEO,MAAMmB,4DAA+BC,6BAAAA,oBAAgC,CAAC;IACzE,gBAAgB7B;IAChB,cAAc;QAAC8B;QAAuBC;KAAoB;AAC9D"}
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
- export declare const DataList: (() => React.JSX.Element | null) & {
3
- displayName: string;
2
+ export declare const DataList: (() => React.JSX.Element | null) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element | null;
4
4
  };
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
- export declare const FileUpload: (() => React.JSX.Element) & {
3
- displayName: string;
2
+ export declare const FileUpload: (() => React.JSX.Element) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element;
4
4
  };
@@ -13,7 +13,7 @@ const FileUpload = observer(()=>{
13
13
  accept: [
14
14
  "application/json"
15
15
  ],
16
- maxSize: "5mb",
16
+ maxSize: "10mb",
17
17
  onSuccess: (files)=>{
18
18
  const file = files.find((f)=>f.src.file);
19
19
  const uploadedFile = file?.src?.file;
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/importContentModels/components/FileUpload.js","sources":["../../../../src/presentation/importContentModels/components/FileUpload.tsx"],"sourcesContent":["import React from \"react\";\nimport { BrowserFilePicker } from \"@webiny/app-admin/presentation/browserFilePicker/index.js\";\nimport { Text } from \"@webiny/admin-ui\";\nimport { getError } from \"./Errors.js\";\nimport { observer } from \"mobx-react-lite\";\nimport { useImportContentModelsPresenter } from \"../useImportContentModelsPresenter.js\";\n\nexport const FileUpload = observer(() => {\n const presenter = useImportContentModelsPresenter();\n const onFile = (file: File) => presenter.onFile(file);\n const onFileError = (error: string) => presenter.onFileError(error);\n const fileName = presenter.vm.file?.name;\n\n return (\n <BrowserFilePicker\n accept={[\"application/json\"]}\n maxSize={\"5mb\"}\n onSuccess={files => {\n const file = files.find(f => f.src.file);\n const uploadedFile = file?.src?.file;\n if (!uploadedFile) {\n onFileError(\n \"File is not valid. Please make sure you are uploading a valid JSON file.\"\n );\n return;\n }\n onFile(uploadedFile);\n }}\n onError={err => {\n const errors = err.map(er => {\n return getError(er);\n });\n if (errors.length === 0) {\n return;\n }\n onFileError(errors[0]);\n }}\n multiple={false}\n >\n {({ browseFiles, getDropZoneProps }) => {\n return (\n <>\n <div\n className={\n \"w-full mx-auto my-0 border-sm border-dashed cursor-pointer border-neutral-muted bg-neutral-base text-center p-md \"\n }\n onClick={() => browseFiles()}\n {...getDropZoneProps()}\n >\n <Text>{fileName || \"Drop a file here, or click to select one.\"}</Text>\n </div>\n </>\n );\n }}\n </BrowserFilePicker>\n );\n});\n"],"names":["FileUpload","observer","presenter","useImportContentModelsPresenter","onFile","file","onFileError","error","fileName","BrowserFilePicker","files","f","uploadedFile","err","errors","er","getError","browseFiles","getDropZoneProps","Text"],"mappings":";;;;;;AAOO,MAAMA,aAAaC,SAAS;IAC/B,MAAMC,YAAYC;IAClB,MAAMC,SAAS,CAACC,OAAeH,UAAU,MAAM,CAACG;IAChD,MAAMC,cAAc,CAACC,QAAkBL,UAAU,WAAW,CAACK;IAC7D,MAAMC,WAAWN,UAAU,EAAE,CAAC,IAAI,EAAE;IAEpC,OAAO,WAAP,GACI,oBAACO,mBAAiBA;QACd,QAAQ;YAAC;SAAmB;QAC5B,SAAS;QACT,WAAWC,CAAAA;YACP,MAAML,OAAOK,MAAM,IAAI,CAACC,CAAAA,IAAKA,EAAE,GAAG,CAAC,IAAI;YACvC,MAAMC,eAAeP,MAAM,KAAK;YAChC,IAAI,CAACO,cAAc,YACfN,YACI;YAIRF,OAAOQ;QACX;QACA,SAASC,CAAAA;YACL,MAAMC,SAASD,IAAI,GAAG,CAACE,CAAAA,KACZC,SAASD;YAEpB,IAAID,AAAkB,MAAlBA,OAAO,MAAM,EACb;YAEJR,YAAYQ,MAAM,CAAC,EAAE;QACzB;QACA,UAAU;OAET,CAAC,EAAEG,WAAW,EAAEC,gBAAgB,EAAE,GACxB,WAAP,GACI,wDACI,oBAAC;YACG,WACI;YAEJ,SAAS,IAAMD;YACd,GAAGC,kBAAkB;yBAEtB,oBAACC,MAAIA,MAAEX,YAAY;AAO/C"}
1
+ {"version":3,"file":"presentation/importContentModels/components/FileUpload.js","sources":["../../../../src/presentation/importContentModels/components/FileUpload.tsx"],"sourcesContent":["import React from \"react\";\nimport { BrowserFilePicker } from \"@webiny/app-admin/presentation/browserFilePicker/index.js\";\nimport { Text } from \"@webiny/admin-ui\";\nimport { getError } from \"./Errors.js\";\nimport { observer } from \"mobx-react-lite\";\nimport { useImportContentModelsPresenter } from \"../useImportContentModelsPresenter.js\";\n\nexport const FileUpload = observer(() => {\n const presenter = useImportContentModelsPresenter();\n const onFile = (file: File) => presenter.onFile(file);\n const onFileError = (error: string) => presenter.onFileError(error);\n const fileName = presenter.vm.file?.name;\n\n return (\n <BrowserFilePicker\n accept={[\"application/json\"]}\n maxSize={\"10mb\"}\n onSuccess={files => {\n const file = files.find(f => f.src.file);\n const uploadedFile = file?.src?.file;\n if (!uploadedFile) {\n onFileError(\n \"File is not valid. Please make sure you are uploading a valid JSON file.\"\n );\n return;\n }\n onFile(uploadedFile);\n }}\n onError={err => {\n const errors = err.map(er => {\n return getError(er);\n });\n if (errors.length === 0) {\n return;\n }\n onFileError(errors[0]);\n }}\n multiple={false}\n >\n {({ browseFiles, getDropZoneProps }) => {\n return (\n <>\n <div\n className={\n \"w-full mx-auto my-0 border-sm border-dashed cursor-pointer border-neutral-muted bg-neutral-base text-center p-md \"\n }\n onClick={() => browseFiles()}\n {...getDropZoneProps()}\n >\n <Text>{fileName || \"Drop a file here, or click to select one.\"}</Text>\n </div>\n </>\n );\n }}\n </BrowserFilePicker>\n );\n});\n"],"names":["FileUpload","observer","presenter","useImportContentModelsPresenter","onFile","file","onFileError","error","fileName","BrowserFilePicker","files","f","uploadedFile","err","errors","er","getError","browseFiles","getDropZoneProps","Text"],"mappings":";;;;;;AAOO,MAAMA,aAAaC,SAAS;IAC/B,MAAMC,YAAYC;IAClB,MAAMC,SAAS,CAACC,OAAeH,UAAU,MAAM,CAACG;IAChD,MAAMC,cAAc,CAACC,QAAkBL,UAAU,WAAW,CAACK;IAC7D,MAAMC,WAAWN,UAAU,EAAE,CAAC,IAAI,EAAE;IAEpC,OAAO,WAAP,GACI,oBAACO,mBAAiBA;QACd,QAAQ;YAAC;SAAmB;QAC5B,SAAS;QACT,WAAWC,CAAAA;YACP,MAAML,OAAOK,MAAM,IAAI,CAACC,CAAAA,IAAKA,EAAE,GAAG,CAAC,IAAI;YACvC,MAAMC,eAAeP,MAAM,KAAK;YAChC,IAAI,CAACO,cAAc,YACfN,YACI;YAIRF,OAAOQ;QACX;QACA,SAASC,CAAAA;YACL,MAAMC,SAASD,IAAI,GAAG,CAACE,CAAAA,KACZC,SAASD;YAEpB,IAAID,AAAkB,MAAlBA,OAAO,MAAM,EACb;YAEJR,YAAYQ,MAAM,CAAC,EAAE;QACzB;QACA,UAAU;OAET,CAAC,EAAEG,WAAW,EAAEC,gBAAgB,EAAE,GACxB,WAAP,GACI,wDACI,oBAAC;YACG,WACI;YAEJ,SAAS,IAAMD;YACd,GAAGC,kBAAkB;yBAEtB,oBAACC,MAAIA,MAAEX,YAAY;AAO/C"}
@@ -72,9 +72,9 @@ const Checkbox = ({ model, toggle, selected })=>{
72
72
  };
73
73
  const Container = ({ model, children })=>{
74
74
  if (model.imported) return /*#__PURE__*/ react.createElement(ContainerImported, null, children);
75
- if ("create" === model.action) return /*#__PURE__*/ react.createElement(ContainerCreate, null, children);
76
- if ("update" === model.action) return /*#__PURE__*/ react.createElement(ContainerUpdate, null, children);
77
- if (model.error) return /*#__PURE__*/ react.createElement(ContainerError, null, children);
75
+ else if ("create" === model.action) return /*#__PURE__*/ react.createElement(ContainerCreate, null, children);
76
+ else if ("update" === model.action) return /*#__PURE__*/ react.createElement(ContainerUpdate, null, children);
77
+ else if (model.error) return /*#__PURE__*/ react.createElement(ContainerError, null, children);
78
78
  return /*#__PURE__*/ react.createElement(ContainerBase, null, children);
79
79
  };
80
80
  const DataListModelItem = ({ model, toggle, selected })=>/*#__PURE__*/ react.createElement(Container, {
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/importContentModels/components/Model/DataListModelItem.js","sources":["../../../../../src/presentation/importContentModels/components/Model/DataListModelItem.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport styled from \"@emotion/styled\";\nimport type { ImportModelData } from \"../../types.js\";\nimport { DataListModelItemError } from \"./DataListModelItemError.js\";\nimport { DataListModelItemInfo } from \"./DataListModelItemInfo.js\";\n\ntype ToggleModelCb = (item: Pick<ImportModelData, \"id\" | \"name\" | \"related\">) => void;\n\nconst ContainerBase = styled(\"div\")(() => {\n return {\n width: \"100%\",\n padding: \"0px 5px 15px 5px\",\n margin: \"0\",\n boxSizing: \"border-box\" as const,\n \"&:last-child\": {\n paddingBottom: \"2px\"\n }\n };\n});\nconst ContainerCreate = styled(ContainerBase)(() => {\n return {\n // backgroundColor: \"var(--mdc-theme-secondary)\"\n };\n});\nconst ContainerImported = styled(ContainerBase)(() => {\n return {};\n});\nconst ContainerUpdate = styled(ContainerBase)(() => {\n return {};\n});\nconst ContainerError = styled(ContainerBase)(() => {\n return {};\n});\n\nconst ModelContainer = styled(\"div\")({\n display: \"flex\",\n width: \"100%\",\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"space-between\"\n});\nconst Name = styled(\"h4\")({\n fontSize: \"12px\",\n flex: \"1 0 auto\",\n lineHeight: \"18px\"\n});\nconst CheckboxContainer = styled(\"div\")({\n width: \"120px\",\n textAlign: \"right\",\n verticalAlign: \"middle\"\n});\n\nconst Button = styled(\"button\")({\n padding: \"1px 5px\",\n textAlign: \"right\",\n display: \"inline-block\",\n border: \"1px solid var(--mdc-theme-on-background)\",\n fontSize: \"10px\",\n lineHeight: \"12px\",\n cursor: \"pointer\",\n outline: \"0 none\",\n backgroundColor: \"var(--mdc-theme-background)\",\n \"&.selected\": {\n border: \"1px solid var(--mdc-theme-secondary)\"\n }\n});\n\nconst ImportedText = styled(\"div\")({\n padding: \"1px 5px\",\n textAlign: \"right\",\n display: \"inline-block\",\n border: \"1px solid var(--mdc-theme-on-background)\",\n fontSize: \"10px\",\n lineHeight: \"12px\",\n outline: \"0 none\",\n backgroundColor: \"var(--mdc-theme-secondary)\",\n color: \"#FFF\"\n});\n\nconst Imported = () => {\n return (\n <CheckboxContainer>\n <ImportedText>Imported.</ImportedText>\n </CheckboxContainer>\n );\n};\n\ninterface CheckboxProps {\n model: Pick<ImportModelData, \"id\" | \"name\" | \"error\" | \"related\">;\n toggle: ToggleModelCb;\n selected: boolean;\n}\n\nconst Checkbox = ({ model, toggle, selected }: CheckboxProps) => {\n const onClick = useCallback(() => {\n toggle(model);\n }, [toggle]);\n if (model.error) {\n return null;\n }\n return (\n <CheckboxContainer>\n <Button onClick={onClick} className={selected ? \"selected\" : \"\"}>\n {selected ? \"Model will be imported\" : \"Model will be skipped\"}\n </Button>\n </CheckboxContainer>\n );\n};\n\ninterface ContainerProps {\n model: Pick<ImportModelData, \"action\" | \"error\" | \"imported\">;\n children: React.ReactNode;\n}\n\nconst Container = ({ model, children }: ContainerProps) => {\n if (model.imported) {\n return <ContainerImported>{children}</ContainerImported>;\n } else if (model.action === \"create\") {\n return <ContainerCreate>{children}</ContainerCreate>;\n } else if (model.action === \"update\") {\n return <ContainerUpdate>{children}</ContainerUpdate>;\n } else if (model.error) {\n return <ContainerError>{children}</ContainerError>;\n }\n return <ContainerBase>{children}</ContainerBase>;\n};\n\ninterface DataListModelItemProps {\n model: ImportModelData;\n toggle: ToggleModelCb;\n selected: boolean;\n}\n\nexport const DataListModelItem = ({ model, toggle, selected }: DataListModelItemProps) => {\n return (\n <Container model={model}>\n <ModelContainer>\n <div>\n <Name>{model.name || model.id}</Name>\n {model.error ? (\n <DataListModelItemError error={model.error} />\n ) : (\n <DataListModelItemInfo model={model} />\n )}\n </div>\n {model.imported ? (\n <Imported />\n ) : (\n <Checkbox model={model} toggle={toggle} selected={selected} />\n )}\n </ModelContainer>\n </Container>\n );\n};\n"],"names":["ContainerBase","styled","ContainerCreate","ContainerImported","ContainerUpdate","ContainerError","ModelContainer","Name","CheckboxContainer","Button","ImportedText","Imported","Checkbox","model","toggle","selected","onClick","useCallback","Container","children","DataListModelItem","DataListModelItemError","DataListModelItemInfo"],"mappings":";;;;AAQA,MAAMA,gBAAgBC,OAAO,OAAO,IACzB;QACH,OAAO;QACP,SAAS;QACT,QAAQ;QACR,WAAW;QACX,gBAAgB;YACZ,eAAe;QACnB;IACJ;AAEJ,MAAMC,kBAAkBD,OAAOD,eAAe,IACnC,EAEP;AAEJ,MAAMG,oBAAoBF,OAAOD,eAAe,IACrC,EAAC;AAEZ,MAAMI,kBAAkBH,OAAOD,eAAe,IACnC,EAAC;AAEZ,MAAMK,iBAAiBJ,OAAOD,eAAe,IAClC,EAAC;AAGZ,MAAMM,iBAAiBL,OAAO,OAAO;IACjC,SAAS;IACT,OAAO;IACP,eAAe;IACf,YAAY;IACZ,gBAAgB;AACpB;AACA,MAAMM,OAAON,OAAO,MAAM;IACtB,UAAU;IACV,MAAM;IACN,YAAY;AAChB;AACA,MAAMO,oBAAoBP,OAAO,OAAO;IACpC,OAAO;IACP,WAAW;IACX,eAAe;AACnB;AAEA,MAAMQ,SAASR,OAAO,UAAU;IAC5B,SAAS;IACT,WAAW;IACX,SAAS;IACT,QAAQ;IACR,UAAU;IACV,YAAY;IACZ,QAAQ;IACR,SAAS;IACT,iBAAiB;IACjB,cAAc;QACV,QAAQ;IACZ;AACJ;AAEA,MAAMS,eAAeT,OAAO,OAAO;IAC/B,SAAS;IACT,WAAW;IACX,SAAS;IACT,QAAQ;IACR,UAAU;IACV,YAAY;IACZ,SAAS;IACT,iBAAiB;IACjB,OAAO;AACX;AAEA,MAAMU,WAAW,IACN,WAAP,GACI,oBAACH,mBAAiBA,MAAAA,WAAAA,GACd,oBAACE,cAAYA,MAAC;AAW1B,MAAME,WAAW,CAAC,EAAEC,KAAK,EAAEC,MAAM,EAAEC,QAAQ,EAAiB;IACxD,MAAMC,UAAUC,YAAY;QACxBH,OAAOD;IACX,GAAG;QAACC;KAAO;IACX,IAAID,MAAM,KAAK,EACX,OAAO;IAEX,OAAO,WAAP,GACI,oBAACL,mBAAiBA,MAAAA,WAAAA,GACd,oBAACC,QAAMA;QAAC,SAASO;QAAS,WAAWD,WAAW,aAAa;OACxDA,WAAW,2BAA2B;AAIvD;AAOA,MAAMG,YAAY,CAAC,EAAEL,KAAK,EAAEM,QAAQ,EAAkB;IAClD,IAAIN,MAAM,QAAQ,EACd,OAAO,WAAP,GAAO,oBAACV,mBAAiBA,MAAEgB;IACxB,IAAIN,AAAiB,aAAjBA,MAAM,MAAM,EACnB,OAAO,WAAP,GAAO,oBAACX,iBAAeA,MAAEiB;IACtB,IAAIN,AAAiB,aAAjBA,MAAM,MAAM,EACnB,OAAO,WAAP,GAAO,oBAACT,iBAAeA,MAAEe;IACtB,IAAIN,MAAM,KAAK,EAClB,OAAO,WAAP,GAAO,oBAACR,gBAAcA,MAAEc;IAE5B,OAAO,WAAP,GAAO,oBAACnB,eAAaA,MAAEmB;AAC3B;AAQO,MAAMC,oBAAoB,CAAC,EAAEP,KAAK,EAAEC,MAAM,EAAEC,QAAQ,EAA0B,GAC1E,WAAP,GACI,oBAACG,WAASA;QAAC,OAAOL;qBACd,oBAACP,gBAAcA,MAAAA,WAAAA,GACX,oBAAC,2BACG,oBAACC,MAAIA,MAAEM,MAAM,IAAI,IAAIA,MAAM,EAAE,GAC5BA,MAAM,KAAK,GAAG,WAAH,GACR,oBAACQ,wBAAsBA;QAAC,OAAOR,MAAM,KAAK;uBAE1C,oBAACS,uBAAqBA;QAAC,OAAOT;SAGrCA,MAAM,QAAQ,GAAG,WAAH,GACX,oBAACF,UAAQA,QAAAA,WAAAA,GAET,oBAACC,UAAQA;QAAC,OAAOC;QAAO,QAAQC;QAAQ,UAAUC"}
1
+ {"version":3,"file":"presentation/importContentModels/components/Model/DataListModelItem.js","sources":["../../../../../src/presentation/importContentModels/components/Model/DataListModelItem.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport styled from \"@emotion/styled\";\nimport type { ImportModelData } from \"../../types.js\";\nimport { DataListModelItemError } from \"./DataListModelItemError.js\";\nimport { DataListModelItemInfo } from \"./DataListModelItemInfo.js\";\n\ntype ToggleModelCb = (item: Pick<ImportModelData, \"id\" | \"name\" | \"related\">) => void;\n\nconst ContainerBase = styled(\"div\")(() => {\n return {\n width: \"100%\",\n padding: \"0px 5px 15px 5px\",\n margin: \"0\",\n boxSizing: \"border-box\" as const,\n \"&:last-child\": {\n paddingBottom: \"2px\"\n }\n };\n});\nconst ContainerCreate = styled(ContainerBase)(() => {\n return {\n // backgroundColor: \"var(--mdc-theme-secondary)\"\n };\n});\nconst ContainerImported = styled(ContainerBase)(() => {\n return {};\n});\nconst ContainerUpdate = styled(ContainerBase)(() => {\n return {};\n});\nconst ContainerError = styled(ContainerBase)(() => {\n return {};\n});\n\nconst ModelContainer = styled(\"div\")({\n display: \"flex\",\n width: \"100%\",\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"space-between\"\n});\nconst Name = styled(\"h4\")({\n fontSize: \"12px\",\n flex: \"1 0 auto\",\n lineHeight: \"18px\"\n});\nconst CheckboxContainer = styled(\"div\")({\n width: \"120px\",\n textAlign: \"right\",\n verticalAlign: \"middle\"\n});\n\nconst Button = styled(\"button\")({\n padding: \"1px 5px\",\n textAlign: \"right\",\n display: \"inline-block\",\n border: \"1px solid var(--mdc-theme-on-background)\",\n fontSize: \"10px\",\n lineHeight: \"12px\",\n cursor: \"pointer\",\n outline: \"0 none\",\n backgroundColor: \"var(--mdc-theme-background)\",\n \"&.selected\": {\n border: \"1px solid var(--mdc-theme-secondary)\"\n }\n});\n\nconst ImportedText = styled(\"div\")({\n padding: \"1px 5px\",\n textAlign: \"right\",\n display: \"inline-block\",\n border: \"1px solid var(--mdc-theme-on-background)\",\n fontSize: \"10px\",\n lineHeight: \"12px\",\n outline: \"0 none\",\n backgroundColor: \"var(--mdc-theme-secondary)\",\n color: \"#FFF\"\n});\n\nconst Imported = () => {\n return (\n <CheckboxContainer>\n <ImportedText>Imported.</ImportedText>\n </CheckboxContainer>\n );\n};\n\ninterface CheckboxProps {\n model: Pick<ImportModelData, \"id\" | \"name\" | \"error\" | \"related\">;\n toggle: ToggleModelCb;\n selected: boolean;\n}\n\nconst Checkbox = ({ model, toggle, selected }: CheckboxProps) => {\n const onClick = useCallback(() => {\n toggle(model);\n }, [toggle]);\n if (model.error) {\n return null;\n }\n return (\n <CheckboxContainer>\n <Button onClick={onClick} className={selected ? \"selected\" : \"\"}>\n {selected ? \"Model will be imported\" : \"Model will be skipped\"}\n </Button>\n </CheckboxContainer>\n );\n};\n\ninterface ContainerProps {\n model: Pick<ImportModelData, \"action\" | \"error\" | \"imported\">;\n children: React.ReactNode;\n}\n\nconst Container = ({ model, children }: ContainerProps) => {\n if (model.imported) {\n return <ContainerImported>{children}</ContainerImported>;\n } else if (model.action === \"create\") {\n return <ContainerCreate>{children}</ContainerCreate>;\n } else if (model.action === \"update\") {\n return <ContainerUpdate>{children}</ContainerUpdate>;\n } else if (model.error) {\n return <ContainerError>{children}</ContainerError>;\n }\n return <ContainerBase>{children}</ContainerBase>;\n};\n\ninterface DataListModelItemProps {\n model: ImportModelData;\n toggle: ToggleModelCb;\n selected: boolean;\n}\n\nexport const DataListModelItem = ({ model, toggle, selected }: DataListModelItemProps) => {\n return (\n <Container model={model}>\n <ModelContainer>\n <div>\n <Name>{model.name || model.id}</Name>\n {model.error ? (\n <DataListModelItemError error={model.error} />\n ) : (\n <DataListModelItemInfo model={model} />\n )}\n </div>\n {model.imported ? (\n <Imported />\n ) : (\n <Checkbox model={model} toggle={toggle} selected={selected} />\n )}\n </ModelContainer>\n </Container>\n );\n};\n"],"names":["ContainerBase","styled","ContainerCreate","ContainerImported","ContainerUpdate","ContainerError","ModelContainer","Name","CheckboxContainer","Button","ImportedText","Imported","Checkbox","model","toggle","selected","onClick","useCallback","Container","children","DataListModelItem","DataListModelItemError","DataListModelItemInfo"],"mappings":";;;;AAQA,MAAMA,gBAAgBC,OAAO,OAAO,IACzB;QACH,OAAO;QACP,SAAS;QACT,QAAQ;QACR,WAAW;QACX,gBAAgB;YACZ,eAAe;QACnB;IACJ;AAEJ,MAAMC,kBAAkBD,OAAOD,eAAe,IACnC,EAEP;AAEJ,MAAMG,oBAAoBF,OAAOD,eAAe,IACrC,EAAC;AAEZ,MAAMI,kBAAkBH,OAAOD,eAAe,IACnC,EAAC;AAEZ,MAAMK,iBAAiBJ,OAAOD,eAAe,IAClC,EAAC;AAGZ,MAAMM,iBAAiBL,OAAO,OAAO;IACjC,SAAS;IACT,OAAO;IACP,eAAe;IACf,YAAY;IACZ,gBAAgB;AACpB;AACA,MAAMM,OAAON,OAAO,MAAM;IACtB,UAAU;IACV,MAAM;IACN,YAAY;AAChB;AACA,MAAMO,oBAAoBP,OAAO,OAAO;IACpC,OAAO;IACP,WAAW;IACX,eAAe;AACnB;AAEA,MAAMQ,SAASR,OAAO,UAAU;IAC5B,SAAS;IACT,WAAW;IACX,SAAS;IACT,QAAQ;IACR,UAAU;IACV,YAAY;IACZ,QAAQ;IACR,SAAS;IACT,iBAAiB;IACjB,cAAc;QACV,QAAQ;IACZ;AACJ;AAEA,MAAMS,eAAeT,OAAO,OAAO;IAC/B,SAAS;IACT,WAAW;IACX,SAAS;IACT,QAAQ;IACR,UAAU;IACV,YAAY;IACZ,SAAS;IACT,iBAAiB;IACjB,OAAO;AACX;AAEA,MAAMU,WAAW,IACN,WAAP,GACI,oBAACH,mBAAiBA,MAAAA,WAAAA,GACd,oBAACE,cAAYA,MAAC;AAW1B,MAAME,WAAW,CAAC,EAAEC,KAAK,EAAEC,MAAM,EAAEC,QAAQ,EAAiB;IACxD,MAAMC,UAAUC,YAAY;QACxBH,OAAOD;IACX,GAAG;QAACC;KAAO;IACX,IAAID,MAAM,KAAK,EACX,OAAO;IAEX,OAAO,WAAP,GACI,oBAACL,mBAAiBA,MAAAA,WAAAA,GACd,oBAACC,QAAMA;QAAC,SAASO;QAAS,WAAWD,WAAW,aAAa;OACxDA,WAAW,2BAA2B;AAIvD;AAOA,MAAMG,YAAY,CAAC,EAAEL,KAAK,EAAEM,QAAQ,EAAkB;IAClD,IAAIN,MAAM,QAAQ,EACd,OAAO,WAAP,GAAO,oBAACV,mBAAiBA,MAAEgB;SACxB,IAAIN,AAAiB,aAAjBA,MAAM,MAAM,EACnB,OAAO,WAAP,GAAO,oBAACX,iBAAeA,MAAEiB;SACtB,IAAIN,AAAiB,aAAjBA,MAAM,MAAM,EACnB,OAAO,WAAP,GAAO,oBAACT,iBAAeA,MAAEe;SACtB,IAAIN,MAAM,KAAK,EAClB,OAAO,WAAP,GAAO,oBAACR,gBAAcA,MAAEc;IAE5B,OAAO,WAAP,GAAO,oBAACnB,eAAaA,MAAEmB;AAC3B;AAQO,MAAMC,oBAAoB,CAAC,EAAEP,KAAK,EAAEC,MAAM,EAAEC,QAAQ,EAA0B,GAC1E,WAAP,GACI,oBAACG,WAASA;QAAC,OAAOL;qBACd,oBAACP,gBAAcA,MAAAA,WAAAA,GACX,oBAAC,2BACG,oBAACC,MAAIA,MAAEM,MAAM,IAAI,IAAIA,MAAM,EAAE,GAC5BA,MAAM,KAAK,GAAG,WAAH,GACR,oBAACQ,wBAAsBA;QAAC,OAAOR,MAAM,KAAK;uBAE1C,oBAACS,uBAAqBA;QAAC,OAAOT;SAGrCA,MAAM,QAAQ,GAAG,WAAH,GACX,oBAACF,UAAQA,QAAAA,WAAAA,GAET,oBAACC,UAAQA;QAAC,OAAOC;QAAO,QAAQC;QAAQ,UAAUC"}
@@ -9,8 +9,8 @@ const Text = styled("p")({
9
9
  });
10
10
  const getText = (action)=>{
11
11
  if ("create" === action) return "Model will be created.";
12
- if ("update" === action) return "Model will be updated.";
13
- if ("code" === action) return "Model cannot be updated because it was created via code.";
12
+ else if ("update" === action) return "Model will be updated.";
13
+ else if ("code" === action) return "Model cannot be updated because it was created via code.";
14
14
  return `Unknown action: ${action}`;
15
15
  };
16
16
  const DataListModelItemInfo = ({ model })=>{
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/importContentModels/components/Model/DataListModelItemInfo.js","sources":["../../../../../src/presentation/importContentModels/components/Model/DataListModelItemInfo.tsx"],"sourcesContent":["import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport type { ImportModelData } from \"../../types.js\";\n\nconst Text = styled(\"p\")({\n fontSize: \"9px\",\n lineHeight: \"10px\",\n display: \"block\",\n padding: \"0\",\n margin: \"0\"\n});\n\nconst getText = (action?: string | null) => {\n if (action === \"create\") {\n return `Model will be created.`;\n } else if (action === \"update\") {\n return `Model will be updated.`;\n } else if (action === \"code\") {\n return \"Model cannot be updated because it was created via code.\";\n }\n return `Unknown action: ${action}`;\n};\n\ninterface DataListModelItemInfoProps {\n model: ImportModelData;\n}\n\nexport const DataListModelItemInfo = ({ model }: DataListModelItemInfoProps) => {\n const { action } = model;\n\n return <Text>{getText(action)}</Text>;\n};\n"],"names":["Text","styled","getText","action","DataListModelItemInfo","model"],"mappings":";;AAIA,MAAMA,OAAOC,OAAO,KAAK;IACrB,UAAU;IACV,YAAY;IACZ,SAAS;IACT,SAAS;IACT,QAAQ;AACZ;AAEA,MAAMC,UAAU,CAACC;IACb,IAAIA,AAAW,aAAXA,QACA,OAAO;IACJ,IAAIA,AAAW,aAAXA,QACP,OAAO;IACJ,IAAIA,AAAW,WAAXA,QACP,OAAO;IAEX,OAAO,CAAC,gBAAgB,EAAEA,QAAQ;AACtC;AAMO,MAAMC,wBAAwB,CAAC,EAAEC,KAAK,EAA8B;IACvE,MAAM,EAAEF,MAAM,EAAE,GAAGE;IAEnB,OAAO,WAAP,GAAO,oBAACL,MAAIA,MAAEE,QAAQC;AAC1B"}
1
+ {"version":3,"file":"presentation/importContentModels/components/Model/DataListModelItemInfo.js","sources":["../../../../../src/presentation/importContentModels/components/Model/DataListModelItemInfo.tsx"],"sourcesContent":["import React from \"react\";\nimport styled from \"@emotion/styled\";\nimport type { ImportModelData } from \"../../types.js\";\n\nconst Text = styled(\"p\")({\n fontSize: \"9px\",\n lineHeight: \"10px\",\n display: \"block\",\n padding: \"0\",\n margin: \"0\"\n});\n\nconst getText = (action?: string | null) => {\n if (action === \"create\") {\n return `Model will be created.`;\n } else if (action === \"update\") {\n return `Model will be updated.`;\n } else if (action === \"code\") {\n return \"Model cannot be updated because it was created via code.\";\n }\n return `Unknown action: ${action}`;\n};\n\ninterface DataListModelItemInfoProps {\n model: ImportModelData;\n}\n\nexport const DataListModelItemInfo = ({ model }: DataListModelItemInfoProps) => {\n const { action } = model;\n\n return <Text>{getText(action)}</Text>;\n};\n"],"names":["Text","styled","getText","action","DataListModelItemInfo","model"],"mappings":";;AAIA,MAAMA,OAAOC,OAAO,KAAK;IACrB,UAAU;IACV,YAAY;IACZ,SAAS;IACT,SAAS;IACT,QAAQ;AACZ;AAEA,MAAMC,UAAU,CAACC;IACb,IAAIA,AAAW,aAAXA,QACA,OAAO;SACJ,IAAIA,AAAW,aAAXA,QACP,OAAO;SACJ,IAAIA,AAAW,WAAXA,QACP,OAAO;IAEX,OAAO,CAAC,gBAAgB,EAAEA,QAAQ;AACtC;AAMO,MAAMC,wBAAwB,CAAC,EAAEC,KAAK,EAA8B;IACvE,MAAM,EAAEF,MAAM,EAAE,GAAGE;IAEnB,OAAO,WAAP,GAAO,oBAACL,MAAIA,MAAEE,QAAQC;AAC1B"}
@@ -3,7 +3,7 @@ import type { ImportModelData } from "../../types.js";
3
3
  interface DataListModelsProps {
4
4
  models: ImportModelData[];
5
5
  }
6
- export declare const DataListModels: (({ models }: DataListModelsProps) => React.JSX.Element) & {
7
- displayName: string;
6
+ export declare const DataListModels: (({ models }: DataListModelsProps) => React.JSX.Element) & React.NamedExoticComponent<DataListModelsProps> & {
7
+ readonly type: ({ models }: DataListModelsProps) => React.JSX.Element;
8
8
  };
9
9
  export {};
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
- export declare const ContentGroupsMenuItems: (() => React.JSX.Element | null) & {
3
- displayName: string;
2
+ export declare const ContentGroupsMenuItems: (() => React.JSX.Element | null) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element | null;
4
4
  };
@@ -133,8 +133,7 @@ class ModelGroupPresenterImpl {
133
133
  this.selectedGroup = group;
134
134
  });
135
135
  return group;
136
- }
137
- {
136
+ } else {
138
137
  const group = await this.createModelGroupUseCase.execute({
139
138
  name: data.name,
140
139
  slug: data.slug,
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/modelGroup/ModelGroupPresenter.js","sources":["../../../src/presentation/modelGroup/ModelGroupPresenter.ts"],"sourcesContent":["import { makeAutoObservable, runInAction, computed } from \"mobx\";\nimport slugify from \"slugify\";\nimport { ListPresenter } from \"@webiny/app-admin/presentation/listPresenter/abstractions.js\";\nimport { FormModelFactory } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport type { IFormModel } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport type { ModelGroupDto } from \"~/features/modelGroup/listModelGroups/abstractions.js\";\nimport { ListModelGroupsUseCase } from \"~/features/modelGroup/listModelGroups/abstractions.js\";\nimport { GetModelGroupUseCase } from \"~/features/modelGroup/getModelGroup/abstractions.js\";\nimport { CreateModelGroupUseCase } from \"~/features/modelGroup/createModelGroup/abstractions.js\";\nimport { UpdateModelGroupUseCase } from \"~/features/modelGroup/updateModelGroup/abstractions.js\";\nimport { DeleteModelGroupUseCase } from \"~/features/modelGroup/deleteModelGroup/abstractions.js\";\nimport { ModelGroupsCache } from \"~/features/modelGroup/abstractions.js\";\nimport {\n ModelGroupPresenter as Abstraction,\n type IModelGroupPresenter,\n type IModelGroupPresenterViewModel\n} from \"./abstractions.js\";\nimport { ModelGroupDataSource } from \"./ModelGroupDataSource.js\";\n\nfunction extractIconName(icon: unknown): string {\n if (icon !== null && typeof icon === \"object\" && \"name\" in icon) {\n return (icon as { name: string }).name;\n }\n if (typeof icon === \"string\") {\n return icon;\n }\n return \"\";\n}\n\nfunction toIconValue(name: string): { type: string; name: string } {\n return { type: \"icon\", name };\n}\n\nclass ModelGroupPresenterImpl implements IModelGroupPresenter {\n private selectedGroup: ModelGroupDto | null = null;\n private loading = false;\n private saving = false;\n private showForm = false;\n private form: IFormModel;\n\n constructor(\n private listPresenter: ListPresenter.Interface<ModelGroupDto>,\n private formModelFactory: FormModelFactory.Interface,\n private listModelGroupsUseCase: ListModelGroupsUseCase.Interface,\n private getRoleUseCase: GetModelGroupUseCase.Interface,\n private createModelGroupUseCase: CreateModelGroupUseCase.Interface,\n private updateModelGroupUseCase: UpdateModelGroupUseCase.Interface,\n private deleteModelGroupUseCase: DeleteModelGroupUseCase.Interface,\n private cache: ModelGroupsCache.Interface\n ) {\n this.form = this.buildForm(false, false);\n makeAutoObservable<\n ModelGroupPresenterImpl,\n | \"formModelFactory\"\n | \"listModelGroupsUseCase\"\n | \"getRoleUseCase\"\n | \"createModelGroupUseCase\"\n | \"updateModelGroupUseCase\"\n | \"deleteModelGroupUseCase\"\n | \"cache\"\n >(this, {\n formModelFactory: false,\n listModelGroupsUseCase: false,\n getRoleUseCase: false,\n createModelGroupUseCase: false,\n updateModelGroupUseCase: false,\n deleteModelGroupUseCase: false,\n cache: false,\n vm: computed\n });\n }\n\n get vm(): IModelGroupPresenterViewModel {\n const group = this.selectedGroup;\n const isPluginGroup = group !== null && (group.plugin ?? false);\n\n return {\n selectedGroup: this.selectedGroup,\n loading: this.loading,\n saving: this.saving,\n showForm: this.showForm,\n canModify: !isPluginGroup,\n isPluginGroup,\n form: this.form.vm\n };\n }\n\n get list(): ListPresenter.Interface<ModelGroupDto> {\n return this.listPresenter;\n }\n\n init(): void {\n const dataSource = new ModelGroupDataSource(this.listModelGroupsUseCase, this.cache);\n\n this.listPresenter.init({\n dataSource,\n initialSort: { field: \"createdOn\", direction: \"DESC\" },\n limit: 1000\n });\n }\n\n async selectGroup(id: string): Promise<void> {\n runInAction(() => {\n this.loading = true;\n this.showForm = true;\n });\n\n try {\n const group = await this.getRoleUseCase.execute(id);\n const isPluginGroup = group.plugin ?? false;\n const canModify = !isPluginGroup;\n\n runInAction(() => {\n this.selectedGroup = group;\n this.form = this.buildForm(false, canModify);\n this.form.setData({\n name: group.name,\n slug: group.slug,\n description: group.description,\n icon: extractIconName(group.icon)\n });\n });\n } finally {\n runInAction(() => {\n this.loading = false;\n });\n }\n }\n\n createNew(): void {\n this.selectedGroup = null;\n this.form = this.buildForm(true, true);\n this.form.setData({ icon: \"fas/star\", description: \"\" });\n this.showForm = true;\n }\n\n deselect(): void {\n this.selectedGroup = null;\n this.showForm = false;\n }\n\n async save(): Promise<ModelGroupDto | null> {\n const data = await this.form.submit<ModelGroupDto>();\n if (!data) {\n return null;\n }\n\n runInAction(() => {\n this.saving = true;\n });\n\n try {\n const isUpdate = this.selectedGroup !== null && this.selectedGroup.createdOn;\n\n const iconValue = toIconValue(data.icon as unknown as string);\n\n if (isUpdate) {\n const group = await this.updateModelGroupUseCase.execute({\n id: this.selectedGroup!.id,\n name: data.name as unknown as string,\n slug: this.selectedGroup!.slug,\n description: data.description as unknown as string,\n icon: iconValue as unknown as string\n });\n runInAction(() => {\n this.selectedGroup = group;\n });\n return group;\n } else {\n const group = await this.createModelGroupUseCase.execute({\n name: data.name as unknown as string,\n slug: data.slug as unknown as string,\n description: data.description as unknown as string,\n icon: iconValue as unknown as string\n });\n runInAction(() => {\n this.selectedGroup = group;\n this.form = this.buildForm(false, true);\n this.form.setData({\n name: group.name,\n slug: group.slug,\n description: group.description,\n icon: extractIconName(group.icon)\n });\n });\n return group;\n }\n } catch {\n return null;\n } finally {\n runInAction(() => {\n this.saving = false;\n });\n }\n }\n\n async deleteGroup(id: string): Promise<void> {\n await this.deleteModelGroupUseCase.execute(id);\n\n runInAction(() => {\n if (this.selectedGroup !== null && this.selectedGroup.id === id) {\n this.selectedGroup = null;\n this.showForm = false;\n }\n });\n }\n\n private buildForm(isNew: boolean, canModify: boolean): IFormModel {\n return this.formModelFactory.create({\n fields: fields => ({\n name: fields\n .text()\n .label(\"Name\")\n .required(\"Name is required.\")\n .disabled(!canModify)\n .onBlur((value, { form }) => {\n const slugValue = form.field(\"slug\").getValue();\n if (slugValue || !value) {\n return;\n }\n form.field(\"slug\").setValue(\n slugify(String(value), {\n replacement: \"-\",\n lower: true,\n remove: /[*#?<>_{}[\\]+~.()'\"!:;@]/g,\n trim: false\n })\n );\n }),\n slug: fields\n .text()\n .label(\"Slug\")\n .required(\"Slug is required.\")\n .disabled(!isNew || !canModify),\n icon: fields\n .text()\n .label(\"Group icon\")\n .required(\"Icon is required.\")\n .disabled(!canModify)\n .renderer(\"cmsIconPicker\"),\n description: fields\n .text()\n .label(\"Description\")\n .defaultValue(\"\")\n .renderer(\"textarea\")\n .disabled(!canModify)\n }),\n layout: layout => [\n layout.row(\"name\"),\n layout.row(\"slug\"),\n layout.row(\"icon\"),\n layout.row(\"description\")\n ]\n });\n }\n}\n\nexport const ModelGroupPresenter = Abstraction.createImplementation({\n implementation: ModelGroupPresenterImpl,\n dependencies: [\n ListPresenter,\n FormModelFactory,\n ListModelGroupsUseCase,\n GetModelGroupUseCase,\n CreateModelGroupUseCase,\n UpdateModelGroupUseCase,\n DeleteModelGroupUseCase,\n ModelGroupsCache\n ]\n});\n"],"names":["extractIconName","icon","toIconValue","name","ModelGroupPresenterImpl","listPresenter","formModelFactory","listModelGroupsUseCase","getRoleUseCase","createModelGroupUseCase","updateModelGroupUseCase","deleteModelGroupUseCase","cache","makeAutoObservable","computed","group","isPluginGroup","dataSource","ModelGroupDataSource","id","runInAction","canModify","data","isUpdate","iconValue","isNew","fields","value","form","slugValue","slugify","String","layout","ModelGroupPresenter","Abstraction","ListPresenter","FormModelFactory","ListModelGroupsUseCase","GetModelGroupUseCase","CreateModelGroupUseCase","UpdateModelGroupUseCase","DeleteModelGroupUseCase","ModelGroupsCache"],"mappings":";;;;;;;;;;;;AAmBA,SAASA,gBAAgBC,IAAa;IAClC,IAAIA,AAAS,SAATA,QAAiB,AAAgB,YAAhB,OAAOA,QAAqB,UAAUA,MACvD,OAAQA,KAA0B,IAAI;IAE1C,IAAI,AAAgB,YAAhB,OAAOA,MACP,OAAOA;IAEX,OAAO;AACX;AAEA,SAASC,YAAYC,IAAY;IAC7B,OAAO;QAAE,MAAM;QAAQA;IAAK;AAChC;AAEA,MAAMC;IAOF,YACYC,aAAqD,EACrDC,gBAA4C,EAC5CC,sBAAwD,EACxDC,cAA8C,EAC9CC,uBAA0D,EAC1DC,uBAA0D,EAC1DC,uBAA0D,EAC1DC,KAAiC,CAC3C;aARUP,aAAa,GAAbA;aACAC,gBAAgB,GAAhBA;aACAC,sBAAsB,GAAtBA;aACAC,cAAc,GAAdA;aACAC,uBAAuB,GAAvBA;aACAC,uBAAuB,GAAvBA;aACAC,uBAAuB,GAAvBA;aACAC,KAAK,GAALA;aAdJ,aAAa,GAAyB;aACtC,OAAO,GAAG;aACV,MAAM,GAAG;aACT,QAAQ,GAAG;QAaf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO;QAClCC,mBASE,IAAI,EAAE;YACJ,kBAAkB;YAClB,wBAAwB;YACxB,gBAAgB;YAChB,yBAAyB;YACzB,yBAAyB;YACzB,yBAAyB;YACzB,OAAO;YACP,IAAIC;QACR;IACJ;IAEA,IAAI,KAAoC;QACpC,MAAMC,QAAQ,IAAI,CAAC,aAAa;QAChC,MAAMC,gBAAgBD,AAAU,SAAVA,SAAmBA,CAAAA,MAAM,MAAM,IAAI,KAAI;QAE7D,OAAO;YACH,eAAe,IAAI,CAAC,aAAa;YACjC,SAAS,IAAI,CAAC,OAAO;YACrB,QAAQ,IAAI,CAAC,MAAM;YACnB,UAAU,IAAI,CAAC,QAAQ;YACvB,WAAW,CAACC;YACZA;YACA,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE;QACtB;IACJ;IAEA,IAAI,OAA+C;QAC/C,OAAO,IAAI,CAAC,aAAa;IAC7B;IAEA,OAAa;QACT,MAAMC,aAAa,IAAIC,qBAAqB,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC,KAAK;QAEnF,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YACpBD;YACA,aAAa;gBAAE,OAAO;gBAAa,WAAW;YAAO;YACrD,OAAO;QACX;IACJ;IAEA,MAAM,YAAYE,EAAU,EAAiB;QACzCC,YAAY;YACR,IAAI,CAAC,OAAO,GAAG;YACf,IAAI,CAAC,QAAQ,GAAG;QACpB;QAEA,IAAI;YACA,MAAML,QAAQ,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAACI;YAChD,MAAMH,gBAAgBD,MAAM,MAAM,IAAI;YACtC,MAAMM,YAAY,CAACL;YAEnBI,YAAY;gBACR,IAAI,CAAC,aAAa,GAAGL;gBACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAOM;gBAClC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;oBACd,MAAMN,MAAM,IAAI;oBAChB,MAAMA,MAAM,IAAI;oBAChB,aAAaA,MAAM,WAAW;oBAC9B,MAAMf,gBAAgBe,MAAM,IAAI;gBACpC;YACJ;QACJ,SAAU;YACNK,YAAY;gBACR,IAAI,CAAC,OAAO,GAAG;YACnB;QACJ;IACJ;IAEA,YAAkB;QACd,IAAI,CAAC,aAAa,GAAG;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM;QACjC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,MAAM;YAAY,aAAa;QAAG;QACtD,IAAI,CAAC,QAAQ,GAAG;IACpB;IAEA,WAAiB;QACb,IAAI,CAAC,aAAa,GAAG;QACrB,IAAI,CAAC,QAAQ,GAAG;IACpB;IAEA,MAAM,OAAsC;QACxC,MAAME,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM;QACnC,IAAI,CAACA,MACD,OAAO;QAGXF,YAAY;YACR,IAAI,CAAC,MAAM,GAAG;QAClB;QAEA,IAAI;YACA,MAAMG,WAAW,AAAuB,SAAvB,IAAI,CAAC,aAAa,IAAa,IAAI,CAAC,aAAa,CAAC,SAAS;YAE5E,MAAMC,YAAYtB,YAAYoB,KAAK,IAAI;YAEvC,IAAIC,UAAU;gBACV,MAAMR,QAAQ,MAAM,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC;oBACrD,IAAI,IAAI,CAAC,aAAa,CAAE,EAAE;oBAC1B,MAAMO,KAAK,IAAI;oBACf,MAAM,IAAI,CAAC,aAAa,CAAE,IAAI;oBAC9B,aAAaA,KAAK,WAAW;oBAC7B,MAAME;gBACV;gBACAJ,YAAY;oBACR,IAAI,CAAC,aAAa,GAAGL;gBACzB;gBACA,OAAOA;YACX;YAAO;gBACH,MAAMA,QAAQ,MAAM,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC;oBACrD,MAAMO,KAAK,IAAI;oBACf,MAAMA,KAAK,IAAI;oBACf,aAAaA,KAAK,WAAW;oBAC7B,MAAME;gBACV;gBACAJ,YAAY;oBACR,IAAI,CAAC,aAAa,GAAGL;oBACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO;oBAClC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;wBACd,MAAMA,MAAM,IAAI;wBAChB,MAAMA,MAAM,IAAI;wBAChB,aAAaA,MAAM,WAAW;wBAC9B,MAAMf,gBAAgBe,MAAM,IAAI;oBACpC;gBACJ;gBACA,OAAOA;YACX;QACJ,EAAE,OAAM;YACJ,OAAO;QACX,SAAU;YACNK,YAAY;gBACR,IAAI,CAAC,MAAM,GAAG;YAClB;QACJ;IACJ;IAEA,MAAM,YAAYD,EAAU,EAAiB;QACzC,MAAM,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAACA;QAE3CC,YAAY;YACR,IAAI,AAAuB,SAAvB,IAAI,CAAC,aAAa,IAAa,IAAI,CAAC,aAAa,CAAC,EAAE,KAAKD,IAAI;gBAC7D,IAAI,CAAC,aAAa,GAAG;gBACrB,IAAI,CAAC,QAAQ,GAAG;YACpB;QACJ;IACJ;IAEQ,UAAUM,KAAc,EAAEJ,SAAkB,EAAc;QAC9D,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAChC,QAAQK,CAAAA,SAAW;oBACf,MAAMA,OACD,IAAI,GACJ,KAAK,CAAC,QACN,QAAQ,CAAC,qBACT,QAAQ,CAAC,CAACL,WACV,MAAM,CAAC,CAACM,OAAO,EAAEC,IAAI,EAAE;wBACpB,MAAMC,YAAYD,KAAK,KAAK,CAAC,QAAQ,QAAQ;wBAC7C,IAAIC,aAAa,CAACF,OACd;wBAEJC,KAAK,KAAK,CAAC,QAAQ,QAAQ,CACvBE,QAAQC,OAAOJ,QAAQ;4BACnB,aAAa;4BACb,OAAO;4BACP,QAAQ;4BACR,MAAM;wBACV;oBAER;oBACJ,MAAMD,OACD,IAAI,GACJ,KAAK,CAAC,QACN,QAAQ,CAAC,qBACT,QAAQ,CAAC,CAACD,SAAS,CAACJ;oBACzB,MAAMK,OACD,IAAI,GACJ,KAAK,CAAC,cACN,QAAQ,CAAC,qBACT,QAAQ,CAAC,CAACL,WACV,QAAQ,CAAC;oBACd,aAAaK,OACR,IAAI,GACJ,KAAK,CAAC,eACN,YAAY,CAAC,IACb,QAAQ,CAAC,YACT,QAAQ,CAAC,CAACL;gBACnB;YACA,QAAQW,CAAAA,SAAU;oBACdA,OAAO,GAAG,CAAC;oBACXA,OAAO,GAAG,CAAC;oBACXA,OAAO,GAAG,CAAC;oBACXA,OAAO,GAAG,CAAC;iBACd;QACL;IACJ;AACJ;AAEO,MAAMC,0CAAsBC,oBAAAA,oBAAgC,CAAC;IAChE,gBAAgB9B;IAChB,cAAc;QACV+B;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;KACH;AACL"}
1
+ {"version":3,"file":"presentation/modelGroup/ModelGroupPresenter.js","sources":["../../../src/presentation/modelGroup/ModelGroupPresenter.ts"],"sourcesContent":["import { makeAutoObservable, runInAction, computed } from \"mobx\";\nimport slugify from \"slugify\";\nimport { ListPresenter } from \"@webiny/app-admin/presentation/listPresenter/abstractions.js\";\nimport { FormModelFactory } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport type { IFormModel } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport type { ModelGroupDto } from \"~/features/modelGroup/listModelGroups/abstractions.js\";\nimport { ListModelGroupsUseCase } from \"~/features/modelGroup/listModelGroups/abstractions.js\";\nimport { GetModelGroupUseCase } from \"~/features/modelGroup/getModelGroup/abstractions.js\";\nimport { CreateModelGroupUseCase } from \"~/features/modelGroup/createModelGroup/abstractions.js\";\nimport { UpdateModelGroupUseCase } from \"~/features/modelGroup/updateModelGroup/abstractions.js\";\nimport { DeleteModelGroupUseCase } from \"~/features/modelGroup/deleteModelGroup/abstractions.js\";\nimport { ModelGroupsCache } from \"~/features/modelGroup/abstractions.js\";\nimport {\n ModelGroupPresenter as Abstraction,\n type IModelGroupPresenter,\n type IModelGroupPresenterViewModel\n} from \"./abstractions.js\";\nimport { ModelGroupDataSource } from \"./ModelGroupDataSource.js\";\n\nfunction extractIconName(icon: unknown): string {\n if (icon !== null && typeof icon === \"object\" && \"name\" in icon) {\n return (icon as { name: string }).name;\n }\n if (typeof icon === \"string\") {\n return icon;\n }\n return \"\";\n}\n\nfunction toIconValue(name: string): { type: string; name: string } {\n return { type: \"icon\", name };\n}\n\nclass ModelGroupPresenterImpl implements IModelGroupPresenter {\n private selectedGroup: ModelGroupDto | null = null;\n private loading = false;\n private saving = false;\n private showForm = false;\n private form: IFormModel;\n\n constructor(\n private listPresenter: ListPresenter.Interface<ModelGroupDto>,\n private formModelFactory: FormModelFactory.Interface,\n private listModelGroupsUseCase: ListModelGroupsUseCase.Interface,\n private getRoleUseCase: GetModelGroupUseCase.Interface,\n private createModelGroupUseCase: CreateModelGroupUseCase.Interface,\n private updateModelGroupUseCase: UpdateModelGroupUseCase.Interface,\n private deleteModelGroupUseCase: DeleteModelGroupUseCase.Interface,\n private cache: ModelGroupsCache.Interface\n ) {\n this.form = this.buildForm(false, false);\n makeAutoObservable<\n ModelGroupPresenterImpl,\n | \"formModelFactory\"\n | \"listModelGroupsUseCase\"\n | \"getRoleUseCase\"\n | \"createModelGroupUseCase\"\n | \"updateModelGroupUseCase\"\n | \"deleteModelGroupUseCase\"\n | \"cache\"\n >(this, {\n formModelFactory: false,\n listModelGroupsUseCase: false,\n getRoleUseCase: false,\n createModelGroupUseCase: false,\n updateModelGroupUseCase: false,\n deleteModelGroupUseCase: false,\n cache: false,\n vm: computed\n });\n }\n\n get vm(): IModelGroupPresenterViewModel {\n const group = this.selectedGroup;\n const isPluginGroup = group !== null && (group.plugin ?? false);\n\n return {\n selectedGroup: this.selectedGroup,\n loading: this.loading,\n saving: this.saving,\n showForm: this.showForm,\n canModify: !isPluginGroup,\n isPluginGroup,\n form: this.form.vm\n };\n }\n\n get list(): ListPresenter.Interface<ModelGroupDto> {\n return this.listPresenter;\n }\n\n init(): void {\n const dataSource = new ModelGroupDataSource(this.listModelGroupsUseCase, this.cache);\n\n this.listPresenter.init({\n dataSource,\n initialSort: { field: \"createdOn\", direction: \"DESC\" },\n limit: 1000\n });\n }\n\n async selectGroup(id: string): Promise<void> {\n runInAction(() => {\n this.loading = true;\n this.showForm = true;\n });\n\n try {\n const group = await this.getRoleUseCase.execute(id);\n const isPluginGroup = group.plugin ?? false;\n const canModify = !isPluginGroup;\n\n runInAction(() => {\n this.selectedGroup = group;\n this.form = this.buildForm(false, canModify);\n this.form.setData({\n name: group.name,\n slug: group.slug,\n description: group.description,\n icon: extractIconName(group.icon)\n });\n });\n } finally {\n runInAction(() => {\n this.loading = false;\n });\n }\n }\n\n createNew(): void {\n this.selectedGroup = null;\n this.form = this.buildForm(true, true);\n this.form.setData({ icon: \"fas/star\", description: \"\" });\n this.showForm = true;\n }\n\n deselect(): void {\n this.selectedGroup = null;\n this.showForm = false;\n }\n\n async save(): Promise<ModelGroupDto | null> {\n const data = await this.form.submit<ModelGroupDto>();\n if (!data) {\n return null;\n }\n\n runInAction(() => {\n this.saving = true;\n });\n\n try {\n const isUpdate = this.selectedGroup !== null && this.selectedGroup.createdOn;\n\n const iconValue = toIconValue(data.icon as unknown as string);\n\n if (isUpdate) {\n const group = await this.updateModelGroupUseCase.execute({\n id: this.selectedGroup!.id,\n name: data.name as unknown as string,\n slug: this.selectedGroup!.slug,\n description: data.description as unknown as string,\n icon: iconValue as unknown as string\n });\n runInAction(() => {\n this.selectedGroup = group;\n });\n return group;\n } else {\n const group = await this.createModelGroupUseCase.execute({\n name: data.name as unknown as string,\n slug: data.slug as unknown as string,\n description: data.description as unknown as string,\n icon: iconValue as unknown as string\n });\n runInAction(() => {\n this.selectedGroup = group;\n this.form = this.buildForm(false, true);\n this.form.setData({\n name: group.name,\n slug: group.slug,\n description: group.description,\n icon: extractIconName(group.icon)\n });\n });\n return group;\n }\n } catch {\n return null;\n } finally {\n runInAction(() => {\n this.saving = false;\n });\n }\n }\n\n async deleteGroup(id: string): Promise<void> {\n await this.deleteModelGroupUseCase.execute(id);\n\n runInAction(() => {\n if (this.selectedGroup !== null && this.selectedGroup.id === id) {\n this.selectedGroup = null;\n this.showForm = false;\n }\n });\n }\n\n private buildForm(isNew: boolean, canModify: boolean): IFormModel {\n return this.formModelFactory.create({\n fields: fields => ({\n name: fields\n .text()\n .label(\"Name\")\n .required(\"Name is required.\")\n .disabled(!canModify)\n .onBlur((value, { form }) => {\n const slugValue = form.field(\"slug\").getValue();\n if (slugValue || !value) {\n return;\n }\n form.field(\"slug\").setValue(\n slugify(String(value), {\n replacement: \"-\",\n lower: true,\n remove: /[*#?<>_{}[\\]+~.()'\"!:;@]/g,\n trim: false\n })\n );\n }),\n slug: fields\n .text()\n .label(\"Slug\")\n .required(\"Slug is required.\")\n .disabled(!isNew || !canModify),\n icon: fields\n .text()\n .label(\"Group icon\")\n .required(\"Icon is required.\")\n .disabled(!canModify)\n .renderer(\"cmsIconPicker\"),\n description: fields\n .text()\n .label(\"Description\")\n .defaultValue(\"\")\n .renderer(\"textarea\")\n .disabled(!canModify)\n }),\n layout: layout => [\n layout.row(\"name\"),\n layout.row(\"slug\"),\n layout.row(\"icon\"),\n layout.row(\"description\")\n ]\n });\n }\n}\n\nexport const ModelGroupPresenter = Abstraction.createImplementation({\n implementation: ModelGroupPresenterImpl,\n dependencies: [\n ListPresenter,\n FormModelFactory,\n ListModelGroupsUseCase,\n GetModelGroupUseCase,\n CreateModelGroupUseCase,\n UpdateModelGroupUseCase,\n DeleteModelGroupUseCase,\n ModelGroupsCache\n ]\n});\n"],"names":["extractIconName","icon","toIconValue","name","ModelGroupPresenterImpl","listPresenter","formModelFactory","listModelGroupsUseCase","getRoleUseCase","createModelGroupUseCase","updateModelGroupUseCase","deleteModelGroupUseCase","cache","makeAutoObservable","computed","group","isPluginGroup","dataSource","ModelGroupDataSource","id","runInAction","canModify","data","isUpdate","iconValue","isNew","fields","value","form","slugValue","slugify","String","layout","ModelGroupPresenter","Abstraction","ListPresenter","FormModelFactory","ListModelGroupsUseCase","GetModelGroupUseCase","CreateModelGroupUseCase","UpdateModelGroupUseCase","DeleteModelGroupUseCase","ModelGroupsCache"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- declare const ContentModelGroups: (() => React.JSX.Element) & {
3
- displayName: string;
2
+ declare const ContentModelGroups: (() => React.JSX.Element) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element;
4
4
  };
5
5
  export default ContentModelGroups;
@@ -1,6 +1,10 @@
1
1
  import React from "react";
2
2
  export declare const ContentModelGroupsDataList: (({ activeId }: {
3
3
  activeId: string | undefined;
4
- }) => React.JSX.Element) & {
5
- displayName: string;
4
+ }) => React.JSX.Element) & React.NamedExoticComponent<{
5
+ activeId: string | undefined;
6
+ }> & {
7
+ readonly type: ({ activeId }: {
8
+ activeId: string | undefined;
9
+ }) => React.JSX.Element;
6
10
  };
@@ -2,6 +2,12 @@ import React from "react";
2
2
  export declare const ContentModelGroupsForm: (({ newEntry, id }: {
3
3
  newEntry: boolean;
4
4
  id: string | undefined;
5
- }) => React.JSX.Element) & {
6
- displayName: string;
5
+ }) => React.JSX.Element) & React.NamedExoticComponent<{
6
+ newEntry: boolean;
7
+ id: string | undefined;
8
+ }> & {
9
+ readonly type: ({ newEntry, id }: {
10
+ newEntry: boolean;
11
+ id: string | undefined;
12
+ }) => React.JSX.Element;
7
13
  };
@@ -1,3 +1,7 @@
1
1
  import type { IconProp } from "@fortawesome/fontawesome-svg-core";
2
2
  import type { CmsIcon } from "@webiny/app-headless-cms-common/types/index.js";
3
+ /**
4
+ * Converts a stored icon ("prefix/name") into a FontAwesome icon tuple.
5
+ * Returns undefined when the value is missing or not in the "prefix/name" format.
6
+ */
3
7
  export declare const normalizeIcon: (icon: string | CmsIcon | undefined) => IconProp | undefined;
@@ -1,10 +1,13 @@
1
1
  const normalizeIcon = (icon)=>{
2
- let iconName;
3
- if (icon) {
4
- const name = "string" == typeof icon ? icon : icon.name;
5
- iconName = name.split("/");
6
- }
7
- return iconName;
2
+ if (!icon) return;
3
+ const name = "string" == typeof icon ? icon : icon.name;
4
+ if (!name) return;
5
+ const [prefix, iconName, ...rest] = name.split("/");
6
+ if (!prefix || !iconName || rest.length > 0) return;
7
+ return [
8
+ prefix,
9
+ iconName
10
+ ];
8
11
  };
9
12
  export { normalizeIcon };
10
13
 
@@ -1 +1 @@
1
- {"version":3,"file":"utils/normalizeIcon.js","sources":["../../src/utils/normalizeIcon.ts"],"sourcesContent":["import type { IconProp } from \"@fortawesome/fontawesome-svg-core\";\nimport type { CmsIcon } from \"@webiny/app-headless-cms-common/types/index.js\";\n\nexport const normalizeIcon = (icon: string | CmsIcon | undefined) => {\n let iconName: IconProp | undefined = undefined;\n if (icon) {\n const name = typeof icon === \"string\" ? icon : icon.name;\n iconName = name.split(\"/\") as IconProp;\n }\n return iconName;\n};\n"],"names":["normalizeIcon","icon","iconName","name"],"mappings":"AAGO,MAAMA,gBAAgB,CAACC;IAC1B,IAAIC;IACJ,IAAID,MAAM;QACN,MAAME,OAAO,AAAgB,YAAhB,OAAOF,OAAoBA,OAAOA,KAAK,IAAI;QACxDC,WAAWC,KAAK,KAAK,CAAC;IAC1B;IACA,OAAOD;AACX"}
1
+ {"version":3,"file":"utils/normalizeIcon.js","sources":["../../src/utils/normalizeIcon.ts"],"sourcesContent":["import type { IconProp } from \"@fortawesome/fontawesome-svg-core\";\nimport type { CmsIcon } from \"@webiny/app-headless-cms-common/types/index.js\";\n\n/**\n * Converts a stored icon (\"prefix/name\") into a FontAwesome icon tuple.\n * Returns undefined when the value is missing or not in the \"prefix/name\" format.\n */\nexport const normalizeIcon = (icon: string | CmsIcon | undefined): IconProp | undefined => {\n if (!icon) {\n return undefined;\n }\n const name = typeof icon === \"string\" ? icon : icon.name;\n if (!name) {\n return undefined;\n }\n const [prefix, iconName, ...rest] = name.split(\"/\");\n if (!prefix || !iconName || rest.length > 0) {\n return undefined;\n }\n return [prefix, iconName] as IconProp;\n};\n"],"names":["normalizeIcon","icon","name","prefix","iconName","rest"],"mappings":"AAOO,MAAMA,gBAAgB,CAACC;IAC1B,IAAI,CAACA,MACD;IAEJ,MAAMC,OAAO,AAAgB,YAAhB,OAAOD,OAAoBA,OAAOA,KAAK,IAAI;IACxD,IAAI,CAACC,MACD;IAEJ,MAAM,CAACC,QAAQC,UAAU,GAAGC,KAAK,GAAGH,KAAK,KAAK,CAAC;IAC/C,IAAI,CAACC,UAAU,CAACC,YAAYC,KAAK,MAAM,GAAG,GACtC;IAEJ,OAAO;QAACF;QAAQC;KAAS;AAC7B"}