@websolutespa/payload-plugin-bowl 2.0.1 → 3.0.1
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.
- package/CHANGELOG.md +23 -4
- package/README.md +1 -1
- package/dist/blocks/MenuItem.js +219 -0
- package/dist/blocks/MenuItem.js.map +1 -0
- package/dist/blocks/index.js +4 -0
- package/dist/blocks/index.js.map +1 -0
- package/dist/blocks/withComponentBlock.js +31 -0
- package/dist/blocks/withComponentBlock.js.map +1 -0
- package/dist/bowl.js +331 -0
- package/dist/bowl.js.map +1 -0
- package/dist/collections/Address.js +7 -0
- package/dist/collections/Address.js.map +1 -0
- package/dist/collections/Category.js +94 -0
- package/dist/collections/Category.js.map +1 -0
- package/dist/collections/ConsentPreference.js +34 -0
- package/dist/collections/ConsentPreference.js.map +1 -0
- package/dist/collections/Continent.js +24 -0
- package/dist/collections/Continent.js.map +1 -0
- package/dist/collections/Country.js +66 -0
- package/dist/collections/Country.js.map +1 -0
- package/dist/collections/CountryZone.js +24 -0
- package/dist/collections/CountryZone.js.map +1 -0
- package/dist/collections/EmailConfig.js +84 -0
- package/dist/collections/EmailConfig.js.map +1 -0
- package/dist/collections/EndUsers.js +24 -0
- package/dist/collections/EndUsers.js.map +1 -0
- package/dist/collections/Label.js +26 -0
- package/dist/collections/Label.js.map +1 -0
- package/dist/collections/Language.js +35 -0
- package/dist/collections/Language.js.map +1 -0
- package/dist/collections/LegalNotice.js +29 -0
- package/dist/collections/LegalNotice.js.map +1 -0
- package/dist/collections/Market.js +106 -0
- package/dist/collections/Market.js.map +1 -0
- package/dist/collections/Media.js +40 -0
- package/dist/collections/Media.js.map +1 -0
- package/dist/collections/Menu.js +49 -0
- package/dist/collections/Menu.js.map +1 -0
- package/dist/collections/Municipality.js +68 -0
- package/dist/collections/Municipality.js.map +1 -0
- package/dist/collections/Province.js +59 -0
- package/dist/collections/Province.js.map +1 -0
- package/dist/collections/Redirect.js +90 -0
- package/dist/collections/Redirect.js.map +1 -0
- package/dist/collections/Region.js +45 -0
- package/dist/collections/Region.js.map +1 -0
- package/dist/collections/SubContinent.js +36 -0
- package/dist/collections/SubContinent.js.map +1 -0
- package/dist/collections/Template.js +79 -0
- package/dist/collections/Template.js.map +1 -0
- package/dist/collections/Users.js +11 -0
- package/dist/collections/Users.js.map +1 -0
- package/dist/components/Category/CategoryMenu.js +47 -0
- package/dist/components/Category/CategoryMenu.js.map +1 -0
- package/dist/components/Category/CategoryTree.js +430 -0
- package/dist/components/Category/CategoryTree.js.map +1 -0
- package/dist/components/Category/CategoryTree.scss +330 -0
- package/dist/components/Category/CategoryTreeRoute.js +51 -0
- package/dist/components/Category/CategoryTreeRoute.js.map +1 -0
- package/dist/components/Category/category.service.js +32 -0
- package/dist/components/Category/category.service.js.map +1 -0
- package/dist/components/DataTree/DataTree.js +281 -0
- package/dist/components/DataTree/DataTree.js.map +1 -0
- package/dist/components/DataTree/DataTree.scss +363 -0
- package/dist/components/DataTree/DataTreeProvider.js +67 -0
- package/dist/components/DataTree/DataTreeProvider.js.map +1 -0
- package/dist/components/DataTree/EventEmitter.js +38 -0
- package/dist/components/DataTree/EventEmitter.js.map +1 -0
- package/dist/components/DataTree/useDataTree.js +52 -0
- package/dist/components/DataTree/useDataTree.js.map +1 -0
- package/dist/components/DecoratedList/DecoratedList.js +17 -0
- package/dist/components/DecoratedList/DecoratedList.js.map +1 -0
- package/dist/components/IconServer/IconServer.js +15 -0
- package/dist/components/IconServer/IconServer.js.map +1 -0
- package/dist/components/IconServer/IconServer.scss +14 -0
- package/dist/components/ImportExport/ImportExportList.js +91 -0
- package/dist/components/ImportExport/ImportExportList.js.map +1 -0
- package/dist/components/ImportExport/ImportExportList.scss +70 -0
- package/dist/components/ImportExport/ImportExportRedirect.js +142 -0
- package/dist/components/ImportExport/ImportExportRedirect.js.map +1 -0
- package/dist/components/ImportExport/ImportModal.js +458 -0
- package/dist/components/ImportExport/ImportModal.js.map +1 -0
- package/dist/components/ImportExport/ImportModal.scss +99 -0
- package/dist/components/ImportExport/types.js +3 -0
- package/dist/components/ImportExport/types.js.map +1 -0
- package/dist/components/LeaveWithoutSaving/LeaveWithoutSaving.js +83 -0
- package/dist/components/LeaveWithoutSaving/LeaveWithoutSaving.js.map +1 -0
- package/dist/components/LeaveWithoutSaving/LeaveWithoutSaving.scss +46 -0
- package/dist/components/LeaveWithoutSaving/usePreventLeave.js +119 -0
- package/dist/components/LeaveWithoutSaving/usePreventLeave.js.map +1 -0
- package/dist/components/LocalizedDescription/LocalizedDescriptionClient.js +15 -0
- package/dist/components/LocalizedDescription/LocalizedDescriptionClient.js.map +1 -0
- package/dist/components/LocalizedDescription/LocalizedDescriptionServer.js +13 -0
- package/dist/components/LocalizedDescription/LocalizedDescriptionServer.js.map +1 -0
- package/dist/components/LogoServer/LogoServer.js +20 -0
- package/dist/components/LogoServer/LogoServer.js.map +1 -0
- package/dist/components/LogoServer/LogoServer.scss +21 -0
- package/dist/core/access/access.js +181 -0
- package/dist/core/access/access.js.map +1 -0
- package/dist/core/access/access.test.js +454 -0
- package/dist/core/access/access.test.js.map +1 -0
- package/dist/core/access/index.js +3 -0
- package/dist/core/access/index.js.map +1 -0
- package/dist/core/api/action.service.js +441 -0
- package/dist/core/api/action.service.js.map +1 -0
- package/dist/core/api/action.service.test.js +218 -0
- package/dist/core/api/action.service.test.js.map +1 -0
- package/dist/core/api/cache.service.js +33 -0
- package/dist/core/api/cache.service.js.map +1 -0
- package/dist/core/api/cache.service.test.js +33 -0
- package/dist/core/api/cache.service.test.js.map +1 -0
- package/dist/core/api/category.service.js +53 -0
- package/dist/core/api/category.service.js.map +1 -0
- package/dist/core/api/collection.service.js +457 -0
- package/dist/core/api/collection.service.js.map +1 -0
- package/dist/core/api/collection.service.test.js +318 -0
- package/dist/core/api/collection.service.test.js.map +1 -0
- package/dist/core/api/email.service.js +84 -0
- package/dist/core/api/email.service.js.map +1 -0
- package/dist/core/api/global.service.js +18 -0
- package/dist/core/api/global.service.js.map +1 -0
- package/dist/core/api/health.service.js +12 -0
- package/dist/core/api/health.service.js.map +1 -0
- package/dist/core/api/index.js +16 -0
- package/dist/core/api/index.js.map +1 -0
- package/dist/core/api/locale.service.js +58 -0
- package/dist/core/api/locale.service.js.map +1 -0
- package/dist/core/api/locale.service.test.js +46 -0
- package/dist/core/api/locale.service.test.js.map +1 -0
- package/dist/core/api/menu.service.js +81 -0
- package/dist/core/api/menu.service.js.map +1 -0
- package/dist/core/api/menu.service.test.js +300 -0
- package/dist/core/api/menu.service.test.js.map +1 -0
- package/dist/core/api/page.service.js +171 -0
- package/dist/core/api/page.service.js.map +1 -0
- package/dist/core/api/page.service.test.js +68 -0
- package/dist/core/api/page.service.test.js.map +1 -0
- package/dist/core/api/pagination.service.js +29 -0
- package/dist/core/api/pagination.service.js.map +1 -0
- package/dist/core/api/pagination.service.test.js +175 -0
- package/dist/core/api/pagination.service.test.js.map +1 -0
- package/dist/core/api/redirect.service.js +106 -0
- package/dist/core/api/redirect.service.js.map +1 -0
- package/dist/core/api/redirect.service.test.js +106 -0
- package/dist/core/api/redirect.service.test.js.map +1 -0
- package/dist/core/api/route.service.js +451 -0
- package/dist/core/api/route.service.js.map +1 -0
- package/dist/core/api/route.service.test.js +214 -0
- package/dist/core/api/route.service.test.js.map +1 -0
- package/dist/core/api/static.service.js +249 -0
- package/dist/core/api/static.service.js.map +1 -0
- package/dist/core/api/static.service.test.js +240 -0
- package/dist/core/api/static.service.test.js.map +1 -0
- package/dist/core/api/store.service.js +336 -0
- package/dist/core/api/store.service.js.map +1 -0
- package/dist/core/api/store.service.test.js +105 -0
- package/dist/core/api/store.service.test.js.map +1 -0
- package/dist/core/api/types.js +21 -0
- package/dist/core/api/types.js.map +1 -0
- package/dist/core/api/utils.js +83 -0
- package/dist/core/api/utils.js.map +1 -0
- package/dist/core/api/where.service.js +231 -0
- package/dist/core/api/where.service.js.map +1 -0
- package/dist/core/collections/index.js +12 -0
- package/dist/core/collections/index.js.map +1 -0
- package/dist/core/collections/withAction.js +91 -0
- package/dist/core/collections/withAction.js.map +1 -0
- package/dist/core/collections/withAction.test.js +68 -0
- package/dist/core/collections/withAction.test.js.map +1 -0
- package/dist/core/collections/withAddress.js +122 -0
- package/dist/core/collections/withAddress.js.map +1 -0
- package/dist/core/collections/withBlock.js +17 -0
- package/dist/core/collections/withBlock.js.map +1 -0
- package/dist/core/collections/withBlock.test.js +68 -0
- package/dist/core/collections/withBlock.test.js.map +1 -0
- package/dist/core/collections/withCollection.js +61 -0
- package/dist/core/collections/withCollection.js.map +1 -0
- package/dist/core/collections/withCollection.test.js +64 -0
- package/dist/core/collections/withCollection.test.js.map +1 -0
- package/dist/core/collections/withEndUser.js +301 -0
- package/dist/core/collections/withEndUser.js.map +1 -0
- package/dist/core/collections/withGlobal.js +27 -0
- package/dist/core/collections/withGlobal.js.map +1 -0
- package/dist/core/collections/withGlobal.test.js +57 -0
- package/dist/core/collections/withGlobal.test.js.map +1 -0
- package/dist/core/collections/withMenu.js +19 -0
- package/dist/core/collections/withMenu.js.map +1 -0
- package/dist/core/collections/withMenu.test.js +63 -0
- package/dist/core/collections/withMenu.test.js.map +1 -0
- package/dist/core/collections/withPage.js +126 -0
- package/dist/core/collections/withPage.js.map +1 -0
- package/dist/core/collections/withPage.test.js +103 -0
- package/dist/core/collections/withPage.test.js.map +1 -0
- package/dist/core/collections/withStaticCollection.js +60 -0
- package/dist/core/collections/withStaticCollection.js.map +1 -0
- package/dist/core/collections/withStaticCollection.test.js +84 -0
- package/dist/core/collections/withStaticCollection.test.js.map +1 -0
- package/dist/core/collections/withUser.js +56 -0
- package/dist/core/collections/withUser.js.map +1 -0
- package/dist/core/decorators/category.js +28 -0
- package/dist/core/decorators/category.js.map +1 -0
- package/dist/core/decorators/components.js +9 -0
- package/dist/core/decorators/components.js.map +1 -0
- package/dist/core/decorators/href.js +25 -0
- package/dist/core/decorators/href.js.map +1 -0
- package/dist/core/decorators/index.js +11 -0
- package/dist/core/decorators/index.js.map +1 -0
- package/dist/core/decorators/localize.js +27 -0
- package/dist/core/decorators/localize.js.map +1 -0
- package/dist/core/decorators/menu.js +246 -0
- package/dist/core/decorators/menu.js.map +1 -0
- package/dist/core/decorators/nav.js +42 -0
- package/dist/core/decorators/nav.js.map +1 -0
- package/dist/core/decorators/rich-text.js +39 -0
- package/dist/core/decorators/rich-text.js.map +1 -0
- package/dist/core/decorators/schema.js +16 -0
- package/dist/core/decorators/schema.js.map +1 -0
- package/dist/core/decorators/upload.js +44 -0
- package/dist/core/decorators/upload.js.map +1 -0
- package/dist/core/encryption/encryption.js +66 -0
- package/dist/core/encryption/encryption.js.map +1 -0
- package/dist/core/encryption/index.js +3 -0
- package/dist/core/encryption/index.js.map +1 -0
- package/dist/core/fields/index.js +28 -0
- package/dist/core/fields/index.js.map +1 -0
- package/dist/core/fields/withAbstract.js +15 -0
- package/dist/core/fields/withAbstract.js.map +1 -0
- package/dist/core/fields/withAbstract.test.js +72 -0
- package/dist/core/fields/withAbstract.test.js.map +1 -0
- package/dist/core/fields/withAnchor.js +56 -0
- package/dist/core/fields/withAnchor.js.map +1 -0
- package/dist/core/fields/withCategory.js +21 -0
- package/dist/core/fields/withCategory.js.map +1 -0
- package/dist/core/fields/withCategory.test.js +63 -0
- package/dist/core/fields/withCategory.test.js.map +1 -0
- package/dist/core/fields/withCheckbox.js +19 -0
- package/dist/core/fields/withCheckbox.js.map +1 -0
- package/dist/core/fields/withCheckbox.test.js +59 -0
- package/dist/core/fields/withCheckbox.test.js.map +1 -0
- package/dist/core/fields/withComponents.js +17 -0
- package/dist/core/fields/withComponents.js.map +1 -0
- package/dist/core/fields/withComponents.test.js +62 -0
- package/dist/core/fields/withComponents.test.js.map +1 -0
- package/dist/core/fields/withDate.js +18 -0
- package/dist/core/fields/withDate.js.map +1 -0
- package/dist/core/fields/withDate.test.js +56 -0
- package/dist/core/fields/withDate.test.js.map +1 -0
- package/dist/core/fields/withDescription.js +15 -0
- package/dist/core/fields/withDescription.js.map +1 -0
- package/dist/core/fields/withDescription.test.js +72 -0
- package/dist/core/fields/withDescription.test.js.map +1 -0
- package/dist/core/fields/withId.js +19 -0
- package/dist/core/fields/withId.js.map +1 -0
- package/dist/core/fields/withId.test.js +61 -0
- package/dist/core/fields/withId.test.js.map +1 -0
- package/dist/core/fields/withIsActive.js +15 -0
- package/dist/core/fields/withIsActive.js.map +1 -0
- package/dist/core/fields/withIsActive.test.js +59 -0
- package/dist/core/fields/withIsActive.test.js.map +1 -0
- package/dist/core/fields/withIsDefault.js +15 -0
- package/dist/core/fields/withIsDefault.js.map +1 -0
- package/dist/core/fields/withIsDefault.test.js +59 -0
- package/dist/core/fields/withIsDefault.test.js.map +1 -0
- package/dist/core/fields/withLink.js +116 -0
- package/dist/core/fields/withLink.js.map +1 -0
- package/dist/core/fields/withLink.test.js +144 -0
- package/dist/core/fields/withLink.test.js.map +1 -0
- package/dist/core/fields/withMarkets.js +21 -0
- package/dist/core/fields/withMarkets.js.map +1 -0
- package/dist/core/fields/withMarkets.test.js +65 -0
- package/dist/core/fields/withMarkets.test.js.map +1 -0
- package/dist/core/fields/withMedia.js +20 -0
- package/dist/core/fields/withMedia.js.map +1 -0
- package/dist/core/fields/withMedia.test.js +41 -0
- package/dist/core/fields/withMedia.test.js.map +1 -0
- package/dist/core/fields/withMedias.js +25 -0
- package/dist/core/fields/withMedias.js.map +1 -0
- package/dist/core/fields/withMedias.test.js +46 -0
- package/dist/core/fields/withMedias.test.js.map +1 -0
- package/dist/core/fields/withName.js +17 -0
- package/dist/core/fields/withName.js.map +1 -0
- package/dist/core/fields/withName.test.js +59 -0
- package/dist/core/fields/withName.test.js.map +1 -0
- package/dist/core/fields/withNav.js +28 -0
- package/dist/core/fields/withNav.js.map +1 -0
- package/dist/core/fields/withNavs.js +53 -0
- package/dist/core/fields/withNavs.js.map +1 -0
- package/dist/core/fields/withOrder.js +80 -0
- package/dist/core/fields/withOrder.js.map +1 -0
- package/dist/core/fields/withOrder.test.js +56 -0
- package/dist/core/fields/withOrder.test.js.map +1 -0
- package/dist/core/fields/withRelated.js +18 -0
- package/dist/core/fields/withRelated.js.map +1 -0
- package/dist/core/fields/withRelated.test.js +62 -0
- package/dist/core/fields/withRelated.test.js.map +1 -0
- package/dist/core/fields/withRichText.js +68 -0
- package/dist/core/fields/withRichText.js.map +1 -0
- package/dist/core/fields/withRichText.test.js +72 -0
- package/dist/core/fields/withRichText.test.js.map +1 -0
- package/dist/core/fields/withRoles.js +27 -0
- package/dist/core/fields/withRoles.js.map +1 -0
- package/dist/core/fields/withRoles.test.js +49 -0
- package/dist/core/fields/withRoles.test.js.map +1 -0
- package/dist/core/fields/withSelect.js +23 -0
- package/dist/core/fields/withSelect.js.map +1 -0
- package/dist/core/fields/withSelect.test.js +59 -0
- package/dist/core/fields/withSelect.test.js.map +1 -0
- package/dist/core/fields/withSeoWeight.js +19 -0
- package/dist/core/fields/withSeoWeight.js.map +1 -0
- package/dist/core/fields/withSlug.js +33 -0
- package/dist/core/fields/withSlug.js.map +1 -0
- package/dist/core/fields/withSlug.test.js +71 -0
- package/dist/core/fields/withSlug.test.js.map +1 -0
- package/dist/core/fields/withTemplate.js +49 -0
- package/dist/core/fields/withTemplate.js.map +1 -0
- package/dist/core/fields/withTemplate.test.js +93 -0
- package/dist/core/fields/withTemplate.test.js.map +1 -0
- package/dist/core/fields/withTenants.js +21 -0
- package/dist/core/fields/withTenants.js.map +1 -0
- package/dist/core/fields/withTenants.test.js +42 -0
- package/dist/core/fields/withTenants.test.js.map +1 -0
- package/dist/core/fields/withText.js +18 -0
- package/dist/core/fields/withText.js.map +1 -0
- package/dist/core/fields/withText.test.js +56 -0
- package/dist/core/fields/withText.test.js.map +1 -0
- package/dist/core/fields/withTitle.js +17 -0
- package/dist/core/fields/withTitle.js.map +1 -0
- package/dist/core/fields/withTitle.test.js +58 -0
- package/dist/core/fields/withTitle.test.js.map +1 -0
- package/dist/core/index.js +11 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/logger/index.js +3 -0
- package/dist/core/logger/index.js.map +1 -0
- package/dist/core/logger/logger.js +9 -0
- package/dist/core/logger/logger.js.map +1 -0
- package/dist/core/translations/index.js +3 -0
- package/dist/core/translations/index.js.map +1 -0
- package/dist/core/translations/translations.js +137 -0
- package/dist/core/translations/translations.js.map +1 -0
- package/dist/core/translations/translations.test.js +72 -0
- package/dist/core/translations/translations.test.js.map +1 -0
- package/dist/core/utils/findByIDHandler.js +28 -0
- package/dist/core/utils/findByIDHandler.js.map +1 -0
- package/dist/core/utils/findHandler.js +31 -0
- package/dist/core/utils/findHandler.js.map +1 -0
- package/dist/core/utils/getPreviewURL.js +45 -0
- package/dist/core/utils/getPreviewURL.js.map +1 -0
- package/dist/core/utils/getRequestCollection.js +49 -0
- package/dist/core/utils/getRequestCollection.js.map +1 -0
- package/dist/core/utils/index.js +7 -0
- package/dist/core/utils/index.js.map +1 -0
- package/dist/core/utils/mergeCollections.js +18 -0
- package/dist/core/utils/mergeCollections.js.map +1 -0
- package/dist/core/utils/mergeFields.js +20 -0
- package/dist/core/utils/mergeFields.js.map +1 -0
- package/dist/core/utils/mergeGlobals.js +17 -0
- package/dist/core/utils/mergeGlobals.js.map +1 -0
- package/dist/core/utils/richText.js +29 -0
- package/dist/core/utils/richText.js.map +1 -0
- package/dist/core/utils/sortByGroup.js +36 -0
- package/dist/core/utils/sortByGroup.js.map +1 -0
- package/dist/debug.js +25 -0
- package/dist/debug.js.map +1 -0
- package/dist/declaration.d.js +3 -0
- package/dist/declaration.d.js.map +1 -0
- package/dist/exports/client.d.ts +36 -0
- package/dist/exports/client.d.ts.map +1 -0
- package/dist/exports/client.js +8 -0
- package/dist/exports/client.js.map +1 -0
- package/dist/exports/rsc.d.ts +18 -0
- package/dist/exports/rsc.d.ts.map +1 -0
- package/dist/exports/rsc.js +5 -0
- package/dist/exports/rsc.js.map +1 -0
- package/dist/fields/color-picker/ColorCell.js +19 -0
- package/dist/fields/color-picker/ColorCell.js.map +1 -0
- package/dist/fields/color-picker/ColorField.js +131 -0
- package/dist/fields/color-picker/ColorField.js.map +1 -0
- package/dist/fields/color-picker/index.js +26 -0
- package/dist/fields/color-picker/index.js.map +1 -0
- package/dist/fields/color-picker/styles.scss +113 -0
- package/dist/fields/color-picker/utils.js +6 -0
- package/dist/fields/color-picker/utils.js.map +1 -0
- package/dist/fields/index.js +3 -0
- package/dist/fields/index.js.map +1 -0
- package/dist/globals/App.js +97 -0
- package/dist/globals/App.js.map +1 -0
- package/dist/globals/Locale.js +82 -0
- package/dist/globals/Locale.js.map +1 -0
- package/dist/globals/LocaleRowLabel.js +16 -0
- package/dist/globals/LocaleRowLabel.js.map +1 -0
- package/dist/index.d.ts +891 -844
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -9263
- package/dist/index.js.map +1 -0
- package/dist/mapper.js +199 -0
- package/dist/mapper.js.map +1 -0
- package/dist/options.js +76 -0
- package/dist/options.js.map +1 -0
- package/dist/test/blocks/blocks.js +13 -0
- package/dist/test/blocks/blocks.js.map +1 -0
- package/dist/test/collections/ActionCollection.js +12 -0
- package/dist/test/collections/ActionCollection.js.map +1 -0
- package/dist/test/collections/AdminCollection.js +18 -0
- package/dist/test/collections/AdminCollection.js.map +1 -0
- package/dist/test/collections/BlockCollection.js +16 -0
- package/dist/test/collections/BlockCollection.js.map +1 -0
- package/dist/test/collections/Collection.js +12 -0
- package/dist/test/collections/Collection.js.map +1 -0
- package/dist/test/collections/FieldCollection.js +84 -0
- package/dist/test/collections/FieldCollection.js.map +1 -0
- package/dist/test/collections/GlobalCollection.js +12 -0
- package/dist/test/collections/GlobalCollection.js.map +1 -0
- package/dist/test/collections/LinkCollection.js +12 -0
- package/dist/test/collections/LinkCollection.js.map +1 -0
- package/dist/test/collections/MenuCollection.js +12 -0
- package/dist/test/collections/MenuCollection.js.map +1 -0
- package/dist/test/collections/PageCollection.js +12 -0
- package/dist/test/collections/PageCollection.js.map +1 -0
- package/dist/test/collections/RoleCollection.js +19 -0
- package/dist/test/collections/RoleCollection.js.map +1 -0
- package/dist/test/collections/RoleFieldCollection.js +40 -0
- package/dist/test/collections/RoleFieldCollection.js.map +1 -0
- package/dist/test/collections/StaticCollection.js +56 -0
- package/dist/test/collections/StaticCollection.js.map +1 -0
- package/dist/test/collections/StorePageCollection.js +12 -0
- package/dist/test/collections/StorePageCollection.js.map +1 -0
- package/dist/test/collections/TenantCollection.js +22 -0
- package/dist/test/collections/TenantCollection.js.map +1 -0
- package/dist/test/collections/TranslationCollection.js +16 -0
- package/dist/test/collections/TranslationCollection.js.map +1 -0
- package/dist/test/collections/TypeACollection.js +18 -0
- package/dist/test/collections/TypeACollection.js.map +1 -0
- package/dist/test/collections/TypeBCollection.js +18 -0
- package/dist/test/collections/TypeBCollection.js.map +1 -0
- package/dist/test/collections/actions/NewsletterAction.js +29 -0
- package/dist/test/collections/actions/NewsletterAction.js.map +1 -0
- package/dist/test/collections/actions/RegisterAction.js +44 -0
- package/dist/test/collections/actions/RegisterAction.js.map +1 -0
- package/dist/test/collections/users/EndUsers.js +40 -0
- package/dist/test/collections/users/EndUsers.js.map +1 -0
- package/dist/test/collections/users/Users.js +20 -0
- package/dist/test/collections/users/Users.js.map +1 -0
- package/dist/test/index.js +32 -0
- package/dist/test/index.js.map +1 -0
- package/dist/test/payload.config.js +106 -0
- package/dist/test/payload.config.js.map +1 -0
- package/dist/test/utils.js +52 -0
- package/dist/test/utils.js.map +1 -0
- package/dist/translations.js +467 -0
- package/dist/translations.js.map +1 -0
- package/dist/types.js +31 -0
- package/dist/types.js.map +1 -0
- package/package.json +119 -37
- package/scss/styles.scss +0 -1
- package/dist/index.css +0 -796
|
@@ -0,0 +1,458 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { MinimalTemplate } from '@payloadcms/next/templates';
|
|
4
|
+
import { Button, CheckboxInput, Form, SelectInput, XIcon, toast, useAuth, useConfig, useLocale, useModal, useTranslation } from '@payloadcms/ui';
|
|
5
|
+
import { getRouteResolver } from '@websolutespa/payload-utils';
|
|
6
|
+
import * as Papa from 'papaparse';
|
|
7
|
+
import React, { useCallback, useEffect, useState } from 'react';
|
|
8
|
+
import { useDropzone } from 'react-dropzone';
|
|
9
|
+
import { ImportLogInvalidTypes, ImportLogType, ImportMode } from '../../core/api/types';
|
|
10
|
+
import './ImportModal.scss';
|
|
11
|
+
const INITIAL_DATA = {
|
|
12
|
+
importMode: ImportMode.Append,
|
|
13
|
+
dataParsing: false
|
|
14
|
+
};
|
|
15
|
+
const baseClass = 'import-modal';
|
|
16
|
+
export const ImportModal = ({ parser, slug })=>{
|
|
17
|
+
const { closeAllModals } = useModal();
|
|
18
|
+
const { config, getEntityConfig } = useConfig();
|
|
19
|
+
const collectionConfig = getEntityConfig({
|
|
20
|
+
collectionSlug: slug
|
|
21
|
+
});
|
|
22
|
+
const routeResolver = getRouteResolver(config);
|
|
23
|
+
const collectionUrl = routeResolver.api(`/${collectionConfig.slug}?pagination=false&depth=0`);
|
|
24
|
+
// !!! check translations
|
|
25
|
+
const { t } = useTranslation();
|
|
26
|
+
const format = (text, ...rest)=>{
|
|
27
|
+
return text.replace(/\{(\d)\}/g, (m, g)=>{
|
|
28
|
+
const i = parseInt(g);
|
|
29
|
+
return i >= 0 && i < rest.length ? String(rest[i]) : '';
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
const { code: locale } = useLocale();
|
|
33
|
+
const user = useAuth();
|
|
34
|
+
const [dirty, setDirty] = useState(false);
|
|
35
|
+
const [valid, setValid] = useState(false);
|
|
36
|
+
const [error, setError] = useState();
|
|
37
|
+
const [name, setName] = useState(null);
|
|
38
|
+
const [csv, setCSV] = useState(null);
|
|
39
|
+
const [keys, setKeys] = useState(null);
|
|
40
|
+
const [data, setData] = useState(null);
|
|
41
|
+
const [items, setItems] = useState([]);
|
|
42
|
+
const [logs, setLogs] = useState([]);
|
|
43
|
+
const [importMode, setImportMode] = useState(INITIAL_DATA.importMode);
|
|
44
|
+
const [dataParsing, setDataParsing] = useState(INITIAL_DATA.dataParsing);
|
|
45
|
+
const importModes = Object.entries(ImportMode).map(([k, v])=>({
|
|
46
|
+
value: v,
|
|
47
|
+
label: t(`importExport:mode${k}`)
|
|
48
|
+
}));
|
|
49
|
+
const onSelectDidChange = (option)=>{
|
|
50
|
+
// console.log('onSelectDidChange', option);
|
|
51
|
+
if (Array.isArray(option)) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (importMode !== option.value) {
|
|
55
|
+
setValid(false);
|
|
56
|
+
setImportMode(option.value);
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
const onCheckboxkDidChange = (event)=>{
|
|
60
|
+
// console.log('onCheckboxkDidChange', value);
|
|
61
|
+
setValid(false);
|
|
62
|
+
setDataParsing(!dataParsing);
|
|
63
|
+
};
|
|
64
|
+
const validate = useCallback(async (keys, data)=>{
|
|
65
|
+
try {
|
|
66
|
+
const messageByType = (key, type)=>{
|
|
67
|
+
let message;
|
|
68
|
+
switch(type){
|
|
69
|
+
case ImportLogType.Required:
|
|
70
|
+
message = format(t('importExport:errorRequired'), key);
|
|
71
|
+
break;
|
|
72
|
+
case ImportLogType.Optional:
|
|
73
|
+
message = format(t('importExport:errorOptional'), key);
|
|
74
|
+
break;
|
|
75
|
+
case ImportLogType.Invalid:
|
|
76
|
+
message = format(t('importExport:errorInvalid'), key);
|
|
77
|
+
break;
|
|
78
|
+
case ImportLogType.Duplicate:
|
|
79
|
+
message = format(t('importExport:errorDuplicate'), key);
|
|
80
|
+
break;
|
|
81
|
+
case ImportLogType.Unexpected:
|
|
82
|
+
message = format(t('importExport:errorUnexpected'), key);
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
return message;
|
|
86
|
+
};
|
|
87
|
+
const addLog = (logs, key, type, invalid)=>{
|
|
88
|
+
const message = messageByType(key, type);
|
|
89
|
+
const id = invalid ? `${key}-${type}-${invalid}` : `${key}-${type}`;
|
|
90
|
+
const log = once(logs, {
|
|
91
|
+
id,
|
|
92
|
+
key,
|
|
93
|
+
type,
|
|
94
|
+
message,
|
|
95
|
+
invalid,
|
|
96
|
+
count: 0
|
|
97
|
+
});
|
|
98
|
+
log.count++;
|
|
99
|
+
return log;
|
|
100
|
+
};
|
|
101
|
+
const itemOptionalKeys = [];
|
|
102
|
+
const itemKeys = keys;
|
|
103
|
+
// collecting model fields & keys
|
|
104
|
+
const fields = collectionConfig.fields.filter((x)=>'name' in x && x['name'] !== undefined && x.type !== 'ui');
|
|
105
|
+
const fieldKeys = fields.map((x)=>x['name']);
|
|
106
|
+
const requiredFields = fields.filter((x)=>{
|
|
107
|
+
if (x['name'] === 'id' && importMode === ImportMode.Update) {
|
|
108
|
+
return true;
|
|
109
|
+
} else {
|
|
110
|
+
return 'required' in x && x['required'] === true;
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
const uniqueFields = fields.filter((x)=>x['unique'] === true);
|
|
114
|
+
const requiredFieldKeys = requiredFields.map((x)=>x['name']);
|
|
115
|
+
const optionalFieldKeys = fieldKeys.filter((x)=>!requiredFieldKeys.includes(x));
|
|
116
|
+
const uniqueFieldKeys = uniqueFields.map((x)=>x['name']);
|
|
117
|
+
let items = [];
|
|
118
|
+
// parse values
|
|
119
|
+
const valueParsers = itemKeys.map((key)=>{
|
|
120
|
+
let parseValue = (item)=>item[key];
|
|
121
|
+
if (fieldKeys.includes(key)) {
|
|
122
|
+
const field = collectionConfig.fields.find((x)=>'name' in x && x['name'] === key);
|
|
123
|
+
if (field) {
|
|
124
|
+
switch(field.type){
|
|
125
|
+
case 'checkbox':
|
|
126
|
+
parseValue = (item)=>item[key] !== undefined ? Boolean(item[key]) : item[key];
|
|
127
|
+
break;
|
|
128
|
+
case 'date':
|
|
129
|
+
parseValue = (item)=>item[key] !== undefined ? new Date(item[key]) : item[key];
|
|
130
|
+
break;
|
|
131
|
+
case 'number':
|
|
132
|
+
parseValue = (item)=>item[key] !== undefined ? Number(item[key]) : item[key];
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return parseValue;
|
|
138
|
+
});
|
|
139
|
+
for (const row of data){
|
|
140
|
+
const item = {};
|
|
141
|
+
itemKeys.forEach((key, i)=>{
|
|
142
|
+
const parser = valueParsers[i];
|
|
143
|
+
if (parser) {
|
|
144
|
+
item[key] = parser(row);
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
items.push(item);
|
|
148
|
+
}
|
|
149
|
+
if (dataParsing && typeof parser === 'function') {
|
|
150
|
+
items = parser(items);
|
|
151
|
+
}
|
|
152
|
+
// console.log('data', data);
|
|
153
|
+
// console.log('items', items);
|
|
154
|
+
// collecting stored values
|
|
155
|
+
const httpResponse = await fetch(collectionUrl, {
|
|
156
|
+
method: 'GET',
|
|
157
|
+
credentials: 'include',
|
|
158
|
+
headers: {
|
|
159
|
+
'Content-Type': 'application/json'
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
if (!httpResponse.ok) {
|
|
163
|
+
throw httpResponse;
|
|
164
|
+
}
|
|
165
|
+
const storedItems = await httpResponse.json();
|
|
166
|
+
// console.log('rows', rows, 'data', result.data);
|
|
167
|
+
// collecting logs
|
|
168
|
+
const logs = [];
|
|
169
|
+
// required fields
|
|
170
|
+
requiredFieldKeys.forEach((key)=>{
|
|
171
|
+
if (!itemKeys.includes(key) || itemOptionalKeys.includes(key)) {
|
|
172
|
+
addLog(logs, key, ImportLogType.Required);
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
// optional fields
|
|
176
|
+
optionalFieldKeys.forEach((key)=>{
|
|
177
|
+
if (!itemKeys.includes(key)) {
|
|
178
|
+
addLog(logs, key, ImportLogType.Optional);
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
// deep check values
|
|
182
|
+
for (const key of itemKeys){
|
|
183
|
+
if (fieldKeys.includes(key)) {
|
|
184
|
+
const field = collectionConfig.fields.find((x)=>'name' in x && x['name'] === key);
|
|
185
|
+
if (field) {
|
|
186
|
+
const validate = 'validate' in field ? field['validate'] : undefined;
|
|
187
|
+
const values = [];
|
|
188
|
+
const storedValues = uniqueFieldKeys.includes(key) ? storedItems.map((x)=>x[key]) : [];
|
|
189
|
+
for (const item of items){
|
|
190
|
+
const value = item[key];
|
|
191
|
+
// validate field
|
|
192
|
+
if (typeof validate === 'function') {
|
|
193
|
+
const validation = await validate(value, {
|
|
194
|
+
data: item,
|
|
195
|
+
siblingData: item,
|
|
196
|
+
operation: 'create',
|
|
197
|
+
user,
|
|
198
|
+
t
|
|
199
|
+
});
|
|
200
|
+
if (validation !== true) {
|
|
201
|
+
// console.log(key, value, validation, item);
|
|
202
|
+
if (logs.find((x)=>x.key === 'key' && x.type === ImportLogType.Invalid) === undefined) {
|
|
203
|
+
addLog(logs, key, ImportLogType.Invalid, validation);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// unique field
|
|
208
|
+
if (uniqueFieldKeys.includes(key) && (values.includes(value) || (importMode === ImportMode.Append ? storedValues.includes(value) : false))) {
|
|
209
|
+
addLog(logs, key, ImportLogType.Duplicate, String(value));
|
|
210
|
+
}
|
|
211
|
+
values.push(value);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
} else {
|
|
215
|
+
addLog(logs, key, ImportLogType.Unexpected);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
const sortOrder = Object.values(ImportLogType);
|
|
219
|
+
logs.sort((a, b)=>{
|
|
220
|
+
return sortOrder.indexOf(a.type) - sortOrder.indexOf(b.type);
|
|
221
|
+
});
|
|
222
|
+
setItems(items);
|
|
223
|
+
setLogs(logs);
|
|
224
|
+
const errors = logs.filter((x)=>ImportLogInvalidTypes.includes(x.type));
|
|
225
|
+
if (errors.length === 0) {
|
|
226
|
+
setValid(true);
|
|
227
|
+
}
|
|
228
|
+
// console.log(logs, items, itemKeys, itemOptionalKeys, fieldKeys, requiredFieldKeys, optionalFieldKeys);
|
|
229
|
+
} catch (error) {
|
|
230
|
+
console.log('parse error', error);
|
|
231
|
+
setError(error);
|
|
232
|
+
}
|
|
233
|
+
}, [
|
|
234
|
+
collectionUrl,
|
|
235
|
+
importMode,
|
|
236
|
+
dataParsing,
|
|
237
|
+
parser,
|
|
238
|
+
collectionConfig.fields,
|
|
239
|
+
t,
|
|
240
|
+
user
|
|
241
|
+
]);
|
|
242
|
+
useEffect(()=>{
|
|
243
|
+
if (keys && data) {
|
|
244
|
+
validate(keys, data);
|
|
245
|
+
}
|
|
246
|
+
}, [
|
|
247
|
+
keys,
|
|
248
|
+
data,
|
|
249
|
+
importMode,
|
|
250
|
+
validate
|
|
251
|
+
]);
|
|
252
|
+
const onDrop = useCallback((acceptedFiles)=>{
|
|
253
|
+
const acceptedFile = acceptedFiles.find(()=>true);
|
|
254
|
+
if (acceptedFile) {
|
|
255
|
+
const reader = new FileReader();
|
|
256
|
+
reader.onabort = ()=>console.log('file reading was aborted');
|
|
257
|
+
reader.onerror = ()=>console.log('file reading has failed');
|
|
258
|
+
reader.onload = ()=>{
|
|
259
|
+
// Do whatever you want with the file contents
|
|
260
|
+
const csv = reader.result;
|
|
261
|
+
// console.log('csv', csv);
|
|
262
|
+
// parsing csv to { data:[][] }
|
|
263
|
+
const result = Papa.parse(csv);
|
|
264
|
+
const resultData = result.data;
|
|
265
|
+
// collecting imported keys & data
|
|
266
|
+
let keys = [];
|
|
267
|
+
const data = resultData.reduce((p, c, i)=>{
|
|
268
|
+
if (i === 0) {
|
|
269
|
+
keys = c;
|
|
270
|
+
} else {
|
|
271
|
+
const item = {};
|
|
272
|
+
keys.forEach((key, k)=>{
|
|
273
|
+
if (c[k] !== undefined) {
|
|
274
|
+
item[key] = c[k];
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
p.push(item);
|
|
278
|
+
}
|
|
279
|
+
return p;
|
|
280
|
+
}, []);
|
|
281
|
+
setName(acceptedFile.name);
|
|
282
|
+
setCSV(csv);
|
|
283
|
+
setKeys(keys);
|
|
284
|
+
setData(data);
|
|
285
|
+
setDirty(true);
|
|
286
|
+
};
|
|
287
|
+
// reader.readAsArrayBuffer(file);
|
|
288
|
+
reader.readAsText(acceptedFile);
|
|
289
|
+
}
|
|
290
|
+
}, []);
|
|
291
|
+
const { getRootProps, getInputProps, isDragActive } = useDropzone({
|
|
292
|
+
accept: {
|
|
293
|
+
'text/csv': []
|
|
294
|
+
},
|
|
295
|
+
maxSize: 1048576 * 20,
|
|
296
|
+
maxFiles: 1,
|
|
297
|
+
onDrop
|
|
298
|
+
});
|
|
299
|
+
const onSubmit = async ()=>{
|
|
300
|
+
// console.log('ImportModal.onSubmit');
|
|
301
|
+
try {
|
|
302
|
+
const url = routeResolver.api(`/${collectionConfig.slug}/import?locale=${locale}&mode=${importMode}`);
|
|
303
|
+
const httpResponse = await fetch(url, {
|
|
304
|
+
method: 'POST',
|
|
305
|
+
body: JSON.stringify({
|
|
306
|
+
items
|
|
307
|
+
}),
|
|
308
|
+
credentials: 'include',
|
|
309
|
+
headers: {
|
|
310
|
+
'Content-Type': 'application/json'
|
|
311
|
+
}
|
|
312
|
+
});
|
|
313
|
+
if (!httpResponse.ok) {
|
|
314
|
+
throw httpResponse;
|
|
315
|
+
}
|
|
316
|
+
const response = await httpResponse.json();
|
|
317
|
+
// console.log('ImportModal.onSubmit', response);
|
|
318
|
+
toast.success(t('importExport:success'));
|
|
319
|
+
closeAllModals();
|
|
320
|
+
} catch (error) {
|
|
321
|
+
console.log('ImportModal.onSubmit.error', error);
|
|
322
|
+
toast.error(format(t('importExport:failure'), collectionConfig.slug));
|
|
323
|
+
}
|
|
324
|
+
};
|
|
325
|
+
const onClose = ()=>{
|
|
326
|
+
// console.log('onClose');
|
|
327
|
+
closeAllModals();
|
|
328
|
+
};
|
|
329
|
+
const onClear = ()=>{
|
|
330
|
+
// console.log('onClear');
|
|
331
|
+
setValid(false);
|
|
332
|
+
setDirty(false);
|
|
333
|
+
setName(null);
|
|
334
|
+
setCSV(null);
|
|
335
|
+
setKeys(null);
|
|
336
|
+
setData(null);
|
|
337
|
+
setItems([]);
|
|
338
|
+
setLogs([]);
|
|
339
|
+
};
|
|
340
|
+
return /*#__PURE__*/ _jsxs(MinimalTemplate, {
|
|
341
|
+
children: [
|
|
342
|
+
/*#__PURE__*/ _jsxs("header", {
|
|
343
|
+
className: `${baseClass}__header`,
|
|
344
|
+
children: [
|
|
345
|
+
/*#__PURE__*/ _jsx("h3", {
|
|
346
|
+
children: t('importExport:modalTitle')
|
|
347
|
+
}),
|
|
348
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
349
|
+
buttonStyle: "none",
|
|
350
|
+
onClick: onClose,
|
|
351
|
+
children: /*#__PURE__*/ _jsx(XIcon, {})
|
|
352
|
+
})
|
|
353
|
+
]
|
|
354
|
+
}),
|
|
355
|
+
/*#__PURE__*/ _jsx("main", {
|
|
356
|
+
className: `${baseClass}__main`,
|
|
357
|
+
children: /*#__PURE__*/ _jsxs(Form, {
|
|
358
|
+
onSubmit: onSubmit,
|
|
359
|
+
children: [
|
|
360
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
361
|
+
className: "render-fields",
|
|
362
|
+
children: [
|
|
363
|
+
/*#__PURE__*/ _jsx(SelectInput, {
|
|
364
|
+
// isClearable={viewType === 'list'}
|
|
365
|
+
label: t('importExport:importMode'),
|
|
366
|
+
name: "importMode",
|
|
367
|
+
path: 'importMode',
|
|
368
|
+
options: importModes,
|
|
369
|
+
onChange: onSelectDidChange
|
|
370
|
+
}),
|
|
371
|
+
typeof parser === 'function' && /*#__PURE__*/ _jsx(CheckboxInput, {
|
|
372
|
+
label: t('importExport:enableDataParsing'),
|
|
373
|
+
id: "importMode",
|
|
374
|
+
name: "dataParsing",
|
|
375
|
+
onToggle: onCheckboxkDidChange
|
|
376
|
+
})
|
|
377
|
+
]
|
|
378
|
+
}),
|
|
379
|
+
data ? /*#__PURE__*/ _jsxs(_Fragment, {
|
|
380
|
+
children: [
|
|
381
|
+
/*#__PURE__*/ _jsx("div", {
|
|
382
|
+
dangerouslySetInnerHTML: {
|
|
383
|
+
__html: format(t('importExport:records'), items.length, name)
|
|
384
|
+
}
|
|
385
|
+
}),
|
|
386
|
+
logs.length > 0 && /*#__PURE__*/ _jsx("ul", {
|
|
387
|
+
className: `${baseClass}__logs`,
|
|
388
|
+
children: logs.map((log, i)=>/*#__PURE__*/ _jsxs("li", {
|
|
389
|
+
className: `${baseClass}__log ${baseClass}__log--${log.type}`,
|
|
390
|
+
children: [
|
|
391
|
+
log.count,
|
|
392
|
+
" ",
|
|
393
|
+
log.message,
|
|
394
|
+
" ",
|
|
395
|
+
/*#__PURE__*/ _jsx("i", {
|
|
396
|
+
children: log.invalid
|
|
397
|
+
})
|
|
398
|
+
]
|
|
399
|
+
}, `log-${i}`))
|
|
400
|
+
})
|
|
401
|
+
]
|
|
402
|
+
}) : /*#__PURE__*/ _jsxs("div", {
|
|
403
|
+
className: `${baseClass}__dropzone`,
|
|
404
|
+
...getRootProps(),
|
|
405
|
+
children: [
|
|
406
|
+
/*#__PURE__*/ _jsx("input", {
|
|
407
|
+
className: `${baseClass}__input`,
|
|
408
|
+
...getInputProps()
|
|
409
|
+
}),
|
|
410
|
+
isDragActive ? /*#__PURE__*/ _jsx("div", {
|
|
411
|
+
children: t('importExport:dropTitle')
|
|
412
|
+
}) : /*#__PURE__*/ _jsx("div", {
|
|
413
|
+
children: t('importExport:dropAbstract')
|
|
414
|
+
})
|
|
415
|
+
]
|
|
416
|
+
}),
|
|
417
|
+
error && /*#__PURE__*/ _jsxs(_Fragment, {
|
|
418
|
+
children: [
|
|
419
|
+
/*#__PURE__*/ _jsx("div", {
|
|
420
|
+
children: t('importExport:parseError')
|
|
421
|
+
}),
|
|
422
|
+
error.message && /*#__PURE__*/ _jsx("div", {
|
|
423
|
+
children: error.message
|
|
424
|
+
})
|
|
425
|
+
]
|
|
426
|
+
}),
|
|
427
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
428
|
+
className: `${baseClass}__foot`,
|
|
429
|
+
children: [
|
|
430
|
+
dirty && /*#__PURE__*/ _jsx(Button, {
|
|
431
|
+
type: "button",
|
|
432
|
+
buttonStyle: "secondary",
|
|
433
|
+
onClick: onClear,
|
|
434
|
+
children: t('importExport:clear')
|
|
435
|
+
}),
|
|
436
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
437
|
+
type: "submit",
|
|
438
|
+
disabled: !valid,
|
|
439
|
+
children: t('importExport:submit')
|
|
440
|
+
})
|
|
441
|
+
]
|
|
442
|
+
})
|
|
443
|
+
]
|
|
444
|
+
})
|
|
445
|
+
})
|
|
446
|
+
]
|
|
447
|
+
});
|
|
448
|
+
};
|
|
449
|
+
function once(items, item) {
|
|
450
|
+
const exhistingItem = items.find((x)=>x.id === item.id);
|
|
451
|
+
if (exhistingItem) {
|
|
452
|
+
return exhistingItem;
|
|
453
|
+
}
|
|
454
|
+
items.push(item);
|
|
455
|
+
return item;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
//# sourceMappingURL=ImportModal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/ImportExport/ImportModal.tsx"],"sourcesContent":["'use client';\r\n\r\nimport { MinimalTemplate } from '@payloadcms/next/templates';\r\nimport { Button, CheckboxInput, Form, SelectInput, XIcon, toast, useAuth, useConfig, useLocale, useModal, useTranslation } from '@payloadcms/ui';\r\nimport { IEntity, IEquatable } from '@websolutespa/bom-core';\r\nimport { getRouteResolver } from '@websolutespa/payload-utils';\r\nimport * as Papa from 'papaparse';\r\nimport type { ClientField } from 'payload';\r\nimport React, { useCallback, useEffect, useState } from 'react';\r\nimport { useDropzone } from 'react-dropzone';\r\nimport { ImportLogInvalidTypes, ImportLogType, ImportMode } from '../../core/api/types';\r\nimport './ImportModal.scss';\r\nimport { IImportItem } from './types';\r\n\r\ntype Option<TValue = unknown> = {\r\n [key: string]: unknown;\r\n id?: string;\r\n value: TValue;\r\n};\r\n\r\ntype IRow = Record<string, string>;\r\n\r\ntype ImportModalProps<T = any> = {\r\n parser?: (items: IImportItem[]) => T[];\r\n slug: string;\r\n};\r\n\r\ntype ILog = {\r\n count: number;\r\n id: IEquatable;\r\n invalid?: string;\r\n key: string;\r\n message: string;\r\n type: ImportLogType;\r\n};\r\n\r\nconst INITIAL_DATA = {\r\n importMode: ImportMode.Append,\r\n dataParsing: false,\r\n};\r\n\r\nconst baseClass = 'import-modal';\r\n\r\nexport const ImportModal: React.FC<ImportModalProps> = ({\r\n parser,\r\n slug,\r\n}) => {\r\n const { closeAllModals } = useModal();\r\n const { config, getEntityConfig } = useConfig();\r\n const collectionConfig = getEntityConfig({ collectionSlug: slug });\r\n\r\n const routeResolver = getRouteResolver(config);\r\n const collectionUrl = routeResolver.api(`/${collectionConfig.slug}?pagination=false&depth=0`);\r\n\r\n // !!! check translations\r\n const { t } = useTranslation<any, any>();\r\n\r\n const format = (text: string, ...rest: unknown[]) => {\r\n return text.replace(/\\{(\\d)\\}/g, (m, g) => {\r\n const i = parseInt(g);\r\n return (i >= 0 && i < rest.length) ? String(rest[i]) : '';\r\n });\r\n };\r\n\r\n const { code: locale } = useLocale();\r\n\r\n const user = useAuth();\r\n\r\n const [dirty, setDirty] = useState<boolean>(false);\r\n const [valid, setValid] = useState<boolean>(false);\r\n const [error, setError] = useState<Error>();\r\n const [name, setName] = useState<string | null>(null);\r\n const [csv, setCSV] = useState<string | null>(null);\r\n const [keys, setKeys] = useState<string[] | null>(null);\r\n const [data, setData] = useState<IRow[] | null>(null);\r\n const [items, setItems] = useState<IImportItem[]>([]);\r\n const [logs, setLogs] = useState<ILog[]>([]);\r\n const [importMode, setImportMode] = useState<ImportMode>(INITIAL_DATA.importMode);\r\n const [dataParsing, setDataParsing] = useState<boolean>(INITIAL_DATA.dataParsing);\r\n\r\n const importModes = Object.entries(ImportMode).map(([k, v]) => ({\r\n value: v,\r\n label: t(`importExport:mode${k}`),\r\n }));\r\n\r\n const onSelectDidChange = (option: Option | Option[]) => {\r\n // console.log('onSelectDidChange', option);\r\n if (Array.isArray(option)) {\r\n return;\r\n }\r\n if (importMode !== option.value) {\r\n setValid(false);\r\n setImportMode(option.value as ImportMode);\r\n }\r\n };\r\n\r\n const onCheckboxkDidChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n // console.log('onCheckboxkDidChange', value);\r\n setValid(false);\r\n setDataParsing(!dataParsing);\r\n };\r\n\r\n const validate = useCallback(async (keys: string[], data: IRow[]) => {\r\n try {\r\n const messageByType = (key: string, type: ImportLogType) => {\r\n let message: string;\r\n switch (type) {\r\n case ImportLogType.Required:\r\n message = format(t('importExport:errorRequired'), key);\r\n break;\r\n case ImportLogType.Optional:\r\n message = format(t('importExport:errorOptional'), key);\r\n break;\r\n case ImportLogType.Invalid:\r\n message = format(t('importExport:errorInvalid'), key);\r\n break;\r\n case ImportLogType.Duplicate:\r\n message = format(t('importExport:errorDuplicate'), key);\r\n break;\r\n case ImportLogType.Unexpected:\r\n message = format(t('importExport:errorUnexpected'), key);\r\n break;\r\n }\r\n return message;\r\n };\r\n\r\n const addLog = (logs: ILog[], key: string, type: ImportLogType, invalid?: string): ILog => {\r\n const message = messageByType(key, type);\r\n const id = invalid ? `${key}-${type}-${invalid}` : `${key}-${type}`;\r\n const log = once<ILog>(logs, { id, key, type, message, invalid, count: 0 });\r\n log.count++;\r\n return log;\r\n };\r\n\r\n const itemOptionalKeys: string[] = [];\r\n const itemKeys = keys;\r\n\r\n // collecting model fields & keys\r\n const fields = collectionConfig.fields\r\n .filter(x => 'name' in x && x['name'] !== undefined && x.type !== 'ui') as (ClientField & { name: string })[];\r\n const fieldKeys = fields.map(x => x['name']);\r\n const requiredFields = fields.filter(x => {\r\n if (x['name'] === 'id' && importMode === ImportMode.Update) {\r\n return true;\r\n } else {\r\n return 'required' in x && x['required'] === true;\r\n }\r\n });\r\n const uniqueFields = fields.filter(x => x['unique'] === true);\r\n const requiredFieldKeys = requiredFields.map(x => x['name']);\r\n const optionalFieldKeys = fieldKeys.filter(x => !requiredFieldKeys.includes(x));\r\n const uniqueFieldKeys = uniqueFields.map(x => x['name']);\r\n\r\n let items: IImportItem[] = [];\r\n\r\n // parse values\r\n const valueParsers = itemKeys.map(key => {\r\n let parseValue = (item: IRow): string | number | boolean | Date | undefined => item[key];\r\n if (fieldKeys.includes(key)) {\r\n const field = collectionConfig.fields.find(x => 'name' in x && x['name'] === key);\r\n if (field) {\r\n switch (field.type) {\r\n case 'checkbox':\r\n parseValue = (item: IRow) => item[key] !== undefined ? Boolean(item[key]) : item[key];\r\n break;\r\n case 'date':\r\n parseValue = (item: IRow) => item[key] !== undefined ? new Date(item[key]) : item[key];\r\n break;\r\n case 'number':\r\n parseValue = (item: IRow) => item[key] !== undefined ? Number(item[key]) : item[key];\r\n break;\r\n }\r\n }\r\n }\r\n return parseValue;\r\n });\r\n\r\n for (const row of data) {\r\n const item = {};\r\n itemKeys.forEach((key, i) => {\r\n const parser = valueParsers[i];\r\n if (parser) {\r\n (item as any)[key] = parser(row);\r\n }\r\n });\r\n items.push(item);\r\n }\r\n\r\n if (dataParsing && typeof parser === 'function') {\r\n items = parser(items);\r\n }\r\n\r\n // console.log('data', data);\r\n // console.log('items', items);\r\n\r\n // collecting stored values\r\n const httpResponse = await fetch(collectionUrl, {\r\n method: 'GET',\r\n credentials: 'include',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n });\r\n if (!httpResponse.ok) {\r\n throw httpResponse;\r\n }\r\n const storedItems = await httpResponse.json();\r\n // console.log('rows', rows, 'data', result.data);\r\n\r\n // collecting logs\r\n const logs: ILog[] = [];\r\n // required fields\r\n requiredFieldKeys.forEach(key => {\r\n if (!itemKeys.includes(key) || itemOptionalKeys.includes(key)) {\r\n addLog(logs, key, ImportLogType.Required);\r\n }\r\n });\r\n // optional fields\r\n optionalFieldKeys.forEach(key => {\r\n if (!itemKeys.includes(key)) {\r\n addLog(logs, key, ImportLogType.Optional);\r\n }\r\n });\r\n // deep check values\r\n for (const key of itemKeys) {\r\n if (fieldKeys.includes(key)) {\r\n const field = collectionConfig.fields.find(x => 'name' in x && x['name'] === key);\r\n if (field) {\r\n const validate = 'validate' in field ? field['validate'] : undefined;\r\n const values: (string | number | boolean | Date | undefined)[] = [];\r\n const storedValues = uniqueFieldKeys.includes(key) ? storedItems.map((x: any) => x[key]) : [];\r\n for (const item of items) {\r\n const value = item[key];\r\n // validate field\r\n if (typeof validate === 'function') {\r\n const validation = await validate(value, {\r\n data: item,\r\n siblingData: item,\r\n operation: 'create',\r\n user,\r\n t,\r\n });\r\n if (validation !== true) {\r\n // console.log(key, value, validation, item);\r\n if (logs.find(x =>\r\n x.key === 'key' &&\r\n x.type === ImportLogType.Invalid\r\n ) === undefined) {\r\n addLog(logs, key, ImportLogType.Invalid, validation as string);\r\n }\r\n }\r\n }\r\n // unique field\r\n if (uniqueFieldKeys.includes(key) && (\r\n values.includes(value) ||\r\n (importMode === ImportMode.Append ? storedValues.includes(value) : false)\r\n )) {\r\n addLog(logs, key, ImportLogType.Duplicate, String(value));\r\n }\r\n values.push(value);\r\n }\r\n }\r\n } else {\r\n addLog(logs, key, ImportLogType.Unexpected);\r\n }\r\n }\r\n\r\n const sortOrder = Object.values(ImportLogType);\r\n logs.sort((a, b) => {\r\n return sortOrder.indexOf(a.type) - sortOrder.indexOf(b.type);\r\n });\r\n\r\n setItems(items);\r\n setLogs(logs);\r\n\r\n const errors = logs.filter(x => ImportLogInvalidTypes.includes(x.type));\r\n if (errors.length === 0) {\r\n setValid(true);\r\n }\r\n\r\n // console.log(logs, items, itemKeys, itemOptionalKeys, fieldKeys, requiredFieldKeys, optionalFieldKeys);\r\n\r\n } catch (error) {\r\n console.log('parse error', error);\r\n setError(error as Error);\r\n }\r\n }, [collectionUrl, importMode, dataParsing, parser, collectionConfig.fields, t, user]);\r\n\r\n useEffect(() => {\r\n if (keys && data) {\r\n validate(keys, data);\r\n }\r\n }, [keys, data, importMode, validate]);\r\n\r\n const onDrop = useCallback((acceptedFiles: File[]) => {\r\n const acceptedFile = acceptedFiles.find(() => true);\r\n if (acceptedFile) {\r\n const reader = new FileReader();\r\n reader.onabort = () => console.log('file reading was aborted');\r\n reader.onerror = () => console.log('file reading has failed');\r\n reader.onload = () => {\r\n // Do whatever you want with the file contents\r\n const csv = reader.result as string;\r\n // console.log('csv', csv);\r\n // parsing csv to { data:[][] }\r\n const result = Papa.parse(csv);\r\n const resultData: string[][] = result.data as string[][];\r\n // collecting imported keys & data\r\n let keys: string[] = [];\r\n const data: IRow[] = resultData.reduce((p, c, i) => {\r\n if (i === 0) {\r\n keys = c;\r\n } else {\r\n const item: Record<string, string> = {};\r\n keys.forEach((key, k) => {\r\n if (c[k] !== undefined) {\r\n item[key] = c[k];\r\n }\r\n });\r\n p.push(item);\r\n }\r\n return p;\r\n }, [] as IRow[]);\r\n setName(acceptedFile.name);\r\n setCSV(csv);\r\n setKeys(keys);\r\n setData(data);\r\n setDirty(true);\r\n };\r\n // reader.readAsArrayBuffer(file);\r\n reader.readAsText(acceptedFile);\r\n }\r\n }, []);\r\n\r\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\r\n accept: {\r\n 'text/csv': [],\r\n },\r\n maxSize: 1048576 * 20,\r\n maxFiles: 1,\r\n onDrop,\r\n });\r\n\r\n const onSubmit = async () => {\r\n // console.log('ImportModal.onSubmit');\r\n try {\r\n const url = routeResolver.api(`/${collectionConfig.slug}/import?locale=${locale}&mode=${importMode}`);\r\n\r\n const httpResponse = await fetch(url, {\r\n method: 'POST',\r\n body: JSON.stringify({ items }),\r\n credentials: 'include',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n });\r\n\r\n if (!httpResponse.ok) {\r\n throw httpResponse;\r\n }\r\n\r\n const response = await httpResponse.json();\r\n // console.log('ImportModal.onSubmit', response);\r\n toast.success(t('importExport:success'));\r\n closeAllModals();\r\n\r\n } catch (error) {\r\n console.log('ImportModal.onSubmit.error', error);\r\n toast.error(format(t('importExport:failure'), collectionConfig.slug));\r\n }\r\n };\r\n\r\n const onClose = () => {\r\n // console.log('onClose');\r\n closeAllModals();\r\n };\r\n\r\n const onClear = () => {\r\n // console.log('onClear');\r\n setValid(false);\r\n setDirty(false);\r\n setName(null);\r\n setCSV(null);\r\n setKeys(null);\r\n setData(null);\r\n setItems([]);\r\n setLogs([]);\r\n };\r\n\r\n return (\r\n <MinimalTemplate>\r\n <header className={`${baseClass}__header`}>\r\n <h3>{t('importExport:modalTitle')}</h3>\r\n <Button buttonStyle=\"none\" onClick={onClose}><XIcon /></Button>\r\n </header>\r\n <main className={`${baseClass}__main`}>\r\n <Form onSubmit={onSubmit}>\r\n <div className=\"render-fields\">\r\n <SelectInput\r\n // isClearable={viewType === 'list'}\r\n label={t('importExport:importMode')}\r\n name=\"importMode\"\r\n path={'importMode'}\r\n options={importModes}\r\n onChange={onSelectDidChange}\r\n />\r\n {typeof parser === 'function' && (\r\n <CheckboxInput\r\n label={t('importExport:enableDataParsing')}\r\n id=\"importMode\"\r\n name=\"dataParsing\"\r\n onToggle={onCheckboxkDidChange}\r\n />\r\n )}\r\n </div>\r\n {data ? (\r\n <>\r\n <div dangerouslySetInnerHTML={{ __html: format(t('importExport:records'), items.length, name) }} ></div>\r\n {logs.length > 0 && (\r\n <ul className={`${baseClass}__logs`}>\r\n {logs.map((log, i) => (\r\n <li key={`log-${i}`} className={`${baseClass}__log ${baseClass}__log--${log.type}`}>\r\n {log.count} {log.message} <i>{log.invalid}</i>\r\n </li>\r\n ))}\r\n </ul>\r\n )}\r\n </>\r\n ) : (\r\n <div className={`${baseClass}__dropzone`} {...getRootProps()}>\r\n <input className={`${baseClass}__input`} {...getInputProps()} />\r\n {isDragActive ? (\r\n <div>{t('importExport:dropTitle')}</div>\r\n ) : (\r\n <div>{t('importExport:dropAbstract')}</div>\r\n )}\r\n </div>\r\n )}\r\n {error && (\r\n <>\r\n <div>{t('importExport:parseError')}</div>\r\n {error.message && <div>{error.message}</div>}\r\n </>\r\n )}\r\n <div className={`${baseClass}__foot`}>\r\n {dirty && <Button type=\"button\" buttonStyle=\"secondary\" onClick={onClear}>\r\n {t('importExport:clear')}\r\n </Button>}\r\n <Button type=\"submit\" disabled={!valid}>\r\n {t('importExport:submit')}\r\n </Button>\r\n </div>\r\n </Form>\r\n </main>\r\n </MinimalTemplate>\r\n );\r\n};\r\n\r\nfunction once<T extends IEntity = IEntity>(items: T[], item: T): T {\r\n const exhistingItem = items.find(x => x.id === item.id);\r\n if (exhistingItem) {\r\n return exhistingItem;\r\n }\r\n items.push(item);\r\n return item;\r\n}\r\n"],"names":["MinimalTemplate","Button","CheckboxInput","Form","SelectInput","XIcon","toast","useAuth","useConfig","useLocale","useModal","useTranslation","getRouteResolver","Papa","React","useCallback","useEffect","useState","useDropzone","ImportLogInvalidTypes","ImportLogType","ImportMode","INITIAL_DATA","importMode","Append","dataParsing","baseClass","ImportModal","parser","slug","closeAllModals","config","getEntityConfig","collectionConfig","collectionSlug","routeResolver","collectionUrl","api","t","format","text","rest","replace","m","g","i","parseInt","length","String","code","locale","user","dirty","setDirty","valid","setValid","error","setError","name","setName","csv","setCSV","keys","setKeys","data","setData","items","setItems","logs","setLogs","setImportMode","setDataParsing","importModes","Object","entries","map","k","v","value","label","onSelectDidChange","option","Array","isArray","onCheckboxkDidChange","event","validate","messageByType","key","type","message","Required","Optional","Invalid","Duplicate","Unexpected","addLog","invalid","id","log","once","count","itemOptionalKeys","itemKeys","fields","filter","x","undefined","fieldKeys","requiredFields","Update","uniqueFields","requiredFieldKeys","optionalFieldKeys","includes","uniqueFieldKeys","valueParsers","parseValue","item","field","find","Boolean","Date","Number","row","forEach","push","httpResponse","fetch","method","credentials","headers","ok","storedItems","json","values","storedValues","validation","siblingData","operation","sortOrder","sort","a","b","indexOf","errors","console","onDrop","acceptedFiles","acceptedFile","reader","FileReader","onabort","onerror","onload","result","parse","resultData","reduce","p","c","readAsText","getRootProps","getInputProps","isDragActive","accept","maxSize","maxFiles","onSubmit","url","body","JSON","stringify","response","success","onClose","onClear","header","className","h3","buttonStyle","onClick","main","div","path","options","onChange","onToggle","dangerouslySetInnerHTML","__html","ul","li","input","disabled","exhistingItem"],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
@use "sass:math";
|
|
2
|
+
|
|
3
|
+
.import-modal {
|
|
4
|
+
|
|
5
|
+
&__header {
|
|
6
|
+
width: 100%;
|
|
7
|
+
display: flex;
|
|
8
|
+
justify-content: space-between;
|
|
9
|
+
margin: 0 0 0.6rem 0;
|
|
10
|
+
|
|
11
|
+
h3 {
|
|
12
|
+
display: flex;
|
|
13
|
+
gap: 0.5em;
|
|
14
|
+
margin: 0;
|
|
15
|
+
|
|
16
|
+
svg {
|
|
17
|
+
width: 1em;
|
|
18
|
+
height: 1em;
|
|
19
|
+
fill: currentColor;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
&__main {
|
|
25
|
+
|
|
26
|
+
.rich-text__editor {
|
|
27
|
+
overflow-x: hidden;
|
|
28
|
+
overflow-y: auto;
|
|
29
|
+
max-height: Max(160px, calc(100vh - 650px));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
&__foot {
|
|
34
|
+
display: flex;
|
|
35
|
+
gap: 2rem;
|
|
36
|
+
|
|
37
|
+
&>.btn,
|
|
38
|
+
&>.form-submit {
|
|
39
|
+
flex: 1 1 calc(50% - 1rem);
|
|
40
|
+
|
|
41
|
+
&>.btn {
|
|
42
|
+
width: 100%;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
&__dropzone {
|
|
48
|
+
text-align: center;
|
|
49
|
+
padding: 20px;
|
|
50
|
+
margin-top: var(--base);
|
|
51
|
+
border: 3px #2f2f2f dashed;
|
|
52
|
+
width: 100%;
|
|
53
|
+
height: 150px;
|
|
54
|
+
display: flex;
|
|
55
|
+
justify-content: center;
|
|
56
|
+
align-items: center;
|
|
57
|
+
line-height: 1;
|
|
58
|
+
cursor: pointer;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
&__logs {
|
|
62
|
+
display: flex;
|
|
63
|
+
flex-direction: column;
|
|
64
|
+
row-gap: 5px;
|
|
65
|
+
list-style: none;
|
|
66
|
+
padding: 0;
|
|
67
|
+
margin: 1em 0 0 0;
|
|
68
|
+
line-height: 1.4;
|
|
69
|
+
padding: 1rem;
|
|
70
|
+
border: 2px solid #2f2f2f;
|
|
71
|
+
border-radius: 8px;
|
|
72
|
+
max-height: 150px;
|
|
73
|
+
overflow-y: auto;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
&__log {
|
|
77
|
+
padding: 0;
|
|
78
|
+
|
|
79
|
+
&--duplicate {
|
|
80
|
+
color: red;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
&--invalid {
|
|
84
|
+
color: red;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
&--required {
|
|
88
|
+
color: red;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
&--unexpected {
|
|
92
|
+
color: orange;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
&--optional {
|
|
96
|
+
color: grey;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/ImportExport/types.ts"],"sourcesContent":["export type IImportItem = Record<string, string | number | boolean | Date>;\r\n"],"names":[],"mappings":"AAAA,WAA2E"}
|