@strapi/content-releases 5.51.0 → 5.51.2
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/pages/ReleasesSettingsPage.js +1 -1
- package/dist/admin/pages/ReleasesSettingsPage.js.map +1 -1
- package/dist/admin/pages/ReleasesSettingsPage.mjs +1 -1
- package/dist/admin/pages/ReleasesSettingsPage.mjs.map +1 -1
- package/dist/admin/utils/time.js +1 -1
- package/dist/admin/utils/time.js.map +1 -1
- package/dist/admin/utils/time.mjs +1 -1
- package/dist/admin/utils/time.mjs.map +1 -1
- package/dist/server/services/settings.js +1 -1
- package/dist/server/services/settings.js.map +1 -1
- package/dist/server/services/settings.mjs +1 -1
- package/dist/server/services/settings.mjs.map +1 -1
- package/dist/server/src/utils/index.d.ts.map +1 -1
- package/dist/server/utils/index.js +11 -1
- package/dist/server/utils/index.js.map +1 -1
- package/dist/server/utils/index.mjs +11 -1
- package/dist/server/utils/index.mjs.map +1 -1
- package/dist/shared/contracts/release-actions.d.ts +2 -1
- package/dist/shared/contracts/release-actions.d.ts.map +1 -1
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReleasesSettingsPage.js","sources":["../../../admin/src/pages/ReleasesSettingsPage.tsx"],"sourcesContent":["import {\n Form,\n Layouts,\n Page,\n useAPIErrorHandler,\n isFetchError,\n GradientBadge,\n useNotification,\n useField,\n useRBAC,\n FormHelpers,\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\ninterface UpdateDefaultTimezone {\n defaultTimezone: string;\n}\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 (\n body: UpdateSettings.Request['body'],\n { setErrors }: FormHelpers<UpdateDefaultTimezone>\n ) => {\n const { defaultTimezone } = body;\n const formattedDefaultTimezone = defaultTimezone;\n const isBodyTimezoneValid = timezoneList.some(\n (timezone) => timezone.value === formattedDefaultTimezone\n );\n\n if (!isBodyTimezoneValid && defaultTimezone) {\n const errorMessage = formatMessage({\n id: 'components.Input.error.validation.combobox.invalid',\n defaultMessage: 'The value provided is not valid',\n });\n setErrors({\n defaultTimezone: errorMessage,\n });\n toggleNotification({\n type: 'danger',\n message: errorMessage,\n });\n return;\n }\n\n const newBody =\n !defaultTimezone || !isBodyTimezoneValid\n ? { defaultTimezone: null }\n : { defaultTimezone: formattedDefaultTimezone };\n\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({\n id: 'notification.error',\n defaultMessage: 'An error occurred',\n }),\n });\n }\n } catch (error) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'notification.error',\n defaultMessage: 'An error occurred',\n }),\n });\n }\n };\n\n if (isLoadingSettings) {\n return <Page.Loading />;\n }\n\n const releasePageTitle = formatMessage({\n id: 'content-releases.pages.Releases.title',\n defaultMessage: 'Releases',\n });\n\n return (\n <>\n <Page.Title>\n {formatMessage(\n { id: 'Settings.PageTitle', defaultMessage: 'Settings - {name}' },\n {\n name: releasePageTitle,\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 fullWidth\n >\n {formatMessage({\n id: 'global.save',\n defaultMessage: 'Save',\n })}\n </Button>\n ) : null\n }\n secondaryAction={\n <GradientBadge\n label={formatMessage({\n id: 'components.premiumFeature.title',\n defaultMessage: 'Premium feature',\n })}\n />\n }\n title={releasePageTitle}\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} xs={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 </>\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<UpdateDefaultTimezone['defaultTimezone']>('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 onTextValueChange={(value) => field.onChange('defaultTimezone', value)}\n onChange={(value) => {\n if ((field.value && value) || !field.value) {\n field.onChange('defaultTimezone', value);\n }\n }}\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":["ReleasesSettingsPage","formatMessage","useIntl","formatAPIError","useAPIErrorHandler","toggleNotification","useNotification","data","isLoading","isLoadingSettings","useGetReleaseSettingsQuery","updateReleaseSettings","isSubmittingForm","useUpdateReleaseSettingsMutation","permissions","useTypedSelector","state","admin_app","allowedActions","canUpdate","useRBAC","timezoneList","getTimezones","Date","handleSubmit","body","setErrors","defaultTimezone","formattedDefaultTimezone","isBodyTimezoneValid","some","timezone","value","errorMessage","id","defaultMessage","type","message","newBody","response","isFetchError","error","_jsx","Page","Loading","releasePageTitle","_jsxs","_Fragment","Title","name","Main","aria-busy","tabIndex","Form","method","initialValues","onSubmit","validationSchema","SETTINGS_SCHEMA","modified","isSubmitting","Layouts","Header","primaryAction","Button","disabled","loading","startIcon","Check","fullWidth","secondaryAction","GradientBadge","label","title","subtitle","Content","Flex","direction","background","alignItems","padding","gap","shadow","hasRadius","Typography","variant","tag","Grid","Root","Item","col","xs","TimezoneDropdown","field","useField","Field","hint","Label","Combobox","autocomplete","filter","onTextValueChange","onChange","onClear","map","ComboboxOption","replace","Hint","Error","ProtectedReleasesSettingsPage","read","Protect"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ReleasesSettingsPage.js","sources":["../../../admin/src/pages/ReleasesSettingsPage.tsx"],"sourcesContent":["import {\n Form,\n Layouts,\n Page,\n useAPIErrorHandler,\n isFetchError,\n GradientBadge,\n useNotification,\n useField,\n useRBAC,\n FormHelpers,\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\ninterface UpdateDefaultTimezone {\n defaultTimezone: string;\n}\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 (\n body: UpdateSettings.Request['body'],\n { setErrors }: FormHelpers<UpdateDefaultTimezone>\n ) => {\n const { defaultTimezone } = body;\n const formattedDefaultTimezone = defaultTimezone;\n const isBodyTimezoneValid = timezoneList.some(\n (timezone) => timezone.value === formattedDefaultTimezone\n );\n\n if (!isBodyTimezoneValid && defaultTimezone) {\n const errorMessage = formatMessage({\n id: 'components.Input.error.validation.combobox.invalid',\n defaultMessage: 'The value provided is not valid',\n });\n setErrors({\n defaultTimezone: errorMessage,\n });\n toggleNotification({\n type: 'danger',\n message: errorMessage,\n });\n return;\n }\n\n const newBody =\n !defaultTimezone || !isBodyTimezoneValid\n ? { defaultTimezone: null }\n : { defaultTimezone: formattedDefaultTimezone };\n\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({\n id: 'notification.error',\n defaultMessage: 'An error occurred',\n }),\n });\n }\n } catch {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'notification.error',\n defaultMessage: 'An error occurred',\n }),\n });\n }\n };\n\n if (isLoadingSettings) {\n return <Page.Loading />;\n }\n\n const releasePageTitle = formatMessage({\n id: 'content-releases.pages.Releases.title',\n defaultMessage: 'Releases',\n });\n\n return (\n <>\n <Page.Title>\n {formatMessage(\n { id: 'Settings.PageTitle', defaultMessage: 'Settings - {name}' },\n {\n name: releasePageTitle,\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 fullWidth\n >\n {formatMessage({\n id: 'global.save',\n defaultMessage: 'Save',\n })}\n </Button>\n ) : null\n }\n secondaryAction={\n <GradientBadge\n label={formatMessage({\n id: 'components.premiumFeature.title',\n defaultMessage: 'Premium feature',\n })}\n />\n }\n title={releasePageTitle}\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} xs={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 </>\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<UpdateDefaultTimezone['defaultTimezone']>('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 onTextValueChange={(value) => field.onChange('defaultTimezone', value)}\n onChange={(value) => {\n if ((field.value && value) || !field.value) {\n field.onChange('defaultTimezone', value);\n }\n }}\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":["ReleasesSettingsPage","formatMessage","useIntl","formatAPIError","useAPIErrorHandler","toggleNotification","useNotification","data","isLoading","isLoadingSettings","useGetReleaseSettingsQuery","updateReleaseSettings","isSubmittingForm","useUpdateReleaseSettingsMutation","permissions","useTypedSelector","state","admin_app","allowedActions","canUpdate","useRBAC","timezoneList","getTimezones","Date","handleSubmit","body","setErrors","defaultTimezone","formattedDefaultTimezone","isBodyTimezoneValid","some","timezone","value","errorMessage","id","defaultMessage","type","message","newBody","response","isFetchError","error","_jsx","Page","Loading","releasePageTitle","_jsxs","_Fragment","Title","name","Main","aria-busy","tabIndex","Form","method","initialValues","onSubmit","validationSchema","SETTINGS_SCHEMA","modified","isSubmitting","Layouts","Header","primaryAction","Button","disabled","loading","startIcon","Check","fullWidth","secondaryAction","GradientBadge","label","title","subtitle","Content","Flex","direction","background","alignItems","padding","gap","shadow","hasRadius","Typography","variant","tag","Grid","Root","Item","col","xs","TimezoneDropdown","field","useField","Field","hint","Label","Combobox","autocomplete","filter","onTextValueChange","onChange","onClear","map","ComboboxOption","replace","Hint","Error","ProtectedReleasesSettingsPage","read","Protect"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReleasesSettingsPage.mjs","sources":["../../../admin/src/pages/ReleasesSettingsPage.tsx"],"sourcesContent":["import {\n Form,\n Layouts,\n Page,\n useAPIErrorHandler,\n isFetchError,\n GradientBadge,\n useNotification,\n useField,\n useRBAC,\n FormHelpers,\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\ninterface UpdateDefaultTimezone {\n defaultTimezone: string;\n}\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 (\n body: UpdateSettings.Request['body'],\n { setErrors }: FormHelpers<UpdateDefaultTimezone>\n ) => {\n const { defaultTimezone } = body;\n const formattedDefaultTimezone = defaultTimezone;\n const isBodyTimezoneValid = timezoneList.some(\n (timezone) => timezone.value === formattedDefaultTimezone\n );\n\n if (!isBodyTimezoneValid && defaultTimezone) {\n const errorMessage = formatMessage({\n id: 'components.Input.error.validation.combobox.invalid',\n defaultMessage: 'The value provided is not valid',\n });\n setErrors({\n defaultTimezone: errorMessage,\n });\n toggleNotification({\n type: 'danger',\n message: errorMessage,\n });\n return;\n }\n\n const newBody =\n !defaultTimezone || !isBodyTimezoneValid\n ? { defaultTimezone: null }\n : { defaultTimezone: formattedDefaultTimezone };\n\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({\n id: 'notification.error',\n defaultMessage: 'An error occurred',\n }),\n });\n }\n } catch (error) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'notification.error',\n defaultMessage: 'An error occurred',\n }),\n });\n }\n };\n\n if (isLoadingSettings) {\n return <Page.Loading />;\n }\n\n const releasePageTitle = formatMessage({\n id: 'content-releases.pages.Releases.title',\n defaultMessage: 'Releases',\n });\n\n return (\n <>\n <Page.Title>\n {formatMessage(\n { id: 'Settings.PageTitle', defaultMessage: 'Settings - {name}' },\n {\n name: releasePageTitle,\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 fullWidth\n >\n {formatMessage({\n id: 'global.save',\n defaultMessage: 'Save',\n })}\n </Button>\n ) : null\n }\n secondaryAction={\n <GradientBadge\n label={formatMessage({\n id: 'components.premiumFeature.title',\n defaultMessage: 'Premium feature',\n })}\n />\n }\n title={releasePageTitle}\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} xs={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 </>\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<UpdateDefaultTimezone['defaultTimezone']>('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 onTextValueChange={(value) => field.onChange('defaultTimezone', value)}\n onChange={(value) => {\n if ((field.value && value) || !field.value) {\n field.onChange('defaultTimezone', value);\n }\n }}\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":["ReleasesSettingsPage","formatMessage","useIntl","formatAPIError","useAPIErrorHandler","toggleNotification","useNotification","data","isLoading","isLoadingSettings","useGetReleaseSettingsQuery","updateReleaseSettings","isSubmittingForm","useUpdateReleaseSettingsMutation","permissions","useTypedSelector","state","admin_app","allowedActions","canUpdate","useRBAC","timezoneList","getTimezones","Date","handleSubmit","body","setErrors","defaultTimezone","formattedDefaultTimezone","isBodyTimezoneValid","some","timezone","value","errorMessage","id","defaultMessage","type","message","newBody","response","isFetchError","error","_jsx","Page","Loading","releasePageTitle","_jsxs","_Fragment","Title","name","Main","aria-busy","tabIndex","Form","method","initialValues","onSubmit","validationSchema","SETTINGS_SCHEMA","modified","isSubmitting","Layouts","Header","primaryAction","Button","disabled","loading","startIcon","Check","fullWidth","secondaryAction","GradientBadge","label","title","subtitle","Content","Flex","direction","background","alignItems","padding","gap","shadow","hasRadius","Typography","variant","tag","Grid","Root","Item","col","xs","TimezoneDropdown","field","useField","Field","hint","Label","Combobox","autocomplete","filter","onTextValueChange","onChange","onClear","map","ComboboxOption","replace","Hint","Error","ProtectedReleasesSettingsPage","read","Protect"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ReleasesSettingsPage.mjs","sources":["../../../admin/src/pages/ReleasesSettingsPage.tsx"],"sourcesContent":["import {\n Form,\n Layouts,\n Page,\n useAPIErrorHandler,\n isFetchError,\n GradientBadge,\n useNotification,\n useField,\n useRBAC,\n FormHelpers,\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\ninterface UpdateDefaultTimezone {\n defaultTimezone: string;\n}\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 (\n body: UpdateSettings.Request['body'],\n { setErrors }: FormHelpers<UpdateDefaultTimezone>\n ) => {\n const { defaultTimezone } = body;\n const formattedDefaultTimezone = defaultTimezone;\n const isBodyTimezoneValid = timezoneList.some(\n (timezone) => timezone.value === formattedDefaultTimezone\n );\n\n if (!isBodyTimezoneValid && defaultTimezone) {\n const errorMessage = formatMessage({\n id: 'components.Input.error.validation.combobox.invalid',\n defaultMessage: 'The value provided is not valid',\n });\n setErrors({\n defaultTimezone: errorMessage,\n });\n toggleNotification({\n type: 'danger',\n message: errorMessage,\n });\n return;\n }\n\n const newBody =\n !defaultTimezone || !isBodyTimezoneValid\n ? { defaultTimezone: null }\n : { defaultTimezone: formattedDefaultTimezone };\n\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({\n id: 'notification.error',\n defaultMessage: 'An error occurred',\n }),\n });\n }\n } catch {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'notification.error',\n defaultMessage: 'An error occurred',\n }),\n });\n }\n };\n\n if (isLoadingSettings) {\n return <Page.Loading />;\n }\n\n const releasePageTitle = formatMessage({\n id: 'content-releases.pages.Releases.title',\n defaultMessage: 'Releases',\n });\n\n return (\n <>\n <Page.Title>\n {formatMessage(\n { id: 'Settings.PageTitle', defaultMessage: 'Settings - {name}' },\n {\n name: releasePageTitle,\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 fullWidth\n >\n {formatMessage({\n id: 'global.save',\n defaultMessage: 'Save',\n })}\n </Button>\n ) : null\n }\n secondaryAction={\n <GradientBadge\n label={formatMessage({\n id: 'components.premiumFeature.title',\n defaultMessage: 'Premium feature',\n })}\n />\n }\n title={releasePageTitle}\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} xs={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 </>\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<UpdateDefaultTimezone['defaultTimezone']>('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 onTextValueChange={(value) => field.onChange('defaultTimezone', value)}\n onChange={(value) => {\n if ((field.value && value) || !field.value) {\n field.onChange('defaultTimezone', value);\n }\n }}\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":["ReleasesSettingsPage","formatMessage","useIntl","formatAPIError","useAPIErrorHandler","toggleNotification","useNotification","data","isLoading","isLoadingSettings","useGetReleaseSettingsQuery","updateReleaseSettings","isSubmittingForm","useUpdateReleaseSettingsMutation","permissions","useTypedSelector","state","admin_app","allowedActions","canUpdate","useRBAC","timezoneList","getTimezones","Date","handleSubmit","body","setErrors","defaultTimezone","formattedDefaultTimezone","isBodyTimezoneValid","some","timezone","value","errorMessage","id","defaultMessage","type","message","newBody","response","isFetchError","error","_jsx","Page","Loading","releasePageTitle","_jsxs","_Fragment","Title","name","Main","aria-busy","tabIndex","Form","method","initialValues","onSubmit","validationSchema","SETTINGS_SCHEMA","modified","isSubmitting","Layouts","Header","primaryAction","Button","disabled","loading","startIcon","Check","fullWidth","secondaryAction","GradientBadge","label","title","subtitle","Content","Flex","direction","background","alignItems","padding","gap","shadow","hasRadius","Typography","variant","tag","Grid","Root","Item","col","xs","TimezoneDropdown","field","useField","Field","hint","Label","Combobox","autocomplete","filter","onTextValueChange","onChange","onClear","map","ComboboxOption","replace","Hint","Error","ProtectedReleasesSettingsPage","read","Protect"],"mappings":"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"}
|
package/dist/admin/utils/time.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time.js","sources":["../../../admin/src/utils/time.ts"],"sourcesContent":["export const getTimezoneOffset = (timezone: string, date: Date) => {\n try {\n const offsetPart = new Intl.DateTimeFormat('en', {\n timeZone: timezone,\n timeZoneName: 'longOffset',\n })\n .formatToParts(date)\n .find((part) => part.type === 'timeZoneName');\n\n const offset = offsetPart ? offsetPart.value : '';\n\n // We want to show time based on UTC, not GMT so we swap that.\n let utcOffset = offset.replace('GMT', 'UTC');\n\n // For perfect UTC (UTC+0:00) we only get the string UTC, So we need to append the 0's.\n if (!utcOffset.includes('+') && !utcOffset.includes('-')) {\n utcOffset = `${utcOffset}+00:00`;\n }\n\n return utcOffset;\n } catch
|
|
1
|
+
{"version":3,"file":"time.js","sources":["../../../admin/src/utils/time.ts"],"sourcesContent":["export const getTimezoneOffset = (timezone: string, date: Date) => {\n try {\n const offsetPart = new Intl.DateTimeFormat('en', {\n timeZone: timezone,\n timeZoneName: 'longOffset',\n })\n .formatToParts(date)\n .find((part) => part.type === 'timeZoneName');\n\n const offset = offsetPart ? offsetPart.value : '';\n\n // We want to show time based on UTC, not GMT so we swap that.\n let utcOffset = offset.replace('GMT', 'UTC');\n\n // For perfect UTC (UTC+0:00) we only get the string UTC, So we need to append the 0's.\n if (!utcOffset.includes('+') && !utcOffset.includes('-')) {\n utcOffset = `${utcOffset}+00:00`;\n }\n\n return utcOffset;\n } catch {\n // When timezone is invalid we catch the error and return empty to don't break the app\n return '';\n }\n};\n\ninterface ITimezoneOption {\n offset: string;\n value: string;\n}\n\nexport const getTimezones = (selectedDate: Date) => {\n const timezoneList: ITimezoneOption[] = Intl.supportedValuesOf('timeZone').map((timezone) => {\n // Timezone will be in the format GMT${OFFSET} where offset could be nothing,\n // a four digit string e.g. +05:00 or -08:00\n const utcOffset = getTimezoneOffset(timezone, selectedDate);\n\n // Offset and timezone are concatenated with '&', so to split and save the required timezone in DB\n return { offset: utcOffset, value: `${utcOffset}&${timezone}` } satisfies ITimezoneOption;\n });\n\n const systemTimezone = timezoneList.find(\n (timezone) => timezone.value.split('&')[1] === Intl.DateTimeFormat().resolvedOptions().timeZone\n );\n\n return { timezoneList, systemTimezone };\n};\n"],"names":["getTimezoneOffset","timezone","date","offsetPart","Intl","DateTimeFormat","timeZone","timeZoneName","formatToParts","find","part","type","offset","value","utcOffset","replace","includes","getTimezones","selectedDate","timezoneList","supportedValuesOf","map","systemTimezone","split","resolvedOptions"],"mappings":";;AAAO,MAAMA,iBAAAA,GAAoB,CAACC,QAAAA,EAAkBC,IAAAA,GAAAA;IAClD,IAAI;AACF,QAAA,MAAMC,UAAAA,GAAa,IAAIC,IAAAA,CAAKC,cAAc,CAAC,IAAA,EAAM;YAC/CC,QAAAA,EAAUL,QAAAA;YACVM,YAAAA,EAAc;SAChB,CAAA,CACGC,aAAa,CAACN,IAAAA,CAAAA,CACdO,IAAI,CAAC,CAACC,IAAAA,GAASA,IAAAA,CAAKC,IAAI,KAAK,cAAA,CAAA;AAEhC,QAAA,MAAMC,MAAAA,GAAST,UAAAA,GAAaA,UAAAA,CAAWU,KAAK,GAAG,EAAA;;AAG/C,QAAA,IAAIC,SAAAA,GAAYF,MAAAA,CAAOG,OAAO,CAAC,KAAA,EAAO,KAAA,CAAA;;QAGtC,IAAI,CAACD,UAAUE,QAAQ,CAAC,QAAQ,CAACF,SAAAA,CAAUE,QAAQ,CAAC,GAAA,CAAA,EAAM;YACxDF,SAAAA,GAAY,CAAA,EAAGA,SAAAA,CAAU,MAAM,CAAC;AAClC,QAAA;QAEA,OAAOA,SAAAA;AACT,IAAA,CAAA,CAAE,OAAM;;QAEN,OAAO,EAAA;AACT,IAAA;AACF;AAOO,MAAMG,eAAe,CAACC,YAAAA,GAAAA;AAC3B,IAAA,MAAMC,eAAkCf,IAAAA,CAAKgB,iBAAiB,CAAC,UAAA,CAAA,CAAYC,GAAG,CAAC,CAACpB,QAAAA,GAAAA;;;QAG9E,MAAMa,SAAAA,GAAYd,kBAAkBC,QAAAA,EAAUiB,YAAAA,CAAAA;;QAG9C,OAAO;YAAEN,MAAAA,EAAQE,SAAAA;AAAWD,YAAAA,KAAAA,EAAO,CAAA,EAAGC,SAAAA,CAAU,CAAC,EAAEb,QAAAA,CAAAA;AAAW,SAAA;AAChE,IAAA,CAAA,CAAA;IAEA,MAAMqB,cAAAA,GAAiBH,aAAaV,IAAI,CACtC,CAACR,QAAAA,GAAaA,QAAAA,CAASY,KAAK,CAACU,KAAK,CAAC,GAAA,CAAI,CAAC,EAAE,KAAKnB,IAAAA,CAAKC,cAAc,EAAA,CAAGmB,eAAe,GAAGlB,QAAQ,CAAA;IAGjG,OAAO;AAAEa,QAAAA,YAAAA;AAAcG,QAAAA;AAAe,KAAA;AACxC;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time.mjs","sources":["../../../admin/src/utils/time.ts"],"sourcesContent":["export const getTimezoneOffset = (timezone: string, date: Date) => {\n try {\n const offsetPart = new Intl.DateTimeFormat('en', {\n timeZone: timezone,\n timeZoneName: 'longOffset',\n })\n .formatToParts(date)\n .find((part) => part.type === 'timeZoneName');\n\n const offset = offsetPart ? offsetPart.value : '';\n\n // We want to show time based on UTC, not GMT so we swap that.\n let utcOffset = offset.replace('GMT', 'UTC');\n\n // For perfect UTC (UTC+0:00) we only get the string UTC, So we need to append the 0's.\n if (!utcOffset.includes('+') && !utcOffset.includes('-')) {\n utcOffset = `${utcOffset}+00:00`;\n }\n\n return utcOffset;\n } catch
|
|
1
|
+
{"version":3,"file":"time.mjs","sources":["../../../admin/src/utils/time.ts"],"sourcesContent":["export const getTimezoneOffset = (timezone: string, date: Date) => {\n try {\n const offsetPart = new Intl.DateTimeFormat('en', {\n timeZone: timezone,\n timeZoneName: 'longOffset',\n })\n .formatToParts(date)\n .find((part) => part.type === 'timeZoneName');\n\n const offset = offsetPart ? offsetPart.value : '';\n\n // We want to show time based on UTC, not GMT so we swap that.\n let utcOffset = offset.replace('GMT', 'UTC');\n\n // For perfect UTC (UTC+0:00) we only get the string UTC, So we need to append the 0's.\n if (!utcOffset.includes('+') && !utcOffset.includes('-')) {\n utcOffset = `${utcOffset}+00:00`;\n }\n\n return utcOffset;\n } catch {\n // When timezone is invalid we catch the error and return empty to don't break the app\n return '';\n }\n};\n\ninterface ITimezoneOption {\n offset: string;\n value: string;\n}\n\nexport const getTimezones = (selectedDate: Date) => {\n const timezoneList: ITimezoneOption[] = Intl.supportedValuesOf('timeZone').map((timezone) => {\n // Timezone will be in the format GMT${OFFSET} where offset could be nothing,\n // a four digit string e.g. +05:00 or -08:00\n const utcOffset = getTimezoneOffset(timezone, selectedDate);\n\n // Offset and timezone are concatenated with '&', so to split and save the required timezone in DB\n return { offset: utcOffset, value: `${utcOffset}&${timezone}` } satisfies ITimezoneOption;\n });\n\n const systemTimezone = timezoneList.find(\n (timezone) => timezone.value.split('&')[1] === Intl.DateTimeFormat().resolvedOptions().timeZone\n );\n\n return { timezoneList, systemTimezone };\n};\n"],"names":["getTimezoneOffset","timezone","date","offsetPart","Intl","DateTimeFormat","timeZone","timeZoneName","formatToParts","find","part","type","offset","value","utcOffset","replace","includes","getTimezones","selectedDate","timezoneList","supportedValuesOf","map","systemTimezone","split","resolvedOptions"],"mappings":"AAAO,MAAMA,iBAAAA,GAAoB,CAACC,QAAAA,EAAkBC,IAAAA,GAAAA;IAClD,IAAI;AACF,QAAA,MAAMC,UAAAA,GAAa,IAAIC,IAAAA,CAAKC,cAAc,CAAC,IAAA,EAAM;YAC/CC,QAAAA,EAAUL,QAAAA;YACVM,YAAAA,EAAc;SAChB,CAAA,CACGC,aAAa,CAACN,IAAAA,CAAAA,CACdO,IAAI,CAAC,CAACC,IAAAA,GAASA,IAAAA,CAAKC,IAAI,KAAK,cAAA,CAAA;AAEhC,QAAA,MAAMC,MAAAA,GAAST,UAAAA,GAAaA,UAAAA,CAAWU,KAAK,GAAG,EAAA;;AAG/C,QAAA,IAAIC,SAAAA,GAAYF,MAAAA,CAAOG,OAAO,CAAC,KAAA,EAAO,KAAA,CAAA;;QAGtC,IAAI,CAACD,UAAUE,QAAQ,CAAC,QAAQ,CAACF,SAAAA,CAAUE,QAAQ,CAAC,GAAA,CAAA,EAAM;YACxDF,SAAAA,GAAY,CAAA,EAAGA,SAAAA,CAAU,MAAM,CAAC;AAClC,QAAA;QAEA,OAAOA,SAAAA;AACT,IAAA,CAAA,CAAE,OAAM;;QAEN,OAAO,EAAA;AACT,IAAA;AACF;AAOO,MAAMG,eAAe,CAACC,YAAAA,GAAAA;AAC3B,IAAA,MAAMC,eAAkCf,IAAAA,CAAKgB,iBAAiB,CAAC,UAAA,CAAA,CAAYC,GAAG,CAAC,CAACpB,QAAAA,GAAAA;;;QAG9E,MAAMa,SAAAA,GAAYd,kBAAkBC,QAAAA,EAAUiB,YAAAA,CAAAA;;QAG9C,OAAO;YAAEN,MAAAA,EAAQE,SAAAA;AAAWD,YAAAA,KAAAA,EAAO,CAAA,EAAGC,SAAAA,CAAU,CAAC,EAAEb,QAAAA,CAAAA;AAAW,SAAA;AAChE,IAAA,CAAA,CAAA;IAEA,MAAMqB,cAAAA,GAAiBH,aAAaV,IAAI,CACtC,CAACR,QAAAA,GAAaA,QAAAA,CAASY,KAAK,CAACU,KAAK,CAAC,GAAA,CAAI,CAAC,EAAE,KAAKnB,IAAAA,CAAKC,cAAc,EAAA,CAAGmB,eAAe,GAAGlB,QAAQ,CAAA;IAGjG,OAAO;AAAEa,QAAAA,YAAAA;AAAcG,QAAAA;AAAe,KAAA;AACxC;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sources":["../../../server/src/services/settings.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nimport type { Settings } from '../../../shared/contracts/settings';\n\nconst DEFAULT_SETTINGS = {\n defaultTimezone: null,\n} satisfies Settings;\n\nconst createSettingsService = ({ strapi }: { strapi: Core.Strapi }) => {\n const getStore = async () => strapi.store({ type: 'core', name: 'content-releases' });\n\n return {\n async update({ settings }: { settings: Settings }): Promise<Settings> {\n const store = await getStore();\n store.set({ key: 'settings', value: settings });\n return settings;\n },\n async find(): Promise<Settings> {\n const store = await getStore();\n const settings = (await store.get({ key: 'settings' })) as Settings | undefined;\n\n return {\n ...DEFAULT_SETTINGS,\n ...
|
|
1
|
+
{"version":3,"file":"settings.js","sources":["../../../server/src/services/settings.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nimport type { Settings } from '../../../shared/contracts/settings';\n\nconst DEFAULT_SETTINGS = {\n defaultTimezone: null,\n} satisfies Settings;\n\nconst createSettingsService = ({ strapi }: { strapi: Core.Strapi }) => {\n const getStore = async () => strapi.store({ type: 'core', name: 'content-releases' });\n\n return {\n async update({ settings }: { settings: Settings }): Promise<Settings> {\n const store = await getStore();\n store.set({ key: 'settings', value: settings });\n return settings;\n },\n async find(): Promise<Settings> {\n const store = await getStore();\n const settings = (await store.get({ key: 'settings' })) as Settings | undefined;\n\n return {\n ...DEFAULT_SETTINGS,\n ...settings,\n };\n },\n };\n};\n\nexport type SettingsService = ReturnType<typeof createSettingsService>;\n\nexport default createSettingsService;\n"],"names":["DEFAULT_SETTINGS","defaultTimezone","createSettingsService","strapi","getStore","store","type","name","update","settings","set","key","value","find","get"],"mappings":";;AAIA,MAAMA,gBAAAA,GAAmB;IACvBC,eAAAA,EAAiB;AACnB,CAAA;AAEA,MAAMC,qBAAAA,GAAwB,CAAC,EAAEC,MAAM,EAA2B,GAAA;AAChE,IAAA,MAAMC,QAAAA,GAAW,UAAYD,MAAAA,CAAOE,KAAK,CAAC;YAAEC,IAAAA,EAAM,MAAA;YAAQC,IAAAA,EAAM;AAAmB,SAAA,CAAA;IAEnF,OAAO;QACL,MAAMC,MAAAA,CAAAA,CAAO,EAAEC,QAAQ,EAA0B,EAAA;AAC/C,YAAA,MAAMJ,QAAQ,MAAMD,QAAAA,EAAAA;AACpBC,YAAAA,KAAAA,CAAMK,GAAG,CAAC;gBAAEC,GAAAA,EAAK,UAAA;gBAAYC,KAAAA,EAAOH;AAAS,aAAA,CAAA;YAC7C,OAAOA,QAAAA;AACT,QAAA,CAAA;QACA,MAAMI,IAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMR,QAAQ,MAAMD,QAAAA,EAAAA;AACpB,YAAA,MAAMK,QAAAA,GAAY,MAAMJ,KAAAA,CAAMS,GAAG,CAAC;gBAAEH,GAAAA,EAAK;AAAW,aAAA,CAAA;YAEpD,OAAO;AACL,gBAAA,GAAGX,gBAAgB;AACnB,gBAAA,GAAGS;AACL,aAAA;AACF,QAAA;AACF,KAAA;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.mjs","sources":["../../../server/src/services/settings.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nimport type { Settings } from '../../../shared/contracts/settings';\n\nconst DEFAULT_SETTINGS = {\n defaultTimezone: null,\n} satisfies Settings;\n\nconst createSettingsService = ({ strapi }: { strapi: Core.Strapi }) => {\n const getStore = async () => strapi.store({ type: 'core', name: 'content-releases' });\n\n return {\n async update({ settings }: { settings: Settings }): Promise<Settings> {\n const store = await getStore();\n store.set({ key: 'settings', value: settings });\n return settings;\n },\n async find(): Promise<Settings> {\n const store = await getStore();\n const settings = (await store.get({ key: 'settings' })) as Settings | undefined;\n\n return {\n ...DEFAULT_SETTINGS,\n ...
|
|
1
|
+
{"version":3,"file":"settings.mjs","sources":["../../../server/src/services/settings.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nimport type { Settings } from '../../../shared/contracts/settings';\n\nconst DEFAULT_SETTINGS = {\n defaultTimezone: null,\n} satisfies Settings;\n\nconst createSettingsService = ({ strapi }: { strapi: Core.Strapi }) => {\n const getStore = async () => strapi.store({ type: 'core', name: 'content-releases' });\n\n return {\n async update({ settings }: { settings: Settings }): Promise<Settings> {\n const store = await getStore();\n store.set({ key: 'settings', value: settings });\n return settings;\n },\n async find(): Promise<Settings> {\n const store = await getStore();\n const settings = (await store.get({ key: 'settings' })) as Settings | undefined;\n\n return {\n ...DEFAULT_SETTINGS,\n ...settings,\n };\n },\n };\n};\n\nexport type SettingsService = ReturnType<typeof createSettingsService>;\n\nexport default createSettingsService;\n"],"names":["DEFAULT_SETTINGS","defaultTimezone","createSettingsService","strapi","getStore","store","type","name","update","settings","set","key","value","find","get"],"mappings":"AAIA,MAAMA,gBAAAA,GAAmB;IACvBC,eAAAA,EAAiB;AACnB,CAAA;AAEA,MAAMC,qBAAAA,GAAwB,CAAC,EAAEC,MAAM,EAA2B,GAAA;AAChE,IAAA,MAAMC,QAAAA,GAAW,UAAYD,MAAAA,CAAOE,KAAK,CAAC;YAAEC,IAAAA,EAAM,MAAA;YAAQC,IAAAA,EAAM;AAAmB,SAAA,CAAA;IAEnF,OAAO;QACL,MAAMC,MAAAA,CAAAA,CAAO,EAAEC,QAAQ,EAA0B,EAAA;AAC/C,YAAA,MAAMJ,QAAQ,MAAMD,QAAAA,EAAAA;AACpBC,YAAAA,KAAAA,CAAMK,GAAG,CAAC;gBAAEC,GAAAA,EAAK,UAAA;gBAAYC,KAAAA,EAAOH;AAAS,aAAA,CAAA;YAC7C,OAAOA,QAAAA;AACT,QAAA,CAAA;QACA,MAAMI,IAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMR,QAAQ,MAAMD,QAAAA,EAAAA;AACpB,YAAA,MAAMK,QAAAA,GAAY,MAAMJ,KAAAA,CAAMS,GAAG,CAAC;gBAAEH,GAAAA,EAAK;AAAW,aAAA,CAAA;YAEpD,OAAO;AACL,gBAAA,GAAGX,gBAAgB;AACnB,gBAAA,GAAGS;AACL,aAAA;AACF,QAAA;AACF,KAAA;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/utils/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAEvE,KAAK,QAAQ,GAAG;IACd,OAAO,EAAE,cAAc,CAAC;IACxB,oBAAoB,EAAE,GAAG,CAAC;IAC1B,UAAU,EAAE,GAAG,CAAC;IAChB,gBAAgB,EAAE,oBAAoB,CAAC;IACvC,eAAe,EAAE,GAAG,CAAC;IACrB,QAAQ,EAAE,eAAe,CAAC;CAC3B,CAAC;AAEF,UAAU,MAAM;IACd,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC;IAC7B,UAAU,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,UAAU,GAAI,KAAK,SAAS,MAAM,QAAQ,EACrD,MAAM,KAAK,EACX,YAAY;IAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;CAAE,KAClC,QAAQ,CAAC,KAAK,CAEhB,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,qCAAqC,MAAM,EAC3C,YAAY;IAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;CAAE,qBASpC,CAAC;AAEF,eAAO,MAAM,YAAY,GACvB,gBAAgB,MAAM,EACtB,OAAO,GAAG,EACV,YAAY;IAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/utils/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAEvE,KAAK,QAAQ,GAAG;IACd,OAAO,EAAE,cAAc,CAAC;IACxB,oBAAoB,EAAE,GAAG,CAAC;IAC1B,UAAU,EAAE,GAAG,CAAC;IAChB,gBAAgB,EAAE,oBAAoB,CAAC;IACvC,eAAe,EAAE,GAAG,CAAC;IACrB,QAAQ,EAAE,eAAe,CAAC;CAC3B,CAAC;AAEF,UAAU,MAAM;IACd,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC;IAC7B,UAAU,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,UAAU,GAAI,KAAK,SAAS,MAAM,QAAQ,EACrD,MAAM,KAAK,EACX,YAAY;IAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;CAAE,KAClC,QAAQ,CAAC,KAAK,CAEhB,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,qCAAqC,MAAM,EAC3C,YAAY;IAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;CAAE,qBASpC,CAAC;AAEF,eAAO,MAAM,YAAY,GACvB,gBAAgB,MAAM,EACtB,OAAO,GAAG,EACV,YAAY;IAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;CAAE,qBAoCpC,CAAC;AAEF,eAAO,MAAM,QAAQ,GACnB,wDAMG,MAAM,GAAG;IAAE,MAAM,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;IAAC,QAAQ,EAAE,GAAG,CAAA;CAAE,EAC7D,YAAY;IAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;CAAE,wFAmBpC,CAAC;AAEF,eAAO,MAAM,cAAc,GAAU,aAAa,GAAG,CAAC,WAAW,EAAE,OAAO,IAAI,CAAC,WAAW,gDAwBzF,CAAC;AA+CF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,8BAA8B,GACzC,iBAAiB,GAAG,CAAC,WAAW,EAAE,EAClC,YAAY;IAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;CAAE,KAClC,GAAG,CAAC,WAAW,EAsDjB,CAAC"}
|
|
@@ -23,8 +23,18 @@ const getDraftEntryValidStatus = async ({ contentType, documentId, locale }, { s
|
|
|
23
23
|
};
|
|
24
24
|
const isEntryValid = async (contentTypeUid, entry, { strapi: strapi1 })=>{
|
|
25
25
|
try {
|
|
26
|
+
// Mirror the document-service publish path: when `api.documents.strictRelations`
|
|
27
|
+
// is on, required media/relations are enforced on non-draft writes. Reading the
|
|
28
|
+
// flag here keeps the release "valid" badge consistent with what publish will
|
|
29
|
+
// actually accept (otherwise the UI can mark an entry valid that publish rejects).
|
|
30
|
+
const rawStrictRelations = strapi1.config.get('api.documents.strictRelations', undefined);
|
|
31
|
+
const strictRelations = rawStrictRelations === true;
|
|
26
32
|
// @TODO: When documents service has validateEntityCreation method, use it instead
|
|
27
|
-
await strapi1.entityValidator.validateEntityCreation(strapi1.getModel(contentTypeUid), entry,
|
|
33
|
+
await strapi1.entityValidator.validateEntityCreation(strapi1.getModel(contentTypeUid), entry, {
|
|
34
|
+
isDraft: false,
|
|
35
|
+
locale: entry?.locale,
|
|
36
|
+
strictRelations
|
|
37
|
+
}, // @ts-expect-error - FIXME: entity here is unnecessary
|
|
28
38
|
entry);
|
|
29
39
|
const workflowsService = strapi1.plugin('review-workflows').service('workflows');
|
|
30
40
|
// Workflows service may not be available depending on the license
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../server/src/utils/index.ts"],"sourcesContent":["import { contentTypes as contentTypesUtils } from '@strapi/utils';\n\nimport type { UID, Data, Core } from '@strapi/types';\n\nimport type { SettingsService } from '../services/settings';\nimport type { ReleaseService } from '../services/release';\nimport type { ReleaseActionService } from '../services/release-action';\n\ntype Services = {\n release: ReleaseService;\n 'release-validation': any;\n scheduling: any;\n 'release-action': ReleaseActionService;\n 'event-manager': any;\n settings: SettingsService;\n};\n\ninterface Action {\n contentType: UID.ContentType;\n documentId?: Data.DocumentID;\n locale?: string;\n}\n\nexport const getService = <TName extends keyof Services>(\n name: TName,\n { strapi }: { strapi: Core.Strapi }\n): Services[TName] => {\n return strapi.plugin('content-releases').service(name);\n};\n\nexport const getDraftEntryValidStatus = async (\n { contentType, documentId, locale }: Action,\n { strapi }: { strapi: Core.Strapi }\n) => {\n const populateBuilderService = strapi.plugin('content-manager').service('populate-builder');\n // @ts-expect-error - populateBuilderService should be a function but is returning service\n const populate = await populateBuilderService(contentType).populateDeep(Infinity).build();\n\n const entry = await getEntry({ contentType, documentId, locale, populate }, { strapi });\n\n return isEntryValid(contentType, entry, { strapi });\n};\n\nexport const isEntryValid = async (\n contentTypeUid: string,\n entry: any,\n { strapi }: { strapi: Core.Strapi }\n) => {\n try {\n // @TODO: When documents service has validateEntityCreation method, use it instead\n await strapi.entityValidator.validateEntityCreation(\n strapi.getModel(contentTypeUid as UID.ContentType),\n entry,\n undefined,\n // @ts-expect-error - FIXME: entity here is unnecessary\n entry\n );\n\n const workflowsService = strapi.plugin('review-workflows').service('workflows');\n // Workflows service may not be available depending on the license\n const workflow = await workflowsService?.getAssignedWorkflow(contentTypeUid, {\n populate: 'stageRequiredToPublish',\n });\n\n if (workflow?.stageRequiredToPublish) {\n return entry.strapi_stage.id === workflow.stageRequiredToPublish.id;\n }\n\n return true;\n } catch {\n return false;\n }\n};\n\nexport const getEntry = async (\n {\n contentType,\n documentId,\n locale,\n populate,\n status = 'draft',\n }: Action & { status?: 'draft' | 'published'; populate: any },\n { strapi }: { strapi: Core.Strapi }\n) => {\n if (documentId) {\n // Try to get an existing draft or published document\n const entry = await strapi\n .documents(contentType)\n .findOne({ documentId, locale, populate, status });\n\n // The document isn't published yet, but the action is to publish it, fetch the draft\n if (status === 'published' && !entry) {\n return strapi\n .documents(contentType)\n .findOne({ documentId, locale, populate, status: 'draft' });\n }\n\n return entry;\n }\n\n return strapi.documents(contentType).findFirst({ locale, populate, status });\n};\n\nexport const getEntryStatus = async (contentType: UID.ContentType, entry: Data.ContentType) => {\n if (entry.publishedAt) {\n return 'published';\n }\n\n const publishedEntry = await strapi.documents(contentType).findOne({\n documentId: entry.documentId,\n locale: entry.locale,\n status: 'published',\n fields: ['updatedAt'],\n });\n\n if (!publishedEntry) {\n return 'draft';\n }\n\n const entryUpdatedAt = new Date(entry.updatedAt).getTime();\n const publishedEntryUpdatedAt = new Date(publishedEntry.updatedAt).getTime();\n\n if (entryUpdatedAt > publishedEntryUpdatedAt) {\n return 'modified';\n }\n\n return 'published';\n};\n\n/**\n * Recursively collects content type UIDs that a model (content type or component) has relations to.\n * Go through component and dynamic zone attributes to find nested relations.\n */\nconst collectRelationTargets = (\n modelUid: string,\n strapi: Core.Strapi,\n visited = new Set<string>()\n): Set<string> => {\n const targets = new Set<string>();\n if (visited.has(modelUid)) {\n return targets;\n }\n visited.add(modelUid);\n\n const model = strapi.getModel(modelUid as UID.Schema);\n if (!model?.attributes) {\n return targets;\n }\n\n for (const attribute of Object.values(model.attributes) as Array<{\n type?: string;\n target?: string;\n component?: string;\n components?: string[];\n }>) {\n if (attribute?.type === 'relation' && attribute.target) {\n targets.add(attribute.target);\n }\n if (attribute?.type === 'component' && attribute.component) {\n for (const t of collectRelationTargets(attribute.component, strapi, visited)) {\n targets.add(t);\n }\n }\n if (attribute?.type === 'dynamiczone' && attribute.components) {\n for (const compUid of attribute.components) {\n for (const t of collectRelationTargets(compUid, strapi, visited)) {\n targets.add(t);\n }\n }\n }\n }\n return targets;\n};\n\n/**\n * Returns content type UIDs sorted by relation dependency order for publishing.\n * When content type A has a relation to content type B (both with draft & publish),\n * B will appear before A in the result. This ensures that when publishing a release,\n * related entities are published first, so that relation IDs can be correctly\n * resolved (published target must exist when publishing source).\n *\n * Relations in components (nested or not) and dynamic zones are also considered.\n *\n * @param contentTypeUids - Content type UIDs that will be published in the release\n * @param strapi - Strapi instance\n * @returns Content type UIDs in publish order (dependencies first)\n */\nexport const getPublishOrderForContentTypes = (\n contentTypeUids: UID.ContentType[],\n { strapi }: { strapi: Core.Strapi }\n): UID.ContentType[] => {\n const uidSet = new Set(contentTypeUids);\n\n // Build dependency graph: source depends on target (source must be published after target)\n const dependencies = new Map<UID.ContentType, Set<UID.ContentType>>();\n\n for (const uid of contentTypeUids) {\n const model = strapi.getModel(uid);\n if (model && contentTypesUtils.hasDraftAndPublish(model)) {\n const relationTargets = collectRelationTargets(uid, strapi);\n\n for (const targetUid of relationTargets) {\n const targetContentTypeUid = targetUid as UID.ContentType;\n const isTargetInRelease =\n uidSet.has(targetContentTypeUid) && targetContentTypeUid in strapi.contentTypes;\n const targetModel = strapi.getModel(targetContentTypeUid);\n const targetHasDraftAndPublish =\n targetModel && contentTypesUtils.hasDraftAndPublish(targetModel);\n\n if (isTargetInRelease && targetHasDraftAndPublish) {\n let dependencySet = dependencies.get(uid);\n if (!dependencySet) {\n dependencySet = new Set();\n dependencies.set(uid, dependencySet);\n }\n dependencySet.add(targetContentTypeUid);\n }\n }\n }\n }\n\n // Topological sort: dependencies first\n const sorted: UID.ContentType[] = [];\n const visited = new Set<UID.ContentType>();\n const visiting = new Set<UID.ContentType>();\n\n const visit = (uid: UID.ContentType) => {\n if (visited.has(uid)) return;\n if (visiting.has(uid)) return; // No cycle in valid schemas\n\n visiting.add(uid);\n for (const dep of dependencies.get(uid) ?? []) {\n visit(dep);\n }\n visiting.delete(uid);\n visited.add(uid);\n sorted.push(uid);\n };\n\n for (const uid of contentTypeUids) {\n visit(uid);\n }\n\n return sorted;\n};\n"],"names":["getService","name","strapi","plugin","service","getDraftEntryValidStatus","contentType","documentId","locale","populateBuilderService","populate","populateDeep","Infinity","build","entry","getEntry","isEntryValid","contentTypeUid","entityValidator","validateEntityCreation","getModel","undefined","workflowsService","workflow","getAssignedWorkflow","stageRequiredToPublish","strapi_stage","id","status","documents","findOne","findFirst","getEntryStatus","publishedAt","publishedEntry","fields","entryUpdatedAt","Date","updatedAt","getTime","publishedEntryUpdatedAt","collectRelationTargets","modelUid","visited","Set","targets","has","add","model","attributes","attribute","Object","values","type","target","component","t","components","compUid","getPublishOrderForContentTypes","contentTypeUids","uidSet","dependencies","Map","uid","contentTypesUtils","hasDraftAndPublish","relationTargets","targetUid","targetContentTypeUid","isTargetInRelease","contentTypes","targetModel","targetHasDraftAndPublish","dependencySet","get","set","sorted","visiting","visit","dep","delete","push"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../server/src/utils/index.ts"],"sourcesContent":["import { contentTypes as contentTypesUtils } from '@strapi/utils';\n\nimport type { UID, Data, Core } from '@strapi/types';\n\nimport type { SettingsService } from '../services/settings';\nimport type { ReleaseService } from '../services/release';\nimport type { ReleaseActionService } from '../services/release-action';\n\ntype Services = {\n release: ReleaseService;\n 'release-validation': any;\n scheduling: any;\n 'release-action': ReleaseActionService;\n 'event-manager': any;\n settings: SettingsService;\n};\n\ninterface Action {\n contentType: UID.ContentType;\n documentId?: Data.DocumentID;\n locale?: string;\n}\n\nexport const getService = <TName extends keyof Services>(\n name: TName,\n { strapi }: { strapi: Core.Strapi }\n): Services[TName] => {\n return strapi.plugin('content-releases').service(name);\n};\n\nexport const getDraftEntryValidStatus = async (\n { contentType, documentId, locale }: Action,\n { strapi }: { strapi: Core.Strapi }\n) => {\n const populateBuilderService = strapi.plugin('content-manager').service('populate-builder');\n // @ts-expect-error - populateBuilderService should be a function but is returning service\n const populate = await populateBuilderService(contentType).populateDeep(Infinity).build();\n\n const entry = await getEntry({ contentType, documentId, locale, populate }, { strapi });\n\n return isEntryValid(contentType, entry, { strapi });\n};\n\nexport const isEntryValid = async (\n contentTypeUid: string,\n entry: any,\n { strapi }: { strapi: Core.Strapi }\n) => {\n try {\n // Mirror the document-service publish path: when `api.documents.strictRelations`\n // is on, required media/relations are enforced on non-draft writes. Reading the\n // flag here keeps the release \"valid\" badge consistent with what publish will\n // actually accept (otherwise the UI can mark an entry valid that publish rejects).\n const rawStrictRelations: unknown = strapi.config.get(\n 'api.documents.strictRelations',\n undefined\n );\n const strictRelations = rawStrictRelations === true;\n\n // @TODO: When documents service has validateEntityCreation method, use it instead\n await strapi.entityValidator.validateEntityCreation(\n strapi.getModel(contentTypeUid as UID.ContentType),\n entry,\n { isDraft: false, locale: entry?.locale, strictRelations },\n // @ts-expect-error - FIXME: entity here is unnecessary\n entry\n );\n\n const workflowsService = strapi.plugin('review-workflows').service('workflows');\n // Workflows service may not be available depending on the license\n const workflow = await workflowsService?.getAssignedWorkflow(contentTypeUid, {\n populate: 'stageRequiredToPublish',\n });\n\n if (workflow?.stageRequiredToPublish) {\n return entry.strapi_stage.id === workflow.stageRequiredToPublish.id;\n }\n\n return true;\n } catch {\n return false;\n }\n};\n\nexport const getEntry = async (\n {\n contentType,\n documentId,\n locale,\n populate,\n status = 'draft',\n }: Action & { status?: 'draft' | 'published'; populate: any },\n { strapi }: { strapi: Core.Strapi }\n) => {\n if (documentId) {\n // Try to get an existing draft or published document\n const entry = await strapi\n .documents(contentType)\n .findOne({ documentId, locale, populate, status });\n\n // The document isn't published yet, but the action is to publish it, fetch the draft\n if (status === 'published' && !entry) {\n return strapi\n .documents(contentType)\n .findOne({ documentId, locale, populate, status: 'draft' });\n }\n\n return entry;\n }\n\n return strapi.documents(contentType).findFirst({ locale, populate, status });\n};\n\nexport const getEntryStatus = async (contentType: UID.ContentType, entry: Data.ContentType) => {\n if (entry.publishedAt) {\n return 'published';\n }\n\n const publishedEntry = await strapi.documents(contentType).findOne({\n documentId: entry.documentId,\n locale: entry.locale,\n status: 'published',\n fields: ['updatedAt'],\n });\n\n if (!publishedEntry) {\n return 'draft';\n }\n\n const entryUpdatedAt = new Date(entry.updatedAt).getTime();\n const publishedEntryUpdatedAt = new Date(publishedEntry.updatedAt).getTime();\n\n if (entryUpdatedAt > publishedEntryUpdatedAt) {\n return 'modified';\n }\n\n return 'published';\n};\n\n/**\n * Recursively collects content type UIDs that a model (content type or component) has relations to.\n * Go through component and dynamic zone attributes to find nested relations.\n */\nconst collectRelationTargets = (\n modelUid: string,\n strapi: Core.Strapi,\n visited = new Set<string>()\n): Set<string> => {\n const targets = new Set<string>();\n if (visited.has(modelUid)) {\n return targets;\n }\n visited.add(modelUid);\n\n const model = strapi.getModel(modelUid as UID.Schema);\n if (!model?.attributes) {\n return targets;\n }\n\n for (const attribute of Object.values(model.attributes) as Array<{\n type?: string;\n target?: string;\n component?: string;\n components?: string[];\n }>) {\n if (attribute?.type === 'relation' && attribute.target) {\n targets.add(attribute.target);\n }\n if (attribute?.type === 'component' && attribute.component) {\n for (const t of collectRelationTargets(attribute.component, strapi, visited)) {\n targets.add(t);\n }\n }\n if (attribute?.type === 'dynamiczone' && attribute.components) {\n for (const compUid of attribute.components) {\n for (const t of collectRelationTargets(compUid, strapi, visited)) {\n targets.add(t);\n }\n }\n }\n }\n return targets;\n};\n\n/**\n * Returns content type UIDs sorted by relation dependency order for publishing.\n * When content type A has a relation to content type B (both with draft & publish),\n * B will appear before A in the result. This ensures that when publishing a release,\n * related entities are published first, so that relation IDs can be correctly\n * resolved (published target must exist when publishing source).\n *\n * Relations in components (nested or not) and dynamic zones are also considered.\n *\n * @param contentTypeUids - Content type UIDs that will be published in the release\n * @param strapi - Strapi instance\n * @returns Content type UIDs in publish order (dependencies first)\n */\nexport const getPublishOrderForContentTypes = (\n contentTypeUids: UID.ContentType[],\n { strapi }: { strapi: Core.Strapi }\n): UID.ContentType[] => {\n const uidSet = new Set(contentTypeUids);\n\n // Build dependency graph: source depends on target (source must be published after target)\n const dependencies = new Map<UID.ContentType, Set<UID.ContentType>>();\n\n for (const uid of contentTypeUids) {\n const model = strapi.getModel(uid);\n if (model && contentTypesUtils.hasDraftAndPublish(model)) {\n const relationTargets = collectRelationTargets(uid, strapi);\n\n for (const targetUid of relationTargets) {\n const targetContentTypeUid = targetUid as UID.ContentType;\n const isTargetInRelease =\n uidSet.has(targetContentTypeUid) && targetContentTypeUid in strapi.contentTypes;\n const targetModel = strapi.getModel(targetContentTypeUid);\n const targetHasDraftAndPublish =\n targetModel && contentTypesUtils.hasDraftAndPublish(targetModel);\n\n if (isTargetInRelease && targetHasDraftAndPublish) {\n let dependencySet = dependencies.get(uid);\n if (!dependencySet) {\n dependencySet = new Set();\n dependencies.set(uid, dependencySet);\n }\n dependencySet.add(targetContentTypeUid);\n }\n }\n }\n }\n\n // Topological sort: dependencies first\n const sorted: UID.ContentType[] = [];\n const visited = new Set<UID.ContentType>();\n const visiting = new Set<UID.ContentType>();\n\n const visit = (uid: UID.ContentType) => {\n if (visited.has(uid)) return;\n if (visiting.has(uid)) return; // No cycle in valid schemas\n\n visiting.add(uid);\n for (const dep of dependencies.get(uid) ?? []) {\n visit(dep);\n }\n visiting.delete(uid);\n visited.add(uid);\n sorted.push(uid);\n };\n\n for (const uid of contentTypeUids) {\n visit(uid);\n }\n\n return sorted;\n};\n"],"names":["getService","name","strapi","plugin","service","getDraftEntryValidStatus","contentType","documentId","locale","populateBuilderService","populate","populateDeep","Infinity","build","entry","getEntry","isEntryValid","contentTypeUid","rawStrictRelations","config","get","undefined","strictRelations","entityValidator","validateEntityCreation","getModel","isDraft","workflowsService","workflow","getAssignedWorkflow","stageRequiredToPublish","strapi_stage","id","status","documents","findOne","findFirst","getEntryStatus","publishedAt","publishedEntry","fields","entryUpdatedAt","Date","updatedAt","getTime","publishedEntryUpdatedAt","collectRelationTargets","modelUid","visited","Set","targets","has","add","model","attributes","attribute","Object","values","type","target","component","t","components","compUid","getPublishOrderForContentTypes","contentTypeUids","uidSet","dependencies","Map","uid","contentTypesUtils","hasDraftAndPublish","relationTargets","targetUid","targetContentTypeUid","isTargetInRelease","contentTypes","targetModel","targetHasDraftAndPublish","dependencySet","set","sorted","visiting","visit","dep","delete","push"],"mappings":"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"}
|
|
@@ -21,8 +21,18 @@ const getDraftEntryValidStatus = async ({ contentType, documentId, locale }, { s
|
|
|
21
21
|
};
|
|
22
22
|
const isEntryValid = async (contentTypeUid, entry, { strapi: strapi1 })=>{
|
|
23
23
|
try {
|
|
24
|
+
// Mirror the document-service publish path: when `api.documents.strictRelations`
|
|
25
|
+
// is on, required media/relations are enforced on non-draft writes. Reading the
|
|
26
|
+
// flag here keeps the release "valid" badge consistent with what publish will
|
|
27
|
+
// actually accept (otherwise the UI can mark an entry valid that publish rejects).
|
|
28
|
+
const rawStrictRelations = strapi1.config.get('api.documents.strictRelations', undefined);
|
|
29
|
+
const strictRelations = rawStrictRelations === true;
|
|
24
30
|
// @TODO: When documents service has validateEntityCreation method, use it instead
|
|
25
|
-
await strapi1.entityValidator.validateEntityCreation(strapi1.getModel(contentTypeUid), entry,
|
|
31
|
+
await strapi1.entityValidator.validateEntityCreation(strapi1.getModel(contentTypeUid), entry, {
|
|
32
|
+
isDraft: false,
|
|
33
|
+
locale: entry?.locale,
|
|
34
|
+
strictRelations
|
|
35
|
+
}, // @ts-expect-error - FIXME: entity here is unnecessary
|
|
26
36
|
entry);
|
|
27
37
|
const workflowsService = strapi1.plugin('review-workflows').service('workflows');
|
|
28
38
|
// Workflows service may not be available depending on the license
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../server/src/utils/index.ts"],"sourcesContent":["import { contentTypes as contentTypesUtils } from '@strapi/utils';\n\nimport type { UID, Data, Core } from '@strapi/types';\n\nimport type { SettingsService } from '../services/settings';\nimport type { ReleaseService } from '../services/release';\nimport type { ReleaseActionService } from '../services/release-action';\n\ntype Services = {\n release: ReleaseService;\n 'release-validation': any;\n scheduling: any;\n 'release-action': ReleaseActionService;\n 'event-manager': any;\n settings: SettingsService;\n};\n\ninterface Action {\n contentType: UID.ContentType;\n documentId?: Data.DocumentID;\n locale?: string;\n}\n\nexport const getService = <TName extends keyof Services>(\n name: TName,\n { strapi }: { strapi: Core.Strapi }\n): Services[TName] => {\n return strapi.plugin('content-releases').service(name);\n};\n\nexport const getDraftEntryValidStatus = async (\n { contentType, documentId, locale }: Action,\n { strapi }: { strapi: Core.Strapi }\n) => {\n const populateBuilderService = strapi.plugin('content-manager').service('populate-builder');\n // @ts-expect-error - populateBuilderService should be a function but is returning service\n const populate = await populateBuilderService(contentType).populateDeep(Infinity).build();\n\n const entry = await getEntry({ contentType, documentId, locale, populate }, { strapi });\n\n return isEntryValid(contentType, entry, { strapi });\n};\n\nexport const isEntryValid = async (\n contentTypeUid: string,\n entry: any,\n { strapi }: { strapi: Core.Strapi }\n) => {\n try {\n // @TODO: When documents service has validateEntityCreation method, use it instead\n await strapi.entityValidator.validateEntityCreation(\n strapi.getModel(contentTypeUid as UID.ContentType),\n entry,\n undefined,\n // @ts-expect-error - FIXME: entity here is unnecessary\n entry\n );\n\n const workflowsService = strapi.plugin('review-workflows').service('workflows');\n // Workflows service may not be available depending on the license\n const workflow = await workflowsService?.getAssignedWorkflow(contentTypeUid, {\n populate: 'stageRequiredToPublish',\n });\n\n if (workflow?.stageRequiredToPublish) {\n return entry.strapi_stage.id === workflow.stageRequiredToPublish.id;\n }\n\n return true;\n } catch {\n return false;\n }\n};\n\nexport const getEntry = async (\n {\n contentType,\n documentId,\n locale,\n populate,\n status = 'draft',\n }: Action & { status?: 'draft' | 'published'; populate: any },\n { strapi }: { strapi: Core.Strapi }\n) => {\n if (documentId) {\n // Try to get an existing draft or published document\n const entry = await strapi\n .documents(contentType)\n .findOne({ documentId, locale, populate, status });\n\n // The document isn't published yet, but the action is to publish it, fetch the draft\n if (status === 'published' && !entry) {\n return strapi\n .documents(contentType)\n .findOne({ documentId, locale, populate, status: 'draft' });\n }\n\n return entry;\n }\n\n return strapi.documents(contentType).findFirst({ locale, populate, status });\n};\n\nexport const getEntryStatus = async (contentType: UID.ContentType, entry: Data.ContentType) => {\n if (entry.publishedAt) {\n return 'published';\n }\n\n const publishedEntry = await strapi.documents(contentType).findOne({\n documentId: entry.documentId,\n locale: entry.locale,\n status: 'published',\n fields: ['updatedAt'],\n });\n\n if (!publishedEntry) {\n return 'draft';\n }\n\n const entryUpdatedAt = new Date(entry.updatedAt).getTime();\n const publishedEntryUpdatedAt = new Date(publishedEntry.updatedAt).getTime();\n\n if (entryUpdatedAt > publishedEntryUpdatedAt) {\n return 'modified';\n }\n\n return 'published';\n};\n\n/**\n * Recursively collects content type UIDs that a model (content type or component) has relations to.\n * Go through component and dynamic zone attributes to find nested relations.\n */\nconst collectRelationTargets = (\n modelUid: string,\n strapi: Core.Strapi,\n visited = new Set<string>()\n): Set<string> => {\n const targets = new Set<string>();\n if (visited.has(modelUid)) {\n return targets;\n }\n visited.add(modelUid);\n\n const model = strapi.getModel(modelUid as UID.Schema);\n if (!model?.attributes) {\n return targets;\n }\n\n for (const attribute of Object.values(model.attributes) as Array<{\n type?: string;\n target?: string;\n component?: string;\n components?: string[];\n }>) {\n if (attribute?.type === 'relation' && attribute.target) {\n targets.add(attribute.target);\n }\n if (attribute?.type === 'component' && attribute.component) {\n for (const t of collectRelationTargets(attribute.component, strapi, visited)) {\n targets.add(t);\n }\n }\n if (attribute?.type === 'dynamiczone' && attribute.components) {\n for (const compUid of attribute.components) {\n for (const t of collectRelationTargets(compUid, strapi, visited)) {\n targets.add(t);\n }\n }\n }\n }\n return targets;\n};\n\n/**\n * Returns content type UIDs sorted by relation dependency order for publishing.\n * When content type A has a relation to content type B (both with draft & publish),\n * B will appear before A in the result. This ensures that when publishing a release,\n * related entities are published first, so that relation IDs can be correctly\n * resolved (published target must exist when publishing source).\n *\n * Relations in components (nested or not) and dynamic zones are also considered.\n *\n * @param contentTypeUids - Content type UIDs that will be published in the release\n * @param strapi - Strapi instance\n * @returns Content type UIDs in publish order (dependencies first)\n */\nexport const getPublishOrderForContentTypes = (\n contentTypeUids: UID.ContentType[],\n { strapi }: { strapi: Core.Strapi }\n): UID.ContentType[] => {\n const uidSet = new Set(contentTypeUids);\n\n // Build dependency graph: source depends on target (source must be published after target)\n const dependencies = new Map<UID.ContentType, Set<UID.ContentType>>();\n\n for (const uid of contentTypeUids) {\n const model = strapi.getModel(uid);\n if (model && contentTypesUtils.hasDraftAndPublish(model)) {\n const relationTargets = collectRelationTargets(uid, strapi);\n\n for (const targetUid of relationTargets) {\n const targetContentTypeUid = targetUid as UID.ContentType;\n const isTargetInRelease =\n uidSet.has(targetContentTypeUid) && targetContentTypeUid in strapi.contentTypes;\n const targetModel = strapi.getModel(targetContentTypeUid);\n const targetHasDraftAndPublish =\n targetModel && contentTypesUtils.hasDraftAndPublish(targetModel);\n\n if (isTargetInRelease && targetHasDraftAndPublish) {\n let dependencySet = dependencies.get(uid);\n if (!dependencySet) {\n dependencySet = new Set();\n dependencies.set(uid, dependencySet);\n }\n dependencySet.add(targetContentTypeUid);\n }\n }\n }\n }\n\n // Topological sort: dependencies first\n const sorted: UID.ContentType[] = [];\n const visited = new Set<UID.ContentType>();\n const visiting = new Set<UID.ContentType>();\n\n const visit = (uid: UID.ContentType) => {\n if (visited.has(uid)) return;\n if (visiting.has(uid)) return; // No cycle in valid schemas\n\n visiting.add(uid);\n for (const dep of dependencies.get(uid) ?? []) {\n visit(dep);\n }\n visiting.delete(uid);\n visited.add(uid);\n sorted.push(uid);\n };\n\n for (const uid of contentTypeUids) {\n visit(uid);\n }\n\n return sorted;\n};\n"],"names":["getService","name","strapi","plugin","service","getDraftEntryValidStatus","contentType","documentId","locale","populateBuilderService","populate","populateDeep","Infinity","build","entry","getEntry","isEntryValid","contentTypeUid","entityValidator","validateEntityCreation","getModel","undefined","workflowsService","workflow","getAssignedWorkflow","stageRequiredToPublish","strapi_stage","id","status","documents","findOne","findFirst","getEntryStatus","publishedAt","publishedEntry","fields","entryUpdatedAt","Date","updatedAt","getTime","publishedEntryUpdatedAt","collectRelationTargets","modelUid","visited","Set","targets","has","add","model","attributes","attribute","Object","values","type","target","component","t","components","compUid","getPublishOrderForContentTypes","contentTypeUids","uidSet","dependencies","Map","uid","contentTypesUtils","hasDraftAndPublish","relationTargets","targetUid","targetContentTypeUid","isTargetInRelease","contentTypes","targetModel","targetHasDraftAndPublish","dependencySet","get","set","sorted","visiting","visit","dep","delete","push"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../server/src/utils/index.ts"],"sourcesContent":["import { contentTypes as contentTypesUtils } from '@strapi/utils';\n\nimport type { UID, Data, Core } from '@strapi/types';\n\nimport type { SettingsService } from '../services/settings';\nimport type { ReleaseService } from '../services/release';\nimport type { ReleaseActionService } from '../services/release-action';\n\ntype Services = {\n release: ReleaseService;\n 'release-validation': any;\n scheduling: any;\n 'release-action': ReleaseActionService;\n 'event-manager': any;\n settings: SettingsService;\n};\n\ninterface Action {\n contentType: UID.ContentType;\n documentId?: Data.DocumentID;\n locale?: string;\n}\n\nexport const getService = <TName extends keyof Services>(\n name: TName,\n { strapi }: { strapi: Core.Strapi }\n): Services[TName] => {\n return strapi.plugin('content-releases').service(name);\n};\n\nexport const getDraftEntryValidStatus = async (\n { contentType, documentId, locale }: Action,\n { strapi }: { strapi: Core.Strapi }\n) => {\n const populateBuilderService = strapi.plugin('content-manager').service('populate-builder');\n // @ts-expect-error - populateBuilderService should be a function but is returning service\n const populate = await populateBuilderService(contentType).populateDeep(Infinity).build();\n\n const entry = await getEntry({ contentType, documentId, locale, populate }, { strapi });\n\n return isEntryValid(contentType, entry, { strapi });\n};\n\nexport const isEntryValid = async (\n contentTypeUid: string,\n entry: any,\n { strapi }: { strapi: Core.Strapi }\n) => {\n try {\n // Mirror the document-service publish path: when `api.documents.strictRelations`\n // is on, required media/relations are enforced on non-draft writes. Reading the\n // flag here keeps the release \"valid\" badge consistent with what publish will\n // actually accept (otherwise the UI can mark an entry valid that publish rejects).\n const rawStrictRelations: unknown = strapi.config.get(\n 'api.documents.strictRelations',\n undefined\n );\n const strictRelations = rawStrictRelations === true;\n\n // @TODO: When documents service has validateEntityCreation method, use it instead\n await strapi.entityValidator.validateEntityCreation(\n strapi.getModel(contentTypeUid as UID.ContentType),\n entry,\n { isDraft: false, locale: entry?.locale, strictRelations },\n // @ts-expect-error - FIXME: entity here is unnecessary\n entry\n );\n\n const workflowsService = strapi.plugin('review-workflows').service('workflows');\n // Workflows service may not be available depending on the license\n const workflow = await workflowsService?.getAssignedWorkflow(contentTypeUid, {\n populate: 'stageRequiredToPublish',\n });\n\n if (workflow?.stageRequiredToPublish) {\n return entry.strapi_stage.id === workflow.stageRequiredToPublish.id;\n }\n\n return true;\n } catch {\n return false;\n }\n};\n\nexport const getEntry = async (\n {\n contentType,\n documentId,\n locale,\n populate,\n status = 'draft',\n }: Action & { status?: 'draft' | 'published'; populate: any },\n { strapi }: { strapi: Core.Strapi }\n) => {\n if (documentId) {\n // Try to get an existing draft or published document\n const entry = await strapi\n .documents(contentType)\n .findOne({ documentId, locale, populate, status });\n\n // The document isn't published yet, but the action is to publish it, fetch the draft\n if (status === 'published' && !entry) {\n return strapi\n .documents(contentType)\n .findOne({ documentId, locale, populate, status: 'draft' });\n }\n\n return entry;\n }\n\n return strapi.documents(contentType).findFirst({ locale, populate, status });\n};\n\nexport const getEntryStatus = async (contentType: UID.ContentType, entry: Data.ContentType) => {\n if (entry.publishedAt) {\n return 'published';\n }\n\n const publishedEntry = await strapi.documents(contentType).findOne({\n documentId: entry.documentId,\n locale: entry.locale,\n status: 'published',\n fields: ['updatedAt'],\n });\n\n if (!publishedEntry) {\n return 'draft';\n }\n\n const entryUpdatedAt = new Date(entry.updatedAt).getTime();\n const publishedEntryUpdatedAt = new Date(publishedEntry.updatedAt).getTime();\n\n if (entryUpdatedAt > publishedEntryUpdatedAt) {\n return 'modified';\n }\n\n return 'published';\n};\n\n/**\n * Recursively collects content type UIDs that a model (content type or component) has relations to.\n * Go through component and dynamic zone attributes to find nested relations.\n */\nconst collectRelationTargets = (\n modelUid: string,\n strapi: Core.Strapi,\n visited = new Set<string>()\n): Set<string> => {\n const targets = new Set<string>();\n if (visited.has(modelUid)) {\n return targets;\n }\n visited.add(modelUid);\n\n const model = strapi.getModel(modelUid as UID.Schema);\n if (!model?.attributes) {\n return targets;\n }\n\n for (const attribute of Object.values(model.attributes) as Array<{\n type?: string;\n target?: string;\n component?: string;\n components?: string[];\n }>) {\n if (attribute?.type === 'relation' && attribute.target) {\n targets.add(attribute.target);\n }\n if (attribute?.type === 'component' && attribute.component) {\n for (const t of collectRelationTargets(attribute.component, strapi, visited)) {\n targets.add(t);\n }\n }\n if (attribute?.type === 'dynamiczone' && attribute.components) {\n for (const compUid of attribute.components) {\n for (const t of collectRelationTargets(compUid, strapi, visited)) {\n targets.add(t);\n }\n }\n }\n }\n return targets;\n};\n\n/**\n * Returns content type UIDs sorted by relation dependency order for publishing.\n * When content type A has a relation to content type B (both with draft & publish),\n * B will appear before A in the result. This ensures that when publishing a release,\n * related entities are published first, so that relation IDs can be correctly\n * resolved (published target must exist when publishing source).\n *\n * Relations in components (nested or not) and dynamic zones are also considered.\n *\n * @param contentTypeUids - Content type UIDs that will be published in the release\n * @param strapi - Strapi instance\n * @returns Content type UIDs in publish order (dependencies first)\n */\nexport const getPublishOrderForContentTypes = (\n contentTypeUids: UID.ContentType[],\n { strapi }: { strapi: Core.Strapi }\n): UID.ContentType[] => {\n const uidSet = new Set(contentTypeUids);\n\n // Build dependency graph: source depends on target (source must be published after target)\n const dependencies = new Map<UID.ContentType, Set<UID.ContentType>>();\n\n for (const uid of contentTypeUids) {\n const model = strapi.getModel(uid);\n if (model && contentTypesUtils.hasDraftAndPublish(model)) {\n const relationTargets = collectRelationTargets(uid, strapi);\n\n for (const targetUid of relationTargets) {\n const targetContentTypeUid = targetUid as UID.ContentType;\n const isTargetInRelease =\n uidSet.has(targetContentTypeUid) && targetContentTypeUid in strapi.contentTypes;\n const targetModel = strapi.getModel(targetContentTypeUid);\n const targetHasDraftAndPublish =\n targetModel && contentTypesUtils.hasDraftAndPublish(targetModel);\n\n if (isTargetInRelease && targetHasDraftAndPublish) {\n let dependencySet = dependencies.get(uid);\n if (!dependencySet) {\n dependencySet = new Set();\n dependencies.set(uid, dependencySet);\n }\n dependencySet.add(targetContentTypeUid);\n }\n }\n }\n }\n\n // Topological sort: dependencies first\n const sorted: UID.ContentType[] = [];\n const visited = new Set<UID.ContentType>();\n const visiting = new Set<UID.ContentType>();\n\n const visit = (uid: UID.ContentType) => {\n if (visited.has(uid)) return;\n if (visiting.has(uid)) return; // No cycle in valid schemas\n\n visiting.add(uid);\n for (const dep of dependencies.get(uid) ?? []) {\n visit(dep);\n }\n visiting.delete(uid);\n visited.add(uid);\n sorted.push(uid);\n };\n\n for (const uid of contentTypeUids) {\n visit(uid);\n }\n\n return sorted;\n};\n"],"names":["getService","name","strapi","plugin","service","getDraftEntryValidStatus","contentType","documentId","locale","populateBuilderService","populate","populateDeep","Infinity","build","entry","getEntry","isEntryValid","contentTypeUid","rawStrictRelations","config","get","undefined","strictRelations","entityValidator","validateEntityCreation","getModel","isDraft","workflowsService","workflow","getAssignedWorkflow","stageRequiredToPublish","strapi_stage","id","status","documents","findOne","findFirst","getEntryStatus","publishedAt","publishedEntry","fields","entryUpdatedAt","Date","updatedAt","getTime","publishedEntryUpdatedAt","collectRelationTargets","modelUid","visited","Set","targets","has","add","model","attributes","attribute","Object","values","type","target","component","t","components","compUid","getPublishOrderForContentTypes","contentTypeUids","uidSet","dependencies","Map","uid","contentTypesUtils","hasDraftAndPublish","relationTargets","targetUid","targetContentTypeUid","isTargetInRelease","contentTypes","targetModel","targetHasDraftAndPublish","dependencySet","set","sorted","visiting","visit","dep","delete","push"],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { Schema, Modules, UID, Struct } from '@strapi/types';
|
|
2
|
+
import type { errors } from '@strapi/utils';
|
|
2
3
|
import type { Release, Pagination } from './releases';
|
|
3
4
|
import type { Entity } from '../types';
|
|
4
|
-
|
|
5
|
+
export type ReleaseActionEntryType = 'single-types' | 'collection-types';
|
|
5
6
|
export type ReleaseActionEntry = Modules.Documents.AnyDocument & {
|
|
6
7
|
[key: string]: Schema.Attribute.AnyAttribute;
|
|
7
8
|
} & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"release-actions.d.ts","sourceRoot":"","sources":["../../../shared/contracts/release-actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,
|
|
1
|
+
{"version":3,"file":"release-actions.d.ts","sourceRoot":"","sources":["../../../shared/contracts/release-actions.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@strapi/content-releases",
|
|
3
|
-
"version": "5.51.
|
|
3
|
+
"version": "5.51.2",
|
|
4
4
|
"description": "Strapi plugin for organizing and releasing content",
|
|
5
5
|
"homepage": "https://strapi.io",
|
|
6
6
|
"bugs": {
|
|
@@ -64,11 +64,11 @@
|
|
|
64
64
|
},
|
|
65
65
|
"dependencies": {
|
|
66
66
|
"@reduxjs/toolkit": "1.9.7",
|
|
67
|
-
"@strapi/database": "5.51.
|
|
67
|
+
"@strapi/database": "5.51.2",
|
|
68
68
|
"@strapi/design-system": "2.2.3",
|
|
69
69
|
"@strapi/icons": "2.2.3",
|
|
70
|
-
"@strapi/types": "5.51.
|
|
71
|
-
"@strapi/utils": "5.51.
|
|
70
|
+
"@strapi/types": "5.51.2",
|
|
71
|
+
"@strapi/utils": "5.51.2",
|
|
72
72
|
"date-fns": "2.30.0",
|
|
73
73
|
"date-fns-tz": "2.0.1",
|
|
74
74
|
"formik": "2.4.9",
|
|
@@ -79,9 +79,9 @@
|
|
|
79
79
|
"yup": "0.32.9"
|
|
80
80
|
},
|
|
81
81
|
"devDependencies": {
|
|
82
|
-
"@strapi/admin": "5.51.
|
|
83
|
-
"@strapi/admin-test-utils": "5.51.
|
|
84
|
-
"@strapi/content-manager": "5.51.
|
|
82
|
+
"@strapi/admin": "5.51.2",
|
|
83
|
+
"@strapi/admin-test-utils": "5.51.2",
|
|
84
|
+
"@strapi/content-manager": "5.51.2",
|
|
85
85
|
"@testing-library/dom": "10.4.1",
|
|
86
86
|
"@testing-library/jest-dom": "6.9.1",
|
|
87
87
|
"@testing-library/react": "16.3.2",
|
|
@@ -95,7 +95,7 @@
|
|
|
95
95
|
"react": "18.3.1",
|
|
96
96
|
"react-dom": "18.3.1",
|
|
97
97
|
"react-query": "3.39.3",
|
|
98
|
-
"react-router-dom": "6.30.
|
|
98
|
+
"react-router-dom": "6.30.4",
|
|
99
99
|
"styled-components": "6.4.1",
|
|
100
100
|
"typescript": "5.9.3"
|
|
101
101
|
},
|