@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,83 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { ConfirmationModal, Modal, useAuth, useModal, useTranslation } from '@payloadcms/ui';
|
|
4
|
+
import React, { useCallback } from 'react';
|
|
5
|
+
import { usePreventLeave } from './usePreventLeave';
|
|
6
|
+
// import './LeaveWithoutSaving.scss';
|
|
7
|
+
export const modalSlug = 'leave-without-saving';
|
|
8
|
+
export const LeaveWithoutSavingModal = (props)=>{
|
|
9
|
+
const { onConfirm, onCancel } = props;
|
|
10
|
+
const { t } = useTranslation();
|
|
11
|
+
return /*#__PURE__*/ _jsx(ConfirmationModal, {
|
|
12
|
+
body: t('general:changesNotSaved'),
|
|
13
|
+
cancelLabel: t('general:stayOnThisPage'),
|
|
14
|
+
confirmLabel: t('general:leaveAnyway'),
|
|
15
|
+
heading: t('general:leaveWithoutSaving'),
|
|
16
|
+
modalSlug: modalSlug,
|
|
17
|
+
onCancel: onCancel,
|
|
18
|
+
onConfirm: onConfirm
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
export const LeaveModal = (props)=>{
|
|
22
|
+
const { visible } = props;
|
|
23
|
+
const { openModal, isModalOpen, closeModal } = useModal();
|
|
24
|
+
const onConfirm = ()=>{
|
|
25
|
+
closeModal(modalSlug);
|
|
26
|
+
};
|
|
27
|
+
const onCancel = ()=>{
|
|
28
|
+
closeModal(modalSlug);
|
|
29
|
+
};
|
|
30
|
+
return /*#__PURE__*/ _jsx(Modal, {
|
|
31
|
+
slug: modalSlug,
|
|
32
|
+
className: `${modalSlug}__modal`,
|
|
33
|
+
children: visible && /*#__PURE__*/ _jsx(LeaveWithoutSavingModal, {
|
|
34
|
+
onConfirm: onConfirm,
|
|
35
|
+
onCancel: onCancel
|
|
36
|
+
})
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
const LeaveWithoutSaving = (props)=>{
|
|
40
|
+
const { modified } = props;
|
|
41
|
+
const { closeModal, openModal } = useModal();
|
|
42
|
+
const { user } = useAuth();
|
|
43
|
+
const [hasAccepted, setHasAccepted] = React.useState(false);
|
|
44
|
+
const { t } = useTranslation();
|
|
45
|
+
// const { isValid } = useForm();
|
|
46
|
+
const prevent = Boolean(modified && user); // Boolean((modified || !isValid) && user);
|
|
47
|
+
const onPrevent = useCallback(()=>{
|
|
48
|
+
openModal(modalSlug);
|
|
49
|
+
}, [
|
|
50
|
+
openModal
|
|
51
|
+
]);
|
|
52
|
+
const handleAccept = useCallback(()=>{
|
|
53
|
+
closeModal(modalSlug);
|
|
54
|
+
}, [
|
|
55
|
+
closeModal
|
|
56
|
+
]);
|
|
57
|
+
usePreventLeave({
|
|
58
|
+
hasAccepted,
|
|
59
|
+
onAccept: handleAccept,
|
|
60
|
+
onPrevent,
|
|
61
|
+
prevent
|
|
62
|
+
});
|
|
63
|
+
const onCancel = useCallback(()=>{
|
|
64
|
+
closeModal(modalSlug);
|
|
65
|
+
}, [
|
|
66
|
+
closeModal
|
|
67
|
+
]);
|
|
68
|
+
const onConfirm = useCallback(()=>{
|
|
69
|
+
setHasAccepted(true);
|
|
70
|
+
}, []);
|
|
71
|
+
return /*#__PURE__*/ _jsx(ConfirmationModal, {
|
|
72
|
+
body: t('general:changesNotSaved'),
|
|
73
|
+
cancelLabel: t('general:stayOnThisPage'),
|
|
74
|
+
confirmLabel: t('general:leaveAnyway'),
|
|
75
|
+
heading: t('general:leaveWithoutSaving'),
|
|
76
|
+
modalSlug: modalSlug,
|
|
77
|
+
onCancel: onCancel,
|
|
78
|
+
onConfirm: onConfirm
|
|
79
|
+
});
|
|
80
|
+
};
|
|
81
|
+
export default LeaveWithoutSaving;
|
|
82
|
+
|
|
83
|
+
//# sourceMappingURL=LeaveWithoutSaving.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/LeaveWithoutSaving/LeaveWithoutSaving.tsx"],"sourcesContent":["'use client';\r\n\r\nimport { ConfirmationModal, Modal, OnCancel, useAuth, useModal, useTranslation } from '@payloadcms/ui';\r\nimport React, { useCallback } from 'react';\r\nimport { usePreventLeave } from './usePreventLeave';\r\n// import './LeaveWithoutSaving.scss';\r\n\r\nexport const modalSlug = 'leave-without-saving';\r\n\r\nexport type LeaveWithoutSavingModalProps = {\r\n onConfirm: () => void;\r\n onCancel: () => void;\r\n};\r\n\r\nexport const LeaveWithoutSavingModal: React.FC<LeaveWithoutSavingModalProps> = (props: LeaveWithoutSavingModalProps) => {\r\n const { onConfirm, onCancel } = props;\r\n const { t } = useTranslation();\r\n return (\r\n <ConfirmationModal\r\n body={t('general:changesNotSaved')}\r\n cancelLabel={t('general:stayOnThisPage')}\r\n confirmLabel={t('general:leaveAnyway')}\r\n heading={t('general:leaveWithoutSaving')}\r\n modalSlug={modalSlug}\r\n onCancel={onCancel}\r\n onConfirm={onConfirm}\r\n />\r\n );\r\n};\r\n\r\nexport const LeaveModal = (props: { visible: boolean }) => {\r\n const { visible } = props;\r\n\r\n const { openModal, isModalOpen, closeModal } = useModal();\r\n\r\n const onConfirm = () => {\r\n closeModal(modalSlug);\r\n };\r\n\r\n const onCancel = () => {\r\n closeModal(modalSlug);\r\n };\r\n\r\n return (\r\n <Modal slug={modalSlug} className={`${modalSlug}__modal`}>\r\n {visible && (\r\n <LeaveWithoutSavingModal onConfirm={onConfirm} onCancel={onCancel} />\r\n )}\r\n </Modal>\r\n );\r\n};\r\n\r\nconst LeaveWithoutSaving: React.FC<{ modified: boolean }> = (props: { modified: boolean }) => {\r\n const { modified } = props;\r\n const { closeModal, openModal } = useModal();\r\n const { user } = useAuth();\r\n const [hasAccepted, setHasAccepted] = React.useState(false);\r\n const { t } = useTranslation();\r\n\r\n // const { isValid } = useForm();\r\n const prevent = Boolean(modified && user); // Boolean((modified || !isValid) && user);\r\n\r\n const onPrevent = useCallback(() => {\r\n openModal(modalSlug);\r\n }, [openModal]);\r\n\r\n const handleAccept = useCallback(() => {\r\n closeModal(modalSlug);\r\n }, [closeModal]);\r\n\r\n usePreventLeave({ hasAccepted, onAccept: handleAccept, onPrevent, prevent });\r\n\r\n const onCancel: OnCancel = useCallback(() => {\r\n closeModal(modalSlug);\r\n }, [closeModal]);\r\n\r\n const onConfirm = useCallback(() => {\r\n setHasAccepted(true);\r\n }, []);\r\n\r\n return (\r\n <ConfirmationModal\r\n body={t('general:changesNotSaved')}\r\n cancelLabel={t('general:stayOnThisPage')}\r\n confirmLabel={t('general:leaveAnyway')}\r\n heading={t('general:leaveWithoutSaving')}\r\n modalSlug={modalSlug}\r\n onCancel={onCancel}\r\n onConfirm={onConfirm}\r\n />\r\n );\r\n};\r\n\r\nexport default LeaveWithoutSaving;\r\n"],"names":["ConfirmationModal","Modal","useAuth","useModal","useTranslation","React","useCallback","usePreventLeave","modalSlug","LeaveWithoutSavingModal","props","onConfirm","onCancel","t","body","cancelLabel","confirmLabel","heading","LeaveModal","visible","openModal","isModalOpen","closeModal","slug","className","LeaveWithoutSaving","modified","user","hasAccepted","setHasAccepted","useState","prevent","Boolean","onPrevent","handleAccept","onAccept"],"mappings":"AAAA;;AAEA,SAASA,iBAAiB,EAAEC,KAAK,EAAYC,OAAO,EAAEC,QAAQ,EAAEC,cAAc,QAAQ,iBAAiB;AACvG,OAAOC,SAASC,WAAW,QAAQ,QAAQ;AAC3C,SAASC,eAAe,QAAQ,oBAAoB;AACpD,sCAAsC;AAEtC,OAAO,MAAMC,YAAY,uBAAuB;AAOhD,OAAO,MAAMC,0BAAkE,CAACC;IAC9E,MAAM,EAAEC,SAAS,EAAEC,QAAQ,EAAE,GAAGF;IAChC,MAAM,EAAEG,CAAC,EAAE,GAAGT;IACd,qBACE,KAACJ;QACCc,MAAMD,EAAE;QACRE,aAAaF,EAAE;QACfG,cAAcH,EAAE;QAChBI,SAASJ,EAAE;QACXL,WAAWA;QACXI,UAAUA;QACVD,WAAWA;;AAGjB,EAAE;AAEF,OAAO,MAAMO,aAAa,CAACR;IACzB,MAAM,EAAES,OAAO,EAAE,GAAGT;IAEpB,MAAM,EAAEU,SAAS,EAAEC,WAAW,EAAEC,UAAU,EAAE,GAAGnB;IAE/C,MAAMQ,YAAY;QAChBW,WAAWd;IACb;IAEA,MAAMI,WAAW;QACfU,WAAWd;IACb;IAEA,qBACE,KAACP;QAAMsB,MAAMf;QAAWgB,WAAW,CAAC,EAAEhB,UAAU,OAAO,CAAC;kBACrDW,yBACC,KAACV;YAAwBE,WAAWA;YAAWC,UAAUA;;;AAIjE,EAAE;AAEF,MAAMa,qBAAsD,CAACf;IAC3D,MAAM,EAAEgB,QAAQ,EAAE,GAAGhB;IACrB,MAAM,EAAEY,UAAU,EAAEF,SAAS,EAAE,GAAGjB;IAClC,MAAM,EAAEwB,IAAI,EAAE,GAAGzB;IACjB,MAAM,CAAC0B,aAAaC,eAAe,GAAGxB,MAAMyB,QAAQ,CAAC;IACrD,MAAM,EAAEjB,CAAC,EAAE,GAAGT;IAEd,iCAAiC;IACjC,MAAM2B,UAAUC,QAAQN,YAAYC,OAAO,2CAA2C;IAEtF,MAAMM,YAAY3B,YAAY;QAC5Bc,UAAUZ;IACZ,GAAG;QAACY;KAAU;IAEd,MAAMc,eAAe5B,YAAY;QAC/BgB,WAAWd;IACb,GAAG;QAACc;KAAW;IAEff,gBAAgB;QAAEqB;QAAaO,UAAUD;QAAcD;QAAWF;IAAQ;IAE1E,MAAMnB,WAAqBN,YAAY;QACrCgB,WAAWd;IACb,GAAG;QAACc;KAAW;IAEf,MAAMX,YAAYL,YAAY;QAC5BuB,eAAe;IACjB,GAAG,EAAE;IAEL,qBACE,KAAC7B;QACCc,MAAMD,EAAE;QACRE,aAAaF,EAAE;QACfG,cAAcH,EAAE;QAChBI,SAASJ,EAAE;QACXL,WAAWA;QACXI,UAAUA;QACVD,WAAWA;;AAGjB;AAEA,eAAec,mBAAmB"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
@use "sass:math";
|
|
2
|
+
|
|
3
|
+
@mixin blur-bg($color: var(--theme-bg), $opacity: 0.75) {
|
|
4
|
+
|
|
5
|
+
&:before,
|
|
6
|
+
&:after {
|
|
7
|
+
content: ' ';
|
|
8
|
+
position: absolute;
|
|
9
|
+
top: 0;
|
|
10
|
+
right: 0;
|
|
11
|
+
bottom: 0;
|
|
12
|
+
left: 0;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
&:before {
|
|
16
|
+
background: $color;
|
|
17
|
+
opacity: $opacity;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
&:after {
|
|
21
|
+
backdrop-filter: blur(8px);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
@mixin blur-bg-light {
|
|
26
|
+
@include blur-bg(var(--theme-bg), 0.3);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.leave-without-saving {
|
|
30
|
+
@include blur-bg;
|
|
31
|
+
position: fixed;
|
|
32
|
+
z-index: calc(var(--z-modal) + 1);
|
|
33
|
+
top: 0;
|
|
34
|
+
right: 0;
|
|
35
|
+
bottom: 0;
|
|
36
|
+
left: 0;
|
|
37
|
+
|
|
38
|
+
&__template {
|
|
39
|
+
position: relative;
|
|
40
|
+
z-index: 1;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.btn {
|
|
44
|
+
margin-right: var(--base);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useRouteTransition } from '@payloadcms/ui';
|
|
3
|
+
import { useRouter } from 'next/navigation';
|
|
4
|
+
import { useCallback, useEffect, useRef } from 'react';
|
|
5
|
+
function on(obj, ...args) {
|
|
6
|
+
if (obj && obj.addEventListener) {
|
|
7
|
+
obj.addEventListener(...args);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
function off(obj, ...args) {
|
|
11
|
+
if (obj && obj.removeEventListener) {
|
|
12
|
+
obj.removeEventListener(...args);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export const useBeforeUnload = (enabled = true, message)=>{
|
|
16
|
+
const handler = useCallback((event)=>{
|
|
17
|
+
const finalEnabled = typeof enabled === 'function' ? enabled() : true;
|
|
18
|
+
if (!finalEnabled) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
event.preventDefault();
|
|
22
|
+
if (message) {
|
|
23
|
+
event.returnValue = message;
|
|
24
|
+
}
|
|
25
|
+
return message;
|
|
26
|
+
}, [
|
|
27
|
+
enabled,
|
|
28
|
+
message
|
|
29
|
+
]);
|
|
30
|
+
useEffect(()=>{
|
|
31
|
+
if (!enabled) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
on(window, 'beforeunload', handler);
|
|
35
|
+
return ()=>off(window, 'beforeunload', handler);
|
|
36
|
+
}, [
|
|
37
|
+
enabled,
|
|
38
|
+
handler
|
|
39
|
+
]);
|
|
40
|
+
};
|
|
41
|
+
export const usePreventLeave = ({ hasAccepted = false, message = 'Are you sure want to leave this page?', onAccept, onPrevent, prevent = true })=>{
|
|
42
|
+
// check when page is about to be reloaded
|
|
43
|
+
useBeforeUnload(prevent, message);
|
|
44
|
+
const { startRouteTransition } = useRouteTransition();
|
|
45
|
+
const router = useRouter();
|
|
46
|
+
const cancelledURL = useRef('');
|
|
47
|
+
// check when page is about to be changed
|
|
48
|
+
useEffect(()=>{
|
|
49
|
+
function isAnchorOfCurrentUrl(currentUrl, newUrl) {
|
|
50
|
+
const currentUrlObj = new URL(currentUrl);
|
|
51
|
+
const newUrlObj = new URL(newUrl);
|
|
52
|
+
// Compare hostname, pathname, and search parameters
|
|
53
|
+
if (currentUrlObj.hostname === newUrlObj.hostname && currentUrlObj.pathname === newUrlObj.pathname && currentUrlObj.search === newUrlObj.search) {
|
|
54
|
+
// Check if the new URL is just an anchor of the current URL page
|
|
55
|
+
const currentHash = currentUrlObj.hash;
|
|
56
|
+
const newHash = newUrlObj.hash;
|
|
57
|
+
return currentHash !== newHash && currentUrlObj.href.replace(currentHash, '') === newUrlObj.href.replace(newHash, '');
|
|
58
|
+
}
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
function findClosestAnchor(element) {
|
|
62
|
+
while(element && element.tagName.toLowerCase() !== 'a'){
|
|
63
|
+
element = element.parentElement;
|
|
64
|
+
}
|
|
65
|
+
return element;
|
|
66
|
+
}
|
|
67
|
+
function handleClick(event) {
|
|
68
|
+
try {
|
|
69
|
+
const target = event.target;
|
|
70
|
+
const anchor = findClosestAnchor(target);
|
|
71
|
+
if (anchor) {
|
|
72
|
+
const currentUrl = window.location.href;
|
|
73
|
+
const newUrl = anchor.href;
|
|
74
|
+
const isAnchor = isAnchorOfCurrentUrl(currentUrl, newUrl);
|
|
75
|
+
const isDownloadLink = anchor.download !== '';
|
|
76
|
+
const isNewTab = anchor.target === '_blank' || event.metaKey || event.ctrlKey;
|
|
77
|
+
const isPageLeaving = !(newUrl === currentUrl || isAnchor || isDownloadLink || isNewTab);
|
|
78
|
+
if (isPageLeaving && prevent && (!onPrevent ? !window.confirm(message) : true)) {
|
|
79
|
+
// Keep a reference of the href
|
|
80
|
+
cancelledURL.current = newUrl;
|
|
81
|
+
// Cancel the route change
|
|
82
|
+
event.preventDefault();
|
|
83
|
+
event.stopPropagation();
|
|
84
|
+
if (typeof onPrevent === 'function') {
|
|
85
|
+
onPrevent();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
} catch (err) {
|
|
90
|
+
alert(err);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Add the global click event listener
|
|
94
|
+
document.addEventListener('click', handleClick, true);
|
|
95
|
+
// Clean up the global click event listener when the component is unmounted
|
|
96
|
+
return ()=>{
|
|
97
|
+
document.removeEventListener('click', handleClick, true);
|
|
98
|
+
};
|
|
99
|
+
}, [
|
|
100
|
+
onPrevent,
|
|
101
|
+
prevent,
|
|
102
|
+
message
|
|
103
|
+
]);
|
|
104
|
+
useEffect(()=>{
|
|
105
|
+
if (hasAccepted && cancelledURL.current) {
|
|
106
|
+
if (onAccept) {
|
|
107
|
+
onAccept();
|
|
108
|
+
}
|
|
109
|
+
startRouteTransition(()=>router.push(cancelledURL.current));
|
|
110
|
+
}
|
|
111
|
+
}, [
|
|
112
|
+
hasAccepted,
|
|
113
|
+
onAccept,
|
|
114
|
+
router,
|
|
115
|
+
startRouteTransition
|
|
116
|
+
]);
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
//# sourceMappingURL=usePreventLeave.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/LeaveWithoutSaving/usePreventLeave.ts"],"sourcesContent":["'use client';\r\n\r\nimport { useRouteTransition } from '@payloadcms/ui';\r\nimport { useRouter } from 'next/navigation';\r\nimport { useCallback, useEffect, useRef } from 'react';\r\n\r\nfunction on<T extends Document | EventTarget | HTMLElement | Window>(\r\n obj: null | T,\r\n ...args: [string, (() => void) | null, ...any] | Parameters<T['addEventListener']>\r\n): void {\r\n if (obj && obj.addEventListener) {\r\n obj.addEventListener(...(args as Parameters<HTMLElement['addEventListener']>));\r\n }\r\n}\r\n\r\nfunction off<T extends Document | EventTarget | HTMLElement | Window>(\r\n obj: null | T,\r\n ...args: [string, (() => void) | null, ...any] | Parameters<T['removeEventListener']>\r\n): void {\r\n if (obj && obj.removeEventListener) {\r\n obj.removeEventListener(...(args as Parameters<HTMLElement['removeEventListener']>));\r\n }\r\n}\r\n\r\nexport const useBeforeUnload = (enabled: (() => boolean) | boolean = true, message?: string) => {\r\n const handler = useCallback(\r\n (event: BeforeUnloadEvent) => {\r\n const finalEnabled = typeof enabled === 'function' ? enabled() : true;\r\n\r\n if (!finalEnabled) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n\r\n if (message) {\r\n event.returnValue = message;\r\n }\r\n\r\n return message;\r\n },\r\n [enabled, message]\r\n );\r\n\r\n useEffect(() => {\r\n if (!enabled) {\r\n return;\r\n }\r\n\r\n on(window, 'beforeunload', handler);\r\n\r\n return () => off(window, 'beforeunload', handler);\r\n }, [enabled, handler]);\r\n};\r\n\r\nexport const usePreventLeave = ({\r\n hasAccepted = false,\r\n message = 'Are you sure want to leave this page?',\r\n onAccept,\r\n onPrevent,\r\n prevent = true,\r\n}: {\r\n hasAccepted: boolean;\r\n // if no `onPrevent` is provided, the message will be displayed in a confirm dialog\r\n message?: string;\r\n onAccept?: () => void;\r\n // to use a custom confirmation dialog, provide a function that returns a boolean\r\n onPrevent?: () => void;\r\n prevent: boolean;\r\n}) => {\r\n // check when page is about to be reloaded\r\n useBeforeUnload(prevent, message);\r\n const { startRouteTransition } = useRouteTransition();\r\n\r\n const router = useRouter();\r\n const cancelledURL = useRef<string>('');\r\n\r\n // check when page is about to be changed\r\n useEffect(() => {\r\n function isAnchorOfCurrentUrl(currentUrl: string, newUrl: string) {\r\n const currentUrlObj = new URL(currentUrl);\r\n const newUrlObj = new URL(newUrl);\r\n // Compare hostname, pathname, and search parameters\r\n if (\r\n currentUrlObj.hostname === newUrlObj.hostname &&\r\n currentUrlObj.pathname === newUrlObj.pathname &&\r\n currentUrlObj.search === newUrlObj.search\r\n ) {\r\n // Check if the new URL is just an anchor of the current URL page\r\n const currentHash = currentUrlObj.hash;\r\n const newHash = newUrlObj.hash;\r\n return (\r\n currentHash !== newHash &&\r\n currentUrlObj.href.replace(currentHash, '') === newUrlObj.href.replace(newHash, '')\r\n );\r\n }\r\n return false;\r\n }\r\n\r\n function findClosestAnchor(element: HTMLElement | null): HTMLAnchorElement | null {\r\n while (element && element.tagName.toLowerCase() !== 'a') {\r\n element = element.parentElement;\r\n }\r\n return element as HTMLAnchorElement;\r\n }\r\n\r\n function handleClick(event: MouseEvent) {\r\n try {\r\n const target = event.target as HTMLElement;\r\n const anchor = findClosestAnchor(target);\r\n if (anchor) {\r\n const currentUrl = window.location.href;\r\n const newUrl = anchor.href;\r\n const isAnchor = isAnchorOfCurrentUrl(currentUrl, newUrl);\r\n const isDownloadLink = anchor.download !== '';\r\n const isNewTab = anchor.target === '_blank' || event.metaKey || event.ctrlKey;\r\n\r\n const isPageLeaving = !(newUrl === currentUrl || isAnchor || isDownloadLink || isNewTab);\r\n\r\n if (isPageLeaving && prevent && (!onPrevent ? !window.confirm(message) : true)) {\r\n // Keep a reference of the href\r\n cancelledURL.current = newUrl;\r\n\r\n // Cancel the route change\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n if (typeof onPrevent === 'function') {\r\n onPrevent();\r\n }\r\n }\r\n }\r\n } catch (err) {\r\n alert(err);\r\n }\r\n }\r\n\r\n // Add the global click event listener\r\n document.addEventListener('click', handleClick, true);\r\n\r\n // Clean up the global click event listener when the component is unmounted\r\n return () => {\r\n document.removeEventListener('click', handleClick, true);\r\n };\r\n }, [onPrevent, prevent, message]);\r\n\r\n useEffect(() => {\r\n if (hasAccepted && cancelledURL.current) {\r\n if (onAccept) {\r\n onAccept();\r\n }\r\n startRouteTransition(() => router.push(cancelledURL.current));\r\n }\r\n }, [hasAccepted, onAccept, router, startRouteTransition]);\r\n};\r\n"],"names":["useRouteTransition","useRouter","useCallback","useEffect","useRef","on","obj","args","addEventListener","off","removeEventListener","useBeforeUnload","enabled","message","handler","event","finalEnabled","preventDefault","returnValue","window","usePreventLeave","hasAccepted","onAccept","onPrevent","prevent","startRouteTransition","router","cancelledURL","isAnchorOfCurrentUrl","currentUrl","newUrl","currentUrlObj","URL","newUrlObj","hostname","pathname","search","currentHash","hash","newHash","href","replace","findClosestAnchor","element","tagName","toLowerCase","parentElement","handleClick","target","anchor","location","isAnchor","isDownloadLink","download","isNewTab","metaKey","ctrlKey","isPageLeaving","confirm","current","stopPropagation","err","alert","document","push"],"mappings":"AAAA;AAEA,SAASA,kBAAkB,QAAQ,iBAAiB;AACpD,SAASC,SAAS,QAAQ,kBAAkB;AAC5C,SAASC,WAAW,EAAEC,SAAS,EAAEC,MAAM,QAAQ,QAAQ;AAEvD,SAASC,GACPC,GAAa,EACb,GAAGC,IAA+E;IAElF,IAAID,OAAOA,IAAIE,gBAAgB,EAAE;QAC/BF,IAAIE,gBAAgB,IAAKD;IAC3B;AACF;AAEA,SAASE,IACPH,GAAa,EACb,GAAGC,IAAkF;IAErF,IAAID,OAAOA,IAAII,mBAAmB,EAAE;QAClCJ,IAAII,mBAAmB,IAAKH;IAC9B;AACF;AAEA,OAAO,MAAMI,kBAAkB,CAACC,UAAqC,IAAI,EAAEC;IACzE,MAAMC,UAAUZ,YACd,CAACa;QACC,MAAMC,eAAe,OAAOJ,YAAY,aAAaA,YAAY;QAEjE,IAAI,CAACI,cAAc;YACjB;QACF;QAEAD,MAAME,cAAc;QAEpB,IAAIJ,SAAS;YACXE,MAAMG,WAAW,GAAGL;QACtB;QAEA,OAAOA;IACT,GACA;QAACD;QAASC;KAAQ;IAGpBV,UAAU;QACR,IAAI,CAACS,SAAS;YACZ;QACF;QAEAP,GAAGc,QAAQ,gBAAgBL;QAE3B,OAAO,IAAML,IAAIU,QAAQ,gBAAgBL;IAC3C,GAAG;QAACF;QAASE;KAAQ;AACvB,EAAE;AAEF,OAAO,MAAMM,kBAAkB,CAAC,EAC9BC,cAAc,KAAK,EACnBR,UAAU,uCAAuC,EACjDS,QAAQ,EACRC,SAAS,EACTC,UAAU,IAAI,EASf;IACC,0CAA0C;IAC1Cb,gBAAgBa,SAASX;IACzB,MAAM,EAAEY,oBAAoB,EAAE,GAAGzB;IAEjC,MAAM0B,SAASzB;IACf,MAAM0B,eAAevB,OAAe;IAEpC,yCAAyC;IACzCD,UAAU;QACR,SAASyB,qBAAqBC,UAAkB,EAAEC,MAAc;YAC9D,MAAMC,gBAAgB,IAAIC,IAAIH;YAC9B,MAAMI,YAAY,IAAID,IAAIF;YAC1B,oDAAoD;YACpD,IACEC,cAAcG,QAAQ,KAAKD,UAAUC,QAAQ,IAC7CH,cAAcI,QAAQ,KAAKF,UAAUE,QAAQ,IAC7CJ,cAAcK,MAAM,KAAKH,UAAUG,MAAM,EACzC;gBACA,iEAAiE;gBACjE,MAAMC,cAAcN,cAAcO,IAAI;gBACtC,MAAMC,UAAUN,UAAUK,IAAI;gBAC9B,OACED,gBAAgBE,WAChBR,cAAcS,IAAI,CAACC,OAAO,CAACJ,aAAa,QAAQJ,UAAUO,IAAI,CAACC,OAAO,CAACF,SAAS;YAEpF;YACA,OAAO;QACT;QAEA,SAASG,kBAAkBC,OAA2B;YACpD,MAAOA,WAAWA,QAAQC,OAAO,CAACC,WAAW,OAAO,IAAK;gBACvDF,UAAUA,QAAQG,aAAa;YACjC;YACA,OAAOH;QACT;QAEA,SAASI,YAAYhC,KAAiB;YACpC,IAAI;gBACF,MAAMiC,SAASjC,MAAMiC,MAAM;gBAC3B,MAAMC,SAASP,kBAAkBM;gBACjC,IAAIC,QAAQ;oBACV,MAAMpB,aAAaV,OAAO+B,QAAQ,CAACV,IAAI;oBACvC,MAAMV,SAASmB,OAAOT,IAAI;oBAC1B,MAAMW,WAAWvB,qBAAqBC,YAAYC;oBAClD,MAAMsB,iBAAiBH,OAAOI,QAAQ,KAAK;oBAC3C,MAAMC,WAAWL,OAAOD,MAAM,KAAK,YAAYjC,MAAMwC,OAAO,IAAIxC,MAAMyC,OAAO;oBAE7E,MAAMC,gBAAgB,CAAE3B,CAAAA,WAAWD,cAAcsB,YAAYC,kBAAkBE,QAAO;oBAEtF,IAAIG,iBAAiBjC,WAAY,CAAA,CAACD,YAAY,CAACJ,OAAOuC,OAAO,CAAC7C,WAAW,IAAG,GAAI;wBAC9E,+BAA+B;wBAC/Bc,aAAagC,OAAO,GAAG7B;wBAEvB,0BAA0B;wBAC1Bf,MAAME,cAAc;wBACpBF,MAAM6C,eAAe;wBAErB,IAAI,OAAOrC,cAAc,YAAY;4BACnCA;wBACF;oBACF;gBACF;YACF,EAAE,OAAOsC,KAAK;gBACZC,MAAMD;YACR;QACF;QAEA,sCAAsC;QACtCE,SAASvD,gBAAgB,CAAC,SAASuC,aAAa;QAEhD,2EAA2E;QAC3E,OAAO;YACLgB,SAASrD,mBAAmB,CAAC,SAASqC,aAAa;QACrD;IACF,GAAG;QAACxB;QAAWC;QAASX;KAAQ;IAEhCV,UAAU;QACR,IAAIkB,eAAeM,aAAagC,OAAO,EAAE;YACvC,IAAIrC,UAAU;gBACZA;YACF;YACAG,qBAAqB,IAAMC,OAAOsC,IAAI,CAACrC,aAAagC,OAAO;QAC7D;IACF,GAAG;QAACtC;QAAaC;QAAUI;QAAQD;KAAqB;AAC1D,EAAE"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useTranslation } from '@payloadcms/ui';
|
|
4
|
+
export const LocalizedDescriptionClient = (props)=>{
|
|
5
|
+
const { t } = useTranslation();
|
|
6
|
+
const description = props.description;
|
|
7
|
+
const localizedDescription = t(`description:${description}`);
|
|
8
|
+
/*
|
|
9
|
+
console.log('LocalizedDescriptionServer', description, `description:${description}`, localizedDescription);
|
|
10
|
+
*/ return /*#__PURE__*/ _jsx("div", {
|
|
11
|
+
children: localizedDescription
|
|
12
|
+
});
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=LocalizedDescriptionClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/LocalizedDescription/LocalizedDescriptionClient.tsx"],"sourcesContent":["'use client';\r\n\r\nimport { useTranslation } from '@payloadcms/ui';\r\nimport type { ViewDescriptionClientProps } from 'payload';\r\n\r\nexport const LocalizedDescriptionClient: React.FC<ViewDescriptionClientProps> = (props) => {\r\n const { t } = useTranslation<any, any>();\r\n const description = props.description;\r\n const localizedDescription = t(`description:${description}`);\r\n /*\r\n console.log('LocalizedDescriptionServer', description, `description:${description}`, localizedDescription);\r\n */\r\n return (\r\n <div>{localizedDescription}</div>\r\n );\r\n};\r\n"],"names":["useTranslation","LocalizedDescriptionClient","props","t","description","localizedDescription","div"],"mappings":"AAAA;;AAEA,SAASA,cAAc,QAAQ,iBAAiB;AAGhD,OAAO,MAAMC,6BAAmE,CAACC;IAC/E,MAAM,EAAEC,CAAC,EAAE,GAAGH;IACd,MAAMI,cAAcF,MAAME,WAAW;IACrC,MAAMC,uBAAuBF,EAAE,CAAC,YAAY,EAAEC,YAAY,CAAC;IAC3D;;EAEA,GACA,qBACE,KAACE;kBAAKD;;AAEV,EAAE"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
export const LocalizedDescriptionServer = (props)=>{
|
|
3
|
+
const i18n = props.i18n;
|
|
4
|
+
const description = props.description;
|
|
5
|
+
const localizedDescription = i18n.t(`description:${description}`);
|
|
6
|
+
/*
|
|
7
|
+
console.log('LocalizedDescriptionServer', description, `description:${description}`, localizedDescription);
|
|
8
|
+
*/ return /*#__PURE__*/ _jsx("div", {
|
|
9
|
+
children: localizedDescription
|
|
10
|
+
});
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=LocalizedDescriptionServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/LocalizedDescription/LocalizedDescriptionServer.tsx"],"sourcesContent":["import type { ViewDescriptionServerProps } from 'payload';\r\n\r\nexport const LocalizedDescriptionServer: React.FC<ViewDescriptionServerProps> = (props) => {\r\n const i18n = props.i18n;\r\n const description = props.description;\r\n const localizedDescription = i18n.t(`description:${description}` as any);\r\n /*\r\n console.log('LocalizedDescriptionServer', description, `description:${description}`, localizedDescription);\r\n */\r\n return (\r\n <div>{localizedDescription}</div>\r\n );\r\n};\r\n"],"names":["LocalizedDescriptionServer","props","i18n","description","localizedDescription","t","div"],"mappings":";AAEA,OAAO,MAAMA,6BAAmE,CAACC;IAC/E,MAAMC,OAAOD,MAAMC,IAAI;IACvB,MAAMC,cAAcF,MAAME,WAAW;IACrC,MAAMC,uBAAuBF,KAAKG,CAAC,CAAC,CAAC,YAAY,EAAEF,YAAY,CAAC;IAChE;;EAEA,GACA,qBACE,KAACG;kBAAKF;;AAEV,EAAE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import './LogoServer.scss';
|
|
4
|
+
export const LOGO = 'data:image/svg+xml,%3C%3Fxml version=\'1.0\' encoding=\'utf-8\'%3F%3E%3Csvg version=\'1.1\' xmlns=\'http://www.w3.org/2000/svg\' xmlns:xlink=\'http://www.w3.org/1999/xlink\' x=\'0px\' y=\'0px\' viewBox=\'0 0 128 128\' style=\'enable-background:new 0 0 128 128;\' xml:space=\'preserve\'%0A%3E%3Cstyle type=\'text/css\'%3E .st0%7Bfill:url(%23SVGID_1_);%7D .st1%7Bfill:url(%23SVGID_00000007424893587046585090000002316368835338354857_);%7D%0A%3C/style%3E%3ClinearGradient id=\'SVGID_1_\' gradientUnits=\'userSpaceOnUse\' x1=\'-1.1036\' y1=\'7.6661\' x2=\'119.6941\' y2=\'124.8351\'%3E%3Cstop offset=\'0\' style=\'stop-color:%230099F7\'/%3E%3Cstop offset=\'0.1478\' style=\'stop-color:%2303A4DB\'/%3E%3Cstop offset=\'0.4675\' style=\'stop-color:%230ABF94\'/%3E%3Cstop offset=\'0.9313\' style=\'stop-color:%2315EA23\'/%3E%3Cstop offset=\'1\' style=\'stop-color:%2317F112\'/%3E%3C/linearGradient%3E%3Cpath class=\'st0\' d=\'M111,43.5c-6.4-3.7-15.2-6.4-25.6-8c-3.3-0.5-6.3,1.8-6.8,5s1.8,6.3,5,6.8c9,1.4,16.4,3.7,21.5,6.6 c4.4,2.5,6.7,5.3,6.7,8.2c0,2.2-4.4,4.8-11.2,6.7c-8.6,2.3-21.1,3.5-36.4,3.5c-15.6,0-27.9-1.1-36.4-3.3c-5.3-1.4-8-2.9-9.4-3.9 c-1.7-1.3-1.9-2.3-1.9-2.7c0,0,0-0.1,0-0.1c0-2.9,2.2-5.7,6.7-8.2c5.1-2.9,12.5-5.2,21.5-6.6c3.3-0.5,5.5-3.6,5-6.8s-3.6-5.5-6.8-5 c-10.4,1.6-19.3,4.4-25.6,8C6.6,49.6,4.4,57,4.4,62.1c0,8,1.6,15.9,4.7,23.2c3,7.1,7.3,13.5,12.8,19c5.5,5.5,11.9,9.8,19,12.8 c7.3,3.1,15.1,4.7,23.2,4.7s15.8-1.6,23.2-4.7c7.1-3,13.5-7.3,18.9-12.8s9.8-11.8,12.8-19c3.1-7.3,4.7-15.2,4.7-23.2 C123.6,57,121.4,49.6,111,43.5z M64,109.8c-20.3,0-37.7-12.8-44.5-30.8c1.6,0.6,3.3,1.1,5.1,1.6c9.5,2.5,22.8,3.7,39.4,3.7 c16.5,0,29.8-1.3,39.4-3.8c1.9-0.5,3.6-1,5.2-1.6C101.9,96.8,84.4,109.8,64,109.8z\'/%3E%3ClinearGradient id=\'SVGID_00000038373212010278178410000002552384216750816146_\' gradientUnits=\'userSpaceOnUse\' x1=\'40.599\' y1=\'-5.6707\' x2=\'157.3713\' y2=\'119.6983\'%3E%3Cstop offset=\'0\' style=\'stop-color:%230099F7\'/%3E%3Cstop offset=\'0.1478\' style=\'stop-color:%2303A4DB\'/%3E%3Cstop offset=\'0.4675\' style=\'stop-color:%230ABF94\'/%3E%3Cstop offset=\'0.9313\' style=\'stop-color:%2315EA23\'/%3E%3Cstop offset=\'1\' style=\'stop-color:%2317F112\'/%3E%3C/linearGradient%3E%3Ccircle style=\'fill:url(%23SVGID_00000038373212010278178410000002552384216750816146_);\' cx=\'64\' cy=\'19.5\' r=\'11.2\'/%3E%3C/svg%3E%0A';
|
|
5
|
+
export const LogoServer = ()=>{
|
|
6
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
7
|
+
className: "logo",
|
|
8
|
+
children: [
|
|
9
|
+
/*#__PURE__*/ _jsx("img", {
|
|
10
|
+
src: LOGO,
|
|
11
|
+
alt: "Bowl Logo"
|
|
12
|
+
}),
|
|
13
|
+
false && /*#__PURE__*/ _jsx("h1", {
|
|
14
|
+
children: "Bowl"
|
|
15
|
+
})
|
|
16
|
+
]
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=LogoServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/LogoServer/LogoServer.tsx"],"sourcesContent":["import React from 'react';\r\nimport './LogoServer.scss';\r\n\r\nexport const LOGO = 'data:image/svg+xml,%3C%3Fxml version=\\'1.0\\' encoding=\\'utf-8\\'%3F%3E%3Csvg version=\\'1.1\\' xmlns=\\'http://www.w3.org/2000/svg\\' xmlns:xlink=\\'http://www.w3.org/1999/xlink\\' x=\\'0px\\' y=\\'0px\\' viewBox=\\'0 0 128 128\\' style=\\'enable-background:new 0 0 128 128;\\' xml:space=\\'preserve\\'%0A%3E%3Cstyle type=\\'text/css\\'%3E .st0%7Bfill:url(%23SVGID_1_);%7D .st1%7Bfill:url(%23SVGID_00000007424893587046585090000002316368835338354857_);%7D%0A%3C/style%3E%3ClinearGradient id=\\'SVGID_1_\\' gradientUnits=\\'userSpaceOnUse\\' x1=\\'-1.1036\\' y1=\\'7.6661\\' x2=\\'119.6941\\' y2=\\'124.8351\\'%3E%3Cstop offset=\\'0\\' style=\\'stop-color:%230099F7\\'/%3E%3Cstop offset=\\'0.1478\\' style=\\'stop-color:%2303A4DB\\'/%3E%3Cstop offset=\\'0.4675\\' style=\\'stop-color:%230ABF94\\'/%3E%3Cstop offset=\\'0.9313\\' style=\\'stop-color:%2315EA23\\'/%3E%3Cstop offset=\\'1\\' style=\\'stop-color:%2317F112\\'/%3E%3C/linearGradient%3E%3Cpath class=\\'st0\\' d=\\'M111,43.5c-6.4-3.7-15.2-6.4-25.6-8c-3.3-0.5-6.3,1.8-6.8,5s1.8,6.3,5,6.8c9,1.4,16.4,3.7,21.5,6.6 c4.4,2.5,6.7,5.3,6.7,8.2c0,2.2-4.4,4.8-11.2,6.7c-8.6,2.3-21.1,3.5-36.4,3.5c-15.6,0-27.9-1.1-36.4-3.3c-5.3-1.4-8-2.9-9.4-3.9 c-1.7-1.3-1.9-2.3-1.9-2.7c0,0,0-0.1,0-0.1c0-2.9,2.2-5.7,6.7-8.2c5.1-2.9,12.5-5.2,21.5-6.6c3.3-0.5,5.5-3.6,5-6.8s-3.6-5.5-6.8-5 c-10.4,1.6-19.3,4.4-25.6,8C6.6,49.6,4.4,57,4.4,62.1c0,8,1.6,15.9,4.7,23.2c3,7.1,7.3,13.5,12.8,19c5.5,5.5,11.9,9.8,19,12.8 c7.3,3.1,15.1,4.7,23.2,4.7s15.8-1.6,23.2-4.7c7.1-3,13.5-7.3,18.9-12.8s9.8-11.8,12.8-19c3.1-7.3,4.7-15.2,4.7-23.2 C123.6,57,121.4,49.6,111,43.5z M64,109.8c-20.3,0-37.7-12.8-44.5-30.8c1.6,0.6,3.3,1.1,5.1,1.6c9.5,2.5,22.8,3.7,39.4,3.7 c16.5,0,29.8-1.3,39.4-3.8c1.9-0.5,3.6-1,5.2-1.6C101.9,96.8,84.4,109.8,64,109.8z\\'/%3E%3ClinearGradient id=\\'SVGID_00000038373212010278178410000002552384216750816146_\\' gradientUnits=\\'userSpaceOnUse\\' x1=\\'40.599\\' y1=\\'-5.6707\\' x2=\\'157.3713\\' y2=\\'119.6983\\'%3E%3Cstop offset=\\'0\\' style=\\'stop-color:%230099F7\\'/%3E%3Cstop offset=\\'0.1478\\' style=\\'stop-color:%2303A4DB\\'/%3E%3Cstop offset=\\'0.4675\\' style=\\'stop-color:%230ABF94\\'/%3E%3Cstop offset=\\'0.9313\\' style=\\'stop-color:%2315EA23\\'/%3E%3Cstop offset=\\'1\\' style=\\'stop-color:%2317F112\\'/%3E%3C/linearGradient%3E%3Ccircle style=\\'fill:url(%23SVGID_00000038373212010278178410000002552384216750816146_);\\' cx=\\'64\\' cy=\\'19.5\\' r=\\'11.2\\'/%3E%3C/svg%3E%0A';\r\n\r\nexport const LogoServer: React.FC = () => {\r\n return (\r\n <div className=\"logo\">\r\n <img src={LOGO} alt=\"Bowl Logo\" />\r\n {false && <h1>Bowl</h1>}\r\n </div>\r\n );\r\n};\r\n"],"names":["React","LOGO","LogoServer","div","className","img","src","alt","h1"],"mappings":";AAAA,OAAOA,WAAW,QAAQ;AAC1B,OAAO,oBAAoB;AAE3B,OAAO,MAAMC,OAAO,iyEAAiyE;AAErzE,OAAO,MAAMC,aAAuB;IAClC,qBACE,MAACC;QAAIC,WAAU;;0BACb,KAACC;gBAAIC,KAAKL;gBAAMM,KAAI;;YACnB,uBAAS,KAACC;0BAAG;;;;AAGpB,EAAE"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
.logo {
|
|
2
|
+
display: flex;
|
|
3
|
+
align-items: center;
|
|
4
|
+
gap: 1em;
|
|
5
|
+
|
|
6
|
+
img {
|
|
7
|
+
width: 52px;
|
|
8
|
+
height: 52px;
|
|
9
|
+
margin: auto;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
h1 {
|
|
13
|
+
margin: 0;
|
|
14
|
+
letter-spacing: 0.1rem;
|
|
15
|
+
line-height: 1;
|
|
16
|
+
font-size: 2rem;
|
|
17
|
+
margin-top: 0.5rem;
|
|
18
|
+
font-weight: 100;
|
|
19
|
+
color: #5aeb79;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { options } from '../../options';
|
|
2
|
+
import { roles } from '../../types';
|
|
3
|
+
import { isMixerRequest } from '../api';
|
|
4
|
+
const isUserWithRoles = (user)=>{
|
|
5
|
+
return user ? 'roles' in user && Array.isArray(user.roles) && user.roles.reduce((p, c)=>p && options.rolesList.includes(c), true) : false;
|
|
6
|
+
};
|
|
7
|
+
const isUserWithTenants = (user)=>{
|
|
8
|
+
return user ? user.collection !== undefined && 'tenants' in user && Array.isArray(user.tenants) && user.tenants.length > 0 : false;
|
|
9
|
+
};
|
|
10
|
+
// !!! temporary fix expect ClientUser also
|
|
11
|
+
export const hasRole = (user_, ...roles)=>{
|
|
12
|
+
const user = user_;
|
|
13
|
+
if (!isUserWithRoles(user)) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
// console.log('isUserWithRoles', roles, user.roles);
|
|
17
|
+
// return true if the user has at least one of the roles in the roles arg (or the roles arg is empty and the user has any role at all)
|
|
18
|
+
return roles.length === 0 ? user.roles.length > 0 : user.roles.find((x)=>roles.includes(x)) !== undefined;
|
|
19
|
+
};
|
|
20
|
+
export const isRole = (...roles)=>(args)=>{
|
|
21
|
+
const { req: { user } } = args;
|
|
22
|
+
// console.log('isRole', user?.roles);
|
|
23
|
+
return hasRole(user, ...roles);
|
|
24
|
+
};
|
|
25
|
+
export const isPageRole = (...roles)=>(args)=>{
|
|
26
|
+
const { req } = args;
|
|
27
|
+
const { user } = req;
|
|
28
|
+
if (!hasRole(user, ...roles)) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
if (isMixerRequest(req) && req.query?.draft !== 'true') {
|
|
32
|
+
return {
|
|
33
|
+
or: [
|
|
34
|
+
{
|
|
35
|
+
_status: {
|
|
36
|
+
equals: 'published'
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
_status: {
|
|
41
|
+
exists: false
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
]
|
|
45
|
+
};
|
|
46
|
+
} else {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
export const isAdmin = (args)=>{
|
|
51
|
+
// console.log('isAdmin', roles.Admin, args.req.user?.roles);
|
|
52
|
+
return isRole(roles.Admin)(args);
|
|
53
|
+
};
|
|
54
|
+
export const isSelf = (args)=>{
|
|
55
|
+
const { req } = args;
|
|
56
|
+
const user = req.user;
|
|
57
|
+
if (!user) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
if (user.collection !== options.slug.users && !hasRole(user, roles.User)) return false;
|
|
61
|
+
return {
|
|
62
|
+
id: {
|
|
63
|
+
equals: user.id
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
export const isOwn = (args)=>{
|
|
68
|
+
const { req } = args;
|
|
69
|
+
const user = req.user;
|
|
70
|
+
if (!hasRole(user, roles.User)) return false;
|
|
71
|
+
return {
|
|
72
|
+
'user.id': {
|
|
73
|
+
equals: user.id
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
export const isAdminOrSelf = (args)=>{
|
|
78
|
+
return isAdmin(args) || isSelf(args);
|
|
79
|
+
};
|
|
80
|
+
export const isAdminOrOwn = (args)=>{
|
|
81
|
+
return isAdmin(args) || isOwn(args);
|
|
82
|
+
};
|
|
83
|
+
export const isTenant = (slug)=>(args)=>{
|
|
84
|
+
const { req } = args;
|
|
85
|
+
const { payload } = req;
|
|
86
|
+
const user = req.user;
|
|
87
|
+
if (!isUserWithTenants(user)) {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
// find collections used as tenants (es: ['market', 'llmApp'])
|
|
91
|
+
const userCollection = payload.config.collections.find((x)=>x.slug === user.collection);
|
|
92
|
+
const tenantsField = (userCollection?.fields || []).find((x)=>x.type === 'relationship' && x.name === 'tenants');
|
|
93
|
+
const tenantCollections = [];
|
|
94
|
+
if (Array.isArray(tenantsField?.relationTo)) {
|
|
95
|
+
tenantCollections.push(...tenantsField.relationTo);
|
|
96
|
+
} else {
|
|
97
|
+
tenantCollections.push(tenantsField.relationTo);
|
|
98
|
+
}
|
|
99
|
+
const isPolymorphicRel = Array.isArray(tenantsField.relationTo);
|
|
100
|
+
const isTenantDoc = tenantCollections.includes(slug);
|
|
101
|
+
if (isTenantDoc) {
|
|
102
|
+
// the doc itself is a tenant, check if the user has access to it
|
|
103
|
+
const query = {
|
|
104
|
+
id: {
|
|
105
|
+
in: isPolymorphicRel ? user.tenants.filter((x)=>x.relationTo === slug).map((x)=>x.value?.id) : user.tenants.map((x)=>x.id)
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
return query;
|
|
109
|
+
}
|
|
110
|
+
// find fields in the collection that are relationships to tenants collections
|
|
111
|
+
const collectionConfig = payload.config.collections.find((x)=>x.slug === slug);
|
|
112
|
+
const fields = (collectionConfig?.fields || []).filter((field)=>field.type === 'relationship' && tenantCollections.find((x)=>field.relationTo.includes(x)) !== undefined);
|
|
113
|
+
if (!fields.length) {
|
|
114
|
+
// the doc is neither a tenant nor has any field that is a relationship to a tenant collection, the user cannot access it
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
// for each field, check if its value is in the user's tenants (or is empty)
|
|
118
|
+
const query = {
|
|
119
|
+
and: fields.map((field)=>({
|
|
120
|
+
or: [
|
|
121
|
+
{
|
|
122
|
+
[field.name]: {
|
|
123
|
+
in: isPolymorphicRel ? user.tenants.filter((x)=>x.relationTo === field.relationTo).map((x)=>x.value?.id) : user.tenants.map((x)=>x.id)
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
// if the doc is not restricted to any tenant, we can access it
|
|
127
|
+
{
|
|
128
|
+
[field.name]: {
|
|
129
|
+
exists: false
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
[field.name]: {
|
|
134
|
+
equals: ''
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
[field.name]: {
|
|
139
|
+
equals: null
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
[field.name]: {
|
|
144
|
+
equals: []
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
]
|
|
148
|
+
}))
|
|
149
|
+
};
|
|
150
|
+
return query;
|
|
151
|
+
};
|
|
152
|
+
export const orAccess = (...access)=>{
|
|
153
|
+
return async (args)=>{
|
|
154
|
+
const wheres = [];
|
|
155
|
+
let result = false;
|
|
156
|
+
for (const a of access){
|
|
157
|
+
if (result === true) {
|
|
158
|
+
return result;
|
|
159
|
+
}
|
|
160
|
+
const r = await a(args);
|
|
161
|
+
if (typeof r === 'boolean') {
|
|
162
|
+
result = r;
|
|
163
|
+
} else {
|
|
164
|
+
wheres.push(r);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
const l = wheres.length;
|
|
168
|
+
if (l === 0) {
|
|
169
|
+
return false;
|
|
170
|
+
} else if (l === 1) {
|
|
171
|
+
return wheres[0];
|
|
172
|
+
}
|
|
173
|
+
const where = {
|
|
174
|
+
or: wheres
|
|
175
|
+
};
|
|
176
|
+
// console.log('where', JSON.stringify(where));
|
|
177
|
+
return where;
|
|
178
|
+
};
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
//# sourceMappingURL=access.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/core/access/access.ts"],"sourcesContent":["import { Access, AccessArgs, ClientUser, CollectionSlug, RelationshipField, TypedUser, Where } from 'payload';\r\nimport { options } from '../../options';\r\nimport { BowlRole, roles } from '../../types';\r\nimport { isMixerRequest } from '../api';\r\n\r\ntype UserWithRoles = TypedUser & {\r\n roles: BowlRole[];\r\n};\r\n\r\ntype BowlTenant = {\r\n relationTo?: string,\r\n value?: { id: string },\r\n id?: string,\r\n};\r\n\r\ntype UserWithTenants = TypedUser & {\r\n tenants: BowlTenant[];\r\n};\r\n\r\nconst isUserWithRoles = (user?: TypedUser | null): user is UserWithRoles => {\r\n return user ? (\r\n 'roles' in user &&\r\n Array.isArray(user.roles) &&\r\n user.roles.reduce((p, c) => p && options.rolesList.includes(c), true)\r\n ) : false;\r\n};\r\n\r\nconst isUserWithTenants = (user?: TypedUser | null): user is UserWithTenants => {\r\n return user ? (\r\n user.collection !== undefined &&\r\n 'tenants' in user &&\r\n Array.isArray(user.tenants) &&\r\n user.tenants.length > 0\r\n ) : false;\r\n};\r\n\r\n// !!! temporary fix expect ClientUser also\r\nexport const hasRole = (user_?: ClientUser | TypedUser | null, ...roles: BowlRole[]): user_ is UserWithRoles => {\r\n const user = user_ as TypedUser | null;\r\n if (!isUserWithRoles(user)) {\r\n return false;\r\n }\r\n // console.log('isUserWithRoles', roles, user.roles);\r\n // return true if the user has at least one of the roles in the roles arg (or the roles arg is empty and the user has any role at all)\r\n return roles.length === 0 ? (\r\n user.roles.length > 0\r\n ) : (\r\n user.roles.find(x => roles.includes(x)) !== undefined\r\n );\r\n};\r\n\r\nexport const isRole = (...roles: BowlRole[]) => (args: AccessArgs) => {\r\n const { req: { user } } = args;\r\n // console.log('isRole', user?.roles);\r\n return hasRole(user as TypedUser, ...roles);\r\n};\r\n\r\nexport const isPageRole = (...roles: BowlRole[]) => (args: AccessArgs) => {\r\n const { req } = args;\r\n const { user } = req;\r\n if (!hasRole(user as TypedUser, ...roles)) {\r\n return false;\r\n }\r\n if (isMixerRequest(req) && req.query?.draft !== 'true') {\r\n return {\r\n or: [\r\n {\r\n _status: {\r\n equals: 'published',\r\n },\r\n },\r\n {\r\n _status: {\r\n exists: false,\r\n },\r\n },\r\n ],\r\n };\r\n } else {\r\n return true;\r\n }\r\n};\r\n\r\nexport const isAdmin = (args: AccessArgs) => {\r\n // console.log('isAdmin', roles.Admin, args.req.user?.roles);\r\n return isRole(roles.Admin)(args);\r\n};\r\n\r\nexport const isSelf = (args: AccessArgs) => {\r\n const { req } = args;\r\n const user = req.user as TypedUser;\r\n if (!user) {\r\n return false;\r\n }\r\n if (\r\n user.collection !== options.slug.users &&\r\n !hasRole(user, roles.User)\r\n ) return false;\r\n return {\r\n id: {\r\n equals: (user).id,\r\n },\r\n };\r\n};\r\n\r\nexport const isOwn = (args: AccessArgs) => {\r\n const { req } = args;\r\n const user = req.user as TypedUser;\r\n if (!hasRole(user, roles.User)) return false;\r\n return {\r\n 'user.id': {\r\n equals: user.id,\r\n },\r\n };\r\n};\r\n\r\nexport const isAdminOrSelf = (args: AccessArgs) => {\r\n return isAdmin(args) || isSelf(args);\r\n};\r\n\r\nexport const isAdminOrOwn = (args: AccessArgs) => {\r\n return isAdmin(args) || isOwn(args);\r\n};\r\n\r\nexport const isTenant = (slug: CollectionSlug) => (args: AccessArgs) => {\r\n const { req } = args;\r\n const { payload } = req;\r\n const user = req.user as TypedUser;\r\n if (!isUserWithTenants(user)) {\r\n return false;\r\n }\r\n\r\n // find collections used as tenants (es: ['market', 'llmApp'])\r\n const userCollection = payload.config.collections.find(x => x.slug === user.collection);\r\n const tenantsField = (userCollection?.fields || [])\r\n .find(x => x.type === 'relationship' && x.name === 'tenants') as RelationshipField;\r\n const tenantCollections: CollectionSlug[] = [];\r\n if (Array.isArray(tenantsField?.relationTo)) {\r\n tenantCollections.push(...tenantsField.relationTo);\r\n } else {\r\n tenantCollections.push(tenantsField.relationTo);\r\n }\r\n const isPolymorphicRel = Array.isArray(tenantsField.relationTo);\r\n\r\n const isTenantDoc = tenantCollections.includes(slug);\r\n if (isTenantDoc) {\r\n // the doc itself is a tenant, check if the user has access to it\r\n const query = {\r\n id: {\r\n in: isPolymorphicRel ? (\r\n user.tenants\r\n .filter(x => x.relationTo === slug)\r\n .map(x => x.value?.id)\r\n ) : (\r\n user.tenants.map(x => x.id)\r\n ),\r\n },\r\n };\r\n return query;\r\n }\r\n\r\n // find fields in the collection that are relationships to tenants collections\r\n const collectionConfig = payload.config.collections.find(x => x.slug === slug);\r\n const fields = (collectionConfig?.fields || []).filter(field =>\r\n field.type === 'relationship' &&\r\n tenantCollections.find(x => field.relationTo.includes(x)) !== undefined\r\n ) as RelationshipField[];\r\n\r\n if (!fields.length) {\r\n // the doc is neither a tenant nor has any field that is a relationship to a tenant collection, the user cannot access it\r\n return false;\r\n }\r\n\r\n // for each field, check if its value is in the user's tenants (or is empty)\r\n const query = {\r\n and: fields.map(field => ({\r\n or: [\r\n {\r\n [field.name]: {\r\n in: isPolymorphicRel ? (\r\n user.tenants\r\n .filter(x => x.relationTo === field.relationTo)\r\n .map(x => x.value?.id)\r\n ) : (\r\n user.tenants.map(x => x.id)\r\n ),\r\n },\r\n },\r\n // if the doc is not restricted to any tenant, we can access it\r\n {\r\n [field.name]: {\r\n exists: false,\r\n },\r\n },\r\n {\r\n [field.name]: {\r\n equals: '',\r\n },\r\n },\r\n {\r\n [field.name]: {\r\n equals: null,\r\n },\r\n },\r\n {\r\n [field.name]: {\r\n equals: [],\r\n },\r\n },\r\n ],\r\n })),\r\n };\r\n return query;\r\n};\r\n\r\nexport const orAccess = (...access: Access[]): Access => {\r\n return async (args: AccessArgs) => {\r\n const wheres: Where[] = [];\r\n let result: boolean = false;\r\n for (const a of access) {\r\n if (result === true) {\r\n return result;\r\n }\r\n const r = await a(args);\r\n if (typeof r === 'boolean') {\r\n result = r;\r\n } else {\r\n wheres.push(r);\r\n }\r\n }\r\n const l = wheres.length;\r\n if (l === 0) {\r\n return false;\r\n } else if (l === 1) {\r\n return wheres[0];\r\n }\r\n const where: Where = {\r\n or: wheres,\r\n };\r\n // console.log('where', JSON.stringify(where));\r\n return where;\r\n };\r\n};\r\n"],"names":["options","roles","isMixerRequest","isUserWithRoles","user","Array","isArray","reduce","p","c","rolesList","includes","isUserWithTenants","collection","undefined","tenants","length","hasRole","user_","find","x","isRole","args","req","isPageRole","query","draft","or","_status","equals","exists","isAdmin","Admin","isSelf","slug","users","User","id","isOwn","isAdminOrSelf","isAdminOrOwn","isTenant","payload","userCollection","config","collections","tenantsField","fields","type","name","tenantCollections","relationTo","push","isPolymorphicRel","isTenantDoc","in","filter","map","value","collectionConfig","field","and","orAccess","access","wheres","result","a","r","l","where"],"mappings":"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"}
|