@strapi/content-releases 5.0.0-rc.7 → 5.0.0-rc.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/_chunks/{App-Cf879yGs.mjs → App-DMILern_.mjs} +10 -5
  2. package/dist/_chunks/App-DMILern_.mjs.map +1 -0
  3. package/dist/_chunks/{App-BjBiAE8g.js → App-fAgiijnc.js} +9 -4
  4. package/dist/_chunks/App-fAgiijnc.js.map +1 -0
  5. package/dist/_chunks/{ReleasesSettingsPage-D7kMSSvV.js → ReleasesSettingsPage-YVZJH-oN.js} +3 -3
  6. package/dist/_chunks/ReleasesSettingsPage-YVZJH-oN.js.map +1 -0
  7. package/dist/_chunks/{ReleasesSettingsPage-BlUuvtd9.mjs → ReleasesSettingsPage-dwoRuXB-.mjs} +3 -3
  8. package/dist/_chunks/ReleasesSettingsPage-dwoRuXB-.mjs.map +1 -0
  9. package/dist/_chunks/{en-BCDLTJn3.js → en-CmYoEnA7.js} +2 -1
  10. package/dist/_chunks/en-CmYoEnA7.js.map +1 -0
  11. package/dist/_chunks/{en-CGXIF4vQ.mjs → en-D0yVZFqf.mjs} +2 -1
  12. package/dist/_chunks/en-D0yVZFqf.mjs.map +1 -0
  13. package/dist/_chunks/{index-1MxwkUQx.js → index--_NWfuDG.js} +248 -8
  14. package/dist/_chunks/index--_NWfuDG.js.map +1 -0
  15. package/dist/_chunks/{index-BG0Q8zkH.mjs → index-CYsQToWs.mjs} +251 -11
  16. package/dist/_chunks/index-CYsQToWs.mjs.map +1 -0
  17. package/dist/admin/index.js +1 -1
  18. package/dist/admin/index.mjs +1 -1
  19. package/dist/admin/src/components/ReleaseListCell.d.ts +28 -0
  20. package/dist/admin/src/services/release.d.ts +6 -4
  21. package/dist/server/index.js +73 -73
  22. package/dist/server/index.js.map +1 -1
  23. package/dist/server/index.mjs +73 -73
  24. package/dist/server/index.mjs.map +1 -1
  25. package/dist/server/src/controllers/index.d.ts +2 -0
  26. package/dist/server/src/controllers/index.d.ts.map +1 -1
  27. package/dist/server/src/controllers/release-action.d.ts +1 -0
  28. package/dist/server/src/controllers/release-action.d.ts.map +1 -1
  29. package/dist/server/src/controllers/release.d.ts +1 -0
  30. package/dist/server/src/controllers/release.d.ts.map +1 -1
  31. package/dist/server/src/index.d.ts +2 -0
  32. package/dist/server/src/index.d.ts.map +1 -1
  33. package/dist/server/src/routes/release-action.d.ts.map +1 -1
  34. package/dist/server/src/routes/release.d.ts.map +1 -1
  35. package/dist/shared/contracts/release-actions.d.ts +3 -5
  36. package/dist/shared/contracts/release-actions.d.ts.map +1 -1
  37. package/dist/shared/contracts/releases.d.ts +3 -2
  38. package/dist/shared/contracts/releases.d.ts.map +1 -1
  39. package/package.json +10 -10
  40. package/dist/_chunks/App-BjBiAE8g.js.map +0 -1
  41. package/dist/_chunks/App-Cf879yGs.mjs.map +0 -1
  42. package/dist/_chunks/ReleasesSettingsPage-BlUuvtd9.mjs.map +0 -1
  43. package/dist/_chunks/ReleasesSettingsPage-D7kMSSvV.js.map +0 -1
  44. package/dist/_chunks/en-BCDLTJn3.js.map +0 -1
  45. package/dist/_chunks/en-CGXIF4vQ.mjs.map +0 -1
  46. package/dist/_chunks/index-1MxwkUQx.js.map +0 -1
  47. package/dist/_chunks/index-BG0Q8zkH.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReleasesSettingsPage-YVZJH-oN.js","sources":["../../admin/src/modules/hooks.ts","../../admin/src/pages/ReleasesSettingsPage.tsx"],"sourcesContent":["import { Dispatch } from '@reduxjs/toolkit';\nimport { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux';\n\nimport type { Store } from '@strapi/admin/strapi-admin';\n\ntype RootState = ReturnType<Store['getState']>;\n\nconst useTypedDispatch: () => Dispatch = useDispatch;\nconst useTypedSelector: TypedUseSelectorHook<RootState> = useSelector;\n\nexport { useTypedSelector, useTypedDispatch };\n","import {\n Form,\n Layouts,\n Page,\n useAPIErrorHandler,\n isFetchError,\n useNotification,\n useField,\n useRBAC,\n} from '@strapi/admin/strapi-admin';\nimport {\n Button,\n Combobox,\n ComboboxOption,\n Field,\n Flex,\n Grid,\n Typography,\n} from '@strapi/design-system';\nimport { Check } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { useTypedSelector } from '../modules/hooks';\nimport { useGetReleaseSettingsQuery, useUpdateReleaseSettingsMutation } from '../services/release';\nimport { getTimezones } from '../utils/time';\nimport { SETTINGS_SCHEMA } from '../validation/schemas';\n\nimport type { UpdateSettings } from '../../../shared/contracts/settings';\n\nconst ReleasesSettingsPage = () => {\n const { formatMessage } = useIntl();\n const { formatAPIError } = useAPIErrorHandler();\n const { toggleNotification } = useNotification();\n const { data, isLoading: isLoadingSettings } = useGetReleaseSettingsQuery();\n const [updateReleaseSettings, { isLoading: isSubmittingForm }] =\n useUpdateReleaseSettingsMutation();\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions['settings']?.['releases']\n );\n const {\n allowedActions: { canUpdate },\n } = useRBAC(permissions);\n\n const { timezoneList } = getTimezones(new Date());\n\n const handleSubmit = async (body: UpdateSettings.Request['body']) => {\n const { defaultTimezone } = body;\n const isBodyTimezoneValid = timezoneList.some((timezone) => timezone.value === defaultTimezone);\n const newBody =\n !defaultTimezone || !isBodyTimezoneValid ? { defaultTimezone: null } : { ...body };\n try {\n const response = await updateReleaseSettings(newBody);\n\n if ('data' in response) {\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'content-releases.pages.Settings.releases.setting.default-timezone-notification-success',\n defaultMessage: 'Default timezone updated.',\n }),\n });\n } else if (isFetchError(response.error)) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(response.error),\n });\n } else {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n } catch (error) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n if (isLoadingSettings) {\n return <Page.Loading />;\n }\n\n return (\n <Layouts.Root>\n <Page.Title>\n {formatMessage(\n { id: 'Settings.PageTitle', defaultMessage: 'Settings - {name}' },\n {\n name: 'Releases',\n }\n )}\n </Page.Title>\n <Page.Main aria-busy={isLoadingSettings} tabIndex={-1}>\n <Form\n method=\"PUT\"\n initialValues={{\n defaultTimezone: data?.data.defaultTimezone,\n }}\n onSubmit={handleSubmit}\n validationSchema={SETTINGS_SCHEMA}\n >\n {({ modified, isSubmitting }: { modified: boolean; isSubmitting: boolean }) => {\n return (\n <>\n <Layouts.Header\n primaryAction={\n canUpdate ? (\n <Button\n disabled={!modified || isSubmittingForm}\n loading={isSubmitting}\n startIcon={<Check />}\n type=\"submit\"\n >\n {formatMessage({\n id: 'global.save',\n defaultMessage: 'Save',\n })}\n </Button>\n ) : null\n }\n title={formatMessage({\n id: 'content-releases.pages.Settings.releases.title',\n defaultMessage: 'Releases',\n })}\n subtitle={formatMessage({\n id: 'content-releases.pages.Settings.releases.description',\n defaultMessage: 'Create and manage content updates',\n })}\n />\n <Layouts.Content>\n <Flex\n direction=\"column\"\n background=\"neutral0\"\n alignItems=\"stretch\"\n padding={6}\n gap={6}\n shadow=\"filterShadow\"\n hasRadius\n >\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: 'content-releases.pages.Settings.releases.preferences.title',\n defaultMessage: 'Preferences',\n })}\n </Typography>\n <Grid.Root>\n <Grid.Item col={6} s={12} direction=\"column\" alignItems=\"stretch\">\n <TimezoneDropdown />\n </Grid.Item>\n </Grid.Root>\n </Flex>\n </Layouts.Content>\n </>\n );\n }}\n </Form>\n </Page.Main>\n </Layouts.Root>\n );\n};\n\nconst TimezoneDropdown = () => {\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions['settings']?.['releases']\n );\n const {\n allowedActions: { canUpdate },\n } = useRBAC(permissions);\n const { formatMessage } = useIntl();\n const { timezoneList } = getTimezones(new Date());\n const field = useField('defaultTimezone');\n return (\n <Field.Root\n name=\"defaultTimezone\"\n hint={formatMessage({\n id: 'content-releases.pages.Settings.releases.timezone.hint',\n defaultMessage: 'The timezone of every release can still be changed individually. ',\n })}\n error={field.error}\n >\n <Field.Label>\n {formatMessage({\n id: 'content-releases.pages.Settings.releases.timezone.label',\n defaultMessage: 'Default timezone',\n })}\n </Field.Label>\n <Combobox\n autocomplete={{ type: 'list', filter: 'contains' }}\n onChange={(value) => field.onChange('defaultTimezone', value)}\n onTextValueChange={(value) => field.onChange('defaultTimezone', value)}\n onClear={() => field.onChange('defaultTimezone', '')}\n value={field.value}\n disabled={!canUpdate}\n >\n {timezoneList.map((timezone) => (\n <ComboboxOption key={timezone.value} value={timezone.value}>\n {timezone.value.replace(/&/, ' ')}\n </ComboboxOption>\n ))}\n </Combobox>\n <Field.Hint />\n <Field.Error />\n </Field.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ProtectedSettingsPage\n * -----------------------------------------------------------------------------------------------*/\n\nexport const ProtectedReleasesSettingsPage = () => {\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions['settings']?.['releases']?.read\n );\n\n return (\n <Page.Protect permissions={permissions}>\n <ReleasesSettingsPage />\n </Page.Protect>\n );\n};\n"],"names":["useSelector","useIntl","useAPIErrorHandler","useNotification","useGetReleaseSettingsQuery","useUpdateReleaseSettingsMutation","useRBAC","getTimezones","isFetchError","jsx","Page","jsxs","Layouts","Form","SETTINGS_SCHEMA","Fragment","Button","Check","Flex","Typography","Grid","useField","Field","Combobox","ComboboxOption"],"mappings":"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"}
@@ -4,7 +4,7 @@ import { Button, Flex, Typography, Grid, Field, Combobox, ComboboxOption } from
4
4
  import { Check } from "@strapi/icons";
5
5
  import { useIntl } from "react-intl";
6
6
  import { useSelector } from "react-redux";
7
- import { a as useGetReleaseSettingsQuery, l as useUpdateReleaseSettingsMutation, g as getTimezones } from "./index-BG0Q8zkH.mjs";
7
+ import { a as useGetReleaseSettingsQuery, l as useUpdateReleaseSettingsMutation, g as getTimezones } from "./index-CYsQToWs.mjs";
8
8
  import { S as SETTINGS_SCHEMA } from "./schemas-63pFihNF.mjs";
9
9
  const useTypedSelector = useSelector;
10
10
  const ReleasesSettingsPage = () => {
@@ -114,7 +114,7 @@ const ReleasesSettingsPage = () => {
114
114
  id: "content-releases.pages.Settings.releases.preferences.title",
115
115
  defaultMessage: "Preferences"
116
116
  }) }),
117
- /* @__PURE__ */ jsx(Grid.Root, { children: /* @__PURE__ */ jsx(Grid.Item, { col: 6, s: 12, children: /* @__PURE__ */ jsx(TimezoneDropdown, {}) }) })
117
+ /* @__PURE__ */ jsx(Grid.Root, { children: /* @__PURE__ */ jsx(Grid.Item, { col: 6, s: 12, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsx(TimezoneDropdown, {}) }) })
118
118
  ]
119
119
  }
120
120
  ) })
@@ -175,4 +175,4 @@ const ProtectedReleasesSettingsPage = () => {
175
175
  export {
176
176
  ProtectedReleasesSettingsPage
177
177
  };
178
- //# sourceMappingURL=ReleasesSettingsPage-BlUuvtd9.mjs.map
178
+ //# sourceMappingURL=ReleasesSettingsPage-dwoRuXB-.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReleasesSettingsPage-dwoRuXB-.mjs","sources":["../../admin/src/modules/hooks.ts","../../admin/src/pages/ReleasesSettingsPage.tsx"],"sourcesContent":["import { Dispatch } from '@reduxjs/toolkit';\nimport { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux';\n\nimport type { Store } from '@strapi/admin/strapi-admin';\n\ntype RootState = ReturnType<Store['getState']>;\n\nconst useTypedDispatch: () => Dispatch = useDispatch;\nconst useTypedSelector: TypedUseSelectorHook<RootState> = useSelector;\n\nexport { useTypedSelector, useTypedDispatch };\n","import {\n Form,\n Layouts,\n Page,\n useAPIErrorHandler,\n isFetchError,\n useNotification,\n useField,\n useRBAC,\n} from '@strapi/admin/strapi-admin';\nimport {\n Button,\n Combobox,\n ComboboxOption,\n Field,\n Flex,\n Grid,\n Typography,\n} from '@strapi/design-system';\nimport { Check } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { useTypedSelector } from '../modules/hooks';\nimport { useGetReleaseSettingsQuery, useUpdateReleaseSettingsMutation } from '../services/release';\nimport { getTimezones } from '../utils/time';\nimport { SETTINGS_SCHEMA } from '../validation/schemas';\n\nimport type { UpdateSettings } from '../../../shared/contracts/settings';\n\nconst ReleasesSettingsPage = () => {\n const { formatMessage } = useIntl();\n const { formatAPIError } = useAPIErrorHandler();\n const { toggleNotification } = useNotification();\n const { data, isLoading: isLoadingSettings } = useGetReleaseSettingsQuery();\n const [updateReleaseSettings, { isLoading: isSubmittingForm }] =\n useUpdateReleaseSettingsMutation();\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions['settings']?.['releases']\n );\n const {\n allowedActions: { canUpdate },\n } = useRBAC(permissions);\n\n const { timezoneList } = getTimezones(new Date());\n\n const handleSubmit = async (body: UpdateSettings.Request['body']) => {\n const { defaultTimezone } = body;\n const isBodyTimezoneValid = timezoneList.some((timezone) => timezone.value === defaultTimezone);\n const newBody =\n !defaultTimezone || !isBodyTimezoneValid ? { defaultTimezone: null } : { ...body };\n try {\n const response = await updateReleaseSettings(newBody);\n\n if ('data' in response) {\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'content-releases.pages.Settings.releases.setting.default-timezone-notification-success',\n defaultMessage: 'Default timezone updated.',\n }),\n });\n } else if (isFetchError(response.error)) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(response.error),\n });\n } else {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n } catch (error) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n if (isLoadingSettings) {\n return <Page.Loading />;\n }\n\n return (\n <Layouts.Root>\n <Page.Title>\n {formatMessage(\n { id: 'Settings.PageTitle', defaultMessage: 'Settings - {name}' },\n {\n name: 'Releases',\n }\n )}\n </Page.Title>\n <Page.Main aria-busy={isLoadingSettings} tabIndex={-1}>\n <Form\n method=\"PUT\"\n initialValues={{\n defaultTimezone: data?.data.defaultTimezone,\n }}\n onSubmit={handleSubmit}\n validationSchema={SETTINGS_SCHEMA}\n >\n {({ modified, isSubmitting }: { modified: boolean; isSubmitting: boolean }) => {\n return (\n <>\n <Layouts.Header\n primaryAction={\n canUpdate ? (\n <Button\n disabled={!modified || isSubmittingForm}\n loading={isSubmitting}\n startIcon={<Check />}\n type=\"submit\"\n >\n {formatMessage({\n id: 'global.save',\n defaultMessage: 'Save',\n })}\n </Button>\n ) : null\n }\n title={formatMessage({\n id: 'content-releases.pages.Settings.releases.title',\n defaultMessage: 'Releases',\n })}\n subtitle={formatMessage({\n id: 'content-releases.pages.Settings.releases.description',\n defaultMessage: 'Create and manage content updates',\n })}\n />\n <Layouts.Content>\n <Flex\n direction=\"column\"\n background=\"neutral0\"\n alignItems=\"stretch\"\n padding={6}\n gap={6}\n shadow=\"filterShadow\"\n hasRadius\n >\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: 'content-releases.pages.Settings.releases.preferences.title',\n defaultMessage: 'Preferences',\n })}\n </Typography>\n <Grid.Root>\n <Grid.Item col={6} s={12} direction=\"column\" alignItems=\"stretch\">\n <TimezoneDropdown />\n </Grid.Item>\n </Grid.Root>\n </Flex>\n </Layouts.Content>\n </>\n );\n }}\n </Form>\n </Page.Main>\n </Layouts.Root>\n );\n};\n\nconst TimezoneDropdown = () => {\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions['settings']?.['releases']\n );\n const {\n allowedActions: { canUpdate },\n } = useRBAC(permissions);\n const { formatMessage } = useIntl();\n const { timezoneList } = getTimezones(new Date());\n const field = useField('defaultTimezone');\n return (\n <Field.Root\n name=\"defaultTimezone\"\n hint={formatMessage({\n id: 'content-releases.pages.Settings.releases.timezone.hint',\n defaultMessage: 'The timezone of every release can still be changed individually. ',\n })}\n error={field.error}\n >\n <Field.Label>\n {formatMessage({\n id: 'content-releases.pages.Settings.releases.timezone.label',\n defaultMessage: 'Default timezone',\n })}\n </Field.Label>\n <Combobox\n autocomplete={{ type: 'list', filter: 'contains' }}\n onChange={(value) => field.onChange('defaultTimezone', value)}\n onTextValueChange={(value) => field.onChange('defaultTimezone', value)}\n onClear={() => field.onChange('defaultTimezone', '')}\n value={field.value}\n disabled={!canUpdate}\n >\n {timezoneList.map((timezone) => (\n <ComboboxOption key={timezone.value} value={timezone.value}>\n {timezone.value.replace(/&/, ' ')}\n </ComboboxOption>\n ))}\n </Combobox>\n <Field.Hint />\n <Field.Error />\n </Field.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ProtectedSettingsPage\n * -----------------------------------------------------------------------------------------------*/\n\nexport const ProtectedReleasesSettingsPage = () => {\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions['settings']?.['releases']?.read\n );\n\n return (\n <Page.Protect permissions={permissions}>\n <ReleasesSettingsPage />\n </Page.Protect>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -17,6 +17,7 @@ const en = {
17
17
  "content-releases.content-manager-edit-view.edit-entry": "Edit entry",
18
18
  "content-manager-edit-view.remove-from-release.notification.success": "Entry removed from release",
19
19
  "content-manager-edit-view.release-action-menu": "Release action options",
20
+ "content-manager.list-view.releases.header": "To be released in",
20
21
  "content-manager-list-view.add-to-release": "Add to release",
21
22
  "content-manager-list-view.add-to-release.cancel-button": "Cancel",
22
23
  "content-manager-list-view.add-to-release.continue-button": "Continue",
@@ -89,4 +90,4 @@ const en = {
89
90
  "pages.Settings.releases.setting.default-timezone-notification-success": "Default timezone updated."
90
91
  };
91
92
  exports.default = en;
92
- //# sourceMappingURL=en-BCDLTJn3.js.map
93
+ //# sourceMappingURL=en-CmYoEnA7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en-CmYoEnA7.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -15,6 +15,7 @@ const en = {
15
15
  "content-releases.content-manager-edit-view.edit-entry": "Edit entry",
16
16
  "content-manager-edit-view.remove-from-release.notification.success": "Entry removed from release",
17
17
  "content-manager-edit-view.release-action-menu": "Release action options",
18
+ "content-manager.list-view.releases.header": "To be released in",
18
19
  "content-manager-list-view.add-to-release": "Add to release",
19
20
  "content-manager-list-view.add-to-release.cancel-button": "Cancel",
20
21
  "content-manager-list-view.add-to-release.continue-button": "Continue",
@@ -89,4 +90,4 @@ const en = {
89
90
  export {
90
91
  en as default
91
92
  };
92
- //# sourceMappingURL=en-CGXIF4vQ.mjs.map
93
+ //# sourceMappingURL=en-D0yVZFqf.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en-D0yVZFqf.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -2,11 +2,11 @@
2
2
  const icons = require("@strapi/icons");
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const strapiAdmin = require("@strapi/admin/strapi-admin");
5
- const strapiAdmin$1 = require("@strapi/content-manager/strapi-admin");
6
5
  const designSystem = require("@strapi/design-system");
7
- const symbols = require("@strapi/icons/symbols");
8
6
  const formik = require("formik");
9
7
  const reactIntl = require("react-intl");
8
+ const strapiAdmin$1 = require("@strapi/content-manager/strapi-admin");
9
+ const symbols = require("@strapi/icons/symbols");
10
10
  const reactRouterDom = require("react-router-dom");
11
11
  const yup = require("yup");
12
12
  const styledComponents = require("styled-components");
@@ -373,7 +373,7 @@ const releaseApi = strapiAdmin.adminApi.enhanceEndpoints({
373
373
  data
374
374
  };
375
375
  },
376
- invalidatesTags: (result, error, arg) => [{ type: "ReleaseSettings" }]
376
+ invalidatesTags: [{ type: "ReleaseSettings" }]
377
377
  })
378
378
  };
379
379
  }
@@ -714,6 +714,233 @@ const ReleaseActionModalForm = ({
714
714
  }
715
715
  };
716
716
  };
717
+ const getContentPermissions = (subject) => {
718
+ const permissions = {
719
+ publish: [
720
+ {
721
+ action: "plugin::content-manager.explorer.publish",
722
+ subject,
723
+ id: "",
724
+ actionParameters: {},
725
+ properties: {},
726
+ conditions: []
727
+ }
728
+ ]
729
+ };
730
+ return permissions;
731
+ };
732
+ const ReleaseAction = ({ documents, model }) => {
733
+ const { formatMessage } = reactIntl.useIntl();
734
+ const { toggleNotification } = strapiAdmin.useNotification();
735
+ const { formatAPIError } = strapiAdmin.useAPIErrorHandler();
736
+ const [{ query }] = strapiAdmin.useQueryParams();
737
+ const contentPermissions = getContentPermissions(model);
738
+ const {
739
+ allowedActions: { canPublish }
740
+ } = strapiAdmin.useRBAC(contentPermissions);
741
+ const {
742
+ allowedActions: { canCreate }
743
+ } = strapiAdmin.useRBAC(PERMISSIONS);
744
+ const response = useGetReleasesQuery();
745
+ const releases = response.data?.data;
746
+ const [createManyReleaseActions, { isLoading }] = useCreateManyReleaseActionsMutation();
747
+ const documentIds = documents.map((doc) => doc.documentId);
748
+ const handleSubmit = async (values) => {
749
+ const locale = query.plugins?.i18n?.locale;
750
+ const releaseActionEntries = documentIds.map(
751
+ (entryDocumentId) => ({
752
+ type: values.type,
753
+ contentType: model,
754
+ entryDocumentId,
755
+ locale
756
+ })
757
+ );
758
+ const response2 = await createManyReleaseActions({
759
+ body: releaseActionEntries,
760
+ params: { releaseId: values.releaseId }
761
+ });
762
+ if ("data" in response2) {
763
+ const notificationMessage = formatMessage(
764
+ {
765
+ id: "content-releases.content-manager-list-view.add-to-release.notification.success.message",
766
+ defaultMessage: "{entriesAlreadyInRelease} out of {totalEntries} entries were already in the release."
767
+ },
768
+ {
769
+ entriesAlreadyInRelease: response2.data.meta.entriesAlreadyInRelease,
770
+ totalEntries: response2.data.meta.totalEntries
771
+ }
772
+ );
773
+ const notification = {
774
+ type: "success",
775
+ title: formatMessage(
776
+ {
777
+ id: "content-releases.content-manager-list-view.add-to-release.notification.success.title",
778
+ defaultMessage: "Successfully added to release."
779
+ },
780
+ {
781
+ entriesAlreadyInRelease: response2.data.meta.entriesAlreadyInRelease,
782
+ totalEntries: response2.data.meta.totalEntries
783
+ }
784
+ ),
785
+ message: response2.data.meta.entriesAlreadyInRelease ? notificationMessage : ""
786
+ };
787
+ toggleNotification(notification);
788
+ return true;
789
+ }
790
+ if ("error" in response2) {
791
+ if (strapiAdmin.isFetchError(response2.error)) {
792
+ toggleNotification({
793
+ type: "warning",
794
+ message: formatAPIError(response2.error)
795
+ });
796
+ } else {
797
+ toggleNotification({
798
+ type: "warning",
799
+ message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
800
+ });
801
+ }
802
+ }
803
+ };
804
+ if (!canCreate || !canPublish)
805
+ return null;
806
+ return {
807
+ actionType: "release",
808
+ variant: "tertiary",
809
+ label: formatMessage({
810
+ id: "content-manager-list-view.add-to-release",
811
+ defaultMessage: "Add to Release"
812
+ }),
813
+ dialog: {
814
+ type: "modal",
815
+ title: formatMessage({
816
+ id: "content-manager-list-view.add-to-release",
817
+ defaultMessage: "Add to Release"
818
+ }),
819
+ content: ({ onClose }) => {
820
+ return /* @__PURE__ */ jsxRuntime.jsx(
821
+ formik.Formik,
822
+ {
823
+ onSubmit: async (values) => {
824
+ const data = await handleSubmit(values);
825
+ if (data) {
826
+ return onClose();
827
+ }
828
+ },
829
+ validationSchema: RELEASE_ACTION_FORM_SCHEMA,
830
+ initialValues: INITIAL_VALUES,
831
+ children: ({ values, setFieldValue }) => /* @__PURE__ */ jsxRuntime.jsxs(formik.Form, { children: [
832
+ releases?.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(NoReleases, {}) : /* @__PURE__ */ jsxRuntime.jsx(designSystem.Modal.Body, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
833
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingBottom: 6, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { required: true, children: [
834
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: formatMessage({
835
+ id: "content-releases.content-manager-list-view.add-to-release.select-label",
836
+ defaultMessage: "Select a release"
837
+ }) }),
838
+ /* @__PURE__ */ jsxRuntime.jsx(
839
+ designSystem.SingleSelect,
840
+ {
841
+ placeholder: formatMessage({
842
+ id: "content-releases.content-manager-list-view.add-to-release.select-placeholder",
843
+ defaultMessage: "Select"
844
+ }),
845
+ onChange: (value) => setFieldValue("releaseId", value),
846
+ value: values.releaseId,
847
+ children: releases?.map((release) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: release.id, children: release.name }, release.id))
848
+ }
849
+ )
850
+ ] }) }),
851
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: formatMessage({
852
+ id: "content-releases.content-manager-list-view.add-to-release.action-type-label",
853
+ defaultMessage: "What do you want to do with these entries?"
854
+ }) }),
855
+ /* @__PURE__ */ jsxRuntime.jsx(
856
+ ReleaseActionOptions,
857
+ {
858
+ selected: values.type,
859
+ handleChange: (e) => setFieldValue("type", e.target.value),
860
+ name: "type"
861
+ }
862
+ )
863
+ ] }) }),
864
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Modal.Footer, { children: [
865
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { onClick: onClose, variant: "tertiary", name: "cancel", children: formatMessage({
866
+ id: "content-releases.content-manager-list-view.add-to-release.cancel-button",
867
+ defaultMessage: "Cancel"
868
+ }) }),
869
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { type: "submit", disabled: !values.releaseId, loading: isLoading, children: formatMessage({
870
+ id: "content-releases.content-manager-list-view.add-to-release.continue-button",
871
+ defaultMessage: "Continue"
872
+ }) })
873
+ ] })
874
+ ] })
875
+ }
876
+ );
877
+ }
878
+ }
879
+ };
880
+ };
881
+ const StyledButton = styledComponents.styled(designSystem.Button)`
882
+ span {
883
+ font-weight: 400;
884
+ }
885
+ `;
886
+ const useReleasesList = (contentTypeUid, documentId) => {
887
+ const listViewData = strapiAdmin.useTable("ListView", (state) => state.rows);
888
+ const documentIds = listViewData.map((entry) => entry.documentId);
889
+ const [{ query }] = strapiAdmin.useQueryParams();
890
+ const locale = query?.plugins?.i18n?.locale || void 0;
891
+ const response = useGetMappedEntriesInReleasesQuery(
892
+ { contentTypeUid, documentIds, locale },
893
+ { skip: !documentIds || !contentTypeUid || documentIds.length === 0 }
894
+ );
895
+ const mappedEntriesInReleases = response.data || {};
896
+ return mappedEntriesInReleases?.[documentId] || [];
897
+ };
898
+ const addColumnToTableHook = ({ displayedHeaders, layout }) => {
899
+ const { options } = layout;
900
+ if (!options?.draftAndPublish) {
901
+ return { displayedHeaders, layout };
902
+ }
903
+ return {
904
+ displayedHeaders: [
905
+ ...displayedHeaders,
906
+ {
907
+ searchable: false,
908
+ sortable: false,
909
+ name: "releases",
910
+ label: {
911
+ id: "content-releases.content-manager.list-view.releases.header",
912
+ defaultMessage: "To be released in"
913
+ },
914
+ cellFormatter: (props, _, { model }) => /* @__PURE__ */ jsxRuntime.jsx(ReleaseListCell, { ...props, model })
915
+ }
916
+ ],
917
+ layout
918
+ };
919
+ };
920
+ const ReleaseListCell = ({ documentId, model }) => {
921
+ const releases = useReleasesList(model, documentId);
922
+ const { formatMessage } = reactIntl.useIntl();
923
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Popover.Root, { children: [
924
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Popover.Trigger, { children: /* @__PURE__ */ jsxRuntime.jsx(
925
+ StyledButton,
926
+ {
927
+ variant: "ghost",
928
+ onClick: (e) => e.stopPropagation(),
929
+ endIcon: /* @__PURE__ */ jsxRuntime.jsx(icons.CaretDown, {}),
930
+ children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { style: { maxWidth: "252px", cursor: "pointer" }, textColor: "neutral800", children: releases.length > 0 ? formatMessage(
931
+ {
932
+ id: "content-releases.content-manager.list-view.releases-number",
933
+ defaultMessage: "{number} {number, plural, one {release} other {releases}}"
934
+ },
935
+ {
936
+ number: releases.length
937
+ }
938
+ ) : "-" })
939
+ }
940
+ ) }),
941
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Popover.Content, { children: /* @__PURE__ */ jsxRuntime.jsx("ul", { children: releases.map(({ id, name }) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { padding: 3, tag: "li", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Link, { href: `/admin/plugins/content-releases/${id}`, isExternal: false, children: name }) }, id)) }) })
942
+ ] });
943
+ };
717
944
  const getTimezoneOffset = (timezone, date) => {
718
945
  try {
719
946
  const offsetPart = new Intl.DateTimeFormat("en", {
@@ -880,7 +1107,7 @@ const Root = ({ children }) => {
880
1107
  return (
881
1108
  // A user can access the dropdown if they have permissions to delete a release-action OR update a release
882
1109
  allowedActions.canDeleteAction || allowedActions.canUpdate ? /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Root, { children: [
883
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.Trigger, { variant: "tertiary", endIcon: null, paddingLeft: "7px", paddingRight: "7px", children: /* @__PURE__ */ jsxRuntime.jsx(
1110
+ /* @__PURE__ */ jsxRuntime.jsx(StyledMoreButton, { variant: "tertiary", endIcon: null, paddingLeft: "7px", paddingRight: "7px", children: /* @__PURE__ */ jsxRuntime.jsx(
884
1111
  designSystem.AccessibleIcon,
885
1112
  {
886
1113
  label: formatMessage({
@@ -894,6 +1121,11 @@ const Root = ({ children }) => {
894
1121
  ] }) : null
895
1122
  );
896
1123
  };
1124
+ const StyledMoreButton = styledComponents.styled(designSystem.Menu.Trigger)`
1125
+ & > span {
1126
+ display: flex;
1127
+ }
1128
+ `;
897
1129
  const ReleaseActionMenu = {
898
1130
  Root,
899
1131
  EditReleaseItem,
@@ -1033,7 +1265,7 @@ const admin = {
1033
1265
  id: `${pluginId}.plugin.name`,
1034
1266
  defaultMessage: "Releases"
1035
1267
  },
1036
- Component: () => Promise.resolve().then(() => require("./App-BjBiAE8g.js")).then((mod) => ({ default: mod.App })),
1268
+ Component: () => Promise.resolve().then(() => require("./App-fAgiijnc.js")).then((mod) => ({ default: mod.App })),
1037
1269
  permissions: PERMISSIONS.main,
1038
1270
  position: 2
1039
1271
  });
@@ -1057,10 +1289,18 @@ const admin = {
1057
1289
  },
1058
1290
  permissions: [],
1059
1291
  async Component() {
1060
- const { ProtectedReleasesSettingsPage } = await Promise.resolve().then(() => require("./ReleasesSettingsPage-D7kMSSvV.js"));
1292
+ const { ProtectedReleasesSettingsPage } = await Promise.resolve().then(() => require("./ReleasesSettingsPage-YVZJH-oN.js"));
1061
1293
  return { default: ProtectedReleasesSettingsPage };
1062
1294
  }
1063
1295
  });
1296
+ if ("addBulkAction" in contentManagerPluginApis && typeof contentManagerPluginApis.addBulkAction === "function") {
1297
+ contentManagerPluginApis.addBulkAction((actions) => {
1298
+ const deleteActionIndex = actions.findIndex((action) => action.type === "delete");
1299
+ actions.splice(deleteActionIndex, 0, ReleaseAction);
1300
+ return actions;
1301
+ });
1302
+ }
1303
+ app.registerHook("Admin/CM/pages/ListView/inject-column-in-table", addColumnToTableHook);
1064
1304
  } else if (!window.strapi.features.isEnabled("cms-content-releases") && window.strapi?.flags?.promoteEE) {
1065
1305
  app.addSettingsLink("global", {
1066
1306
  id: pluginId,
@@ -1081,7 +1321,7 @@ const admin = {
1081
1321
  async registerTrads({ locales }) {
1082
1322
  const importedTrads = await Promise.all(
1083
1323
  locales.map((locale) => {
1084
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => Promise.resolve().then(() => require("./en-BCDLTJn3.js")) }), `./translations/${locale}.json`).then(({ default: data }) => {
1324
+ return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => Promise.resolve().then(() => require("./en-CmYoEnA7.js")) }), `./translations/${locale}.json`).then(({ default: data }) => {
1085
1325
  return {
1086
1326
  data: prefixPluginTranslations(data, "content-releases"),
1087
1327
  locale
@@ -1115,4 +1355,4 @@ exports.usePublishReleaseMutation = usePublishReleaseMutation;
1115
1355
  exports.useUpdateReleaseActionMutation = useUpdateReleaseActionMutation;
1116
1356
  exports.useUpdateReleaseMutation = useUpdateReleaseMutation;
1117
1357
  exports.useUpdateReleaseSettingsMutation = useUpdateReleaseSettingsMutation;
1118
- //# sourceMappingURL=index-1MxwkUQx.js.map
1358
+ //# sourceMappingURL=index--_NWfuDG.js.map