@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 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/collections/Template.ts"],"sourcesContent":["import { hasRole, isAdmin, isRole } from '../core';\r\nimport { BowlCollection, BowlOptions, roles } from '../types';\r\n\r\nexport const Template = (options: BowlOptions): BowlCollection => ({\r\n type: 'withCollection',\r\n slug: options.slug.template,\r\n admin: {\r\n group: options.group.config,\r\n useAsTitle: 'name',\r\n defaultColumns: ['name', 'id'],\r\n hidden: (args) => !hasRole(args.user, roles.Admin),\r\n },\r\n access: {\r\n create: isAdmin,\r\n read: isRole(),\r\n update: isAdmin,\r\n delete: isAdmin,\r\n },\r\n fields: [\r\n // inherited fields: id, createdAt, updatedAt\r\n { type: 'withId', required: true },\r\n { type: 'withName', required: true },\r\n // !!! todo withSelect ?\r\n {\r\n name: 'compatibleCollections',\r\n label: 'Compatible pages',\r\n type: 'select',\r\n hasMany: true,\r\n admin: {\r\n isClearable: true,\r\n },\r\n options: (() => {\r\n const selectOptions = options.pages.map(slug => ({\r\n value: slug,\r\n label: slug,\r\n }));\r\n if (selectOptions.length > 0) {\r\n return selectOptions;\r\n } else {\r\n return [{\r\n value: '',\r\n label: 'none',\r\n }];\r\n }\r\n })(),\r\n },\r\n // !!! todo withCheckbox ?\r\n {\r\n name: 'hasCompatibleCollections',\r\n type: 'checkbox',\r\n admin: {\r\n disabled: true,\r\n },\r\n hooks: {\r\n beforeChange: [\r\n ({ data }) => {\r\n if (data?.compatibleCollections && data.compatibleCollections.length > 0) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n },\r\n ],\r\n },\r\n },\r\n ],\r\n});\r\n"],"names":["hasRole","isAdmin","isRole","roles","Template","options","type","slug","template","admin","group","config","useAsTitle","defaultColumns","hidden","args","user","Admin","access","create","read","update","delete","fields","required","name","label","hasMany","isClearable","selectOptions","pages","map","value","length","disabled","hooks","beforeChange","data","compatibleCollections"],"mappings":"AAAA,SAASA,OAAO,EAAEC,OAAO,EAAEC,MAAM,QAAQ,UAAU;AACnD,SAAsCC,KAAK,QAAQ,WAAW;AAE9D,OAAO,MAAMC,WAAW,CAACC,UAA0C,CAAA;QACjEC,MAAM;QACNC,MAAMF,QAAQE,IAAI,CAACC,QAAQ;QAC3BC,OAAO;YACLC,OAAOL,QAAQK,KAAK,CAACC,MAAM;YAC3BC,YAAY;YACZC,gBAAgB;gBAAC;gBAAQ;aAAK;YAC9BC,QAAQ,CAACC,OAAS,CAACf,QAAQe,KAAKC,IAAI,EAAEb,MAAMc,KAAK;QACnD;QACAC,QAAQ;YACNC,QAAQlB;YACRmB,MAAMlB;YACNmB,QAAQpB;YACRqB,QAAQrB;QACV;QACAsB,QAAQ;YACN,6CAA6C;YAC7C;gBAAEjB,MAAM;gBAAUkB,UAAU;YAAK;YACjC;gBAAElB,MAAM;gBAAYkB,UAAU;YAAK;YACnC,wBAAwB;YACxB;gBACEC,MAAM;gBACNC,OAAO;gBACPpB,MAAM;gBACNqB,SAAS;gBACTlB,OAAO;oBACLmB,aAAa;gBACf;gBACAvB,SAAS,AAAC,CAAA;oBACR,MAAMwB,gBAAgBxB,QAAQyB,KAAK,CAACC,GAAG,CAACxB,CAAAA,OAAS,CAAA;4BAC/CyB,OAAOzB;4BACPmB,OAAOnB;wBACT,CAAA;oBACA,IAAIsB,cAAcI,MAAM,GAAG,GAAG;wBAC5B,OAAOJ;oBACT,OAAO;wBACL,OAAO;4BAAC;gCACNG,OAAO;gCACPN,OAAO;4BACT;yBAAE;oBACJ;gBACF,CAAA;YACF;YACA,0BAA0B;YAC1B;gBACED,MAAM;gBACNnB,MAAM;gBACNG,OAAO;oBACLyB,UAAU;gBACZ;gBACAC,OAAO;oBACLC,cAAc;wBACZ,CAAC,EAAEC,IAAI,EAAE;4BACP,IAAIA,MAAMC,yBAAyBD,KAAKC,qBAAqB,CAACL,MAAM,GAAG,GAAG;gCACxE,OAAO;4BACT,OAAO;gCACL,OAAO;4BACT;wBACF;qBACD;gBACH;YACF;SACD;IACH,CAAA,EAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/collections/Users.ts"],"sourcesContent":["import { BowlCollection, BowlOptions } from '../types';\r\n\r\nexport const Users = (options: BowlOptions): BowlCollection => ({\r\n type: 'withUser',\r\n slug: options.slug.users,\r\n fields: [\r\n {\r\n type: 'withRoles',\r\n },\r\n /*\r\n {\r\n type: 'withTenants',\r\n relationTo: ['someCollection'],\r\n },\r\n */\r\n ],\r\n});\r\n"],"names":["Users","options","type","slug","users","fields"],"mappings":"AAEA,OAAO,MAAMA,QAAQ,CAACC,UAA0C,CAAA;QAC9DC,MAAM;QACNC,MAAMF,QAAQE,IAAI,CAACC,KAAK;QACxBC,QAAQ;YACN;gBACEH,MAAM;YACR;SAOD;IACH,CAAA,EAAG"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { Link, useConfig } from '@payloadcms/ui';
|
|
4
|
+
import { getClassNames } from '@websolutespa/bom-core';
|
|
5
|
+
import { usePathname } from 'next/navigation';
|
|
6
|
+
import React from 'react';
|
|
7
|
+
export const CategoryMenu = (props)=>{
|
|
8
|
+
const { collectionSlug } = props;
|
|
9
|
+
const slug = collectionSlug;
|
|
10
|
+
const { config } = useConfig();
|
|
11
|
+
const { routes } = config;
|
|
12
|
+
const pathname = usePathname();
|
|
13
|
+
const items = [
|
|
14
|
+
{
|
|
15
|
+
name: 'List',
|
|
16
|
+
url: `${routes.admin}/collections/${slug}`
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
name: 'Tree',
|
|
20
|
+
url: `${routes.admin}/tree/${slug}`
|
|
21
|
+
}
|
|
22
|
+
];
|
|
23
|
+
const isActive = (url)=>{
|
|
24
|
+
// console.log('isActive', pathname, url);
|
|
25
|
+
return pathname === url;
|
|
26
|
+
};
|
|
27
|
+
return /*#__PURE__*/ _jsx("div", {
|
|
28
|
+
className: "category-menu",
|
|
29
|
+
children: /*#__PURE__*/ _jsx("div", {
|
|
30
|
+
className: "tabs-field__tabs-wrap",
|
|
31
|
+
children: /*#__PURE__*/ _jsx("div", {
|
|
32
|
+
className: "tabs-field__tabs",
|
|
33
|
+
children: items.map((item, i)=>/*#__PURE__*/ _jsx(Link, {
|
|
34
|
+
className: getClassNames('tabs-field__tab-button', {
|
|
35
|
+
'tabs-field__tab-button--active': isActive(item.url)
|
|
36
|
+
}),
|
|
37
|
+
href: item.url,
|
|
38
|
+
children: /*#__PURE__*/ _jsx("span", {
|
|
39
|
+
children: item.name
|
|
40
|
+
})
|
|
41
|
+
}, i))
|
|
42
|
+
})
|
|
43
|
+
})
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
//# sourceMappingURL=CategoryMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/Category/CategoryMenu.tsx"],"sourcesContent":["'use client';\r\n\r\nimport { Link, useConfig } from '@payloadcms/ui';\r\nimport { getClassNames } from '@websolutespa/bom-core';\r\nimport { usePathname } from 'next/navigation';\r\nimport { CollectionSlug } from 'payload';\r\nimport React from 'react';\r\n\r\nexport type CategoryMenuProps = {\r\n collectionSlug: CollectionSlug; // 'category';\r\n hasCreatePermission?: boolean; // true;\r\n newDocumentURL?: string; // '/admin/collections/category/create'\r\n};\r\n\r\nexport const CategoryMenu: React.FC<CategoryMenuProps> = (props) => {\r\n const { collectionSlug } = props;\r\n const slug = collectionSlug;\r\n const { config } = useConfig();\r\n const { routes } = config;\r\n const pathname = usePathname();\r\n const items = [\r\n {\r\n name: 'List',\r\n url: `${routes.admin}/collections/${slug}`,\r\n }, {\r\n name: 'Tree',\r\n url: `${routes.admin}/tree/${slug}`,\r\n },\r\n ];\r\n const isActive = ((url: string) => {\r\n // console.log('isActive', pathname, url);\r\n return pathname === url;\r\n });\r\n return (\r\n <div className=\"category-menu\">\r\n <div className=\"tabs-field__tabs-wrap\">\r\n <div className=\"tabs-field__tabs\">\r\n {items.map((item, i) => (\r\n <Link\r\n key={i}\r\n className={getClassNames('tabs-field__tab-button', { 'tabs-field__tab-button--active': isActive(item.url) })}\r\n href={item.url}\r\n >\r\n <span>{item.name}</span>\r\n </Link>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n"],"names":["Link","useConfig","getClassNames","usePathname","React","CategoryMenu","props","collectionSlug","slug","config","routes","pathname","items","name","url","admin","isActive","div","className","map","item","i","href","span"],"mappings":"AAAA;;AAEA,SAASA,IAAI,EAAEC,SAAS,QAAQ,iBAAiB;AACjD,SAASC,aAAa,QAAQ,yBAAyB;AACvD,SAASC,WAAW,QAAQ,kBAAkB;AAE9C,OAAOC,WAAW,QAAQ;AAQ1B,OAAO,MAAMC,eAA4C,CAACC;IACxD,MAAM,EAAEC,cAAc,EAAE,GAAGD;IAC3B,MAAME,OAAOD;IACb,MAAM,EAAEE,MAAM,EAAE,GAAGR;IACnB,MAAM,EAAES,MAAM,EAAE,GAAGD;IACnB,MAAME,WAAWR;IACjB,MAAMS,QAAQ;QACZ;YACEC,MAAM;YACNC,KAAK,CAAC,EAAEJ,OAAOK,KAAK,CAAC,aAAa,EAAEP,KAAK,CAAC;QAC5C;QAAG;YACDK,MAAM;YACNC,KAAK,CAAC,EAAEJ,OAAOK,KAAK,CAAC,MAAM,EAAEP,KAAK,CAAC;QACrC;KACD;IACD,MAAMQ,WAAY,CAACF;QACjB,0CAA0C;QAC1C,OAAOH,aAAaG;IACtB;IACA,qBACE,KAACG;QAAIC,WAAU;kBACb,cAAA,KAACD;YAAIC,WAAU;sBACb,cAAA,KAACD;gBAAIC,WAAU;0BACZN,MAAMO,GAAG,CAAC,CAACC,MAAMC,kBAChB,KAACrB;wBAECkB,WAAWhB,cAAc,0BAA0B;4BAAE,kCAAkCc,SAASI,KAAKN,GAAG;wBAAE;wBAC1GQ,MAAMF,KAAKN,GAAG;kCAEd,cAAA,KAACS;sCAAMH,KAAKP,IAAI;;uBAJXQ;;;;AAWnB,EAAE"}
|
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { FormSubmit, Gutter, Link, ListHeader, Popup, ViewDescription, toast, useAuth, useConfig, useDocumentDrawer, useLocale, useTranslation } from '@payloadcms/ui';
|
|
4
|
+
import { getRouteResolver } from '@websolutespa/payload-utils';
|
|
5
|
+
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
6
|
+
import { options } from '../../options';
|
|
7
|
+
import { DataTree } from '../DataTree/DataTree';
|
|
8
|
+
import LeaveWithoutSaving from '../LeaveWithoutSaving/LeaveWithoutSaving';
|
|
9
|
+
import { ROOT_ITEM, getNewCategoriesFromChanges } from './category.service';
|
|
10
|
+
import { CategoryMenu } from './CategoryMenu';
|
|
11
|
+
import './CategoryTree.scss';
|
|
12
|
+
// https://rct.lukasbach.com/docs/getstarted
|
|
13
|
+
const USE_BULK_UPDATE = true;
|
|
14
|
+
function CategoryTreeConflict({ conflicts }) {
|
|
15
|
+
const { config } = useConfig();
|
|
16
|
+
const { routes: { admin: adminRoute } } = config;
|
|
17
|
+
const summaryConflicts = useMemo(()=>{
|
|
18
|
+
const summaryConflicts = [];
|
|
19
|
+
const getRouteKey = (routes)=>{
|
|
20
|
+
return routes.map((x)=>`${x.schema}-${x.page}`).join('_');
|
|
21
|
+
};
|
|
22
|
+
conflicts.forEach((routes)=>{
|
|
23
|
+
const routeKey = getRouteKey(routes);
|
|
24
|
+
if (summaryConflicts.find((x)=>getRouteKey(x) === routeKey) === undefined) {
|
|
25
|
+
summaryConflicts.push(routes);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
return summaryConflicts;
|
|
29
|
+
}, [
|
|
30
|
+
conflicts
|
|
31
|
+
]);
|
|
32
|
+
return /*#__PURE__*/ _jsx("span", {
|
|
33
|
+
className: "category__conflicts",
|
|
34
|
+
children: summaryConflicts.length > 0 && /*#__PURE__*/ _jsx(Popup, {
|
|
35
|
+
button: /*#__PURE__*/ _jsx("span", {
|
|
36
|
+
className: "category__conflict",
|
|
37
|
+
children: "conflict detected"
|
|
38
|
+
}),
|
|
39
|
+
buttonType: "custom",
|
|
40
|
+
className: 'category-popup',
|
|
41
|
+
horizontalAlign: "left",
|
|
42
|
+
size: "large",
|
|
43
|
+
verticalAlign: "bottom",
|
|
44
|
+
children: /*#__PURE__*/ _jsx("div", {
|
|
45
|
+
className: 'category-popup__content',
|
|
46
|
+
children: summaryConflicts.map((routes, c)=>/*#__PURE__*/ _jsxs("div", {
|
|
47
|
+
className: 'category-popup__card',
|
|
48
|
+
children: [
|
|
49
|
+
/*#__PURE__*/ _jsxs("h4", {
|
|
50
|
+
children: [
|
|
51
|
+
/*#__PURE__*/ _jsxs("span", {
|
|
52
|
+
children: [
|
|
53
|
+
"Conflict ",
|
|
54
|
+
c + 1
|
|
55
|
+
]
|
|
56
|
+
}),
|
|
57
|
+
" ",
|
|
58
|
+
/*#__PURE__*/ _jsx("small", {
|
|
59
|
+
children: routes.map((r)=>r.schema).join(', ')
|
|
60
|
+
})
|
|
61
|
+
]
|
|
62
|
+
}),
|
|
63
|
+
/*#__PURE__*/ _jsx("ul", {
|
|
64
|
+
children: routes.map((route, r)=>/*#__PURE__*/ _jsxs("li", {
|
|
65
|
+
children: [
|
|
66
|
+
/*#__PURE__*/ _jsxs(Link, {
|
|
67
|
+
className: "category-popup__link btn btn--style-secondary",
|
|
68
|
+
id: 'action-edit',
|
|
69
|
+
href: `${adminRoute}/collections/${route.schema}/${route.page}`,
|
|
70
|
+
children: [
|
|
71
|
+
/*#__PURE__*/ _jsx("span", {
|
|
72
|
+
children: route.title
|
|
73
|
+
}),
|
|
74
|
+
" ",
|
|
75
|
+
/*#__PURE__*/ _jsx("small", {
|
|
76
|
+
children: route.schema
|
|
77
|
+
})
|
|
78
|
+
]
|
|
79
|
+
}, `link-${r}-${route.page}`),
|
|
80
|
+
/*#__PURE__*/ _jsx("p", {
|
|
81
|
+
className: "category-popup__url",
|
|
82
|
+
children: route.id
|
|
83
|
+
})
|
|
84
|
+
]
|
|
85
|
+
}, `route-${r}-${route.page}`))
|
|
86
|
+
})
|
|
87
|
+
]
|
|
88
|
+
}, `card-${c}`))
|
|
89
|
+
})
|
|
90
|
+
})
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
export const CategoryTree = (props)=>{
|
|
94
|
+
const { slug } = props;
|
|
95
|
+
const { config, getEntityConfig } = useConfig();
|
|
96
|
+
const collectionConfig = getEntityConfig({
|
|
97
|
+
collectionSlug: slug
|
|
98
|
+
});
|
|
99
|
+
const { code: locale } = useLocale();
|
|
100
|
+
const { t, i18n } = useTranslation();
|
|
101
|
+
const { permissions, user } = useAuth();
|
|
102
|
+
const dataTreeRef = useRef(null);
|
|
103
|
+
const [categories, setCategories] = useState(null);
|
|
104
|
+
const [items, setItems] = useState(null);
|
|
105
|
+
const [changes, setChanges] = useState(null);
|
|
106
|
+
const [dirty, setDirty] = useState(false);
|
|
107
|
+
const [id, setId] = useState(null);
|
|
108
|
+
const routeResolver = getRouteResolver(config);
|
|
109
|
+
useEffect(()=>{
|
|
110
|
+
const getData = async ()=>{
|
|
111
|
+
try {
|
|
112
|
+
const search = `?pagination=false&depth=0&locale=${locale}`;
|
|
113
|
+
const url = routeResolver.api(`/${options.slug.category}${search}`);
|
|
114
|
+
const httpResponse = await fetch(url, {
|
|
115
|
+
method: 'GET',
|
|
116
|
+
credentials: 'include',
|
|
117
|
+
headers: {
|
|
118
|
+
'Content-Type': 'application/json'
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
if (!httpResponse.ok) {
|
|
122
|
+
throw httpResponse;
|
|
123
|
+
}
|
|
124
|
+
const categories = await httpResponse.json();
|
|
125
|
+
categories.sort((a, b)=>{
|
|
126
|
+
return (a.order || 0) - (b.order || 0);
|
|
127
|
+
});
|
|
128
|
+
// const rootCategory: ICategory | undefined = getRootCategory(categories);
|
|
129
|
+
const children = categories.filter((x)=>x.category == null || x.category === x.id || x.category === ROOT_ITEM).map((x)=>x.id);
|
|
130
|
+
const items = {};
|
|
131
|
+
items[ROOT_ITEM] = {
|
|
132
|
+
index: ROOT_ITEM,
|
|
133
|
+
data: {
|
|
134
|
+
title: ROOT_ITEM,
|
|
135
|
+
conflicts: []
|
|
136
|
+
},
|
|
137
|
+
// children: rootCategory ? [rootCategory.id] : [],
|
|
138
|
+
children,
|
|
139
|
+
isFolder: true,
|
|
140
|
+
canMove: false,
|
|
141
|
+
canRename: false
|
|
142
|
+
};
|
|
143
|
+
categories.forEach((x)=>{
|
|
144
|
+
// const isTopCategory = x.id === firstTopCategory?.id;
|
|
145
|
+
const children = categories.filter((child)=>child.category === x.id && child.id !== x.id).sort((a, b)=>{
|
|
146
|
+
return (a.order || 0) - (b.order || 0);
|
|
147
|
+
}).map((x)=>x.id);
|
|
148
|
+
items[x.id] = {
|
|
149
|
+
index: x.id,
|
|
150
|
+
data: {
|
|
151
|
+
title: x.title,
|
|
152
|
+
conflicts: []
|
|
153
|
+
},
|
|
154
|
+
children,
|
|
155
|
+
isFolder: true,
|
|
156
|
+
canRename: true,
|
|
157
|
+
canMove: true
|
|
158
|
+
};
|
|
159
|
+
});
|
|
160
|
+
setCategories(categories);
|
|
161
|
+
setItems({
|
|
162
|
+
...items
|
|
163
|
+
});
|
|
164
|
+
// console.log('CategoryTree.getData', 'categories', categories, 'items', items);
|
|
165
|
+
// console.log('CategoryTree', 'items', items);
|
|
166
|
+
} catch (error) {
|
|
167
|
+
console.log('CategoryTree.getData.error', error);
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
getData();
|
|
171
|
+
}, [
|
|
172
|
+
locale
|
|
173
|
+
]);
|
|
174
|
+
const [DocumentDrawer, , { isDrawerOpen, openDrawer }] = useDocumentDrawer({
|
|
175
|
+
collectionSlug: slug,
|
|
176
|
+
id
|
|
177
|
+
});
|
|
178
|
+
const openDrawerRef = useRef(false);
|
|
179
|
+
useEffect(()=>{
|
|
180
|
+
if (openDrawerRef.current) {
|
|
181
|
+
openDrawer();
|
|
182
|
+
openDrawerRef.current = false;
|
|
183
|
+
}
|
|
184
|
+
}, [
|
|
185
|
+
openDrawer,
|
|
186
|
+
id
|
|
187
|
+
]);
|
|
188
|
+
const onChange = (changes)=>{
|
|
189
|
+
// console.log('onChange', changes);
|
|
190
|
+
setChanges(changes);
|
|
191
|
+
setDirty(true);
|
|
192
|
+
// console.log(JSON.stringify(items) !== JSON.stringify(changes));
|
|
193
|
+
};
|
|
194
|
+
const onEdit = (items, treeId)=>{
|
|
195
|
+
// console.log('onEdit', items, treeId, items.index);
|
|
196
|
+
if (typeof items.index === 'string') {
|
|
197
|
+
openDrawerRef.current = true;
|
|
198
|
+
setId(items.index);
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
const onSubmit = async ()=>{
|
|
202
|
+
// console.log('onSubmit', changes);
|
|
203
|
+
if (!categories || !changes) {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
const newCategories = getNewCategoriesFromChanges(categories, changes);
|
|
207
|
+
const updateCategory = async (item)=>{
|
|
208
|
+
// console.log('updateCategory', item);
|
|
209
|
+
try {
|
|
210
|
+
const search = `?depth=0&locale=${locale}&fallback-locale=null`;
|
|
211
|
+
const url = routeResolver.api(`/${slug}/${item.id}${search}`);
|
|
212
|
+
const httpResponse = await fetch(url, {
|
|
213
|
+
method: 'PATCH',
|
|
214
|
+
body: JSON.stringify({
|
|
215
|
+
id: item.id,
|
|
216
|
+
category: item.category,
|
|
217
|
+
order: item.order
|
|
218
|
+
}),
|
|
219
|
+
credentials: 'include',
|
|
220
|
+
headers: {
|
|
221
|
+
'Content-Type': 'application/json'
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
if (!httpResponse.ok) {
|
|
225
|
+
throw httpResponse;
|
|
226
|
+
}
|
|
227
|
+
const response = await httpResponse.json();
|
|
228
|
+
// console.log('updateCategory', response);
|
|
229
|
+
return response;
|
|
230
|
+
} catch (error) {
|
|
231
|
+
console.log('CategoryTree.updateCategory.error', error);
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
if (USE_BULK_UPDATE) {
|
|
235
|
+
try {
|
|
236
|
+
const records = newCategories.map((x)=>({
|
|
237
|
+
action: 'upadate',
|
|
238
|
+
item: {
|
|
239
|
+
id: x.id,
|
|
240
|
+
category: x.category,
|
|
241
|
+
order: x.order
|
|
242
|
+
}
|
|
243
|
+
}));
|
|
244
|
+
const url = routeResolver.api(`/${slug}/bulk/`);
|
|
245
|
+
const httpResponse = await fetch(url, {
|
|
246
|
+
method: 'PATCH',
|
|
247
|
+
body: JSON.stringify(records),
|
|
248
|
+
credentials: 'include',
|
|
249
|
+
headers: {
|
|
250
|
+
'Content-Type': 'application/json'
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
if (!httpResponse.ok) {
|
|
254
|
+
throw httpResponse;
|
|
255
|
+
}
|
|
256
|
+
const categories = await httpResponse.json();
|
|
257
|
+
categories.sort((a, b)=>(a.order || 0) - (b.order || 0));
|
|
258
|
+
// console.log('CategoryTree.onSubmit.success', categories);
|
|
259
|
+
setDirty(false);
|
|
260
|
+
toast.success('Updated successfully.');
|
|
261
|
+
} catch (error) {
|
|
262
|
+
toast.error(`There was an error while saving ${slug}.`);
|
|
263
|
+
console.log('CategoryTree.onSubmit.error', error);
|
|
264
|
+
}
|
|
265
|
+
} else {
|
|
266
|
+
try {
|
|
267
|
+
const promises = newCategories.map((x)=>()=>updateCategory(x));
|
|
268
|
+
const responses = [];
|
|
269
|
+
for (const promise of promises){
|
|
270
|
+
const response = await promise();
|
|
271
|
+
responses.push(response);
|
|
272
|
+
}
|
|
273
|
+
// console.log('CategoryTree.onSubmit.success', responses);
|
|
274
|
+
toast.success('Updated successfully.');
|
|
275
|
+
} catch (error) {
|
|
276
|
+
toast.error(`There was an error while saving ${slug}.`);
|
|
277
|
+
console.log('CategoryTree.onSubmit.error', error);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
};
|
|
281
|
+
useEffect(()=>{
|
|
282
|
+
if (!categories) {
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
const getPostData = (changes)=>{
|
|
286
|
+
const payload = Object.fromEntries(Object.entries(changes).map(([k, v])=>[
|
|
287
|
+
k,
|
|
288
|
+
{
|
|
289
|
+
index: v.index,
|
|
290
|
+
children: v.children
|
|
291
|
+
}
|
|
292
|
+
]));
|
|
293
|
+
return payload;
|
|
294
|
+
};
|
|
295
|
+
const getRoutes = async ()=>{
|
|
296
|
+
try {
|
|
297
|
+
const postData = changes ? getPostData(changes) : undefined;
|
|
298
|
+
const search = '';
|
|
299
|
+
const url = routeResolver.api(`/route/changes${search}`);
|
|
300
|
+
const httpResponse = await fetch(url, {
|
|
301
|
+
method: 'POST',
|
|
302
|
+
body: postData ? JSON.stringify(postData) : undefined,
|
|
303
|
+
credentials: 'include',
|
|
304
|
+
headers: {
|
|
305
|
+
'Content-Type': 'application/json'
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
if (!httpResponse.ok) {
|
|
309
|
+
throw httpResponse;
|
|
310
|
+
}
|
|
311
|
+
const routes = await httpResponse.json();
|
|
312
|
+
return routes;
|
|
313
|
+
} catch (error) {
|
|
314
|
+
console.log('CategoryTree.getRoutes.error', error);
|
|
315
|
+
throw error;
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
getRoutes().then((routes)=>{
|
|
319
|
+
const routeMap = new Map();
|
|
320
|
+
for (const route of routes){
|
|
321
|
+
if (routeMap.has(route.id)) {
|
|
322
|
+
routeMap.get(route.id).push(route);
|
|
323
|
+
} else {
|
|
324
|
+
routeMap.set(route.id, [
|
|
325
|
+
route
|
|
326
|
+
]);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
const conflictingRouteMap = new Map([
|
|
330
|
+
...routeMap
|
|
331
|
+
].filter(([k, v])=>v.length > 1));
|
|
332
|
+
// console.log('CategoryTree.changes.getRoutes', routes);
|
|
333
|
+
// console.log('CategoryTree.changes.routeMap', routeMap);
|
|
334
|
+
// console.log('CategoryTree.changes.conflictingRouteMap', conflictingRouteMap);
|
|
335
|
+
if (items) {
|
|
336
|
+
Object.entries(items).forEach(([k, v])=>{
|
|
337
|
+
v.data.conflicts = [];
|
|
338
|
+
for (const conflict of conflictingRouteMap){
|
|
339
|
+
const routes = conflict[1];
|
|
340
|
+
if (routes.find((x)=>x.category === k)) {
|
|
341
|
+
v.data.conflicts.push(routes);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
// console.log(k, v.data.conflicts);
|
|
345
|
+
v.data.extra = /*#__PURE__*/ _jsx(CategoryTreeConflict, {
|
|
346
|
+
conflicts: v.data.conflicts
|
|
347
|
+
});
|
|
348
|
+
if (dataTreeRef.current) {
|
|
349
|
+
dataTreeRef.current.onSetData(v, v.data);
|
|
350
|
+
}
|
|
351
|
+
});
|
|
352
|
+
// console.log(items);
|
|
353
|
+
setItems({
|
|
354
|
+
...items
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
});
|
|
358
|
+
}, [
|
|
359
|
+
changes,
|
|
360
|
+
categories
|
|
361
|
+
]);
|
|
362
|
+
// const modalKey = `${locale}-localized-field-modal-${path}`;
|
|
363
|
+
// const isModalOpened = isModalOpen(modalSlug);
|
|
364
|
+
const onSave = useCallback((args)=>{
|
|
365
|
+
setId(args.doc.id);
|
|
366
|
+
}, []);
|
|
367
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
368
|
+
className: "collection-list",
|
|
369
|
+
children: [
|
|
370
|
+
/*#__PURE__*/ _jsx(CategoryMenu, {
|
|
371
|
+
collectionSlug: slug
|
|
372
|
+
}),
|
|
373
|
+
/*#__PURE__*/ _jsx(Gutter, {
|
|
374
|
+
children: /*#__PURE__*/ _jsxs("div", {
|
|
375
|
+
className: "collection-list__wrap",
|
|
376
|
+
children: [
|
|
377
|
+
/*#__PURE__*/ _jsx(ListHeader, {
|
|
378
|
+
collectionConfig: collectionConfig,
|
|
379
|
+
Description: /*#__PURE__*/ _jsx("div", {
|
|
380
|
+
className: 'collection-list__sub-header',
|
|
381
|
+
children: collectionConfig.admin?.description && /*#__PURE__*/ _jsx(ViewDescription, {
|
|
382
|
+
collectionSlug: collectionConfig.slug,
|
|
383
|
+
description: collectionConfig.admin.description
|
|
384
|
+
})
|
|
385
|
+
}),
|
|
386
|
+
newDocumentURL: "",
|
|
387
|
+
disableBulkDelete: true,
|
|
388
|
+
disableBulkEdit: true,
|
|
389
|
+
hasCreatePermission: false,
|
|
390
|
+
i18n: i18n,
|
|
391
|
+
isBulkUploadEnabled: false,
|
|
392
|
+
smallBreak: true,
|
|
393
|
+
openBulkUpload: ()=>{},
|
|
394
|
+
onBulkUploadSuccess: ()=>{},
|
|
395
|
+
viewType: "list"
|
|
396
|
+
}),
|
|
397
|
+
items && /*#__PURE__*/ _jsxs(_Fragment, {
|
|
398
|
+
children: [
|
|
399
|
+
/*#__PURE__*/ _jsx(DataTree, {
|
|
400
|
+
ref: dataTreeRef,
|
|
401
|
+
items: items,
|
|
402
|
+
rootItem: ROOT_ITEM,
|
|
403
|
+
onChange: onChange,
|
|
404
|
+
onEdit: onEdit
|
|
405
|
+
}),
|
|
406
|
+
/*#__PURE__*/ _jsx("div", {
|
|
407
|
+
className: "collection-list__foot",
|
|
408
|
+
children: /*#__PURE__*/ _jsx(FormSubmit, {
|
|
409
|
+
type: "button",
|
|
410
|
+
disabled: !dirty,
|
|
411
|
+
onClick: onSubmit,
|
|
412
|
+
children: t('general:save')
|
|
413
|
+
})
|
|
414
|
+
}),
|
|
415
|
+
/*#__PURE__*/ _jsx(LeaveWithoutSaving, {
|
|
416
|
+
modified: dirty
|
|
417
|
+
})
|
|
418
|
+
]
|
|
419
|
+
}),
|
|
420
|
+
id && /*#__PURE__*/ _jsx(DocumentDrawer, {
|
|
421
|
+
onSave: onSave
|
|
422
|
+
})
|
|
423
|
+
]
|
|
424
|
+
})
|
|
425
|
+
})
|
|
426
|
+
]
|
|
427
|
+
});
|
|
428
|
+
};
|
|
429
|
+
|
|
430
|
+
//# sourceMappingURL=CategoryTree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/Category/CategoryTree.tsx"],"sourcesContent":["'use client';\r\n\r\nimport { DocumentDrawerProps, FormSubmit, Gutter, Link, ListHeader, Popup, ViewDescription, toast, useAuth, useConfig, useDocumentDrawer, useLocale, useTranslation } from '@payloadcms/ui';\r\nimport { ICategory, IEquatable, IRoute } from '@websolutespa/bom-core';\r\nimport { getRouteResolver } from '@websolutespa/payload-utils';\r\nimport { CollectionSlug, DefaultDocumentIDType } from 'payload';\r\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\r\nimport { TreeItem } from 'react-complex-tree';\r\nimport { options } from '../../options';\r\nimport { DataTree, DataTreeInstance } from '../DataTree/DataTree';\r\nimport LeaveWithoutSaving from '../LeaveWithoutSaving/LeaveWithoutSaving';\r\nimport { CategoryTreeItem, CategoryTreeItems, ROOT_ITEM, getNewCategoriesFromChanges } from './category.service';\r\nimport { CategoryMenu } from './CategoryMenu';\r\nimport './CategoryTree.scss';\r\n\r\n// https://rct.lukasbach.com/docs/getstarted\r\n\r\nconst USE_BULK_UPDATE = true;\r\n\r\nexport type CategoryTreeConflictProps = {\r\n conflicts: IRoute[][];\r\n};\r\n\r\nexport type RouteConflict = {\r\n schema: string;\r\n page: IEquatable;\r\n template: string;\r\n category: IEquatable;\r\n routes: IRoute[];\r\n};\r\n\r\nfunction CategoryTreeConflict({ conflicts }: CategoryTreeConflictProps) {\r\n const { config } = useConfig();\r\n const { routes: { admin: adminRoute } } = config;\r\n const summaryConflicts = useMemo(() => {\r\n const summaryConflicts: IRoute[][] = [];\r\n const getRouteKey = (routes: IRoute[]): string => {\r\n return routes.map(x => `${x.schema}-${x.page}`).join('_');\r\n };\r\n conflicts.forEach(routes => {\r\n const routeKey = getRouteKey(routes);\r\n if (summaryConflicts.find(x => getRouteKey(x) === routeKey) === undefined) {\r\n summaryConflicts.push(routes);\r\n }\r\n });\r\n return summaryConflicts;\r\n }, [conflicts]);\r\n return (\r\n <span className=\"category__conflicts\">\r\n {summaryConflicts.length > 0 && (\r\n <Popup\r\n button={(\r\n <span className=\"category__conflict\">\r\n conflict detected\r\n </span>\r\n )}\r\n buttonType=\"custom\"\r\n className={'category-popup'}\r\n horizontalAlign=\"left\"\r\n size=\"large\"\r\n verticalAlign=\"bottom\"\r\n >\r\n <div className={'category-popup__content'}>\r\n {summaryConflicts.map((routes, c) => (\r\n <div key={`card-${c}`} className={'category-popup__card'}>\r\n <h4><span>Conflict {c + 1}</span> <small>{routes.map(r => r.schema).join(', ')}</small></h4>\r\n <ul>\r\n {routes.map((route, r) => (\r\n <li key={`route-${r}-${route.page}`}>\r\n <Link\r\n key={`link-${r}-${route.page}`}\r\n className=\"category-popup__link btn btn--style-secondary\"\r\n id={'action-edit'}\r\n href={`${adminRoute}/collections/${route.schema}/${route.page}`}\r\n >\r\n <span>{route.title}</span> <small>{route.schema}</small>\r\n </Link>\r\n <p className=\"category-popup__url\">{route.id}</p>\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n ))}\r\n </div>\r\n </Popup>\r\n )}\r\n </span>\r\n );\r\n}\r\n\r\nexport type CategoryTreeProps = {\r\n slug: CollectionSlug;\r\n};\r\n\r\nexport const CategoryTree: React.FC<CategoryTreeProps> = (props) => {\r\n const { slug } = props;\r\n const { config, getEntityConfig } = useConfig();\r\n const collectionConfig = getEntityConfig({ collectionSlug: slug });\r\n const { code: locale } = useLocale();\r\n const { t, i18n } = useTranslation();\r\n const { permissions, user } = useAuth();\r\n\r\n const dataTreeRef = useRef<DataTreeInstance<CategoryTreeItem>>(null);\r\n\r\n const [categories, setCategories] = useState<ICategory[] | null>(null);\r\n const [items, setItems] = useState<CategoryTreeItems | null>(null);\r\n const [changes, setChanges] = useState<CategoryTreeItems | null>(null);\r\n const [dirty, setDirty] = useState(false);\r\n const [id, setId] = useState<DefaultDocumentIDType | null>(null);\r\n\r\n const routeResolver = getRouteResolver(config);\r\n\r\n useEffect(() => {\r\n const getData = async () => {\r\n try {\r\n const search = `?pagination=false&depth=0&locale=${locale}`;\r\n const url = routeResolver.api(`/${options.slug.category}${search}`);\r\n const httpResponse = await fetch(url, {\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 categories = await httpResponse.json() as ICategory[];\r\n categories.sort((a, b) => {\r\n return (a.order || 0) - (b.order || 0);\r\n });\r\n // const rootCategory: ICategory | undefined = getRootCategory(categories);\r\n const children = categories.filter(x =>\r\n x.category == null ||\r\n x.category === x.id ||\r\n x.category === ROOT_ITEM\r\n ).map(x => x.id);\r\n const items: CategoryTreeItems = {};\r\n items[ROOT_ITEM] = {\r\n index: ROOT_ITEM,\r\n data: {\r\n title: ROOT_ITEM,\r\n conflicts: [],\r\n },\r\n // children: rootCategory ? [rootCategory.id] : [],\r\n children,\r\n isFolder: true,\r\n canMove: false,\r\n canRename: false,\r\n };\r\n categories.forEach(x => {\r\n // const isTopCategory = x.id === firstTopCategory?.id;\r\n const children = categories.filter(child => child.category === x.id && child.id !== x.id).sort((a, b) => {\r\n return (a.order || 0) - (b.order || 0);\r\n }).map(x => x.id);\r\n items[x.id] = {\r\n index: x.id,\r\n data: {\r\n title: x.title as string,\r\n conflicts: [],\r\n },\r\n children,\r\n isFolder: true,\r\n canRename: true,\r\n canMove: true, // !isTopCategory,\r\n };\r\n });\r\n setCategories(categories);\r\n setItems({ ...items });\r\n // console.log('CategoryTree.getData', 'categories', categories, 'items', items);\r\n // console.log('CategoryTree', 'items', items);\r\n } catch (error) {\r\n console.log('CategoryTree.getData.error', error);\r\n }\r\n };\r\n getData();\r\n }, [locale]);\r\n\r\n const [DocumentDrawer, , { isDrawerOpen, openDrawer }] = useDocumentDrawer({\r\n collectionSlug: slug,\r\n id,\r\n });\r\n\r\n const openDrawerRef = useRef(false);\r\n\r\n useEffect(() => {\r\n if (openDrawerRef.current) {\r\n openDrawer();\r\n openDrawerRef.current = false;\r\n }\r\n }, [openDrawer, id]);\r\n\r\n const onChange = (changes: CategoryTreeItems) => {\r\n // console.log('onChange', changes);\r\n setChanges(changes);\r\n setDirty(true);\r\n // console.log(JSON.stringify(items) !== JSON.stringify(changes));\r\n };\r\n\r\n const onEdit = (items: TreeItem<CategoryTreeItem>, treeId: string) => {\r\n // console.log('onEdit', items, treeId, items.index);\r\n if (typeof items.index === 'string') {\r\n openDrawerRef.current = true;\r\n setId(items.index);\r\n }\r\n };\r\n\r\n const onSubmit = async () => {\r\n // console.log('onSubmit', changes);\r\n if (!categories || !changes) {\r\n return;\r\n }\r\n const newCategories = getNewCategoriesFromChanges(categories, changes);\r\n const updateCategory = async (item: ICategory) => {\r\n // console.log('updateCategory', item);\r\n try {\r\n const search = `?depth=0&locale=${locale}&fallback-locale=null`;\r\n const url: string = routeResolver.api(`/${slug}/${item.id}${search}`);\r\n const httpResponse = await fetch(url, {\r\n method: 'PATCH',\r\n body: JSON.stringify({\r\n id: item.id,\r\n category: item.category,\r\n order: item.order,\r\n }),\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 response = await httpResponse.json();\r\n // console.log('updateCategory', response);\r\n return response;\r\n } catch (error) {\r\n console.log('CategoryTree.updateCategory.error', error);\r\n }\r\n };\r\n if (USE_BULK_UPDATE) {\r\n try {\r\n const records = newCategories.map(x => ({\r\n action: 'upadate',\r\n item: {\r\n id: x.id,\r\n category: x.category,\r\n order: x.order,\r\n },\r\n }));\r\n const url: string = routeResolver.api(`/${slug}/bulk/`);\r\n const httpResponse = await fetch(url, {\r\n method: 'PATCH',\r\n body: JSON.stringify(records),\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 categories: { order?: number }[] = await httpResponse.json();\r\n categories.sort((a, b) => (a.order || 0) - (b.order || 0));\r\n // console.log('CategoryTree.onSubmit.success', categories);\r\n setDirty(false);\r\n toast.success('Updated successfully.');\r\n } catch (error) {\r\n toast.error(`There was an error while saving ${slug}.`);\r\n console.log('CategoryTree.onSubmit.error', error);\r\n }\r\n } else {\r\n try {\r\n const promises = newCategories.map(x => () => updateCategory(x));\r\n const responses = [];\r\n for (const promise of promises) {\r\n const response = await promise();\r\n responses.push(response);\r\n }\r\n // console.log('CategoryTree.onSubmit.success', responses);\r\n toast.success('Updated successfully.');\r\n } catch (error) {\r\n toast.error(`There was an error while saving ${slug}.`);\r\n console.log('CategoryTree.onSubmit.error', error);\r\n }\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (!categories) {\r\n return;\r\n }\r\n const getPostData = (changes: CategoryTreeItems) => {\r\n const payload = Object.fromEntries(Object.entries(changes)\r\n .map(([k, v]: any) => [k, {\r\n index: v.index,\r\n children: v.children,\r\n }])\r\n );\r\n return payload;\r\n };\r\n const getRoutes = async () => {\r\n try {\r\n const postData = changes ? getPostData(changes) : undefined;\r\n const search = '';\r\n const url = routeResolver.api(`/route/changes${search}`);\r\n const httpResponse = await fetch(url, {\r\n method: 'POST',\r\n body: postData ? JSON.stringify(postData) : undefined,\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 routes = await httpResponse.json() as IRoute[];\r\n return routes;\r\n } catch (error) {\r\n console.log('CategoryTree.getRoutes.error', error);\r\n throw error;\r\n }\r\n };\r\n getRoutes().then(routes => {\r\n const routeMap = new Map<string, IRoute[]>();\r\n for (const route of routes) {\r\n if (routeMap.has(route.id)) {\r\n routeMap.get(route.id)!.push(route);\r\n } else {\r\n routeMap.set(route.id, [route]);\r\n }\r\n }\r\n const conflictingRouteMap = new Map(\r\n [...routeMap].filter(([k, v]) => v.length > 1)\r\n );\r\n // console.log('CategoryTree.changes.getRoutes', routes);\r\n // console.log('CategoryTree.changes.routeMap', routeMap);\r\n // console.log('CategoryTree.changes.conflictingRouteMap', conflictingRouteMap);\r\n if (items) {\r\n Object.entries(items).forEach(([k, v]) => {\r\n v.data.conflicts = [];\r\n for (const conflict of conflictingRouteMap) {\r\n const routes = conflict[1];\r\n if (routes.find(x => x.category === k)) {\r\n v.data.conflicts.push(routes);\r\n }\r\n }\r\n // console.log(k, v.data.conflicts);\r\n v.data.extra = (\r\n <CategoryTreeConflict conflicts={v.data.conflicts} />\r\n );\r\n if (dataTreeRef.current) {\r\n dataTreeRef.current.onSetData(v, v.data);\r\n }\r\n });\r\n // console.log(items);\r\n setItems({ ...items });\r\n }\r\n });\r\n\r\n }, [changes, categories]);\r\n\r\n // const modalKey = `${locale}-localized-field-modal-${path}`;\r\n // const isModalOpened = isModalOpen(modalSlug);\r\n\r\n const onSave = useCallback<Required<DocumentDrawerProps>['onSave']>((args) => {\r\n setId(args.doc.id as DefaultDocumentIDType | null);\r\n }, []);\r\n\r\n return (\r\n <div className=\"collection-list\">\r\n <CategoryMenu collectionSlug={slug} />\r\n <Gutter>\r\n <div className=\"collection-list__wrap\">\r\n <ListHeader\r\n collectionConfig={collectionConfig}\r\n Description={\r\n <div className={'collection-list__sub-header'}>\r\n {collectionConfig.admin?.description && (\r\n <ViewDescription\r\n collectionSlug={collectionConfig.slug}\r\n description={collectionConfig.admin.description}\r\n />\r\n )}\r\n </div>\r\n }\r\n newDocumentURL=\"\"\r\n disableBulkDelete={true}\r\n disableBulkEdit={true}\r\n hasCreatePermission={false}\r\n i18n={i18n}\r\n isBulkUploadEnabled={false}\r\n smallBreak={true}\r\n openBulkUpload={() => { }}\r\n onBulkUploadSuccess={() => { }}\r\n viewType=\"list\"\r\n />\r\n {items && (\r\n <>\r\n <DataTree<CategoryTreeItem> ref={dataTreeRef} items={items} rootItem={ROOT_ITEM} onChange={onChange} onEdit={onEdit} />\r\n <div className=\"collection-list__foot\">\r\n <FormSubmit type=\"button\" disabled={!dirty} onClick={onSubmit}>\r\n {t('general:save')}\r\n </FormSubmit>\r\n </div>\r\n <LeaveWithoutSaving modified={dirty} />\r\n </>\r\n )}\r\n {id && (\r\n <DocumentDrawer onSave={onSave} />\r\n )}\r\n </div>\r\n </Gutter>\r\n </div>\r\n );\r\n};\r\n\r\n"],"names":["FormSubmit","Gutter","Link","ListHeader","Popup","ViewDescription","toast","useAuth","useConfig","useDocumentDrawer","useLocale","useTranslation","getRouteResolver","React","useCallback","useEffect","useMemo","useRef","useState","options","DataTree","LeaveWithoutSaving","ROOT_ITEM","getNewCategoriesFromChanges","CategoryMenu","USE_BULK_UPDATE","CategoryTreeConflict","conflicts","config","routes","admin","adminRoute","summaryConflicts","getRouteKey","map","x","schema","page","join","forEach","routeKey","find","undefined","push","span","className","length","button","buttonType","horizontalAlign","size","verticalAlign","div","c","h4","small","r","ul","route","li","id","href","title","p","CategoryTree","props","slug","getEntityConfig","collectionConfig","collectionSlug","code","locale","t","i18n","permissions","user","dataTreeRef","categories","setCategories","items","setItems","changes","setChanges","dirty","setDirty","setId","routeResolver","getData","search","url","api","category","httpResponse","fetch","method","credentials","headers","ok","json","sort","a","b","order","children","filter","index","data","isFolder","canMove","canRename","child","error","console","log","DocumentDrawer","isDrawerOpen","openDrawer","openDrawerRef","current","onChange","onEdit","treeId","onSubmit","newCategories","updateCategory","item","body","JSON","stringify","response","records","action","success","promises","responses","promise","getPostData","payload","Object","fromEntries","entries","k","v","getRoutes","postData","then","routeMap","Map","has","get","set","conflictingRouteMap","conflict","extra","onSetData","onSave","args","doc","Description","description","newDocumentURL","disableBulkDelete","disableBulkEdit","hasCreatePermission","isBulkUploadEnabled","smallBreak","openBulkUpload","onBulkUploadSuccess","viewType","ref","rootItem","type","disabled","onClick","modified"],"mappings":"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"}
|