@strapi/admin 5.56.0 → 5.57.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/admin/src/components/Filters.js +1 -1
- package/dist/admin/admin/src/components/Filters.js.map +1 -1
- package/dist/admin/admin/src/components/Filters.mjs +1 -1
- package/dist/admin/admin/src/components/Filters.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Enumeration.js +2 -2
- package/dist/admin/admin/src/components/FormInputs/Enumeration.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs +2 -2
- package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs.map +1 -1
- package/dist/admin/admin/src/components/MediaLibraryBanner.js +38 -2
- package/dist/admin/admin/src/components/MediaLibraryBanner.js.map +1 -1
- package/dist/admin/admin/src/components/MediaLibraryBanner.mjs +18 -2
- package/dist/admin/admin/src/components/MediaLibraryBanner.mjs.map +1 -1
- package/dist/admin/admin/src/components/RelativeTime.js +9 -0
- package/dist/admin/admin/src/components/RelativeTime.js.map +1 -1
- package/dist/admin/admin/src/components/RelativeTime.mjs +10 -1
- package/dist/admin/admin/src/components/RelativeTime.mjs.map +1 -1
- package/dist/admin/admin/src/components/TopBanners.js +52 -0
- package/dist/admin/admin/src/components/TopBanners.js.map +1 -0
- package/dist/admin/admin/src/components/TopBanners.mjs +30 -0
- package/dist/admin/admin/src/components/TopBanners.mjs.map +1 -0
- package/dist/admin/admin/src/features/Tracking.js +28 -8
- package/dist/admin/admin/src/features/Tracking.js.map +1 -1
- package/dist/admin/admin/src/features/Tracking.mjs +29 -10
- package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
- package/dist/admin/admin/src/layouts/AuthenticatedLayout.js +4 -20
- package/dist/admin/admin/src/layouts/AuthenticatedLayout.js.map +1 -1
- package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs +4 -20
- package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs.map +1 -1
- package/dist/admin/admin/src/layouts/useAuthenticatedAccessTracking.js +59 -0
- package/dist/admin/admin/src/layouts/useAuthenticatedAccessTracking.js.map +1 -0
- package/dist/admin/admin/src/layouts/useAuthenticatedAccessTracking.mjs +37 -0
- package/dist/admin/admin/src/layouts/useAuthenticatedAccessTracking.mjs.map +1 -0
- package/dist/admin/admin/src/translations/en.json.js +5 -0
- package/dist/admin/admin/src/translations/en.json.js.map +1 -1
- package/dist/admin/admin/src/translations/en.json.mjs +5 -0
- package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
- package/dist/admin/admin/src/utils/getFetchClient.js +3 -3
- package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
- package/dist/admin/admin/src/utils/getFetchClient.mjs +2 -2
- package/dist/admin/admin/src/utils/getFetchClient.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js +6 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs +6 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs.map +1 -1
- package/dist/admin/src/components/MediaLibraryBanner.d.ts +10 -1
- package/dist/admin/src/components/TopBanners.d.ts +8 -0
- package/dist/admin/src/features/Tracking.d.ts +12 -1
- package/dist/admin/src/layouts/useAuthenticatedAccessTracking.d.ts +6 -0
- package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.d.ts +5 -0
- package/dist/ee/server/src/controllers/admin.d.ts.map +1 -1
- package/dist/ee/server/src/controllers/authentication-utils/utils.d.ts +8 -2
- package/dist/ee/server/src/controllers/authentication-utils/utils.d.ts.map +1 -1
- package/dist/ee/server/src/controllers/authentication.d.ts.map +1 -1
- package/dist/ee/server/src/controllers/user.d.ts.map +1 -1
- package/dist/ee/server/src/index.d.ts +4 -1
- package/dist/ee/server/src/index.d.ts.map +1 -1
- package/dist/ee/server/src/services/index.d.ts +4 -1
- package/dist/ee/server/src/services/index.d.ts.map +1 -1
- package/dist/ee/server/src/services/metrics.d.ts.map +1 -1
- package/dist/ee/server/src/services/persist-tables.d.ts.map +1 -1
- package/dist/ee/server/src/services/seat-enforcement.d.ts +3 -1
- package/dist/ee/server/src/services/seat-enforcement.d.ts.map +1 -1
- package/dist/server/ee/server/src/controllers/admin.js +3 -4
- package/dist/server/ee/server/src/controllers/admin.js.map +1 -1
- package/dist/server/ee/server/src/controllers/admin.mjs +3 -4
- package/dist/server/ee/server/src/controllers/admin.mjs.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication-utils/utils.js +2 -2
- package/dist/server/ee/server/src/controllers/authentication-utils/utils.js.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication-utils/utils.mjs +2 -2
- package/dist/server/ee/server/src/controllers/authentication-utils/utils.mjs.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication.js +11 -11
- package/dist/server/ee/server/src/controllers/authentication.js.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication.mjs +11 -11
- package/dist/server/ee/server/src/controllers/authentication.mjs.map +1 -1
- package/dist/server/ee/server/src/controllers/user.js +7 -8
- package/dist/server/ee/server/src/controllers/user.js.map +1 -1
- package/dist/server/ee/server/src/controllers/user.mjs +8 -9
- package/dist/server/ee/server/src/controllers/user.mjs.map +1 -1
- package/dist/server/ee/server/src/services/metrics.js +9 -7
- package/dist/server/ee/server/src/services/metrics.js.map +1 -1
- package/dist/server/ee/server/src/services/metrics.mjs +9 -7
- package/dist/server/ee/server/src/services/metrics.mjs.map +1 -1
- package/dist/server/ee/server/src/services/persist-tables.js +3 -4
- package/dist/server/ee/server/src/services/persist-tables.js.map +1 -1
- package/dist/server/ee/server/src/services/persist-tables.mjs +3 -4
- package/dist/server/ee/server/src/services/persist-tables.mjs.map +1 -1
- package/dist/server/ee/server/src/services/role.js +2 -2
- package/dist/server/ee/server/src/services/role.js.map +1 -1
- package/dist/server/ee/server/src/services/role.mjs +1 -1
- package/dist/server/ee/server/src/services/role.mjs.map +1 -1
- package/dist/server/ee/server/src/services/seat-enforcement.js +20 -20
- package/dist/server/ee/server/src/services/seat-enforcement.js.map +1 -1
- package/dist/server/ee/server/src/services/seat-enforcement.mjs +20 -20
- package/dist/server/ee/server/src/services/seat-enforcement.mjs.map +1 -1
- package/dist/server/ee/server/src/services/user.js +1 -2
- package/dist/server/ee/server/src/services/user.js.map +1 -1
- package/dist/server/ee/server/src/services/user.mjs +2 -3
- package/dist/server/ee/server/src/services/user.mjs.map +1 -1
- package/dist/server/ee/server/src/utils/sso-lock.js +2 -2
- package/dist/server/ee/server/src/utils/sso-lock.js.map +1 -1
- package/dist/server/ee/server/src/utils/sso-lock.mjs +1 -1
- package/dist/server/ee/server/src/utils/sso-lock.mjs.map +1 -1
- package/dist/server/server/src/audit-logs/admin-users.js +3 -3
- package/dist/server/server/src/audit-logs/admin-users.js.map +1 -1
- package/dist/server/server/src/audit-logs/admin-users.mjs +2 -2
- package/dist/server/server/src/audit-logs/admin-users.mjs.map +1 -1
- package/dist/server/server/src/audit-logs/tokens.js +3 -3
- package/dist/server/server/src/audit-logs/tokens.js.map +1 -1
- package/dist/server/server/src/audit-logs/tokens.mjs +2 -2
- package/dist/server/server/src/audit-logs/tokens.mjs.map +1 -1
- package/dist/server/server/src/audit-logs/webhooks.js +2 -2
- package/dist/server/server/src/audit-logs/webhooks.js.map +1 -1
- package/dist/server/server/src/audit-logs/webhooks.mjs +1 -1
- package/dist/server/server/src/audit-logs/webhooks.mjs.map +1 -1
- package/dist/server/server/src/bootstrap.js +6 -4
- package/dist/server/server/src/bootstrap.js.map +1 -1
- package/dist/server/server/src/bootstrap.mjs +6 -4
- package/dist/server/server/src/bootstrap.mjs.map +1 -1
- package/dist/server/server/src/controllers/admin-token.js +8 -8
- package/dist/server/server/src/controllers/admin-token.js.map +1 -1
- package/dist/server/server/src/controllers/admin-token.mjs +4 -4
- package/dist/server/server/src/controllers/admin-token.mjs.map +1 -1
- package/dist/server/server/src/controllers/admin.js +3 -5
- package/dist/server/server/src/controllers/admin.js.map +1 -1
- package/dist/server/server/src/controllers/admin.mjs +2 -4
- package/dist/server/server/src/controllers/admin.mjs.map +1 -1
- package/dist/server/server/src/controllers/api-token.js +8 -8
- package/dist/server/server/src/controllers/api-token.js.map +1 -1
- package/dist/server/server/src/controllers/api-token.mjs +4 -4
- package/dist/server/server/src/controllers/api-token.mjs.map +1 -1
- package/dist/server/server/src/controllers/formatters/conditions.js +2 -2
- package/dist/server/server/src/controllers/formatters/conditions.js.map +1 -1
- package/dist/server/server/src/controllers/formatters/conditions.mjs +2 -2
- package/dist/server/server/src/controllers/formatters/conditions.mjs.map +1 -1
- package/dist/server/server/src/controllers/transfer/index.js +2 -2
- package/dist/server/server/src/controllers/transfer/index.js.map +1 -1
- package/dist/server/server/src/controllers/transfer/index.mjs +2 -2
- package/dist/server/server/src/controllers/transfer/index.mjs.map +1 -1
- package/dist/server/server/src/controllers/transfer/token.js +8 -8
- package/dist/server/server/src/controllers/transfer/token.js.map +1 -1
- package/dist/server/server/src/controllers/transfer/token.mjs +4 -4
- package/dist/server/server/src/controllers/transfer/token.mjs.map +1 -1
- package/dist/server/server/src/domain/action/index.js +18 -16
- package/dist/server/server/src/domain/action/index.js.map +1 -1
- package/dist/server/server/src/domain/action/index.mjs +16 -14
- package/dist/server/server/src/domain/action/index.mjs.map +1 -1
- package/dist/server/server/src/domain/action/provider.mjs +4 -4
- package/dist/server/server/src/domain/action/provider.mjs.map +1 -1
- package/dist/server/server/src/domain/condition/index.js +7 -4
- package/dist/server/server/src/domain/condition/index.js.map +1 -1
- package/dist/server/server/src/domain/condition/index.mjs +7 -4
- package/dist/server/server/src/domain/condition/index.mjs.map +1 -1
- package/dist/server/server/src/domain/permission/index.js +24 -15
- package/dist/server/server/src/domain/permission/index.js.map +1 -1
- package/dist/server/server/src/domain/permission/index.mjs +21 -12
- package/dist/server/server/src/domain/permission/index.mjs.map +1 -1
- package/dist/server/server/src/middlewares/rateLimit.js +5 -5
- package/dist/server/server/src/middlewares/rateLimit.js.map +1 -1
- package/dist/server/server/src/middlewares/rateLimit.mjs +4 -4
- package/dist/server/server/src/middlewares/rateLimit.mjs.map +1 -1
- package/dist/server/server/src/register.js +6 -0
- package/dist/server/server/src/register.js.map +1 -1
- package/dist/server/server/src/register.mjs +6 -0
- package/dist/server/server/src/register.mjs.map +1 -1
- package/dist/server/server/src/services/action.js +1 -2
- package/dist/server/server/src/services/action.js.map +1 -1
- package/dist/server/server/src/services/action.mjs +1 -2
- package/dist/server/server/src/services/action.mjs.map +1 -1
- package/dist/server/server/src/services/api-token.js +61 -49
- package/dist/server/server/src/services/api-token.js.map +1 -1
- package/dist/server/server/src/services/api-token.mjs +53 -41
- package/dist/server/server/src/services/api-token.mjs.map +1 -1
- package/dist/server/server/src/services/condition.js +2 -2
- package/dist/server/server/src/services/condition.js.map +1 -1
- package/dist/server/server/src/services/condition.mjs +1 -1
- package/dist/server/server/src/services/condition.mjs.map +1 -1
- package/dist/server/server/src/services/content-type.js +5 -4
- package/dist/server/server/src/services/content-type.js.map +1 -1
- package/dist/server/server/src/services/content-type.mjs +8 -7
- package/dist/server/server/src/services/content-type.mjs.map +1 -1
- package/dist/server/server/src/services/homepage.js +2 -1
- package/dist/server/server/src/services/homepage.js.map +1 -1
- package/dist/server/server/src/services/homepage.mjs +2 -1
- package/dist/server/server/src/services/homepage.mjs.map +1 -1
- package/dist/server/server/src/services/passport/local-strategy.js +2 -2
- package/dist/server/server/src/services/passport/local-strategy.js.map +1 -1
- package/dist/server/server/src/services/passport/local-strategy.mjs +1 -1
- package/dist/server/server/src/services/passport/local-strategy.mjs.map +1 -1
- package/dist/server/server/src/services/passport.js +1 -2
- package/dist/server/server/src/services/passport.js.map +1 -1
- package/dist/server/server/src/services/passport.mjs +1 -2
- package/dist/server/server/src/services/passport.mjs.map +1 -1
- package/dist/server/server/src/services/permission/engine.js +4 -4
- package/dist/server/server/src/services/permission/engine.js.map +1 -1
- package/dist/server/server/src/services/permission/engine.mjs +2 -2
- package/dist/server/server/src/services/permission/engine.mjs.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/index.js +2 -3
- package/dist/server/server/src/services/permission/permissions-manager/index.js.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/index.mjs +1 -2
- package/dist/server/server/src/services/permission/permissions-manager/index.mjs.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/permission-fields.js +6 -6
- package/dist/server/server/src/services/permission/permissions-manager/permission-fields.js.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/permission-fields.mjs +4 -4
- package/dist/server/server/src/services/permission/permissions-manager/permission-fields.mjs.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/sanitize.js +47 -41
- package/dist/server/server/src/services/permission/permissions-manager/sanitize.js.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/sanitize.mjs +44 -38
- package/dist/server/server/src/services/permission/permissions-manager/sanitize.mjs.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/validate.js +30 -26
- package/dist/server/server/src/services/permission/permissions-manager/validate.js.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/validate.mjs +28 -24
- package/dist/server/server/src/services/permission/permissions-manager/validate.mjs.map +1 -1
- package/dist/server/server/src/services/permission/queries.js +9 -9
- package/dist/server/server/src/services/permission/queries.js.map +1 -1
- package/dist/server/server/src/services/permission/queries.mjs +9 -9
- package/dist/server/server/src/services/permission/queries.mjs.map +1 -1
- package/dist/server/server/src/services/permission/rename-fields.js +118 -0
- package/dist/server/server/src/services/permission/rename-fields.js.map +1 -0
- package/dist/server/server/src/services/permission/rename-fields.mjs +116 -0
- package/dist/server/server/src/services/permission/rename-fields.mjs.map +1 -0
- package/dist/server/server/src/services/permission/sections-builder/index.js +2 -2
- package/dist/server/server/src/services/permission/sections-builder/index.js.map +1 -1
- package/dist/server/server/src/services/permission/sections-builder/index.mjs +2 -2
- package/dist/server/server/src/services/permission/sections-builder/index.mjs.map +1 -1
- package/dist/server/server/src/services/permission/sections-builder/section.js +1 -2
- package/dist/server/server/src/services/permission/sections-builder/section.js.map +1 -1
- package/dist/server/server/src/services/permission/sections-builder/section.mjs +1 -2
- package/dist/server/server/src/services/permission/sections-builder/section.mjs.map +1 -1
- package/dist/server/server/src/services/permission/sections-builder/utils.js +6 -6
- package/dist/server/server/src/services/permission/sections-builder/utils.js.map +1 -1
- package/dist/server/server/src/services/permission/sections-builder/utils.mjs +4 -4
- package/dist/server/server/src/services/permission/sections-builder/utils.mjs.map +1 -1
- package/dist/server/server/src/services/role.js +20 -19
- package/dist/server/server/src/services/role.js.map +1 -1
- package/dist/server/server/src/services/role.mjs +20 -19
- package/dist/server/server/src/services/role.mjs.map +1 -1
- package/dist/server/server/src/services/transfer/token.js +20 -16
- package/dist/server/server/src/services/transfer/token.js.map +1 -1
- package/dist/server/server/src/services/transfer/token.mjs +14 -10
- package/dist/server/server/src/services/transfer/token.mjs.map +1 -1
- package/dist/server/server/src/services/user.js +2 -3
- package/dist/server/server/src/services/user.js.map +1 -1
- package/dist/server/server/src/services/user.mjs +3 -4
- package/dist/server/server/src/services/user.mjs.map +1 -1
- package/dist/server/server/src/strategies/api-token-utils.js +2 -3
- package/dist/server/server/src/strategies/api-token-utils.js.map +1 -1
- package/dist/server/server/src/strategies/api-token-utils.mjs +2 -3
- package/dist/server/server/src/strategies/api-token-utils.mjs.map +1 -1
- package/dist/server/server/src/strategies/content-api-token.js +3 -3
- package/dist/server/server/src/strategies/content-api-token.js.map +1 -1
- package/dist/server/server/src/strategies/content-api-token.mjs +1 -1
- package/dist/server/server/src/strategies/content-api-token.mjs.map +1 -1
- package/dist/server/server/src/strategies/data-transfer.js +4 -4
- package/dist/server/server/src/strategies/data-transfer.js.map +1 -1
- package/dist/server/server/src/strategies/data-transfer.mjs +3 -3
- package/dist/server/server/src/strategies/data-transfer.mjs.map +1 -1
- package/dist/server/server/src/validation/common-validators.js +9 -10
- package/dist/server/server/src/validation/common-validators.js.map +1 -1
- package/dist/server/server/src/validation/common-validators.mjs +13 -14
- package/dist/server/server/src/validation/common-validators.mjs.map +1 -1
- package/dist/server/server/src/validation/user.js +1 -2
- package/dist/server/server/src/validation/user.js.map +1 -1
- package/dist/server/server/src/validation/user.mjs +1 -2
- package/dist/server/server/src/validation/user.mjs.map +1 -1
- package/dist/server/src/audit-logs/tokens.d.ts.map +1 -1
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/controllers/admin-token.d.ts.map +1 -1
- package/dist/server/src/controllers/admin.d.ts.map +1 -1
- package/dist/server/src/controllers/api-token.d.ts.map +1 -1
- package/dist/server/src/controllers/formatters/conditions.d.ts +1 -1
- package/dist/server/src/controllers/formatters/conditions.d.ts.map +1 -1
- package/dist/server/src/controllers/homepage.d.ts +1 -1
- package/dist/server/src/controllers/index.d.ts +1 -1
- package/dist/server/src/controllers/transfer/index.d.ts.map +1 -1
- package/dist/server/src/controllers/transfer/token.d.ts.map +1 -1
- package/dist/server/src/domain/action/index.d.ts +1 -0
- package/dist/server/src/domain/action/index.d.ts.map +1 -1
- package/dist/server/src/domain/condition/index.d.ts +2 -2
- package/dist/server/src/domain/condition/index.d.ts.map +1 -1
- package/dist/server/src/domain/permission/index.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +3 -3
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/middlewares/index.d.ts.map +1 -1
- package/dist/server/src/middlewares/rateLimit.d.ts.map +1 -1
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/services/action.d.ts.map +1 -1
- package/dist/server/src/services/api-token.d.ts.map +1 -1
- package/dist/server/src/services/condition.d.ts.map +1 -1
- package/dist/server/src/services/content-type.d.ts.map +1 -1
- package/dist/server/src/services/homepage.d.ts +1 -1
- package/dist/server/src/services/homepage.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +2 -2
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/passport/local-strategy.d.ts.map +1 -1
- package/dist/server/src/services/passport.d.ts.map +1 -1
- package/dist/server/src/services/permission/engine.d.ts.map +1 -1
- package/dist/server/src/services/permission/permissions-manager/permission-fields.d.ts.map +1 -1
- package/dist/server/src/services/permission/permissions-manager/sanitize.d.ts.map +1 -1
- package/dist/server/src/services/permission/permissions-manager/validate.d.ts.map +1 -1
- package/dist/server/src/services/permission/queries.d.ts.map +1 -1
- package/dist/server/src/services/permission/rename-fields.d.ts +21 -0
- package/dist/server/src/services/permission/rename-fields.d.ts.map +1 -0
- package/dist/server/src/services/permission/sections-builder/section.d.ts.map +1 -1
- package/dist/server/src/services/permission/sections-builder/utils.d.ts +1 -1
- package/dist/server/src/services/permission/sections-builder/utils.d.ts.map +1 -1
- package/dist/server/src/services/role.d.ts +1 -1
- package/dist/server/src/services/role.d.ts.map +1 -1
- package/dist/server/src/services/transfer/token.d.ts.map +1 -1
- package/dist/server/src/strategies/content-api-token.d.ts.map +1 -1
- package/dist/server/src/validation/user.d.ts.map +1 -1
- package/package.json +9 -9
|
@@ -212,7 +212,7 @@ const Root = ({ children, disabled = false, onChange, options = [], onOpenChange
|
|
|
212
212
|
label: filter.label,
|
|
213
213
|
value: filter.name
|
|
214
214
|
})),
|
|
215
|
-
|
|
215
|
+
placeholder: formatMessage({
|
|
216
216
|
id: 'app.utils.select-field',
|
|
217
217
|
defaultMessage: 'Select field'
|
|
218
218
|
}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Filters.js","sources":["../../../../../admin/src/components/Filters.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Flex, Popover, Tag } from '@strapi/design-system';\nimport { Plus, Filter as FilterIcon, Cross } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport {\n BASE_FILTERS,\n CONTAINS_FILTERS,\n FilterOption,\n IS_SENSITIVE_FILTERS,\n NUMERIC_FILTERS,\n STRING_PARSE_FILTERS,\n FILTERS_WITH_NO_VALUE,\n} from '../constants/filters';\nimport { useControllableState } from '../hooks/useControllableState';\nimport {\n deepEncodeQueryValues,\n useQueryParams,\n withEncodedUserParams,\n} from '../hooks/useQueryParams';\n\nimport { createContext } from './Context';\nimport { Form, InputProps } from './Form';\nimport { InputRenderer } from './FormInputs/Renderer';\n\nimport type { Schema } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * Root\n * -----------------------------------------------------------------------------------------------*/\n\ninterface FilterFormData {\n name: string;\n filter: string;\n value?: string;\n}\n\n/**\n * Carries the position in the `$and` array so we replace that exact entry, not every entry\n * sharing the same `(name, operator, value)`.\n */\ninterface EditingFilter extends FilterFormData {\n index: number;\n}\n\ninterface FitlersContextValue {\n disabled: boolean;\n onChange: (data: FilterFormData) => void;\n options: Filters.Filter[];\n setOpen: (open: boolean) => void;\n editingFilter: EditingFilter | null;\n setEditingFilter: (filter: EditingFilter | null) => void;\n}\n\nconst [FiltersProvider, useFilters] = createContext<FitlersContextValue>('Filters');\n\nconst getFilterDetails = (\n filterEntry: Record<string, unknown>,\n options: Filters.Filter[]\n): { name: string; operator: string; value: unknown } | null => {\n const [name] = Object.keys(filterEntry);\n const option = options.find((o) => o.name === name);\n if (!option) {\n return null;\n }\n\n const operatorObj =\n option.type === 'relation'\n ? (filterEntry[name] as Record<string, unknown>)?.[option.mainField?.name ?? 'id']\n : filterEntry[name];\n\n if (typeof operatorObj !== 'object' || operatorObj === null) {\n return null;\n }\n\n const [operator] = Object.keys(operatorObj as Record<string, unknown>);\n if (!operator) {\n return null;\n }\n\n return { name, operator, value: (operatorObj as Record<string, unknown>)[operator] };\n};\n\ninterface RootProps\n extends Partial<Pick<FitlersContextValue, 'disabled' | 'onChange' | 'options'>>,\n Popover.Props {\n children: React.ReactNode;\n}\n\nconst Root = ({\n children,\n disabled = false,\n onChange,\n options = [],\n onOpenChange,\n open: openProp,\n defaultOpen,\n ...restProps\n}: RootProps) => {\n const [editingFilter, setEditingFilter] = React.useState<EditingFilter | null>(null);\n\n const handleChange = (data: FilterFormData) => {\n if (onChange) {\n onChange(data);\n }\n };\n\n const [open = false, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen,\n onChange: onOpenChange,\n });\n\n React.useEffect(() => {\n if (!open) {\n setEditingFilter(null);\n }\n }, [open]);\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen} {...restProps}>\n <FiltersProvider\n setOpen={setOpen}\n disabled={disabled}\n onChange={handleChange}\n options={options}\n editingFilter={editingFilter}\n setEditingFilter={setEditingFilter}\n >\n {children}\n </FiltersProvider>\n </Popover.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Trigger\n * -----------------------------------------------------------------------------------------------*/\n\nconst Trigger = React.forwardRef<HTMLButtonElement, Filters.TriggerProps>(\n ({ label }, forwardedRef) => {\n const { formatMessage } = useIntl();\n const disabled = useFilters('Trigger', ({ disabled }) => disabled);\n\n return (\n <Popover.Trigger>\n <Button\n variant=\"tertiary\"\n ref={forwardedRef}\n startIcon={<FilterIcon />}\n size=\"S\"\n disabled={disabled}\n >\n {label || formatMessage({ id: 'app.utils.filters', defaultMessage: 'Filters' })}\n </Button>\n </Popover.Trigger>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Popover\n * -----------------------------------------------------------------------------------------------*/\n/**\n * The zIndex property is used to override the zIndex of the Portal element of the Popover.\n * This is needed to ensure that the DatePicker is rendered above the Popover when opened.\n * The issue was that both the DatePicker and the Popover are rendered in a Portal and have the same zIndex.\n * On init, since the DatePicker is rendered before the Popover in the DOM,\n * it's causing the issue of appearing behind the Popover.\n */\nconst PopoverImpl = ({ zIndex }: { zIndex?: number }) => {\n const [{ query }, setQuery] = useQueryParams<Filters.Query>();\n const { formatMessage } = useIntl();\n const options = useFilters('Popover', ({ options }) => options);\n const onChange = useFilters('Popover', ({ onChange }) => onChange);\n const setOpen = useFilters('Popover', ({ setOpen }) => setOpen);\n const editingFilter = useFilters('Popover', ({ editingFilter }) => editingFilter);\n const setEditingFilter = useFilters('Popover', ({ setEditingFilter }) => setEditingFilter);\n\n const initialValues = React.useMemo(() => {\n return editingFilter ?? { name: options[0]?.name, filter: BASE_FILTERS[0].value };\n }, [editingFilter, options]);\n\n if (options.length === 0) {\n return null;\n }\n\n const handleSubmit = (data: FilterFormData) => {\n const value = FILTERS_WITH_NO_VALUE.includes(data.filter) ? 'true' : (data.value ?? '');\n\n if (!value) {\n return;\n }\n\n if (onChange) {\n onChange(data);\n }\n\n /**\n * There will ALWAYS be an option because we use the options to create the form data.\n */\n const fieldOptions = options.find((filter) => filter.name === data.name)!;\n\n /**\n * If the filter is a relation, we need to nest the filter object,\n * we filter based on the mainField of the relation, if there is no mainField, we use the id.\n * At the end, we pass the operator & value. This value _could_ look like:\n * ```json\n * {\n * \"$eq\": \"1\",\n * }\n * ```\n */\n const operatorValuePairing = {\n [data.filter]: value,\n };\n\n const newFilterEntry = {\n [data.name]:\n fieldOptions.type === 'relation'\n ? {\n [fieldOptions.mainField?.name ?? 'id']: operatorValuePairing,\n }\n : operatorValuePairing,\n };\n\n const existingFilters = query.filters?.$and ?? [];\n\n const newFilterQuery = editingFilter\n ? {\n ...query.filters,\n $and: existingFilters.map((filter, i) =>\n i === editingFilter.index ? newFilterEntry : filter\n ),\n }\n : {\n ...query.filters,\n $and: [...existingFilters, newFilterEntry],\n };\n\n setQuery(\n withEncodedUserParams(query, { filters: deepEncodeQueryValues(newFilterQuery), page: 1 }),\n 'push',\n true\n );\n setOpen(false);\n setEditingFilter(null);\n };\n\n return (\n <Popover.Content style={{ zIndex }}>\n <Box padding={3}>\n <Form\n method=\"POST\"\n initialValues={initialValues}\n onSubmit={handleSubmit}\n key={\n editingFilter\n ? `edit-${editingFilter.index}-${editingFilter.name}-${editingFilter.filter}-${editingFilter.value ?? 'empty'}`\n : 'create'\n }\n >\n {({ values: formValues, modified, isSubmitting }) => {\n const filter = options.find((filter) => filter.name === formValues.name);\n const Input = filter?.input || InputRenderer;\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2} style={{ minWidth: 184 }}>\n {[\n {\n ['aria-label']: formatMessage({\n id: 'app.utils.select-field',\n defaultMessage: 'Select field',\n }),\n name: 'name',\n options: options.map((filter) => ({\n label: filter.label,\n value: filter.name,\n })),\n placholder: formatMessage({\n id: 'app.utils.select-field',\n defaultMessage: 'Select field',\n }),\n type: 'enumeration' as const,\n },\n {\n ['aria-label']: formatMessage({\n id: 'app.utils.select-filter',\n defaultMessage: 'Select filter',\n }),\n name: 'filter',\n options:\n filter?.operators ||\n getFilterList(filter).map((opt) => ({\n label: formatMessage(opt.label),\n value: opt.value,\n })),\n placeholder: formatMessage({\n id: 'app.utils.select-filter',\n defaultMessage: 'Select filter',\n }),\n type: 'enumeration' as const,\n },\n ].map((field) => (\n <InputRenderer key={field.name} {...field} />\n ))}\n {filter &&\n formValues.filter &&\n !FILTERS_WITH_NO_VALUE.includes(formValues.filter) ? (\n <Input\n {...filter}\n label={null}\n aria-label={filter.label}\n name=\"value\"\n // @ts-expect-error – if type is `custom` then `Input` will be a custom component.\n type={filter.mainField?.type ?? filter.type}\n />\n ) : null}\n <Button\n disabled={!modified || isSubmitting}\n size=\"L\"\n variant=\"secondary\"\n startIcon={<Plus />}\n type=\"submit\"\n fullWidth\n >\n {editingFilter\n ? formatMessage({\n id: 'app.utils.update-filter',\n defaultMessage: 'Update filter',\n })\n : formatMessage({ id: 'app.utils.add-filter', defaultMessage: 'Add filter' })}\n </Button>\n </Flex>\n );\n }}\n </Form>\n </Box>\n </Popover.Content>\n );\n};\n\n/**\n * Depending on the selected field find the possible filters to apply\n */\nconst getFilterList = (filter?: Filters.Filter): FilterOption[] => {\n if (!filter) {\n return [];\n }\n\n const type = filter.mainField?.type ? filter.mainField.type : filter.type;\n\n switch (type) {\n case 'email':\n case 'text':\n case 'string': {\n return [\n ...BASE_FILTERS,\n ...IS_SENSITIVE_FILTERS,\n ...CONTAINS_FILTERS,\n ...STRING_PARSE_FILTERS,\n ];\n }\n\n case 'float':\n case 'integer':\n case 'biginteger':\n case 'decimal': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS];\n }\n case 'time':\n case 'date': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS, ...CONTAINS_FILTERS];\n }\n\n case 'datetime': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS];\n }\n\n case 'enumeration': {\n return BASE_FILTERS;\n }\n\n default:\n return [...BASE_FILTERS, ...IS_SENSITIVE_FILTERS];\n }\n};\n\n/* -------------------------------------------------------------------------------------------------\n * List\n * -----------------------------------------------------------------------------------------------*/\n\nconst List = () => {\n const [{ query }, setQuery] = useQueryParams<Filters.Query>();\n\n const options = useFilters('List', ({ options }) => options);\n\n /**\n * Removed by position: identical filters are a legal query, so matching on\n * `(name, operator, value)` would drop every copy at once.\n */\n const handleRemove = (index: number) => {\n const nextFilters = (query?.filters?.$and ?? []).filter((_, i) => i !== index);\n\n setQuery(\n withEncodedUserParams(query, {\n filters: deepEncodeQueryValues({ $and: nextFilters }),\n page: 1,\n })\n );\n };\n\n if (!query?.filters?.$and?.length) {\n return null;\n }\n\n return (\n <>\n {query?.filters?.$and?.map((queryFilter, index) => {\n const details = getFilterDetails(queryFilter, options);\n if (!details || typeof details.value === 'object') {\n return null;\n }\n\n const filter = options.find(({ name }) => name === details.name);\n if (!filter) {\n return null;\n }\n /**\n * `index` is the position in the raw `$and` array — entries skipped above still count.\n * Never cache it: `qs` re-indexes on removal, so dropping entry 0 of [0, 1, 2]\n * leaves [0, 1] and any held index goes stale.\n */\n return (\n <AttributeTag\n key={`${index}-${details.name}-${details.operator}-${details.value}`}\n {...filter}\n index={index}\n onRemove={handleRemove}\n operator={details.operator}\n value={String(details.value)}\n />\n );\n })}\n </>\n );\n};\n\ninterface AttributeTagProps extends Filters.Filter {\n /**\n * Position in the `$and` array. An explicit prop rather than a closure bound at the call\n * site, so it stays part of the props comparison if this ever gets memoised.\n */\n index: number;\n onRemove: (index: number) => void;\n operator: string;\n value: string;\n}\n\nconst AttributeTag = ({\n index,\n input,\n label,\n mainField,\n name,\n onRemove,\n operator,\n options,\n value,\n ...filter\n}: AttributeTagProps) => {\n const { formatMessage, formatDate, formatTime, formatNumber } = useIntl();\n const setOpen = useFilters('AttributeTag', ({ setOpen }) => setOpen);\n const setEditingFilter = useFilters('AttributeTag', ({ setEditingFilter }) => setEditingFilter);\n\n const handleEdit = () => {\n setEditingFilter({\n name,\n filter: operator,\n index,\n value: FILTERS_WITH_NO_VALUE.includes(operator) ? undefined : value,\n });\n setOpen(true);\n };\n\n const handleRemove = () => {\n onRemove(index);\n };\n\n const type = mainField?.type ? mainField.type : filter.type;\n\n let formattedValue: string = value;\n\n switch (type) {\n case 'date':\n formattedValue = formatDate(value, { dateStyle: 'full' });\n break;\n case 'datetime':\n formattedValue = formatDate(value, { dateStyle: 'full', timeStyle: 'short' });\n break;\n case 'time':\n const [hour, minute] = value.split(':');\n const date = new Date();\n date.setHours(Number(hour));\n date.setMinutes(Number(minute));\n\n formattedValue = formatTime(date, {\n hour: 'numeric',\n minute: 'numeric',\n });\n break;\n case 'float':\n case 'integer':\n case 'biginteger':\n case 'decimal':\n formattedValue = formatNumber(Number(value));\n break;\n }\n\n // Handle custom input\n if (input && options) {\n // If the custom input has an options array, find the option with a customValue matching the query value\n const selectedOption = options.find((option) => {\n return (typeof option === 'string' ? option : option.value) === value;\n });\n\n formattedValue = selectedOption\n ? typeof selectedOption === 'string'\n ? selectedOption\n : (selectedOption.label ?? selectedOption.value)\n : value;\n }\n\n const operatorLabel = formatMessage({\n id: `components.FilterOptions.FILTER_TYPES.${operator}`,\n defaultMessage: operator,\n });\n\n const content = FILTERS_WITH_NO_VALUE.includes(operator)\n ? `${label} ${operatorLabel}`\n : `${label} ${operatorLabel} ${formattedValue}`;\n\n return (\n <Tag padding={1} onClick={handleRemove} icon={<Cross />} label={content}>\n <Box tag=\"span\" cursor=\"pointer\" onClick={handleEdit}>\n {content}\n </Box>\n </Tag>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * EXPORTS\n * -----------------------------------------------------------------------------------------------*/\n\nconst Filters = {\n List,\n Popover: PopoverImpl,\n Root,\n Trigger,\n};\n\ninterface MainField {\n name: string;\n type: Schema.Attribute.Kind | 'custom';\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nnamespace Filters {\n export interface Filter {\n input?: React.ComponentType<ValueInputProps>;\n label: string;\n /**\n * the name of the attribute we use to display the actual name e.g. relations\n * are just ids, so we use the mainField to display something meaninginful by\n * looking at the target's schema\n */\n mainField?: MainField;\n name: string;\n operators?: Array<{\n label: string;\n value: string;\n }>;\n options?: Array<{ label?: string; value: string }> | string[];\n type: InputProps['type'] | 'relation' | 'custom';\n }\n\n export interface ValueInputProps extends Omit<Filter, 'label'> {\n ['aria-label']: string;\n }\n\n export type Props = RootProps;\n\n export interface TriggerProps {\n label?: string;\n }\n\n export interface Query {\n filters?: {\n /**\n * Typically, a filter will be:\n * ```ts\n * {\n * [attributeName]: {\n * [operator]: value\n * }\n * }\n * ```\n * However, for relation items it becomes more nested.\n * ```ts\n * {\n * [attributeName]: {\n * [relationTargetAttribute]: {\n * [operator]: value\n * }\n * }\n * }\n * ```\n */\n $and?: Array<Record<string, Record<string, string | Record<string, string>>>>;\n };\n page?: number;\n _q?: string;\n }\n}\n\nexport { Filters };\n"],"names":["FiltersProvider","useFilters","createContext","getFilterDetails","filterEntry","options","name","Object","keys","option","find","o","operatorObj","type","mainField","operator","value","Root","children","disabled","onChange","onOpenChange","open","openProp","defaultOpen","restProps","editingFilter","setEditingFilter","React","useState","handleChange","data","setOpen","useControllableState","prop","defaultProp","useEffect","_jsx","Popover","Trigger","forwardRef","label","forwardedRef","formatMessage","useIntl","Button","variant","ref","startIcon","FilterIcon","size","id","defaultMessage","PopoverImpl","zIndex","query","setQuery","useQueryParams","initialValues","useMemo","filter","BASE_FILTERS","length","handleSubmit","FILTERS_WITH_NO_VALUE","includes","fieldOptions","operatorValuePairing","newFilterEntry","existingFilters","filters","$and","newFilterQuery","map","i","index","withEncodedUserParams","deepEncodeQueryValues","page","Content","style","Box","padding","Form","method","onSubmit","values","formValues","modified","isSubmitting","Input","input","InputRenderer","_jsxs","Flex","direction","alignItems","gap","minWidth","placholder","operators","getFilterList","opt","placeholder","field","aria-label","Plus","fullWidth","IS_SENSITIVE_FILTERS","CONTAINS_FILTERS","STRING_PARSE_FILTERS","NUMERIC_FILTERS","List","handleRemove","nextFilters","_","_Fragment","queryFilter","details","AttributeTag","onRemove","String","formatDate","formatTime","formatNumber","handleEdit","undefined","formattedValue","dateStyle","timeStyle","hour","minute","split","date","Date","setHours","Number","setMinutes","selectedOption","operatorLabel","content","Tag","onClick","icon","Cross","tag","cursor","Filters"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Filters.js","sources":["../../../../../admin/src/components/Filters.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Flex, Popover, Tag } from '@strapi/design-system';\nimport { Plus, Filter as FilterIcon, Cross } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport {\n BASE_FILTERS,\n CONTAINS_FILTERS,\n FilterOption,\n IS_SENSITIVE_FILTERS,\n NUMERIC_FILTERS,\n STRING_PARSE_FILTERS,\n FILTERS_WITH_NO_VALUE,\n} from '../constants/filters';\nimport { useControllableState } from '../hooks/useControllableState';\nimport {\n deepEncodeQueryValues,\n useQueryParams,\n withEncodedUserParams,\n} from '../hooks/useQueryParams';\n\nimport { createContext } from './Context';\nimport { Form, InputProps } from './Form';\nimport { InputRenderer } from './FormInputs/Renderer';\n\nimport type { Schema } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * Root\n * -----------------------------------------------------------------------------------------------*/\n\ninterface FilterFormData {\n name: string;\n filter: string;\n value?: string;\n}\n\n/**\n * Carries the position in the `$and` array so we replace that exact entry, not every entry\n * sharing the same `(name, operator, value)`.\n */\ninterface EditingFilter extends FilterFormData {\n index: number;\n}\n\ninterface FitlersContextValue {\n disabled: boolean;\n onChange: (data: FilterFormData) => void;\n options: Filters.Filter[];\n setOpen: (open: boolean) => void;\n editingFilter: EditingFilter | null;\n setEditingFilter: (filter: EditingFilter | null) => void;\n}\n\nconst [FiltersProvider, useFilters] = createContext<FitlersContextValue>('Filters');\n\nconst getFilterDetails = (\n filterEntry: Record<string, unknown>,\n options: Filters.Filter[]\n): { name: string; operator: string; value: unknown } | null => {\n const [name] = Object.keys(filterEntry);\n const option = options.find((o) => o.name === name);\n if (!option) {\n return null;\n }\n\n const operatorObj =\n option.type === 'relation'\n ? (filterEntry[name] as Record<string, unknown>)?.[option.mainField?.name ?? 'id']\n : filterEntry[name];\n\n if (typeof operatorObj !== 'object' || operatorObj === null) {\n return null;\n }\n\n const [operator] = Object.keys(operatorObj as Record<string, unknown>);\n if (!operator) {\n return null;\n }\n\n return { name, operator, value: (operatorObj as Record<string, unknown>)[operator] };\n};\n\ninterface RootProps\n extends Partial<Pick<FitlersContextValue, 'disabled' | 'onChange' | 'options'>>,\n Popover.Props {\n children: React.ReactNode;\n}\n\nconst Root = ({\n children,\n disabled = false,\n onChange,\n options = [],\n onOpenChange,\n open: openProp,\n defaultOpen,\n ...restProps\n}: RootProps) => {\n const [editingFilter, setEditingFilter] = React.useState<EditingFilter | null>(null);\n\n const handleChange = (data: FilterFormData) => {\n if (onChange) {\n onChange(data);\n }\n };\n\n const [open = false, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen,\n onChange: onOpenChange,\n });\n\n React.useEffect(() => {\n if (!open) {\n setEditingFilter(null);\n }\n }, [open]);\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen} {...restProps}>\n <FiltersProvider\n setOpen={setOpen}\n disabled={disabled}\n onChange={handleChange}\n options={options}\n editingFilter={editingFilter}\n setEditingFilter={setEditingFilter}\n >\n {children}\n </FiltersProvider>\n </Popover.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Trigger\n * -----------------------------------------------------------------------------------------------*/\n\nconst Trigger = React.forwardRef<HTMLButtonElement, Filters.TriggerProps>(\n ({ label }, forwardedRef) => {\n const { formatMessage } = useIntl();\n const disabled = useFilters('Trigger', ({ disabled }) => disabled);\n\n return (\n <Popover.Trigger>\n <Button\n variant=\"tertiary\"\n ref={forwardedRef}\n startIcon={<FilterIcon />}\n size=\"S\"\n disabled={disabled}\n >\n {label || formatMessage({ id: 'app.utils.filters', defaultMessage: 'Filters' })}\n </Button>\n </Popover.Trigger>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Popover\n * -----------------------------------------------------------------------------------------------*/\n/**\n * The zIndex property is used to override the zIndex of the Portal element of the Popover.\n * This is needed to ensure that the DatePicker is rendered above the Popover when opened.\n * The issue was that both the DatePicker and the Popover are rendered in a Portal and have the same zIndex.\n * On init, since the DatePicker is rendered before the Popover in the DOM,\n * it's causing the issue of appearing behind the Popover.\n */\nconst PopoverImpl = ({ zIndex }: { zIndex?: number }) => {\n const [{ query }, setQuery] = useQueryParams<Filters.Query>();\n const { formatMessage } = useIntl();\n const options = useFilters('Popover', ({ options }) => options);\n const onChange = useFilters('Popover', ({ onChange }) => onChange);\n const setOpen = useFilters('Popover', ({ setOpen }) => setOpen);\n const editingFilter = useFilters('Popover', ({ editingFilter }) => editingFilter);\n const setEditingFilter = useFilters('Popover', ({ setEditingFilter }) => setEditingFilter);\n\n const initialValues = React.useMemo(() => {\n return editingFilter ?? { name: options[0]?.name, filter: BASE_FILTERS[0].value };\n }, [editingFilter, options]);\n\n if (options.length === 0) {\n return null;\n }\n\n const handleSubmit = (data: FilterFormData) => {\n const value = FILTERS_WITH_NO_VALUE.includes(data.filter) ? 'true' : (data.value ?? '');\n\n if (!value) {\n return;\n }\n\n if (onChange) {\n onChange(data);\n }\n\n /**\n * There will ALWAYS be an option because we use the options to create the form data.\n */\n const fieldOptions = options.find((filter) => filter.name === data.name)!;\n\n /**\n * If the filter is a relation, we need to nest the filter object,\n * we filter based on the mainField of the relation, if there is no mainField, we use the id.\n * At the end, we pass the operator & value. This value _could_ look like:\n * ```json\n * {\n * \"$eq\": \"1\",\n * }\n * ```\n */\n const operatorValuePairing = {\n [data.filter]: value,\n };\n\n const newFilterEntry = {\n [data.name]:\n fieldOptions.type === 'relation'\n ? {\n [fieldOptions.mainField?.name ?? 'id']: operatorValuePairing,\n }\n : operatorValuePairing,\n };\n\n const existingFilters = query.filters?.$and ?? [];\n\n const newFilterQuery = editingFilter\n ? {\n ...query.filters,\n $and: existingFilters.map((filter, i) =>\n i === editingFilter.index ? newFilterEntry : filter\n ),\n }\n : {\n ...query.filters,\n $and: [...existingFilters, newFilterEntry],\n };\n\n setQuery(\n withEncodedUserParams(query, { filters: deepEncodeQueryValues(newFilterQuery), page: 1 }),\n 'push',\n true\n );\n setOpen(false);\n setEditingFilter(null);\n };\n\n return (\n <Popover.Content style={{ zIndex }}>\n <Box padding={3}>\n <Form\n method=\"POST\"\n initialValues={initialValues}\n onSubmit={handleSubmit}\n key={\n editingFilter\n ? `edit-${editingFilter.index}-${editingFilter.name}-${editingFilter.filter}-${editingFilter.value ?? 'empty'}`\n : 'create'\n }\n >\n {({ values: formValues, modified, isSubmitting }) => {\n const filter = options.find((filter) => filter.name === formValues.name);\n const Input = filter?.input || InputRenderer;\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2} style={{ minWidth: 184 }}>\n {[\n {\n ['aria-label']: formatMessage({\n id: 'app.utils.select-field',\n defaultMessage: 'Select field',\n }),\n name: 'name',\n options: options.map((filter) => ({\n label: filter.label,\n value: filter.name,\n })),\n placeholder: formatMessage({\n id: 'app.utils.select-field',\n defaultMessage: 'Select field',\n }),\n type: 'enumeration' as const,\n },\n {\n ['aria-label']: formatMessage({\n id: 'app.utils.select-filter',\n defaultMessage: 'Select filter',\n }),\n name: 'filter',\n options:\n filter?.operators ||\n getFilterList(filter).map((opt) => ({\n label: formatMessage(opt.label),\n value: opt.value,\n })),\n placeholder: formatMessage({\n id: 'app.utils.select-filter',\n defaultMessage: 'Select filter',\n }),\n type: 'enumeration' as const,\n },\n ].map((field) => (\n <InputRenderer key={field.name} {...field} />\n ))}\n {filter &&\n formValues.filter &&\n !FILTERS_WITH_NO_VALUE.includes(formValues.filter) ? (\n <Input\n {...filter}\n label={null}\n aria-label={filter.label}\n name=\"value\"\n // @ts-expect-error – if type is `custom` then `Input` will be a custom component.\n type={filter.mainField?.type ?? filter.type}\n />\n ) : null}\n <Button\n disabled={!modified || isSubmitting}\n size=\"L\"\n variant=\"secondary\"\n startIcon={<Plus />}\n type=\"submit\"\n fullWidth\n >\n {editingFilter\n ? formatMessage({\n id: 'app.utils.update-filter',\n defaultMessage: 'Update filter',\n })\n : formatMessage({ id: 'app.utils.add-filter', defaultMessage: 'Add filter' })}\n </Button>\n </Flex>\n );\n }}\n </Form>\n </Box>\n </Popover.Content>\n );\n};\n\n/**\n * Depending on the selected field find the possible filters to apply\n */\nconst getFilterList = (filter?: Filters.Filter): FilterOption[] => {\n if (!filter) {\n return [];\n }\n\n const type = filter.mainField?.type ? filter.mainField.type : filter.type;\n\n switch (type) {\n case 'email':\n case 'text':\n case 'string': {\n return [\n ...BASE_FILTERS,\n ...IS_SENSITIVE_FILTERS,\n ...CONTAINS_FILTERS,\n ...STRING_PARSE_FILTERS,\n ];\n }\n\n case 'float':\n case 'integer':\n case 'biginteger':\n case 'decimal': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS];\n }\n case 'time':\n case 'date': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS, ...CONTAINS_FILTERS];\n }\n\n case 'datetime': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS];\n }\n\n case 'enumeration': {\n return BASE_FILTERS;\n }\n\n default:\n return [...BASE_FILTERS, ...IS_SENSITIVE_FILTERS];\n }\n};\n\n/* -------------------------------------------------------------------------------------------------\n * List\n * -----------------------------------------------------------------------------------------------*/\n\nconst List = () => {\n const [{ query }, setQuery] = useQueryParams<Filters.Query>();\n\n const options = useFilters('List', ({ options }) => options);\n\n /**\n * Removed by position: identical filters are a legal query, so matching on\n * `(name, operator, value)` would drop every copy at once.\n */\n const handleRemove = (index: number) => {\n const nextFilters = (query?.filters?.$and ?? []).filter((_, i) => i !== index);\n\n setQuery(\n withEncodedUserParams(query, {\n filters: deepEncodeQueryValues({ $and: nextFilters }),\n page: 1,\n })\n );\n };\n\n if (!query?.filters?.$and?.length) {\n return null;\n }\n\n return (\n <>\n {query?.filters?.$and?.map((queryFilter, index) => {\n const details = getFilterDetails(queryFilter, options);\n if (!details || typeof details.value === 'object') {\n return null;\n }\n\n const filter = options.find(({ name }) => name === details.name);\n if (!filter) {\n return null;\n }\n /**\n * `index` is the position in the raw `$and` array — entries skipped above still count.\n * Never cache it: `qs` re-indexes on removal, so dropping entry 0 of [0, 1, 2]\n * leaves [0, 1] and any held index goes stale.\n */\n return (\n <AttributeTag\n key={`${index}-${details.name}-${details.operator}-${details.value}`}\n {...filter}\n index={index}\n onRemove={handleRemove}\n operator={details.operator}\n value={String(details.value)}\n />\n );\n })}\n </>\n );\n};\n\ninterface AttributeTagProps extends Filters.Filter {\n /**\n * Position in the `$and` array. An explicit prop rather than a closure bound at the call\n * site, so it stays part of the props comparison if this ever gets memoised.\n */\n index: number;\n onRemove: (index: number) => void;\n operator: string;\n value: string;\n}\n\nconst AttributeTag = ({\n index,\n input,\n label,\n mainField,\n name,\n onRemove,\n operator,\n options,\n value,\n ...filter\n}: AttributeTagProps) => {\n const { formatMessage, formatDate, formatTime, formatNumber } = useIntl();\n const setOpen = useFilters('AttributeTag', ({ setOpen }) => setOpen);\n const setEditingFilter = useFilters('AttributeTag', ({ setEditingFilter }) => setEditingFilter);\n\n const handleEdit = () => {\n setEditingFilter({\n name,\n filter: operator,\n index,\n value: FILTERS_WITH_NO_VALUE.includes(operator) ? undefined : value,\n });\n setOpen(true);\n };\n\n const handleRemove = () => {\n onRemove(index);\n };\n\n const type = mainField?.type ? mainField.type : filter.type;\n\n let formattedValue: string = value;\n\n switch (type) {\n case 'date':\n formattedValue = formatDate(value, { dateStyle: 'full' });\n break;\n case 'datetime':\n formattedValue = formatDate(value, { dateStyle: 'full', timeStyle: 'short' });\n break;\n case 'time':\n const [hour, minute] = value.split(':');\n const date = new Date();\n date.setHours(Number(hour));\n date.setMinutes(Number(minute));\n\n formattedValue = formatTime(date, {\n hour: 'numeric',\n minute: 'numeric',\n });\n break;\n case 'float':\n case 'integer':\n case 'biginteger':\n case 'decimal':\n formattedValue = formatNumber(Number(value));\n break;\n }\n\n // Handle custom input\n if (input && options) {\n // If the custom input has an options array, find the option with a customValue matching the query value\n const selectedOption = options.find((option) => {\n return (typeof option === 'string' ? option : option.value) === value;\n });\n\n formattedValue = selectedOption\n ? typeof selectedOption === 'string'\n ? selectedOption\n : (selectedOption.label ?? selectedOption.value)\n : value;\n }\n\n const operatorLabel = formatMessage({\n id: `components.FilterOptions.FILTER_TYPES.${operator}`,\n defaultMessage: operator,\n });\n\n const content = FILTERS_WITH_NO_VALUE.includes(operator)\n ? `${label} ${operatorLabel}`\n : `${label} ${operatorLabel} ${formattedValue}`;\n\n return (\n <Tag padding={1} onClick={handleRemove} icon={<Cross />} label={content}>\n <Box tag=\"span\" cursor=\"pointer\" onClick={handleEdit}>\n {content}\n </Box>\n </Tag>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * EXPORTS\n * -----------------------------------------------------------------------------------------------*/\n\nconst Filters = {\n List,\n Popover: PopoverImpl,\n Root,\n Trigger,\n};\n\ninterface MainField {\n name: string;\n type: Schema.Attribute.Kind | 'custom';\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nnamespace Filters {\n export interface Filter {\n input?: React.ComponentType<ValueInputProps>;\n label: string;\n /**\n * the name of the attribute we use to display the actual name e.g. relations\n * are just ids, so we use the mainField to display something meaninginful by\n * looking at the target's schema\n */\n mainField?: MainField;\n name: string;\n operators?: Array<{\n label: string;\n value: string;\n }>;\n options?: Array<{ label?: string; value: string }> | string[];\n type: InputProps['type'] | 'relation' | 'custom';\n }\n\n export interface ValueInputProps extends Omit<Filter, 'label'> {\n ['aria-label']: string;\n }\n\n export type Props = RootProps;\n\n export interface TriggerProps {\n label?: string;\n }\n\n export interface Query {\n filters?: {\n /**\n * Typically, a filter will be:\n * ```ts\n * {\n * [attributeName]: {\n * [operator]: value\n * }\n * }\n * ```\n * However, for relation items it becomes more nested.\n * ```ts\n * {\n * [attributeName]: {\n * [relationTargetAttribute]: {\n * [operator]: value\n * }\n * }\n * }\n * ```\n */\n $and?: Array<Record<string, Record<string, string | Record<string, string>>>>;\n };\n page?: number;\n _q?: string;\n }\n}\n\nexport { Filters };\n"],"names":["FiltersProvider","useFilters","createContext","getFilterDetails","filterEntry","options","name","Object","keys","option","find","o","operatorObj","type","mainField","operator","value","Root","children","disabled","onChange","onOpenChange","open","openProp","defaultOpen","restProps","editingFilter","setEditingFilter","React","useState","handleChange","data","setOpen","useControllableState","prop","defaultProp","useEffect","_jsx","Popover","Trigger","forwardRef","label","forwardedRef","formatMessage","useIntl","Button","variant","ref","startIcon","FilterIcon","size","id","defaultMessage","PopoverImpl","zIndex","query","setQuery","useQueryParams","initialValues","useMemo","filter","BASE_FILTERS","length","handleSubmit","FILTERS_WITH_NO_VALUE","includes","fieldOptions","operatorValuePairing","newFilterEntry","existingFilters","filters","$and","newFilterQuery","map","i","index","withEncodedUserParams","deepEncodeQueryValues","page","Content","style","Box","padding","Form","method","onSubmit","values","formValues","modified","isSubmitting","Input","input","InputRenderer","_jsxs","Flex","direction","alignItems","gap","minWidth","placeholder","operators","getFilterList","opt","field","aria-label","Plus","fullWidth","IS_SENSITIVE_FILTERS","CONTAINS_FILTERS","STRING_PARSE_FILTERS","NUMERIC_FILTERS","List","handleRemove","nextFilters","_","_Fragment","queryFilter","details","AttributeTag","onRemove","String","formatDate","formatTime","formatNumber","handleEdit","undefined","formattedValue","dateStyle","timeStyle","hour","minute","split","date","Date","setHours","Number","setMinutes","selectedOption","operatorLabel","content","Tag","onClick","icon","Cross","tag","cursor","Filters"],"mappings":"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"}
|
|
@@ -190,7 +190,7 @@ const Root = ({ children, disabled = false, onChange, options = [], onOpenChange
|
|
|
190
190
|
label: filter.label,
|
|
191
191
|
value: filter.name
|
|
192
192
|
})),
|
|
193
|
-
|
|
193
|
+
placeholder: formatMessage({
|
|
194
194
|
id: 'app.utils.select-field',
|
|
195
195
|
defaultMessage: 'Select field'
|
|
196
196
|
}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Filters.mjs","sources":["../../../../../admin/src/components/Filters.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Flex, Popover, Tag } from '@strapi/design-system';\nimport { Plus, Filter as FilterIcon, Cross } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport {\n BASE_FILTERS,\n CONTAINS_FILTERS,\n FilterOption,\n IS_SENSITIVE_FILTERS,\n NUMERIC_FILTERS,\n STRING_PARSE_FILTERS,\n FILTERS_WITH_NO_VALUE,\n} from '../constants/filters';\nimport { useControllableState } from '../hooks/useControllableState';\nimport {\n deepEncodeQueryValues,\n useQueryParams,\n withEncodedUserParams,\n} from '../hooks/useQueryParams';\n\nimport { createContext } from './Context';\nimport { Form, InputProps } from './Form';\nimport { InputRenderer } from './FormInputs/Renderer';\n\nimport type { Schema } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * Root\n * -----------------------------------------------------------------------------------------------*/\n\ninterface FilterFormData {\n name: string;\n filter: string;\n value?: string;\n}\n\n/**\n * Carries the position in the `$and` array so we replace that exact entry, not every entry\n * sharing the same `(name, operator, value)`.\n */\ninterface EditingFilter extends FilterFormData {\n index: number;\n}\n\ninterface FitlersContextValue {\n disabled: boolean;\n onChange: (data: FilterFormData) => void;\n options: Filters.Filter[];\n setOpen: (open: boolean) => void;\n editingFilter: EditingFilter | null;\n setEditingFilter: (filter: EditingFilter | null) => void;\n}\n\nconst [FiltersProvider, useFilters] = createContext<FitlersContextValue>('Filters');\n\nconst getFilterDetails = (\n filterEntry: Record<string, unknown>,\n options: Filters.Filter[]\n): { name: string; operator: string; value: unknown } | null => {\n const [name] = Object.keys(filterEntry);\n const option = options.find((o) => o.name === name);\n if (!option) {\n return null;\n }\n\n const operatorObj =\n option.type === 'relation'\n ? (filterEntry[name] as Record<string, unknown>)?.[option.mainField?.name ?? 'id']\n : filterEntry[name];\n\n if (typeof operatorObj !== 'object' || operatorObj === null) {\n return null;\n }\n\n const [operator] = Object.keys(operatorObj as Record<string, unknown>);\n if (!operator) {\n return null;\n }\n\n return { name, operator, value: (operatorObj as Record<string, unknown>)[operator] };\n};\n\ninterface RootProps\n extends Partial<Pick<FitlersContextValue, 'disabled' | 'onChange' | 'options'>>,\n Popover.Props {\n children: React.ReactNode;\n}\n\nconst Root = ({\n children,\n disabled = false,\n onChange,\n options = [],\n onOpenChange,\n open: openProp,\n defaultOpen,\n ...restProps\n}: RootProps) => {\n const [editingFilter, setEditingFilter] = React.useState<EditingFilter | null>(null);\n\n const handleChange = (data: FilterFormData) => {\n if (onChange) {\n onChange(data);\n }\n };\n\n const [open = false, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen,\n onChange: onOpenChange,\n });\n\n React.useEffect(() => {\n if (!open) {\n setEditingFilter(null);\n }\n }, [open]);\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen} {...restProps}>\n <FiltersProvider\n setOpen={setOpen}\n disabled={disabled}\n onChange={handleChange}\n options={options}\n editingFilter={editingFilter}\n setEditingFilter={setEditingFilter}\n >\n {children}\n </FiltersProvider>\n </Popover.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Trigger\n * -----------------------------------------------------------------------------------------------*/\n\nconst Trigger = React.forwardRef<HTMLButtonElement, Filters.TriggerProps>(\n ({ label }, forwardedRef) => {\n const { formatMessage } = useIntl();\n const disabled = useFilters('Trigger', ({ disabled }) => disabled);\n\n return (\n <Popover.Trigger>\n <Button\n variant=\"tertiary\"\n ref={forwardedRef}\n startIcon={<FilterIcon />}\n size=\"S\"\n disabled={disabled}\n >\n {label || formatMessage({ id: 'app.utils.filters', defaultMessage: 'Filters' })}\n </Button>\n </Popover.Trigger>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Popover\n * -----------------------------------------------------------------------------------------------*/\n/**\n * The zIndex property is used to override the zIndex of the Portal element of the Popover.\n * This is needed to ensure that the DatePicker is rendered above the Popover when opened.\n * The issue was that both the DatePicker and the Popover are rendered in a Portal and have the same zIndex.\n * On init, since the DatePicker is rendered before the Popover in the DOM,\n * it's causing the issue of appearing behind the Popover.\n */\nconst PopoverImpl = ({ zIndex }: { zIndex?: number }) => {\n const [{ query }, setQuery] = useQueryParams<Filters.Query>();\n const { formatMessage } = useIntl();\n const options = useFilters('Popover', ({ options }) => options);\n const onChange = useFilters('Popover', ({ onChange }) => onChange);\n const setOpen = useFilters('Popover', ({ setOpen }) => setOpen);\n const editingFilter = useFilters('Popover', ({ editingFilter }) => editingFilter);\n const setEditingFilter = useFilters('Popover', ({ setEditingFilter }) => setEditingFilter);\n\n const initialValues = React.useMemo(() => {\n return editingFilter ?? { name: options[0]?.name, filter: BASE_FILTERS[0].value };\n }, [editingFilter, options]);\n\n if (options.length === 0) {\n return null;\n }\n\n const handleSubmit = (data: FilterFormData) => {\n const value = FILTERS_WITH_NO_VALUE.includes(data.filter) ? 'true' : (data.value ?? '');\n\n if (!value) {\n return;\n }\n\n if (onChange) {\n onChange(data);\n }\n\n /**\n * There will ALWAYS be an option because we use the options to create the form data.\n */\n const fieldOptions = options.find((filter) => filter.name === data.name)!;\n\n /**\n * If the filter is a relation, we need to nest the filter object,\n * we filter based on the mainField of the relation, if there is no mainField, we use the id.\n * At the end, we pass the operator & value. This value _could_ look like:\n * ```json\n * {\n * \"$eq\": \"1\",\n * }\n * ```\n */\n const operatorValuePairing = {\n [data.filter]: value,\n };\n\n const newFilterEntry = {\n [data.name]:\n fieldOptions.type === 'relation'\n ? {\n [fieldOptions.mainField?.name ?? 'id']: operatorValuePairing,\n }\n : operatorValuePairing,\n };\n\n const existingFilters = query.filters?.$and ?? [];\n\n const newFilterQuery = editingFilter\n ? {\n ...query.filters,\n $and: existingFilters.map((filter, i) =>\n i === editingFilter.index ? newFilterEntry : filter\n ),\n }\n : {\n ...query.filters,\n $and: [...existingFilters, newFilterEntry],\n };\n\n setQuery(\n withEncodedUserParams(query, { filters: deepEncodeQueryValues(newFilterQuery), page: 1 }),\n 'push',\n true\n );\n setOpen(false);\n setEditingFilter(null);\n };\n\n return (\n <Popover.Content style={{ zIndex }}>\n <Box padding={3}>\n <Form\n method=\"POST\"\n initialValues={initialValues}\n onSubmit={handleSubmit}\n key={\n editingFilter\n ? `edit-${editingFilter.index}-${editingFilter.name}-${editingFilter.filter}-${editingFilter.value ?? 'empty'}`\n : 'create'\n }\n >\n {({ values: formValues, modified, isSubmitting }) => {\n const filter = options.find((filter) => filter.name === formValues.name);\n const Input = filter?.input || InputRenderer;\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2} style={{ minWidth: 184 }}>\n {[\n {\n ['aria-label']: formatMessage({\n id: 'app.utils.select-field',\n defaultMessage: 'Select field',\n }),\n name: 'name',\n options: options.map((filter) => ({\n label: filter.label,\n value: filter.name,\n })),\n placholder: formatMessage({\n id: 'app.utils.select-field',\n defaultMessage: 'Select field',\n }),\n type: 'enumeration' as const,\n },\n {\n ['aria-label']: formatMessage({\n id: 'app.utils.select-filter',\n defaultMessage: 'Select filter',\n }),\n name: 'filter',\n options:\n filter?.operators ||\n getFilterList(filter).map((opt) => ({\n label: formatMessage(opt.label),\n value: opt.value,\n })),\n placeholder: formatMessage({\n id: 'app.utils.select-filter',\n defaultMessage: 'Select filter',\n }),\n type: 'enumeration' as const,\n },\n ].map((field) => (\n <InputRenderer key={field.name} {...field} />\n ))}\n {filter &&\n formValues.filter &&\n !FILTERS_WITH_NO_VALUE.includes(formValues.filter) ? (\n <Input\n {...filter}\n label={null}\n aria-label={filter.label}\n name=\"value\"\n // @ts-expect-error – if type is `custom` then `Input` will be a custom component.\n type={filter.mainField?.type ?? filter.type}\n />\n ) : null}\n <Button\n disabled={!modified || isSubmitting}\n size=\"L\"\n variant=\"secondary\"\n startIcon={<Plus />}\n type=\"submit\"\n fullWidth\n >\n {editingFilter\n ? formatMessage({\n id: 'app.utils.update-filter',\n defaultMessage: 'Update filter',\n })\n : formatMessage({ id: 'app.utils.add-filter', defaultMessage: 'Add filter' })}\n </Button>\n </Flex>\n );\n }}\n </Form>\n </Box>\n </Popover.Content>\n );\n};\n\n/**\n * Depending on the selected field find the possible filters to apply\n */\nconst getFilterList = (filter?: Filters.Filter): FilterOption[] => {\n if (!filter) {\n return [];\n }\n\n const type = filter.mainField?.type ? filter.mainField.type : filter.type;\n\n switch (type) {\n case 'email':\n case 'text':\n case 'string': {\n return [\n ...BASE_FILTERS,\n ...IS_SENSITIVE_FILTERS,\n ...CONTAINS_FILTERS,\n ...STRING_PARSE_FILTERS,\n ];\n }\n\n case 'float':\n case 'integer':\n case 'biginteger':\n case 'decimal': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS];\n }\n case 'time':\n case 'date': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS, ...CONTAINS_FILTERS];\n }\n\n case 'datetime': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS];\n }\n\n case 'enumeration': {\n return BASE_FILTERS;\n }\n\n default:\n return [...BASE_FILTERS, ...IS_SENSITIVE_FILTERS];\n }\n};\n\n/* -------------------------------------------------------------------------------------------------\n * List\n * -----------------------------------------------------------------------------------------------*/\n\nconst List = () => {\n const [{ query }, setQuery] = useQueryParams<Filters.Query>();\n\n const options = useFilters('List', ({ options }) => options);\n\n /**\n * Removed by position: identical filters are a legal query, so matching on\n * `(name, operator, value)` would drop every copy at once.\n */\n const handleRemove = (index: number) => {\n const nextFilters = (query?.filters?.$and ?? []).filter((_, i) => i !== index);\n\n setQuery(\n withEncodedUserParams(query, {\n filters: deepEncodeQueryValues({ $and: nextFilters }),\n page: 1,\n })\n );\n };\n\n if (!query?.filters?.$and?.length) {\n return null;\n }\n\n return (\n <>\n {query?.filters?.$and?.map((queryFilter, index) => {\n const details = getFilterDetails(queryFilter, options);\n if (!details || typeof details.value === 'object') {\n return null;\n }\n\n const filter = options.find(({ name }) => name === details.name);\n if (!filter) {\n return null;\n }\n /**\n * `index` is the position in the raw `$and` array — entries skipped above still count.\n * Never cache it: `qs` re-indexes on removal, so dropping entry 0 of [0, 1, 2]\n * leaves [0, 1] and any held index goes stale.\n */\n return (\n <AttributeTag\n key={`${index}-${details.name}-${details.operator}-${details.value}`}\n {...filter}\n index={index}\n onRemove={handleRemove}\n operator={details.operator}\n value={String(details.value)}\n />\n );\n })}\n </>\n );\n};\n\ninterface AttributeTagProps extends Filters.Filter {\n /**\n * Position in the `$and` array. An explicit prop rather than a closure bound at the call\n * site, so it stays part of the props comparison if this ever gets memoised.\n */\n index: number;\n onRemove: (index: number) => void;\n operator: string;\n value: string;\n}\n\nconst AttributeTag = ({\n index,\n input,\n label,\n mainField,\n name,\n onRemove,\n operator,\n options,\n value,\n ...filter\n}: AttributeTagProps) => {\n const { formatMessage, formatDate, formatTime, formatNumber } = useIntl();\n const setOpen = useFilters('AttributeTag', ({ setOpen }) => setOpen);\n const setEditingFilter = useFilters('AttributeTag', ({ setEditingFilter }) => setEditingFilter);\n\n const handleEdit = () => {\n setEditingFilter({\n name,\n filter: operator,\n index,\n value: FILTERS_WITH_NO_VALUE.includes(operator) ? undefined : value,\n });\n setOpen(true);\n };\n\n const handleRemove = () => {\n onRemove(index);\n };\n\n const type = mainField?.type ? mainField.type : filter.type;\n\n let formattedValue: string = value;\n\n switch (type) {\n case 'date':\n formattedValue = formatDate(value, { dateStyle: 'full' });\n break;\n case 'datetime':\n formattedValue = formatDate(value, { dateStyle: 'full', timeStyle: 'short' });\n break;\n case 'time':\n const [hour, minute] = value.split(':');\n const date = new Date();\n date.setHours(Number(hour));\n date.setMinutes(Number(minute));\n\n formattedValue = formatTime(date, {\n hour: 'numeric',\n minute: 'numeric',\n });\n break;\n case 'float':\n case 'integer':\n case 'biginteger':\n case 'decimal':\n formattedValue = formatNumber(Number(value));\n break;\n }\n\n // Handle custom input\n if (input && options) {\n // If the custom input has an options array, find the option with a customValue matching the query value\n const selectedOption = options.find((option) => {\n return (typeof option === 'string' ? option : option.value) === value;\n });\n\n formattedValue = selectedOption\n ? typeof selectedOption === 'string'\n ? selectedOption\n : (selectedOption.label ?? selectedOption.value)\n : value;\n }\n\n const operatorLabel = formatMessage({\n id: `components.FilterOptions.FILTER_TYPES.${operator}`,\n defaultMessage: operator,\n });\n\n const content = FILTERS_WITH_NO_VALUE.includes(operator)\n ? `${label} ${operatorLabel}`\n : `${label} ${operatorLabel} ${formattedValue}`;\n\n return (\n <Tag padding={1} onClick={handleRemove} icon={<Cross />} label={content}>\n <Box tag=\"span\" cursor=\"pointer\" onClick={handleEdit}>\n {content}\n </Box>\n </Tag>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * EXPORTS\n * -----------------------------------------------------------------------------------------------*/\n\nconst Filters = {\n List,\n Popover: PopoverImpl,\n Root,\n Trigger,\n};\n\ninterface MainField {\n name: string;\n type: Schema.Attribute.Kind | 'custom';\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nnamespace Filters {\n export interface Filter {\n input?: React.ComponentType<ValueInputProps>;\n label: string;\n /**\n * the name of the attribute we use to display the actual name e.g. relations\n * are just ids, so we use the mainField to display something meaninginful by\n * looking at the target's schema\n */\n mainField?: MainField;\n name: string;\n operators?: Array<{\n label: string;\n value: string;\n }>;\n options?: Array<{ label?: string; value: string }> | string[];\n type: InputProps['type'] | 'relation' | 'custom';\n }\n\n export interface ValueInputProps extends Omit<Filter, 'label'> {\n ['aria-label']: string;\n }\n\n export type Props = RootProps;\n\n export interface TriggerProps {\n label?: string;\n }\n\n export interface Query {\n filters?: {\n /**\n * Typically, a filter will be:\n * ```ts\n * {\n * [attributeName]: {\n * [operator]: value\n * }\n * }\n * ```\n * However, for relation items it becomes more nested.\n * ```ts\n * {\n * [attributeName]: {\n * [relationTargetAttribute]: {\n * [operator]: value\n * }\n * }\n * }\n * ```\n */\n $and?: Array<Record<string, Record<string, string | Record<string, string>>>>;\n };\n page?: number;\n _q?: string;\n }\n}\n\nexport { Filters };\n"],"names":["FiltersProvider","useFilters","createContext","getFilterDetails","filterEntry","options","name","Object","keys","option","find","o","operatorObj","type","mainField","operator","value","Root","children","disabled","onChange","onOpenChange","open","openProp","defaultOpen","restProps","editingFilter","setEditingFilter","React","useState","handleChange","data","setOpen","useControllableState","prop","defaultProp","useEffect","_jsx","Popover","Trigger","forwardRef","label","forwardedRef","formatMessage","useIntl","Button","variant","ref","startIcon","FilterIcon","size","id","defaultMessage","PopoverImpl","zIndex","query","setQuery","useQueryParams","initialValues","useMemo","filter","BASE_FILTERS","length","handleSubmit","FILTERS_WITH_NO_VALUE","includes","fieldOptions","operatorValuePairing","newFilterEntry","existingFilters","filters","$and","newFilterQuery","map","i","index","withEncodedUserParams","deepEncodeQueryValues","page","Content","style","Box","padding","Form","method","onSubmit","values","formValues","modified","isSubmitting","Input","input","InputRenderer","_jsxs","Flex","direction","alignItems","gap","minWidth","placholder","operators","getFilterList","opt","placeholder","field","aria-label","Plus","fullWidth","IS_SENSITIVE_FILTERS","CONTAINS_FILTERS","STRING_PARSE_FILTERS","NUMERIC_FILTERS","List","handleRemove","nextFilters","_","_Fragment","queryFilter","details","AttributeTag","onRemove","String","formatDate","formatTime","formatNumber","handleEdit","undefined","formattedValue","dateStyle","timeStyle","hour","minute","split","date","Date","setHours","Number","setMinutes","selectedOption","operatorLabel","content","Tag","onClick","icon","Cross","tag","cursor","Filters"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Filters.mjs","sources":["../../../../../admin/src/components/Filters.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Flex, Popover, Tag } from '@strapi/design-system';\nimport { Plus, Filter as FilterIcon, Cross } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport {\n BASE_FILTERS,\n CONTAINS_FILTERS,\n FilterOption,\n IS_SENSITIVE_FILTERS,\n NUMERIC_FILTERS,\n STRING_PARSE_FILTERS,\n FILTERS_WITH_NO_VALUE,\n} from '../constants/filters';\nimport { useControllableState } from '../hooks/useControllableState';\nimport {\n deepEncodeQueryValues,\n useQueryParams,\n withEncodedUserParams,\n} from '../hooks/useQueryParams';\n\nimport { createContext } from './Context';\nimport { Form, InputProps } from './Form';\nimport { InputRenderer } from './FormInputs/Renderer';\n\nimport type { Schema } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * Root\n * -----------------------------------------------------------------------------------------------*/\n\ninterface FilterFormData {\n name: string;\n filter: string;\n value?: string;\n}\n\n/**\n * Carries the position in the `$and` array so we replace that exact entry, not every entry\n * sharing the same `(name, operator, value)`.\n */\ninterface EditingFilter extends FilterFormData {\n index: number;\n}\n\ninterface FitlersContextValue {\n disabled: boolean;\n onChange: (data: FilterFormData) => void;\n options: Filters.Filter[];\n setOpen: (open: boolean) => void;\n editingFilter: EditingFilter | null;\n setEditingFilter: (filter: EditingFilter | null) => void;\n}\n\nconst [FiltersProvider, useFilters] = createContext<FitlersContextValue>('Filters');\n\nconst getFilterDetails = (\n filterEntry: Record<string, unknown>,\n options: Filters.Filter[]\n): { name: string; operator: string; value: unknown } | null => {\n const [name] = Object.keys(filterEntry);\n const option = options.find((o) => o.name === name);\n if (!option) {\n return null;\n }\n\n const operatorObj =\n option.type === 'relation'\n ? (filterEntry[name] as Record<string, unknown>)?.[option.mainField?.name ?? 'id']\n : filterEntry[name];\n\n if (typeof operatorObj !== 'object' || operatorObj === null) {\n return null;\n }\n\n const [operator] = Object.keys(operatorObj as Record<string, unknown>);\n if (!operator) {\n return null;\n }\n\n return { name, operator, value: (operatorObj as Record<string, unknown>)[operator] };\n};\n\ninterface RootProps\n extends Partial<Pick<FitlersContextValue, 'disabled' | 'onChange' | 'options'>>,\n Popover.Props {\n children: React.ReactNode;\n}\n\nconst Root = ({\n children,\n disabled = false,\n onChange,\n options = [],\n onOpenChange,\n open: openProp,\n defaultOpen,\n ...restProps\n}: RootProps) => {\n const [editingFilter, setEditingFilter] = React.useState<EditingFilter | null>(null);\n\n const handleChange = (data: FilterFormData) => {\n if (onChange) {\n onChange(data);\n }\n };\n\n const [open = false, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen,\n onChange: onOpenChange,\n });\n\n React.useEffect(() => {\n if (!open) {\n setEditingFilter(null);\n }\n }, [open]);\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen} {...restProps}>\n <FiltersProvider\n setOpen={setOpen}\n disabled={disabled}\n onChange={handleChange}\n options={options}\n editingFilter={editingFilter}\n setEditingFilter={setEditingFilter}\n >\n {children}\n </FiltersProvider>\n </Popover.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Trigger\n * -----------------------------------------------------------------------------------------------*/\n\nconst Trigger = React.forwardRef<HTMLButtonElement, Filters.TriggerProps>(\n ({ label }, forwardedRef) => {\n const { formatMessage } = useIntl();\n const disabled = useFilters('Trigger', ({ disabled }) => disabled);\n\n return (\n <Popover.Trigger>\n <Button\n variant=\"tertiary\"\n ref={forwardedRef}\n startIcon={<FilterIcon />}\n size=\"S\"\n disabled={disabled}\n >\n {label || formatMessage({ id: 'app.utils.filters', defaultMessage: 'Filters' })}\n </Button>\n </Popover.Trigger>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Popover\n * -----------------------------------------------------------------------------------------------*/\n/**\n * The zIndex property is used to override the zIndex of the Portal element of the Popover.\n * This is needed to ensure that the DatePicker is rendered above the Popover when opened.\n * The issue was that both the DatePicker and the Popover are rendered in a Portal and have the same zIndex.\n * On init, since the DatePicker is rendered before the Popover in the DOM,\n * it's causing the issue of appearing behind the Popover.\n */\nconst PopoverImpl = ({ zIndex }: { zIndex?: number }) => {\n const [{ query }, setQuery] = useQueryParams<Filters.Query>();\n const { formatMessage } = useIntl();\n const options = useFilters('Popover', ({ options }) => options);\n const onChange = useFilters('Popover', ({ onChange }) => onChange);\n const setOpen = useFilters('Popover', ({ setOpen }) => setOpen);\n const editingFilter = useFilters('Popover', ({ editingFilter }) => editingFilter);\n const setEditingFilter = useFilters('Popover', ({ setEditingFilter }) => setEditingFilter);\n\n const initialValues = React.useMemo(() => {\n return editingFilter ?? { name: options[0]?.name, filter: BASE_FILTERS[0].value };\n }, [editingFilter, options]);\n\n if (options.length === 0) {\n return null;\n }\n\n const handleSubmit = (data: FilterFormData) => {\n const value = FILTERS_WITH_NO_VALUE.includes(data.filter) ? 'true' : (data.value ?? '');\n\n if (!value) {\n return;\n }\n\n if (onChange) {\n onChange(data);\n }\n\n /**\n * There will ALWAYS be an option because we use the options to create the form data.\n */\n const fieldOptions = options.find((filter) => filter.name === data.name)!;\n\n /**\n * If the filter is a relation, we need to nest the filter object,\n * we filter based on the mainField of the relation, if there is no mainField, we use the id.\n * At the end, we pass the operator & value. This value _could_ look like:\n * ```json\n * {\n * \"$eq\": \"1\",\n * }\n * ```\n */\n const operatorValuePairing = {\n [data.filter]: value,\n };\n\n const newFilterEntry = {\n [data.name]:\n fieldOptions.type === 'relation'\n ? {\n [fieldOptions.mainField?.name ?? 'id']: operatorValuePairing,\n }\n : operatorValuePairing,\n };\n\n const existingFilters = query.filters?.$and ?? [];\n\n const newFilterQuery = editingFilter\n ? {\n ...query.filters,\n $and: existingFilters.map((filter, i) =>\n i === editingFilter.index ? newFilterEntry : filter\n ),\n }\n : {\n ...query.filters,\n $and: [...existingFilters, newFilterEntry],\n };\n\n setQuery(\n withEncodedUserParams(query, { filters: deepEncodeQueryValues(newFilterQuery), page: 1 }),\n 'push',\n true\n );\n setOpen(false);\n setEditingFilter(null);\n };\n\n return (\n <Popover.Content style={{ zIndex }}>\n <Box padding={3}>\n <Form\n method=\"POST\"\n initialValues={initialValues}\n onSubmit={handleSubmit}\n key={\n editingFilter\n ? `edit-${editingFilter.index}-${editingFilter.name}-${editingFilter.filter}-${editingFilter.value ?? 'empty'}`\n : 'create'\n }\n >\n {({ values: formValues, modified, isSubmitting }) => {\n const filter = options.find((filter) => filter.name === formValues.name);\n const Input = filter?.input || InputRenderer;\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2} style={{ minWidth: 184 }}>\n {[\n {\n ['aria-label']: formatMessage({\n id: 'app.utils.select-field',\n defaultMessage: 'Select field',\n }),\n name: 'name',\n options: options.map((filter) => ({\n label: filter.label,\n value: filter.name,\n })),\n placeholder: formatMessage({\n id: 'app.utils.select-field',\n defaultMessage: 'Select field',\n }),\n type: 'enumeration' as const,\n },\n {\n ['aria-label']: formatMessage({\n id: 'app.utils.select-filter',\n defaultMessage: 'Select filter',\n }),\n name: 'filter',\n options:\n filter?.operators ||\n getFilterList(filter).map((opt) => ({\n label: formatMessage(opt.label),\n value: opt.value,\n })),\n placeholder: formatMessage({\n id: 'app.utils.select-filter',\n defaultMessage: 'Select filter',\n }),\n type: 'enumeration' as const,\n },\n ].map((field) => (\n <InputRenderer key={field.name} {...field} />\n ))}\n {filter &&\n formValues.filter &&\n !FILTERS_WITH_NO_VALUE.includes(formValues.filter) ? (\n <Input\n {...filter}\n label={null}\n aria-label={filter.label}\n name=\"value\"\n // @ts-expect-error – if type is `custom` then `Input` will be a custom component.\n type={filter.mainField?.type ?? filter.type}\n />\n ) : null}\n <Button\n disabled={!modified || isSubmitting}\n size=\"L\"\n variant=\"secondary\"\n startIcon={<Plus />}\n type=\"submit\"\n fullWidth\n >\n {editingFilter\n ? formatMessage({\n id: 'app.utils.update-filter',\n defaultMessage: 'Update filter',\n })\n : formatMessage({ id: 'app.utils.add-filter', defaultMessage: 'Add filter' })}\n </Button>\n </Flex>\n );\n }}\n </Form>\n </Box>\n </Popover.Content>\n );\n};\n\n/**\n * Depending on the selected field find the possible filters to apply\n */\nconst getFilterList = (filter?: Filters.Filter): FilterOption[] => {\n if (!filter) {\n return [];\n }\n\n const type = filter.mainField?.type ? filter.mainField.type : filter.type;\n\n switch (type) {\n case 'email':\n case 'text':\n case 'string': {\n return [\n ...BASE_FILTERS,\n ...IS_SENSITIVE_FILTERS,\n ...CONTAINS_FILTERS,\n ...STRING_PARSE_FILTERS,\n ];\n }\n\n case 'float':\n case 'integer':\n case 'biginteger':\n case 'decimal': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS];\n }\n case 'time':\n case 'date': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS, ...CONTAINS_FILTERS];\n }\n\n case 'datetime': {\n return [...BASE_FILTERS, ...NUMERIC_FILTERS];\n }\n\n case 'enumeration': {\n return BASE_FILTERS;\n }\n\n default:\n return [...BASE_FILTERS, ...IS_SENSITIVE_FILTERS];\n }\n};\n\n/* -------------------------------------------------------------------------------------------------\n * List\n * -----------------------------------------------------------------------------------------------*/\n\nconst List = () => {\n const [{ query }, setQuery] = useQueryParams<Filters.Query>();\n\n const options = useFilters('List', ({ options }) => options);\n\n /**\n * Removed by position: identical filters are a legal query, so matching on\n * `(name, operator, value)` would drop every copy at once.\n */\n const handleRemove = (index: number) => {\n const nextFilters = (query?.filters?.$and ?? []).filter((_, i) => i !== index);\n\n setQuery(\n withEncodedUserParams(query, {\n filters: deepEncodeQueryValues({ $and: nextFilters }),\n page: 1,\n })\n );\n };\n\n if (!query?.filters?.$and?.length) {\n return null;\n }\n\n return (\n <>\n {query?.filters?.$and?.map((queryFilter, index) => {\n const details = getFilterDetails(queryFilter, options);\n if (!details || typeof details.value === 'object') {\n return null;\n }\n\n const filter = options.find(({ name }) => name === details.name);\n if (!filter) {\n return null;\n }\n /**\n * `index` is the position in the raw `$and` array — entries skipped above still count.\n * Never cache it: `qs` re-indexes on removal, so dropping entry 0 of [0, 1, 2]\n * leaves [0, 1] and any held index goes stale.\n */\n return (\n <AttributeTag\n key={`${index}-${details.name}-${details.operator}-${details.value}`}\n {...filter}\n index={index}\n onRemove={handleRemove}\n operator={details.operator}\n value={String(details.value)}\n />\n );\n })}\n </>\n );\n};\n\ninterface AttributeTagProps extends Filters.Filter {\n /**\n * Position in the `$and` array. An explicit prop rather than a closure bound at the call\n * site, so it stays part of the props comparison if this ever gets memoised.\n */\n index: number;\n onRemove: (index: number) => void;\n operator: string;\n value: string;\n}\n\nconst AttributeTag = ({\n index,\n input,\n label,\n mainField,\n name,\n onRemove,\n operator,\n options,\n value,\n ...filter\n}: AttributeTagProps) => {\n const { formatMessage, formatDate, formatTime, formatNumber } = useIntl();\n const setOpen = useFilters('AttributeTag', ({ setOpen }) => setOpen);\n const setEditingFilter = useFilters('AttributeTag', ({ setEditingFilter }) => setEditingFilter);\n\n const handleEdit = () => {\n setEditingFilter({\n name,\n filter: operator,\n index,\n value: FILTERS_WITH_NO_VALUE.includes(operator) ? undefined : value,\n });\n setOpen(true);\n };\n\n const handleRemove = () => {\n onRemove(index);\n };\n\n const type = mainField?.type ? mainField.type : filter.type;\n\n let formattedValue: string = value;\n\n switch (type) {\n case 'date':\n formattedValue = formatDate(value, { dateStyle: 'full' });\n break;\n case 'datetime':\n formattedValue = formatDate(value, { dateStyle: 'full', timeStyle: 'short' });\n break;\n case 'time':\n const [hour, minute] = value.split(':');\n const date = new Date();\n date.setHours(Number(hour));\n date.setMinutes(Number(minute));\n\n formattedValue = formatTime(date, {\n hour: 'numeric',\n minute: 'numeric',\n });\n break;\n case 'float':\n case 'integer':\n case 'biginteger':\n case 'decimal':\n formattedValue = formatNumber(Number(value));\n break;\n }\n\n // Handle custom input\n if (input && options) {\n // If the custom input has an options array, find the option with a customValue matching the query value\n const selectedOption = options.find((option) => {\n return (typeof option === 'string' ? option : option.value) === value;\n });\n\n formattedValue = selectedOption\n ? typeof selectedOption === 'string'\n ? selectedOption\n : (selectedOption.label ?? selectedOption.value)\n : value;\n }\n\n const operatorLabel = formatMessage({\n id: `components.FilterOptions.FILTER_TYPES.${operator}`,\n defaultMessage: operator,\n });\n\n const content = FILTERS_WITH_NO_VALUE.includes(operator)\n ? `${label} ${operatorLabel}`\n : `${label} ${operatorLabel} ${formattedValue}`;\n\n return (\n <Tag padding={1} onClick={handleRemove} icon={<Cross />} label={content}>\n <Box tag=\"span\" cursor=\"pointer\" onClick={handleEdit}>\n {content}\n </Box>\n </Tag>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * EXPORTS\n * -----------------------------------------------------------------------------------------------*/\n\nconst Filters = {\n List,\n Popover: PopoverImpl,\n Root,\n Trigger,\n};\n\ninterface MainField {\n name: string;\n type: Schema.Attribute.Kind | 'custom';\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nnamespace Filters {\n export interface Filter {\n input?: React.ComponentType<ValueInputProps>;\n label: string;\n /**\n * the name of the attribute we use to display the actual name e.g. relations\n * are just ids, so we use the mainField to display something meaninginful by\n * looking at the target's schema\n */\n mainField?: MainField;\n name: string;\n operators?: Array<{\n label: string;\n value: string;\n }>;\n options?: Array<{ label?: string; value: string }> | string[];\n type: InputProps['type'] | 'relation' | 'custom';\n }\n\n export interface ValueInputProps extends Omit<Filter, 'label'> {\n ['aria-label']: string;\n }\n\n export type Props = RootProps;\n\n export interface TriggerProps {\n label?: string;\n }\n\n export interface Query {\n filters?: {\n /**\n * Typically, a filter will be:\n * ```ts\n * {\n * [attributeName]: {\n * [operator]: value\n * }\n * }\n * ```\n * However, for relation items it becomes more nested.\n * ```ts\n * {\n * [attributeName]: {\n * [relationTargetAttribute]: {\n * [operator]: value\n * }\n * }\n * }\n * ```\n */\n $and?: Array<Record<string, Record<string, string | Record<string, string>>>>;\n };\n page?: number;\n _q?: string;\n }\n}\n\nexport { Filters };\n"],"names":["FiltersProvider","useFilters","createContext","getFilterDetails","filterEntry","options","name","Object","keys","option","find","o","operatorObj","type","mainField","operator","value","Root","children","disabled","onChange","onOpenChange","open","openProp","defaultOpen","restProps","editingFilter","setEditingFilter","React","useState","handleChange","data","setOpen","useControllableState","prop","defaultProp","useEffect","_jsx","Popover","Trigger","forwardRef","label","forwardedRef","formatMessage","useIntl","Button","variant","ref","startIcon","FilterIcon","size","id","defaultMessage","PopoverImpl","zIndex","query","setQuery","useQueryParams","initialValues","useMemo","filter","BASE_FILTERS","length","handleSubmit","FILTERS_WITH_NO_VALUE","includes","fieldOptions","operatorValuePairing","newFilterEntry","existingFilters","filters","$and","newFilterQuery","map","i","index","withEncodedUserParams","deepEncodeQueryValues","page","Content","style","Box","padding","Form","method","onSubmit","values","formValues","modified","isSubmitting","Input","input","InputRenderer","_jsxs","Flex","direction","alignItems","gap","minWidth","placeholder","operators","getFilterList","opt","field","aria-label","Plus","fullWidth","IS_SENSITIVE_FILTERS","CONTAINS_FILTERS","STRING_PARSE_FILTERS","NUMERIC_FILTERS","List","handleRemove","nextFilters","_","_Fragment","queryFilter","details","AttributeTag","onRemove","String","formatDate","formatTime","formatNumber","handleEdit","undefined","formattedValue","dateStyle","timeStyle","hour","minute","split","date","Date","setHours","Number","setMinutes","selectedOption","operatorLabel","content","Tag","onClick","icon","Cross","tag","cursor","Filters"],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ var reactIntl = require('react-intl');
|
|
|
7
7
|
var useFocusInputField = require('../../hooks/useFocusInputField.js');
|
|
8
8
|
var Form = require('../Form.js');
|
|
9
9
|
|
|
10
|
-
const EnumerationInput = /*#__PURE__*/ React.forwardRef(({ name, required, label, hint, labelAction, options = [], ...props }, ref)=>{
|
|
10
|
+
const EnumerationInput = /*#__PURE__*/ React.forwardRef(({ name, required, label, hint, labelAction, options = [], placeholder, ...props }, ref)=>{
|
|
11
11
|
const { formatMessage } = reactIntl.useIntl();
|
|
12
12
|
const field = Form.useField(name);
|
|
13
13
|
const fieldRef = useFocusInputField.useFocusInputField(name);
|
|
@@ -34,7 +34,7 @@ const EnumerationInput = /*#__PURE__*/ React.forwardRef(({ name, required, label
|
|
|
34
34
|
value: "",
|
|
35
35
|
disabled: required,
|
|
36
36
|
hidden: required,
|
|
37
|
-
children: formatMessage({
|
|
37
|
+
children: placeholder || formatMessage({
|
|
38
38
|
id: 'components.InputSelect.option.placeholder',
|
|
39
39
|
defaultMessage: 'Choose here'
|
|
40
40
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Enumeration.js","sources":["../../../../../../admin/src/components/FormInputs/Enumeration.tsx"],"sourcesContent":["import { forwardRef, memo } from 'react';\n\nimport { SingleSelect, SingleSelectOption, useComposedRefs, Field } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { useFocusInputField } from '../../hooks/useFocusInputField';\nimport { useField } from '../Form';\n\nimport { EnumerationProps } from './types';\n\nconst EnumerationInput = forwardRef<HTMLDivElement, EnumerationProps>(\n ({ name, required, label, hint, labelAction, options = [], ...props }, ref) => {\n const { formatMessage } = useIntl();\n const field = useField<string | number | null>(name);\n const fieldRef = useFocusInputField<HTMLDivElement>(name);\n\n const composedRefs = useComposedRefs(ref, fieldRef);\n\n return (\n <Field.Root error={field.error} name={name} hint={hint} required={required}>\n <Field.Label action={labelAction}>{label}</Field.Label>\n <SingleSelect\n ref={composedRefs}\n onChange={(value) => {\n field.onChange(name, value === '' ? null : value);\n }}\n value={field.value}\n {...props}\n >\n <SingleSelectOption value=\"\" disabled={required} hidden={required}>\n {formatMessage({\n
|
|
1
|
+
{"version":3,"file":"Enumeration.js","sources":["../../../../../../admin/src/components/FormInputs/Enumeration.tsx"],"sourcesContent":["import { forwardRef, memo } from 'react';\n\nimport { SingleSelect, SingleSelectOption, useComposedRefs, Field } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { useFocusInputField } from '../../hooks/useFocusInputField';\nimport { useField } from '../Form';\n\nimport { EnumerationProps } from './types';\n\nconst EnumerationInput = forwardRef<HTMLDivElement, EnumerationProps>(\n ({ name, required, label, hint, labelAction, options = [], placeholder, ...props }, ref) => {\n const { formatMessage } = useIntl();\n const field = useField<string | number | null>(name);\n const fieldRef = useFocusInputField<HTMLDivElement>(name);\n\n const composedRefs = useComposedRefs(ref, fieldRef);\n\n return (\n <Field.Root error={field.error} name={name} hint={hint} required={required}>\n <Field.Label action={labelAction}>{label}</Field.Label>\n <SingleSelect\n ref={composedRefs}\n onChange={(value) => {\n field.onChange(name, value === '' ? null : value);\n }}\n value={field.value}\n {...props}\n >\n <SingleSelectOption value=\"\" disabled={required} hidden={required}>\n {placeholder ||\n formatMessage({\n id: 'components.InputSelect.option.placeholder',\n defaultMessage: 'Choose here',\n })}\n </SingleSelectOption>\n {options.map(({ value, label, disabled, hidden }) => {\n return (\n <SingleSelectOption key={value} value={value} disabled={disabled} hidden={hidden}>\n {label ?? formatMessage({ id: value, defaultMessage: value })}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n <Field.Hint />\n <Field.Error />\n </Field.Root>\n );\n }\n);\n\nconst MemoizedEnumerationInput = memo(EnumerationInput);\n\nexport { MemoizedEnumerationInput as EnumerationInput };\n"],"names":["EnumerationInput","forwardRef","name","required","label","hint","labelAction","options","placeholder","props","ref","formatMessage","useIntl","field","useField","fieldRef","useFocusInputField","composedRefs","useComposedRefs","_jsxs","Field","Root","error","_jsx","Label","action","SingleSelect","onChange","value","SingleSelectOption","disabled","hidden","id","defaultMessage","map","Hint","Error","MemoizedEnumerationInput","memo"],"mappings":";;;;;;;;;AAUA,MAAMA,gBAAAA,iBAAmBC,iBACvB,CAAC,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,KAAK,EAAEC,IAAI,EAAEC,WAAW,EAAEC,OAAAA,GAAU,EAAE,EAAEC,WAAW,EAAE,GAAGC,KAAAA,EAAO,EAAEC,GAAAA,GAAAA;IAClF,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAC1B,IAAA,MAAMC,QAAQC,aAAAA,CAAiCZ,IAAAA,CAAAA;AAC/C,IAAA,MAAMa,WAAWC,qCAAAA,CAAmCd,IAAAA,CAAAA;IAEpD,MAAMe,YAAAA,GAAeC,6BAAgBR,GAAAA,EAAKK,QAAAA,CAAAA;IAE1C,qBACEI,eAAA,CAACC,mBAAMC,IAAI,EAAA;AAACC,QAAAA,KAAAA,EAAOT,MAAMS,KAAK;QAAEpB,IAAAA,EAAMA,IAAAA;QAAMG,IAAAA,EAAMA,IAAAA;QAAMF,QAAAA,EAAUA,QAAAA;;AAChE,0BAAAoB,cAAA,CAACH,mBAAMI,KAAK,EAAA;gBAACC,MAAAA,EAAQnB,WAAAA;AAAcF,gBAAAA,QAAAA,EAAAA;;0BACnCe,eAAA,CAACO,yBAAAA,EAAAA;gBACChB,GAAAA,EAAKO,YAAAA;AACLU,gBAAAA,QAAAA,EAAU,CAACC,KAAAA,GAAAA;AACTf,oBAAAA,KAAAA,CAAMc,QAAQ,CAACzB,IAAAA,EAAM0B,KAAAA,KAAU,KAAK,IAAA,GAAOA,KAAAA,CAAAA;AAC7C,gBAAA,CAAA;AACAA,gBAAAA,KAAAA,EAAOf,MAAMe,KAAK;AACjB,gBAAA,GAAGnB,KAAK;;kCAETc,cAAA,CAACM,+BAAAA,EAAAA;wBAAmBD,KAAAA,EAAM,EAAA;wBAAGE,QAAAA,EAAU3B,QAAAA;wBAAU4B,MAAAA,EAAQ5B,QAAAA;AACtDK,wBAAAA,QAAAA,EAAAA,WAAAA,IACCG,aAAAA,CAAc;4BACZqB,EAAAA,EAAI,2CAAA;4BACJC,cAAAA,EAAgB;AAClB,yBAAA;;oBAEH1B,OAAAA,CAAQ2B,GAAG,CAAC,CAAC,EAAEN,KAAK,EAAExB,KAAK,EAAE0B,QAAQ,EAAEC,MAAM,EAAE,GAAA;AAC9C,wBAAA,qBACER,cAAA,CAACM,+BAAAA,EAAAA;4BAA+BD,KAAAA,EAAOA,KAAAA;4BAAOE,QAAAA,EAAUA,QAAAA;4BAAUC,MAAAA,EAAQA,MAAAA;AACvE3B,4BAAAA,QAAAA,EAAAA,KAAAA,IAASO,aAAAA,CAAc;gCAAEqB,EAAAA,EAAIJ,KAAAA;gCAAOK,cAAAA,EAAgBL;AAAM,6BAAA;AADpCA,yBAAAA,EAAAA,KAAAA,CAAAA;AAI7B,oBAAA,CAAA;;;AAEF,0BAAAL,cAAA,CAACH,mBAAMe,IAAI,EAAA,EAAA,CAAA;AACX,0BAAAZ,cAAA,CAACH,mBAAMgB,KAAK,EAAA,EAAA;;;AAGlB,CAAA,CAAA;AAGF,MAAMC,yCAA2BC,UAAAA,CAAKtC,gBAAAA;;;;"}
|
|
@@ -5,7 +5,7 @@ import { useIntl } from 'react-intl';
|
|
|
5
5
|
import { useFocusInputField } from '../../hooks/useFocusInputField.mjs';
|
|
6
6
|
import { useField } from '../Form.mjs';
|
|
7
7
|
|
|
8
|
-
const EnumerationInput = /*#__PURE__*/ forwardRef(({ name, required, label, hint, labelAction, options = [], ...props }, ref)=>{
|
|
8
|
+
const EnumerationInput = /*#__PURE__*/ forwardRef(({ name, required, label, hint, labelAction, options = [], placeholder, ...props }, ref)=>{
|
|
9
9
|
const { formatMessage } = useIntl();
|
|
10
10
|
const field = useField(name);
|
|
11
11
|
const fieldRef = useFocusInputField(name);
|
|
@@ -32,7 +32,7 @@ const EnumerationInput = /*#__PURE__*/ forwardRef(({ name, required, label, hint
|
|
|
32
32
|
value: "",
|
|
33
33
|
disabled: required,
|
|
34
34
|
hidden: required,
|
|
35
|
-
children: formatMessage({
|
|
35
|
+
children: placeholder || formatMessage({
|
|
36
36
|
id: 'components.InputSelect.option.placeholder',
|
|
37
37
|
defaultMessage: 'Choose here'
|
|
38
38
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Enumeration.mjs","sources":["../../../../../../admin/src/components/FormInputs/Enumeration.tsx"],"sourcesContent":["import { forwardRef, memo } from 'react';\n\nimport { SingleSelect, SingleSelectOption, useComposedRefs, Field } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { useFocusInputField } from '../../hooks/useFocusInputField';\nimport { useField } from '../Form';\n\nimport { EnumerationProps } from './types';\n\nconst EnumerationInput = forwardRef<HTMLDivElement, EnumerationProps>(\n ({ name, required, label, hint, labelAction, options = [], ...props }, ref) => {\n const { formatMessage } = useIntl();\n const field = useField<string | number | null>(name);\n const fieldRef = useFocusInputField<HTMLDivElement>(name);\n\n const composedRefs = useComposedRefs(ref, fieldRef);\n\n return (\n <Field.Root error={field.error} name={name} hint={hint} required={required}>\n <Field.Label action={labelAction}>{label}</Field.Label>\n <SingleSelect\n ref={composedRefs}\n onChange={(value) => {\n field.onChange(name, value === '' ? null : value);\n }}\n value={field.value}\n {...props}\n >\n <SingleSelectOption value=\"\" disabled={required} hidden={required}>\n {formatMessage({\n
|
|
1
|
+
{"version":3,"file":"Enumeration.mjs","sources":["../../../../../../admin/src/components/FormInputs/Enumeration.tsx"],"sourcesContent":["import { forwardRef, memo } from 'react';\n\nimport { SingleSelect, SingleSelectOption, useComposedRefs, Field } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { useFocusInputField } from '../../hooks/useFocusInputField';\nimport { useField } from '../Form';\n\nimport { EnumerationProps } from './types';\n\nconst EnumerationInput = forwardRef<HTMLDivElement, EnumerationProps>(\n ({ name, required, label, hint, labelAction, options = [], placeholder, ...props }, ref) => {\n const { formatMessage } = useIntl();\n const field = useField<string | number | null>(name);\n const fieldRef = useFocusInputField<HTMLDivElement>(name);\n\n const composedRefs = useComposedRefs(ref, fieldRef);\n\n return (\n <Field.Root error={field.error} name={name} hint={hint} required={required}>\n <Field.Label action={labelAction}>{label}</Field.Label>\n <SingleSelect\n ref={composedRefs}\n onChange={(value) => {\n field.onChange(name, value === '' ? null : value);\n }}\n value={field.value}\n {...props}\n >\n <SingleSelectOption value=\"\" disabled={required} hidden={required}>\n {placeholder ||\n formatMessage({\n id: 'components.InputSelect.option.placeholder',\n defaultMessage: 'Choose here',\n })}\n </SingleSelectOption>\n {options.map(({ value, label, disabled, hidden }) => {\n return (\n <SingleSelectOption key={value} value={value} disabled={disabled} hidden={hidden}>\n {label ?? formatMessage({ id: value, defaultMessage: value })}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n <Field.Hint />\n <Field.Error />\n </Field.Root>\n );\n }\n);\n\nconst MemoizedEnumerationInput = memo(EnumerationInput);\n\nexport { MemoizedEnumerationInput as EnumerationInput };\n"],"names":["EnumerationInput","forwardRef","name","required","label","hint","labelAction","options","placeholder","props","ref","formatMessage","useIntl","field","useField","fieldRef","useFocusInputField","composedRefs","useComposedRefs","_jsxs","Field","Root","error","_jsx","Label","action","SingleSelect","onChange","value","SingleSelectOption","disabled","hidden","id","defaultMessage","map","Hint","Error","MemoizedEnumerationInput","memo"],"mappings":";;;;;;;AAUA,MAAMA,gBAAAA,iBAAmBC,WACvB,CAAC,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,KAAK,EAAEC,IAAI,EAAEC,WAAW,EAAEC,OAAAA,GAAU,EAAE,EAAEC,WAAW,EAAE,GAAGC,KAAAA,EAAO,EAAEC,GAAAA,GAAAA;IAClF,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAC1B,IAAA,MAAMC,QAAQC,QAAAA,CAAiCZ,IAAAA,CAAAA;AAC/C,IAAA,MAAMa,WAAWC,kBAAAA,CAAmCd,IAAAA,CAAAA;IAEpD,MAAMe,YAAAA,GAAeC,gBAAgBR,GAAAA,EAAKK,QAAAA,CAAAA;IAE1C,qBACEI,IAAA,CAACC,MAAMC,IAAI,EAAA;AAACC,QAAAA,KAAAA,EAAOT,MAAMS,KAAK;QAAEpB,IAAAA,EAAMA,IAAAA;QAAMG,IAAAA,EAAMA,IAAAA;QAAMF,QAAAA,EAAUA,QAAAA;;AAChE,0BAAAoB,GAAA,CAACH,MAAMI,KAAK,EAAA;gBAACC,MAAAA,EAAQnB,WAAAA;AAAcF,gBAAAA,QAAAA,EAAAA;;0BACnCe,IAAA,CAACO,YAAAA,EAAAA;gBACChB,GAAAA,EAAKO,YAAAA;AACLU,gBAAAA,QAAAA,EAAU,CAACC,KAAAA,GAAAA;AACTf,oBAAAA,KAAAA,CAAMc,QAAQ,CAACzB,IAAAA,EAAM0B,KAAAA,KAAU,KAAK,IAAA,GAAOA,KAAAA,CAAAA;AAC7C,gBAAA,CAAA;AACAA,gBAAAA,KAAAA,EAAOf,MAAMe,KAAK;AACjB,gBAAA,GAAGnB,KAAK;;kCAETc,GAAA,CAACM,kBAAAA,EAAAA;wBAAmBD,KAAAA,EAAM,EAAA;wBAAGE,QAAAA,EAAU3B,QAAAA;wBAAU4B,MAAAA,EAAQ5B,QAAAA;AACtDK,wBAAAA,QAAAA,EAAAA,WAAAA,IACCG,aAAAA,CAAc;4BACZqB,EAAAA,EAAI,2CAAA;4BACJC,cAAAA,EAAgB;AAClB,yBAAA;;oBAEH1B,OAAAA,CAAQ2B,GAAG,CAAC,CAAC,EAAEN,KAAK,EAAExB,KAAK,EAAE0B,QAAQ,EAAEC,MAAM,EAAE,GAAA;AAC9C,wBAAA,qBACER,GAAA,CAACM,kBAAAA,EAAAA;4BAA+BD,KAAAA,EAAOA,KAAAA;4BAAOE,QAAAA,EAAUA,QAAAA;4BAAUC,MAAAA,EAAQA,MAAAA;AACvE3B,4BAAAA,QAAAA,EAAAA,KAAAA,IAASO,aAAAA,CAAc;gCAAEqB,EAAAA,EAAIJ,KAAAA;gCAAOK,cAAAA,EAAgBL;AAAM,6BAAA;AADpCA,yBAAAA,EAAAA,KAAAA,CAAAA;AAI7B,oBAAA,CAAA;;;AAEF,0BAAAL,GAAA,CAACH,MAAMe,IAAI,EAAA,EAAA,CAAA;AACX,0BAAAZ,GAAA,CAACH,MAAMgB,KAAK,EAAA,EAAA;;;AAGlB,CAAA,CAAA;AAGF,MAAMC,yCAA2BC,IAAAA,CAAKtC,gBAAAA;;;;"}
|
|
@@ -1,12 +1,34 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
4
5
|
var designSystem = require('@strapi/design-system');
|
|
5
6
|
var icons = require('@strapi/icons');
|
|
6
7
|
var reactIntl = require('react-intl');
|
|
8
|
+
var reactRouterDom = require('react-router-dom');
|
|
7
9
|
var usePersistentState = require('../hooks/usePersistentState.js');
|
|
8
10
|
var DismissibleBanner = require('./DismissibleBanner.js');
|
|
9
11
|
|
|
12
|
+
function _interopNamespace(e) {
|
|
13
|
+
if (e && e.__esModule) return e;
|
|
14
|
+
var n = Object.create(null);
|
|
15
|
+
if (e) {
|
|
16
|
+
Object.keys(e).forEach(function (k) {
|
|
17
|
+
if (k !== 'default') {
|
|
18
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
19
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
get: function () { return e[k]; }
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
n.default = e;
|
|
27
|
+
return Object.freeze(n);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
31
|
+
|
|
10
32
|
const Banner = ({ isLegacyMediaLibrary, onDismiss })=>{
|
|
11
33
|
const { formatMessage } = reactIntl.useIntl();
|
|
12
34
|
return /*#__PURE__*/ jsxRuntime.jsx(DismissibleBanner.DismissibleBanner, {
|
|
@@ -66,13 +88,27 @@ const Banner = ({ isLegacyMediaLibrary, onDismiss })=>{
|
|
|
66
88
|
})
|
|
67
89
|
});
|
|
68
90
|
};
|
|
69
|
-
const MediaLibraryBanner = ()=>{
|
|
91
|
+
const MediaLibraryBanner = ({ onVisibilityChange } = {})=>{
|
|
70
92
|
const isLegacyMediaLibrary = window.strapi.featureFlags.isEnabled('useLegacyMediaLibrary');
|
|
71
93
|
// The flag state is part of the key (not the stored value) so dismissing one
|
|
72
94
|
// message never collides with the other, and toggling `useLegacyMediaLibrary`
|
|
73
95
|
// (enabling it, or rolling it back) brings the banner back with the right message.
|
|
74
96
|
const [isDismissed, setIsDismissed] = usePersistentState.useScopedPersistentState(`STRAPI_MEDIA_LIBRARY_BANNER_DISMISSED_FOR_${isLegacyMediaLibrary}`, false);
|
|
75
|
-
|
|
97
|
+
// `AuthenticatedLayout` renders this banner on every admin page, but it's only
|
|
98
|
+
// relevant on the Media Library itself (both the new and legacy `upload` plugin
|
|
99
|
+
// route share the same `plugins/upload` mount point).
|
|
100
|
+
const isOnMediaLibraryPage = reactRouterDom.useMatch('/plugins/upload/*') !== null;
|
|
101
|
+
const isVisible = isOnMediaLibraryPage && !isDismissed;
|
|
102
|
+
// useLayoutEffect (not useEffect) so the parent's re-render from this lands before the
|
|
103
|
+
// browser paints — otherwise a possibly-visible `UpsellBanner` would flash on screen for a
|
|
104
|
+
// frame before being hidden.
|
|
105
|
+
React__namespace.useLayoutEffect(()=>{
|
|
106
|
+
onVisibilityChange?.(isVisible);
|
|
107
|
+
}, [
|
|
108
|
+
isVisible,
|
|
109
|
+
onVisibilityChange
|
|
110
|
+
]);
|
|
111
|
+
if (!isVisible) {
|
|
76
112
|
return null;
|
|
77
113
|
}
|
|
78
114
|
return /*#__PURE__*/ jsxRuntime.jsx(Banner, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MediaLibraryBanner.js","sources":["../../../../../admin/src/components/MediaLibraryBanner.tsx"],"sourcesContent":["import { LinkButton, Typography } from '@strapi/design-system';\nimport { ExternalLink } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { useScopedPersistentState } from '../hooks/usePersistentState';\n\nimport { DismissibleBanner } from './DismissibleBanner';\n\nconst Banner = ({\n isLegacyMediaLibrary,\n onDismiss,\n}: {\n isLegacyMediaLibrary: boolean;\n onDismiss: () => void;\n}) => {\n const { formatMessage } = useIntl();\n\n return (\n <DismissibleBanner\n onDismiss={onDismiss}\n closeLabel={formatMessage({\n id: 'app.components.MediaLibraryBanner.close',\n defaultMessage: 'Close',\n })}\n message={\n <>\n <Typography\n variant=\"delta\"\n fontWeight=\"bold\"\n textColor=\"neutral0\"\n textAlign=\"center\"\n fontSize={2}\n >\n {formatMessage({\n id: 'app.components.MediaLibraryBanner.intro',\n defaultMessage: 'Introducing the new Media Library ',\n })}\n </Typography>\n <Typography\n variant=\"delta\"\n textColor=\"neutral0\"\n textAlign=\"center\"\n paddingRight={4}\n fontSize={2}\n >\n {formatMessage(\n isLegacyMediaLibrary\n ? {\n id: 'app.components.MediaLibraryBanner.text',\n defaultMessage:\n 'Check the documentation to learn how to switch to the new one.',\n }\n : {\n id: 'app.components.MediaLibraryBanner.text.enabled',\n defaultMessage: \"You're now using the revamped version.\",\n }\n )}\n </Typography>\n </>\n }\n action={\n isLegacyMediaLibrary ? (\n <LinkButton\n width=\"max-content\"\n variant=\"tertiary\"\n startIcon={<ExternalLink />}\n href=\"https://docs.strapi.io/cms/features/media-library\"\n target=\"_blank\"\n >\n {formatMessage({\n id: 'app.components.MediaLibraryBanner.button',\n defaultMessage: 'Docs',\n })}\n </LinkButton>\n ) : (\n <LinkButton\n width=\"max-content\"\n variant=\"tertiary\"\n href=\"https://strapi.io/blog/strapi-release-roundup-everything-that-changed-between-june-and-august-2026\"\n target=\"_blank\"\n >\n {formatMessage({\n id: 'app.components.MediaLibraryBanner.button.enabled',\n defaultMessage: 'Read blog post',\n })}\n </LinkButton>\n )\n }\n />\n );\n};\n\nconst MediaLibraryBanner = () => {\n const isLegacyMediaLibrary = window.strapi.featureFlags.isEnabled('useLegacyMediaLibrary');\n\n // The flag state is part of the key (not the stored value) so dismissing one\n // message never collides with the other, and toggling `useLegacyMediaLibrary`\n // (enabling it, or rolling it back) brings the banner back with the right message.\n const [isDismissed, setIsDismissed] = useScopedPersistentState<boolean>(\n `STRAPI_MEDIA_LIBRARY_BANNER_DISMISSED_FOR_${isLegacyMediaLibrary}`,\n false\n );\n\n
|
|
1
|
+
{"version":3,"file":"MediaLibraryBanner.js","sources":["../../../../../admin/src/components/MediaLibraryBanner.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { LinkButton, Typography } from '@strapi/design-system';\nimport { ExternalLink } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useMatch } from 'react-router-dom';\n\nimport { useScopedPersistentState } from '../hooks/usePersistentState';\n\nimport { DismissibleBanner } from './DismissibleBanner';\n\nconst Banner = ({\n isLegacyMediaLibrary,\n onDismiss,\n}: {\n isLegacyMediaLibrary: boolean;\n onDismiss: () => void;\n}) => {\n const { formatMessage } = useIntl();\n\n return (\n <DismissibleBanner\n onDismiss={onDismiss}\n closeLabel={formatMessage({\n id: 'app.components.MediaLibraryBanner.close',\n defaultMessage: 'Close',\n })}\n message={\n <>\n <Typography\n variant=\"delta\"\n fontWeight=\"bold\"\n textColor=\"neutral0\"\n textAlign=\"center\"\n fontSize={2}\n >\n {formatMessage({\n id: 'app.components.MediaLibraryBanner.intro',\n defaultMessage: 'Introducing the new Media Library ',\n })}\n </Typography>\n <Typography\n variant=\"delta\"\n textColor=\"neutral0\"\n textAlign=\"center\"\n paddingRight={4}\n fontSize={2}\n >\n {formatMessage(\n isLegacyMediaLibrary\n ? {\n id: 'app.components.MediaLibraryBanner.text',\n defaultMessage:\n 'Check the documentation to learn how to switch to the new one.',\n }\n : {\n id: 'app.components.MediaLibraryBanner.text.enabled',\n defaultMessage: \"You're now using the revamped version.\",\n }\n )}\n </Typography>\n </>\n }\n action={\n isLegacyMediaLibrary ? (\n <LinkButton\n width=\"max-content\"\n variant=\"tertiary\"\n startIcon={<ExternalLink />}\n href=\"https://docs.strapi.io/cms/features/media-library\"\n target=\"_blank\"\n >\n {formatMessage({\n id: 'app.components.MediaLibraryBanner.button',\n defaultMessage: 'Docs',\n })}\n </LinkButton>\n ) : (\n <LinkButton\n width=\"max-content\"\n variant=\"tertiary\"\n href=\"https://strapi.io/blog/strapi-release-roundup-everything-that-changed-between-june-and-august-2026\"\n target=\"_blank\"\n >\n {formatMessage({\n id: 'app.components.MediaLibraryBanner.button.enabled',\n defaultMessage: 'Read blog post',\n })}\n </LinkButton>\n )\n }\n />\n );\n};\n\ninterface MediaLibraryBannerProps {\n /**\n * Called synchronously (before paint) whenever this banner's own visibility changes, so a\n * parent rendering it alongside another banner (e.g. `UpsellBanner`) can hide that other one\n * instead of stacking both. This banner owns its dismissal state, so it's the source of truth\n * for whether it's showing — the parent shouldn't have to re-derive that itself.\n */\n onVisibilityChange?: (isVisible: boolean) => void;\n}\n\nconst MediaLibraryBanner = ({ onVisibilityChange }: MediaLibraryBannerProps = {}) => {\n const isLegacyMediaLibrary = window.strapi.featureFlags.isEnabled('useLegacyMediaLibrary');\n\n // The flag state is part of the key (not the stored value) so dismissing one\n // message never collides with the other, and toggling `useLegacyMediaLibrary`\n // (enabling it, or rolling it back) brings the banner back with the right message.\n const [isDismissed, setIsDismissed] = useScopedPersistentState<boolean>(\n `STRAPI_MEDIA_LIBRARY_BANNER_DISMISSED_FOR_${isLegacyMediaLibrary}`,\n false\n );\n\n // `AuthenticatedLayout` renders this banner on every admin page, but it's only\n // relevant on the Media Library itself (both the new and legacy `upload` plugin\n // route share the same `plugins/upload` mount point).\n const isOnMediaLibraryPage = useMatch('/plugins/upload/*') !== null;\n\n const isVisible = isOnMediaLibraryPage && !isDismissed;\n\n // useLayoutEffect (not useEffect) so the parent's re-render from this lands before the\n // browser paints — otherwise a possibly-visible `UpsellBanner` would flash on screen for a\n // frame before being hidden.\n React.useLayoutEffect(() => {\n onVisibilityChange?.(isVisible);\n }, [isVisible, onVisibilityChange]);\n\n if (!isVisible) {\n return null;\n }\n\n return (\n <Banner isLegacyMediaLibrary={isLegacyMediaLibrary} onDismiss={() => setIsDismissed(true)} />\n );\n};\n\nexport { MediaLibraryBanner };\n"],"names":["Banner","isLegacyMediaLibrary","onDismiss","formatMessage","useIntl","_jsx","DismissibleBanner","closeLabel","id","defaultMessage","message","_jsxs","_Fragment","Typography","variant","fontWeight","textColor","textAlign","fontSize","paddingRight","action","LinkButton","width","startIcon","ExternalLink","href","target","MediaLibraryBanner","onVisibilityChange","window","strapi","featureFlags","isEnabled","isDismissed","setIsDismissed","useScopedPersistentState","isOnMediaLibraryPage","useMatch","isVisible","React","useLayoutEffect"],"mappings":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
2
3
|
import { LinkButton, Typography } from '@strapi/design-system';
|
|
3
4
|
import { ExternalLink } from '@strapi/icons';
|
|
4
5
|
import { useIntl } from 'react-intl';
|
|
6
|
+
import { useMatch } from 'react-router-dom';
|
|
5
7
|
import { useScopedPersistentState } from '../hooks/usePersistentState.mjs';
|
|
6
8
|
import { DismissibleBanner } from './DismissibleBanner.mjs';
|
|
7
9
|
|
|
@@ -64,13 +66,27 @@ const Banner = ({ isLegacyMediaLibrary, onDismiss })=>{
|
|
|
64
66
|
})
|
|
65
67
|
});
|
|
66
68
|
};
|
|
67
|
-
const MediaLibraryBanner = ()=>{
|
|
69
|
+
const MediaLibraryBanner = ({ onVisibilityChange } = {})=>{
|
|
68
70
|
const isLegacyMediaLibrary = window.strapi.featureFlags.isEnabled('useLegacyMediaLibrary');
|
|
69
71
|
// The flag state is part of the key (not the stored value) so dismissing one
|
|
70
72
|
// message never collides with the other, and toggling `useLegacyMediaLibrary`
|
|
71
73
|
// (enabling it, or rolling it back) brings the banner back with the right message.
|
|
72
74
|
const [isDismissed, setIsDismissed] = useScopedPersistentState(`STRAPI_MEDIA_LIBRARY_BANNER_DISMISSED_FOR_${isLegacyMediaLibrary}`, false);
|
|
73
|
-
|
|
75
|
+
// `AuthenticatedLayout` renders this banner on every admin page, but it's only
|
|
76
|
+
// relevant on the Media Library itself (both the new and legacy `upload` plugin
|
|
77
|
+
// route share the same `plugins/upload` mount point).
|
|
78
|
+
const isOnMediaLibraryPage = useMatch('/plugins/upload/*') !== null;
|
|
79
|
+
const isVisible = isOnMediaLibraryPage && !isDismissed;
|
|
80
|
+
// useLayoutEffect (not useEffect) so the parent's re-render from this lands before the
|
|
81
|
+
// browser paints — otherwise a possibly-visible `UpsellBanner` would flash on screen for a
|
|
82
|
+
// frame before being hidden.
|
|
83
|
+
React.useLayoutEffect(()=>{
|
|
84
|
+
onVisibilityChange?.(isVisible);
|
|
85
|
+
}, [
|
|
86
|
+
isVisible,
|
|
87
|
+
onVisibilityChange
|
|
88
|
+
]);
|
|
89
|
+
if (!isVisible) {
|
|
74
90
|
return null;
|
|
75
91
|
}
|
|
76
92
|
return /*#__PURE__*/ jsx(Banner, {
|