@strapi/content-releases 5.58.0 → 5.59.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -25,6 +25,7 @@ function _interopNamespace(e) {
25
25
 
26
26
  var React__namespace = /*#__PURE__*/_interopNamespace(React);
27
27
 
28
+ const EMPTY_CUSTOM_INTERVALS = [];
28
29
  const intervals = [
29
30
  'years',
30
31
  'months',
@@ -46,7 +47,7 @@ const intervals = [
46
47
  * { unit: 'hours', threshold: 1, text: 'last hour' },
47
48
  * ]}
48
49
  * ```
49
- */ const RelativeTime = /*#__PURE__*/ React__namespace.forwardRef(({ timestamp, customIntervals = [], ...restProps }, forwardedRef)=>{
50
+ */ const RelativeTime = /*#__PURE__*/ React__namespace.forwardRef(({ timestamp, customIntervals = EMPTY_CUSTOM_INTERVALS, ...restProps }, forwardedRef)=>{
50
51
  const { formatRelativeTime, formatDate, formatTime } = reactIntl.useIntl();
51
52
  // Invalid Date: intervalToDuration throws RangeError (see #27382).
52
53
  if (!dateFns.isValid(timestamp)) {
@@ -1 +1 @@
1
- {"version":3,"file":"RelativeTime.js","sources":["../../../admin/src/components/RelativeTime.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Duration, intervalToDuration, isPast, isValid } from 'date-fns';\nimport { useIntl } from 'react-intl';\n\nconst intervals: Array<keyof Duration> = ['years', 'months', 'days', 'hours', 'minutes', 'seconds'];\n\ninterface CustomInterval {\n unit: keyof Duration;\n text: string;\n threshold: number;\n}\n\ninterface RelativeTimeProps extends React.ComponentPropsWithoutRef<'time'> {\n timestamp: Date;\n customIntervals?: CustomInterval[];\n}\n\n/**\n * Displays the relative time between a given timestamp and the current time.\n * You can display a custom message for given time intervals by passing an array of custom intervals.\n *\n * @example\n * ```jsx\n * <caption>Display \"last hour\" if the timestamp is less than an hour ago</caption>\n * <RelativeTime\n * timestamp={new Date('2021-01-01')}\n * customIntervals={[\n * { unit: 'hours', threshold: 1, text: 'last hour' },\n * ]}\n * ```\n */\nconst RelativeTime = React.forwardRef<HTMLTimeElement, RelativeTimeProps>(\n ({ timestamp, customIntervals = [], ...restProps }, forwardedRef) => {\n const { formatRelativeTime, formatDate, formatTime } = useIntl();\n\n // Invalid Date: intervalToDuration throws RangeError (see #27382).\n if (!isValid(timestamp)) {\n return (\n <time ref={forwardedRef} role=\"time\" {...restProps}>\n -\n </time>\n );\n }\n\n /**\n * TODO: make this auto-update, like a clock.\n */\n const interval = intervalToDuration({\n start: timestamp,\n end: Date.now(),\n // see https://github.com/date-fns/date-fns/issues/2891 – No idea why it's all partial it returns it every time.\n }) as Required<Duration>;\n\n const unit =\n intervals.find((intervalUnit) => {\n return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);\n }) ?? 'seconds';\n\n const value = interval[unit] ?? 0;\n const relativeTime = isPast(timestamp) ? -value : value;\n\n // Display custom text if interval is less than the threshold\n const customInterval = customIntervals.find(\n (custom) => interval[custom.unit] < custom.threshold\n );\n\n const displayText = customInterval\n ? customInterval.text\n : formatRelativeTime(relativeTime, unit, { numeric: 'auto' });\n\n return (\n <time\n ref={forwardedRef}\n dateTime={timestamp.toISOString()}\n role=\"time\"\n title={`${formatDate(timestamp)} ${formatTime(timestamp)}`}\n {...restProps}\n >\n {displayText}\n </time>\n );\n }\n);\n\nexport { RelativeTime };\nexport type { CustomInterval, RelativeTimeProps };\n"],"names":["intervals","RelativeTime","React","forwardRef","timestamp","customIntervals","restProps","forwardedRef","formatRelativeTime","formatDate","formatTime","useIntl","isValid","_jsx","time","ref","role","interval","intervalToDuration","start","end","Date","now","unit","find","intervalUnit","Object","keys","includes","value","relativeTime","isPast","customInterval","custom","threshold","displayText","text","numeric","dateTime","toISOString","title"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,MAAMA,SAAAA,GAAmC;AAAC,IAAA,OAAA;AAAS,IAAA,QAAA;AAAU,IAAA,MAAA;AAAQ,IAAA,OAAA;AAAS,IAAA,SAAA;AAAW,IAAA;AAAU,CAAA;AAanG;;;;;;;;;;;;;AAaC,IACD,MAAMC,YAAAA,iBAAeC,gBAAAA,CAAMC,UAAU,CACnC,CAAC,EAAEC,SAAS,EAAEC,eAAAA,GAAkB,EAAE,EAAE,GAAGC,WAAW,EAAEC,YAAAA,GAAAA;AAClD,IAAA,MAAM,EAAEC,kBAAkB,EAAEC,UAAU,EAAEC,UAAU,EAAE,GAAGC,iBAAAA,EAAAA;;IAGvD,IAAI,CAACC,gBAAQR,SAAAA,CAAAA,EAAY;AACvB,QAAA,qBACES,cAAA,CAACC,MAAAA,EAAAA;YAAKC,GAAAA,EAAKR,YAAAA;YAAcS,IAAAA,EAAK,MAAA;AAAQ,YAAA,GAAGV,SAAS;AAAE,YAAA,QAAA,EAAA;;AAIxD,IAAA;AAEA;;QAGA,MAAMW,WAAWC,0BAAAA,CAAmB;QAClCC,KAAAA,EAAOf,SAAAA;AACPgB,QAAAA,GAAAA,EAAKC,KAAKC,GAAG;AAEf,KAAA,CAAA;AAEA,IAAA,MAAMC,IAAAA,GACJvB,SAAAA,CAAUwB,IAAI,CAAC,CAACC,YAAAA,GAAAA;QACd,OAAOR,QAAQ,CAACQ,YAAAA,CAAa,GAAG,CAAA,IAAKC,OAAOC,IAAI,CAACV,QAAAA,CAAAA,CAAUW,QAAQ,CAACH,YAAAA,CAAAA;IACtE,CAAA,CAAA,IAAM,SAAA;AAER,IAAA,MAAMI,KAAAA,GAAQZ,QAAQ,CAACM,IAAAA,CAAK,IAAI,CAAA;AAChC,IAAA,MAAMO,YAAAA,GAAeC,cAAAA,CAAO3B,SAAAA,CAAAA,GAAa,CAACyB,KAAAA,GAAQA,KAAAA;;AAGlD,IAAA,MAAMG,cAAAA,GAAiB3B,eAAAA,CAAgBmB,IAAI,CACzC,CAACS,MAAAA,GAAWhB,QAAQ,CAACgB,MAAAA,CAAOV,IAAI,CAAC,GAAGU,OAAOC,SAAS,CAAA;AAGtD,IAAA,MAAMC,cAAcH,cAAAA,GAChBA,cAAAA,CAAeI,IAAI,GACnB5B,kBAAAA,CAAmBsB,cAAcP,IAAAA,EAAM;QAAEc,OAAAA,EAAS;AAAO,KAAA,CAAA;AAE7D,IAAA,qBACExB,cAAA,CAACC,MAAAA,EAAAA;QACCC,GAAAA,EAAKR,YAAAA;AACL+B,QAAAA,QAAAA,EAAUlC,UAAUmC,WAAW,EAAA;QAC/BvB,IAAAA,EAAK,MAAA;AACLwB,QAAAA,KAAAA,EAAO,GAAG/B,UAAAA,CAAWL,SAAAA,CAAAA,CAAW,CAAC,EAAEM,WAAWN,SAAAA,CAAAA,CAAAA,CAAY;AACzD,QAAA,GAAGE,SAAS;AAEZ6B,QAAAA,QAAAA,EAAAA;;AAGP,CAAA;;;;"}
1
+ {"version":3,"file":"RelativeTime.js","sources":["../../../admin/src/components/RelativeTime.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Duration, intervalToDuration, isPast, isValid } from 'date-fns';\nimport { useIntl } from 'react-intl';\n\nconst EMPTY_CUSTOM_INTERVALS: NonNullable<RelativeTimeProps['customIntervals']> = [];\n\nconst intervals: Array<keyof Duration> = ['years', 'months', 'days', 'hours', 'minutes', 'seconds'];\n\ninterface CustomInterval {\n unit: keyof Duration;\n text: string;\n threshold: number;\n}\n\ninterface RelativeTimeProps extends React.ComponentPropsWithoutRef<'time'> {\n timestamp: Date;\n customIntervals?: CustomInterval[];\n}\n\n/**\n * Displays the relative time between a given timestamp and the current time.\n * You can display a custom message for given time intervals by passing an array of custom intervals.\n *\n * @example\n * ```jsx\n * <caption>Display \"last hour\" if the timestamp is less than an hour ago</caption>\n * <RelativeTime\n * timestamp={new Date('2021-01-01')}\n * customIntervals={[\n * { unit: 'hours', threshold: 1, text: 'last hour' },\n * ]}\n * ```\n */\nconst RelativeTime = React.forwardRef<HTMLTimeElement, RelativeTimeProps>(\n ({ timestamp, customIntervals = EMPTY_CUSTOM_INTERVALS, ...restProps }, forwardedRef) => {\n const { formatRelativeTime, formatDate, formatTime } = useIntl();\n\n // Invalid Date: intervalToDuration throws RangeError (see #27382).\n if (!isValid(timestamp)) {\n return (\n <time ref={forwardedRef} role=\"time\" {...restProps}>\n -\n </time>\n );\n }\n\n /**\n * TODO: make this auto-update, like a clock.\n */\n const interval = intervalToDuration({\n start: timestamp,\n end: Date.now(),\n // see https://github.com/date-fns/date-fns/issues/2891 – No idea why it's all partial it returns it every time.\n }) as Required<Duration>;\n\n const unit =\n intervals.find((intervalUnit) => {\n return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);\n }) ?? 'seconds';\n\n const value = interval[unit] ?? 0;\n const relativeTime = isPast(timestamp) ? -value : value;\n\n // Display custom text if interval is less than the threshold\n const customInterval = customIntervals.find(\n (custom) => interval[custom.unit] < custom.threshold\n );\n\n const displayText = customInterval\n ? customInterval.text\n : formatRelativeTime(relativeTime, unit, { numeric: 'auto' });\n\n return (\n <time\n ref={forwardedRef}\n dateTime={timestamp.toISOString()}\n role=\"time\"\n title={`${formatDate(timestamp)} ${formatTime(timestamp)}`}\n {...restProps}\n >\n {displayText}\n </time>\n );\n }\n);\n\nexport { RelativeTime };\nexport type { CustomInterval, RelativeTimeProps };\n"],"names":["EMPTY_CUSTOM_INTERVALS","intervals","RelativeTime","React","forwardRef","timestamp","customIntervals","restProps","forwardedRef","formatRelativeTime","formatDate","formatTime","useIntl","isValid","_jsx","time","ref","role","interval","intervalToDuration","start","end","Date","now","unit","find","intervalUnit","Object","keys","includes","value","relativeTime","isPast","customInterval","custom","threshold","displayText","text","numeric","dateTime","toISOString","title"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,MAAMA,yBAA4E,EAAE;AAEpF,MAAMC,SAAAA,GAAmC;AAAC,IAAA,OAAA;AAAS,IAAA,QAAA;AAAU,IAAA,MAAA;AAAQ,IAAA,OAAA;AAAS,IAAA,SAAA;AAAW,IAAA;AAAU,CAAA;AAanG;;;;;;;;;;;;;AAaC,IACD,MAAMC,YAAAA,iBAAeC,gBAAAA,CAAMC,UAAU,CACnC,CAAC,EAAEC,SAAS,EAAEC,eAAAA,GAAkBN,sBAAsB,EAAE,GAAGO,WAAW,EAAEC,YAAAA,GAAAA;AACtE,IAAA,MAAM,EAAEC,kBAAkB,EAAEC,UAAU,EAAEC,UAAU,EAAE,GAAGC,iBAAAA,EAAAA;;IAGvD,IAAI,CAACC,gBAAQR,SAAAA,CAAAA,EAAY;AACvB,QAAA,qBACES,cAAA,CAACC,MAAAA,EAAAA;YAAKC,GAAAA,EAAKR,YAAAA;YAAcS,IAAAA,EAAK,MAAA;AAAQ,YAAA,GAAGV,SAAS;AAAE,YAAA,QAAA,EAAA;;AAIxD,IAAA;AAEA;;QAGA,MAAMW,WAAWC,0BAAAA,CAAmB;QAClCC,KAAAA,EAAOf,SAAAA;AACPgB,QAAAA,GAAAA,EAAKC,KAAKC,GAAG;AAEf,KAAA,CAAA;AAEA,IAAA,MAAMC,IAAAA,GACJvB,SAAAA,CAAUwB,IAAI,CAAC,CAACC,YAAAA,GAAAA;QACd,OAAOR,QAAQ,CAACQ,YAAAA,CAAa,GAAG,CAAA,IAAKC,OAAOC,IAAI,CAACV,QAAAA,CAAAA,CAAUW,QAAQ,CAACH,YAAAA,CAAAA;IACtE,CAAA,CAAA,IAAM,SAAA;AAER,IAAA,MAAMI,KAAAA,GAAQZ,QAAQ,CAACM,IAAAA,CAAK,IAAI,CAAA;AAChC,IAAA,MAAMO,YAAAA,GAAeC,cAAAA,CAAO3B,SAAAA,CAAAA,GAAa,CAACyB,KAAAA,GAAQA,KAAAA;;AAGlD,IAAA,MAAMG,cAAAA,GAAiB3B,eAAAA,CAAgBmB,IAAI,CACzC,CAACS,MAAAA,GAAWhB,QAAQ,CAACgB,MAAAA,CAAOV,IAAI,CAAC,GAAGU,OAAOC,SAAS,CAAA;AAGtD,IAAA,MAAMC,cAAcH,cAAAA,GAChBA,cAAAA,CAAeI,IAAI,GACnB5B,kBAAAA,CAAmBsB,cAAcP,IAAAA,EAAM;QAAEc,OAAAA,EAAS;AAAO,KAAA,CAAA;AAE7D,IAAA,qBACExB,cAAA,CAACC,MAAAA,EAAAA;QACCC,GAAAA,EAAKR,YAAAA;AACL+B,QAAAA,QAAAA,EAAUlC,UAAUmC,WAAW,EAAA;QAC/BvB,IAAAA,EAAK,MAAA;AACLwB,QAAAA,KAAAA,EAAO,GAAG/B,UAAAA,CAAWL,SAAAA,CAAAA,CAAW,CAAC,EAAEM,WAAWN,SAAAA,CAAAA,CAAAA,CAAY;AACzD,QAAA,GAAGE,SAAS;AAEZ6B,QAAAA,QAAAA,EAAAA;;AAGP,CAAA;;;;"}
@@ -3,6 +3,7 @@ import * as React from 'react';
3
3
  import { isValid, intervalToDuration, isPast } from 'date-fns';
4
4
  import { useIntl } from 'react-intl';
5
5
 
6
+ const EMPTY_CUSTOM_INTERVALS = [];
6
7
  const intervals = [
7
8
  'years',
8
9
  'months',
@@ -24,7 +25,7 @@ const intervals = [
24
25
  * { unit: 'hours', threshold: 1, text: 'last hour' },
25
26
  * ]}
26
27
  * ```
27
- */ const RelativeTime = /*#__PURE__*/ React.forwardRef(({ timestamp, customIntervals = [], ...restProps }, forwardedRef)=>{
28
+ */ const RelativeTime = /*#__PURE__*/ React.forwardRef(({ timestamp, customIntervals = EMPTY_CUSTOM_INTERVALS, ...restProps }, forwardedRef)=>{
28
29
  const { formatRelativeTime, formatDate, formatTime } = useIntl();
29
30
  // Invalid Date: intervalToDuration throws RangeError (see #27382).
30
31
  if (!isValid(timestamp)) {
@@ -1 +1 @@
1
- {"version":3,"file":"RelativeTime.mjs","sources":["../../../admin/src/components/RelativeTime.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Duration, intervalToDuration, isPast, isValid } from 'date-fns';\nimport { useIntl } from 'react-intl';\n\nconst intervals: Array<keyof Duration> = ['years', 'months', 'days', 'hours', 'minutes', 'seconds'];\n\ninterface CustomInterval {\n unit: keyof Duration;\n text: string;\n threshold: number;\n}\n\ninterface RelativeTimeProps extends React.ComponentPropsWithoutRef<'time'> {\n timestamp: Date;\n customIntervals?: CustomInterval[];\n}\n\n/**\n * Displays the relative time between a given timestamp and the current time.\n * You can display a custom message for given time intervals by passing an array of custom intervals.\n *\n * @example\n * ```jsx\n * <caption>Display \"last hour\" if the timestamp is less than an hour ago</caption>\n * <RelativeTime\n * timestamp={new Date('2021-01-01')}\n * customIntervals={[\n * { unit: 'hours', threshold: 1, text: 'last hour' },\n * ]}\n * ```\n */\nconst RelativeTime = React.forwardRef<HTMLTimeElement, RelativeTimeProps>(\n ({ timestamp, customIntervals = [], ...restProps }, forwardedRef) => {\n const { formatRelativeTime, formatDate, formatTime } = useIntl();\n\n // Invalid Date: intervalToDuration throws RangeError (see #27382).\n if (!isValid(timestamp)) {\n return (\n <time ref={forwardedRef} role=\"time\" {...restProps}>\n -\n </time>\n );\n }\n\n /**\n * TODO: make this auto-update, like a clock.\n */\n const interval = intervalToDuration({\n start: timestamp,\n end: Date.now(),\n // see https://github.com/date-fns/date-fns/issues/2891 – No idea why it's all partial it returns it every time.\n }) as Required<Duration>;\n\n const unit =\n intervals.find((intervalUnit) => {\n return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);\n }) ?? 'seconds';\n\n const value = interval[unit] ?? 0;\n const relativeTime = isPast(timestamp) ? -value : value;\n\n // Display custom text if interval is less than the threshold\n const customInterval = customIntervals.find(\n (custom) => interval[custom.unit] < custom.threshold\n );\n\n const displayText = customInterval\n ? customInterval.text\n : formatRelativeTime(relativeTime, unit, { numeric: 'auto' });\n\n return (\n <time\n ref={forwardedRef}\n dateTime={timestamp.toISOString()}\n role=\"time\"\n title={`${formatDate(timestamp)} ${formatTime(timestamp)}`}\n {...restProps}\n >\n {displayText}\n </time>\n );\n }\n);\n\nexport { RelativeTime };\nexport type { CustomInterval, RelativeTimeProps };\n"],"names":["intervals","RelativeTime","React","forwardRef","timestamp","customIntervals","restProps","forwardedRef","formatRelativeTime","formatDate","formatTime","useIntl","isValid","_jsx","time","ref","role","interval","intervalToDuration","start","end","Date","now","unit","find","intervalUnit","Object","keys","includes","value","relativeTime","isPast","customInterval","custom","threshold","displayText","text","numeric","dateTime","toISOString","title"],"mappings":";;;;;AAKA,MAAMA,SAAAA,GAAmC;AAAC,IAAA,OAAA;AAAS,IAAA,QAAA;AAAU,IAAA,MAAA;AAAQ,IAAA,OAAA;AAAS,IAAA,SAAA;AAAW,IAAA;AAAU,CAAA;AAanG;;;;;;;;;;;;;AAaC,IACD,MAAMC,YAAAA,iBAAeC,KAAAA,CAAMC,UAAU,CACnC,CAAC,EAAEC,SAAS,EAAEC,eAAAA,GAAkB,EAAE,EAAE,GAAGC,WAAW,EAAEC,YAAAA,GAAAA;AAClD,IAAA,MAAM,EAAEC,kBAAkB,EAAEC,UAAU,EAAEC,UAAU,EAAE,GAAGC,OAAAA,EAAAA;;IAGvD,IAAI,CAACC,QAAQR,SAAAA,CAAAA,EAAY;AACvB,QAAA,qBACES,GAAA,CAACC,MAAAA,EAAAA;YAAKC,GAAAA,EAAKR,YAAAA;YAAcS,IAAAA,EAAK,MAAA;AAAQ,YAAA,GAAGV,SAAS;AAAE,YAAA,QAAA,EAAA;;AAIxD,IAAA;AAEA;;QAGA,MAAMW,WAAWC,kBAAAA,CAAmB;QAClCC,KAAAA,EAAOf,SAAAA;AACPgB,QAAAA,GAAAA,EAAKC,KAAKC,GAAG;AAEf,KAAA,CAAA;AAEA,IAAA,MAAMC,IAAAA,GACJvB,SAAAA,CAAUwB,IAAI,CAAC,CAACC,YAAAA,GAAAA;QACd,OAAOR,QAAQ,CAACQ,YAAAA,CAAa,GAAG,CAAA,IAAKC,OAAOC,IAAI,CAACV,QAAAA,CAAAA,CAAUW,QAAQ,CAACH,YAAAA,CAAAA;IACtE,CAAA,CAAA,IAAM,SAAA;AAER,IAAA,MAAMI,KAAAA,GAAQZ,QAAQ,CAACM,IAAAA,CAAK,IAAI,CAAA;AAChC,IAAA,MAAMO,YAAAA,GAAeC,MAAAA,CAAO3B,SAAAA,CAAAA,GAAa,CAACyB,KAAAA,GAAQA,KAAAA;;AAGlD,IAAA,MAAMG,cAAAA,GAAiB3B,eAAAA,CAAgBmB,IAAI,CACzC,CAACS,MAAAA,GAAWhB,QAAQ,CAACgB,MAAAA,CAAOV,IAAI,CAAC,GAAGU,OAAOC,SAAS,CAAA;AAGtD,IAAA,MAAMC,cAAcH,cAAAA,GAChBA,cAAAA,CAAeI,IAAI,GACnB5B,kBAAAA,CAAmBsB,cAAcP,IAAAA,EAAM;QAAEc,OAAAA,EAAS;AAAO,KAAA,CAAA;AAE7D,IAAA,qBACExB,GAAA,CAACC,MAAAA,EAAAA;QACCC,GAAAA,EAAKR,YAAAA;AACL+B,QAAAA,QAAAA,EAAUlC,UAAUmC,WAAW,EAAA;QAC/BvB,IAAAA,EAAK,MAAA;AACLwB,QAAAA,KAAAA,EAAO,GAAG/B,UAAAA,CAAWL,SAAAA,CAAAA,CAAW,CAAC,EAAEM,WAAWN,SAAAA,CAAAA,CAAAA,CAAY;AACzD,QAAA,GAAGE,SAAS;AAEZ6B,QAAAA,QAAAA,EAAAA;;AAGP,CAAA;;;;"}
1
+ {"version":3,"file":"RelativeTime.mjs","sources":["../../../admin/src/components/RelativeTime.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Duration, intervalToDuration, isPast, isValid } from 'date-fns';\nimport { useIntl } from 'react-intl';\n\nconst EMPTY_CUSTOM_INTERVALS: NonNullable<RelativeTimeProps['customIntervals']> = [];\n\nconst intervals: Array<keyof Duration> = ['years', 'months', 'days', 'hours', 'minutes', 'seconds'];\n\ninterface CustomInterval {\n unit: keyof Duration;\n text: string;\n threshold: number;\n}\n\ninterface RelativeTimeProps extends React.ComponentPropsWithoutRef<'time'> {\n timestamp: Date;\n customIntervals?: CustomInterval[];\n}\n\n/**\n * Displays the relative time between a given timestamp and the current time.\n * You can display a custom message for given time intervals by passing an array of custom intervals.\n *\n * @example\n * ```jsx\n * <caption>Display \"last hour\" if the timestamp is less than an hour ago</caption>\n * <RelativeTime\n * timestamp={new Date('2021-01-01')}\n * customIntervals={[\n * { unit: 'hours', threshold: 1, text: 'last hour' },\n * ]}\n * ```\n */\nconst RelativeTime = React.forwardRef<HTMLTimeElement, RelativeTimeProps>(\n ({ timestamp, customIntervals = EMPTY_CUSTOM_INTERVALS, ...restProps }, forwardedRef) => {\n const { formatRelativeTime, formatDate, formatTime } = useIntl();\n\n // Invalid Date: intervalToDuration throws RangeError (see #27382).\n if (!isValid(timestamp)) {\n return (\n <time ref={forwardedRef} role=\"time\" {...restProps}>\n -\n </time>\n );\n }\n\n /**\n * TODO: make this auto-update, like a clock.\n */\n const interval = intervalToDuration({\n start: timestamp,\n end: Date.now(),\n // see https://github.com/date-fns/date-fns/issues/2891 – No idea why it's all partial it returns it every time.\n }) as Required<Duration>;\n\n const unit =\n intervals.find((intervalUnit) => {\n return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);\n }) ?? 'seconds';\n\n const value = interval[unit] ?? 0;\n const relativeTime = isPast(timestamp) ? -value : value;\n\n // Display custom text if interval is less than the threshold\n const customInterval = customIntervals.find(\n (custom) => interval[custom.unit] < custom.threshold\n );\n\n const displayText = customInterval\n ? customInterval.text\n : formatRelativeTime(relativeTime, unit, { numeric: 'auto' });\n\n return (\n <time\n ref={forwardedRef}\n dateTime={timestamp.toISOString()}\n role=\"time\"\n title={`${formatDate(timestamp)} ${formatTime(timestamp)}`}\n {...restProps}\n >\n {displayText}\n </time>\n );\n }\n);\n\nexport { RelativeTime };\nexport type { CustomInterval, RelativeTimeProps };\n"],"names":["EMPTY_CUSTOM_INTERVALS","intervals","RelativeTime","React","forwardRef","timestamp","customIntervals","restProps","forwardedRef","formatRelativeTime","formatDate","formatTime","useIntl","isValid","_jsx","time","ref","role","interval","intervalToDuration","start","end","Date","now","unit","find","intervalUnit","Object","keys","includes","value","relativeTime","isPast","customInterval","custom","threshold","displayText","text","numeric","dateTime","toISOString","title"],"mappings":";;;;;AAKA,MAAMA,yBAA4E,EAAE;AAEpF,MAAMC,SAAAA,GAAmC;AAAC,IAAA,OAAA;AAAS,IAAA,QAAA;AAAU,IAAA,MAAA;AAAQ,IAAA,OAAA;AAAS,IAAA,SAAA;AAAW,IAAA;AAAU,CAAA;AAanG;;;;;;;;;;;;;AAaC,IACD,MAAMC,YAAAA,iBAAeC,KAAAA,CAAMC,UAAU,CACnC,CAAC,EAAEC,SAAS,EAAEC,eAAAA,GAAkBN,sBAAsB,EAAE,GAAGO,WAAW,EAAEC,YAAAA,GAAAA;AACtE,IAAA,MAAM,EAAEC,kBAAkB,EAAEC,UAAU,EAAEC,UAAU,EAAE,GAAGC,OAAAA,EAAAA;;IAGvD,IAAI,CAACC,QAAQR,SAAAA,CAAAA,EAAY;AACvB,QAAA,qBACES,GAAA,CAACC,MAAAA,EAAAA;YAAKC,GAAAA,EAAKR,YAAAA;YAAcS,IAAAA,EAAK,MAAA;AAAQ,YAAA,GAAGV,SAAS;AAAE,YAAA,QAAA,EAAA;;AAIxD,IAAA;AAEA;;QAGA,MAAMW,WAAWC,kBAAAA,CAAmB;QAClCC,KAAAA,EAAOf,SAAAA;AACPgB,QAAAA,GAAAA,EAAKC,KAAKC,GAAG;AAEf,KAAA,CAAA;AAEA,IAAA,MAAMC,IAAAA,GACJvB,SAAAA,CAAUwB,IAAI,CAAC,CAACC,YAAAA,GAAAA;QACd,OAAOR,QAAQ,CAACQ,YAAAA,CAAa,GAAG,CAAA,IAAKC,OAAOC,IAAI,CAACV,QAAAA,CAAAA,CAAUW,QAAQ,CAACH,YAAAA,CAAAA;IACtE,CAAA,CAAA,IAAM,SAAA;AAER,IAAA,MAAMI,KAAAA,GAAQZ,QAAQ,CAACM,IAAAA,CAAK,IAAI,CAAA;AAChC,IAAA,MAAMO,YAAAA,GAAeC,MAAAA,CAAO3B,SAAAA,CAAAA,GAAa,CAACyB,KAAAA,GAAQA,KAAAA;;AAGlD,IAAA,MAAMG,cAAAA,GAAiB3B,eAAAA,CAAgBmB,IAAI,CACzC,CAACS,MAAAA,GAAWhB,QAAQ,CAACgB,MAAAA,CAAOV,IAAI,CAAC,GAAGU,OAAOC,SAAS,CAAA;AAGtD,IAAA,MAAMC,cAAcH,cAAAA,GAChBA,cAAAA,CAAeI,IAAI,GACnB5B,kBAAAA,CAAmBsB,cAAcP,IAAAA,EAAM;QAAEc,OAAAA,EAAS;AAAO,KAAA,CAAA;AAE7D,IAAA,qBACExB,GAAA,CAACC,MAAAA,EAAAA;QACCC,GAAAA,EAAKR,YAAAA;AACL+B,QAAAA,QAAAA,EAAUlC,UAAUmC,WAAW,EAAA;QAC/BvB,IAAAA,EAAK,MAAA;AACLwB,QAAAA,KAAAA,EAAO,GAAG/B,UAAAA,CAAWL,SAAAA,CAAAA,CAAW,CAAC,EAAEM,WAAWN,SAAAA,CAAAA,CAAAA,CAAY;AACzD,QAAA,GAAGE,SAAS;AAEZ6B,QAAAA,QAAAA,EAAAA;;AAGP,CAAA;;;;"}
@@ -36,6 +36,7 @@ function _interopNamespace(e) {
36
36
 
37
37
  var React__namespace = /*#__PURE__*/_interopNamespace(React);
38
38
 
39
+ const EMPTY_RELEASES = [];
39
40
  const LinkCard = styledComponents.styled(designSystem.Link)`
40
41
  display: block;
41
42
  `;
@@ -70,7 +71,7 @@ const getBadgeProps = (status)=>{
70
71
  borderColor: `${color}200`
71
72
  };
72
73
  };
73
- const ReleasesGrid = ({ sectionTitle, releases = [], isError = false })=>{
74
+ const ReleasesGrid = ({ sectionTitle, releases = EMPTY_RELEASES, isError = false })=>{
74
75
  const { formatMessage } = reactIntl.useIntl();
75
76
  if (isError) {
76
77
  return /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Page.Error, {});
@@ -1 +1 @@
1
- {"version":3,"file":"ReleasesPage.js","sources":["../../../admin/src/pages/ReleasesPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Page,\n Pagination,\n useTracking,\n useAPIErrorHandler,\n useNotification,\n useQueryParams,\n useRBAC,\n isFetchError,\n Layouts,\n GradientBadge,\n} from '@strapi/admin/strapi-admin';\nimport { useLicenseLimits } from '@strapi/admin/strapi-admin/ee';\nimport {\n Alert,\n Badge,\n Box,\n Button,\n Divider,\n EmptyStateLayout,\n Flex,\n Grid,\n Main,\n Tabs,\n Typography,\n Link,\n} from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { EmptyDocuments } from '@strapi/icons/symbols';\nimport { format } from 'date-fns';\nimport { useIntl } from 'react-intl';\nimport { useNavigate, useLocation, NavLink } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { GetReleases, type Release } from '../../../shared/contracts/releases';\nimport { RelativeTime as BaseRelativeTime } from '../components/RelativeTime';\nimport { ReleaseModal, FormValues } from '../components/ReleaseModal';\nimport { PERMISSIONS } from '../constants';\nimport {\n useGetReleasesQuery,\n useGetReleaseSettingsQuery,\n GetReleasesQueryParams,\n useCreateReleaseMutation,\n} from '../services/release';\n\n/* -------------------------------------------------------------------------------------------------\n * ReleasesGrid\n * -----------------------------------------------------------------------------------------------*/\ninterface ReleasesGridProps {\n sectionTitle: 'pending' | 'done';\n releases?: GetReleases.Response['data'];\n isError?: boolean;\n}\n\nconst LinkCard = styled(Link)`\n display: block;\n`;\n\nconst RelativeTime = styled(BaseRelativeTime)`\n display: inline-block;\n &::first-letter {\n text-transform: uppercase;\n }\n`;\n\nconst getBadgeProps = (status: Release['status']) => {\n let color;\n switch (status) {\n case 'ready':\n color = 'success';\n break;\n case 'blocked':\n color = 'warning';\n break;\n case 'failed':\n color = 'danger';\n break;\n case 'done':\n color = 'primary';\n break;\n case 'empty':\n default:\n color = 'neutral';\n }\n\n return {\n textColor: `${color}600`,\n backgroundColor: `${color}100`,\n borderColor: `${color}200`,\n };\n};\n\nconst ReleasesGrid = ({ sectionTitle, releases = [], isError = false }: ReleasesGridProps) => {\n const { formatMessage } = useIntl();\n\n if (isError) {\n return <Page.Error />;\n }\n\n if (releases?.length === 0) {\n return (\n <EmptyStateLayout\n content={formatMessage(\n {\n id: 'content-releases.page.Releases.tab.emptyEntries',\n defaultMessage: 'No releases',\n },\n {\n target: sectionTitle,\n }\n )}\n icon={<EmptyDocuments width=\"16rem\" />}\n />\n );\n }\n\n return (\n <Grid.Root gap={4}>\n {releases.map(({ id, name, scheduledAt, status }) => (\n <Grid.Item col={3} s={6} xs={12} key={id} direction=\"column\" alignItems=\"stretch\">\n <LinkCard tag={NavLink} to={`${id}`} isExternal={false}>\n <Flex\n direction=\"column\"\n justifyContent=\"space-between\"\n padding={4}\n hasRadius\n background=\"neutral0\"\n shadow=\"tableShadow\"\n height=\"100%\"\n width=\"100%\"\n alignItems=\"start\"\n gap={4}\n >\n <Flex direction=\"column\" alignItems=\"start\" gap={1}>\n <Typography textColor=\"neutral800\" tag=\"h3\" variant=\"delta\" fontWeight=\"bold\">\n {name}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {scheduledAt ? (\n <RelativeTime timestamp={new Date(scheduledAt)} />\n ) : (\n formatMessage({\n id: 'content-releases.pages.Releases.not-scheduled',\n defaultMessage: 'Not scheduled',\n })\n )}\n </Typography>\n </Flex>\n <Badge {...getBadgeProps(status)}>{status}</Badge>\n </Flex>\n </LinkCard>\n </Grid.Item>\n ))}\n </Grid.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ReleasesPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledAlert = styled(Alert)`\n button {\n display: none;\n }\n p + div {\n margin-left: auto;\n }\n`;\n\nconst INITIAL_FORM_VALUES = {\n name: '',\n date: format(new Date(), 'yyyy-MM-dd'),\n time: '',\n isScheduled: true,\n scheduledAt: null,\n timezone: null,\n} satisfies FormValues;\n\nconst ReleasesPage = () => {\n const location = useLocation();\n const [releaseModalShown, setReleaseModalShown] = React.useState(false);\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const navigate = useNavigate();\n const { formatAPIError } = useAPIErrorHandler();\n const [{ query }, setQuery] = useQueryParams<GetReleasesQueryParams>();\n const response = useGetReleasesQuery(query);\n const { data, isLoading: isLoadingSettings } = useGetReleaseSettingsQuery();\n const [createRelease, { isLoading: isSubmittingForm }] = useCreateReleaseMutation();\n const { getFeature } = useLicenseLimits();\n const { maximumReleases = 3 } = getFeature('cms-content-releases') as {\n maximumReleases: number;\n };\n const { trackUsage } = useTracking();\n const {\n allowedActions: { canCreate },\n } = useRBAC(PERMISSIONS);\n\n const { isLoading: isLoadingReleases, isSuccess, isError } = response;\n const activeTab = response?.currentData?.meta?.activeTab || 'pending';\n\n // Check if we have some errors and show a notification to the user to explain the error\n React.useEffect(() => {\n if (location?.state?.errors) {\n toggleNotification({\n type: 'danger',\n title: formatMessage({\n id: 'content-releases.pages.Releases.notification.error.title',\n defaultMessage: 'Your request could not be processed.',\n }),\n message: formatMessage({\n id: 'content-releases.pages.Releases.notification.error.message',\n defaultMessage: 'Please try again or open another release.',\n }),\n });\n navigate('', { replace: true, state: null });\n }\n }, [formatMessage, location?.state?.errors, navigate, toggleNotification]);\n\n const toggleAddReleaseModal = () => {\n setReleaseModalShown((prev) => !prev);\n };\n\n if (isLoadingReleases || isLoadingSettings) {\n return <Page.Loading />;\n }\n\n const totalPendingReleases = (isSuccess && response.currentData?.meta?.pendingReleasesCount) || 0;\n const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;\n\n const handleTabChange = (tabValue: string) => {\n setQuery({\n page: 1,\n pageSize: response?.currentData?.meta?.pagination?.pageSize || 16,\n filters: {\n releasedAt: {\n $notNull: tabValue !== 'pending',\n },\n },\n });\n };\n\n const handleAddRelease = async ({ name, scheduledAt, timezone }: FormValues) => {\n const response = await createRelease({\n name,\n scheduledAt,\n timezone,\n });\n if ('data' in response) {\n // When the response returns an object with 'data', handle success\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'content-releases.modal.release-created-notification-success',\n defaultMessage: 'Release created.',\n }),\n });\n\n trackUsage('didCreateRelease');\n navigate(response.data.data.id.toString());\n } else if (isFetchError(response.error)) {\n // When the response returns an object with 'error', handle fetch error\n toggleNotification({\n type: 'danger',\n message: formatAPIError(response.error),\n });\n } else {\n // Otherwise, the response returns an object with 'error', handle a generic error\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n return (\n <Layouts.Root>\n <Main aria-busy={isLoadingReleases || isLoadingSettings}>\n <Layouts.Header\n title={formatMessage({\n id: 'content-releases.pages.Releases.title',\n defaultMessage: 'Releases',\n })}\n secondaryAction={\n <GradientBadge\n label={formatMessage({\n id: 'components.premiumFeature.title',\n defaultMessage: 'Premium feature',\n })}\n />\n }\n subtitle={formatMessage({\n id: 'content-releases.pages.Releases.header-subtitle',\n defaultMessage: 'Create and manage content updates',\n })}\n primaryAction={\n canCreate ? (\n <Button\n startIcon={<Plus />}\n onClick={toggleAddReleaseModal}\n disabled={hasReachedMaximumPendingReleases}\n fullWidth\n >\n {formatMessage({\n id: 'content-releases.header.actions.add-release',\n defaultMessage: 'New release',\n })}\n </Button>\n ) : null\n }\n />\n <Layouts.Content>\n <>\n {hasReachedMaximumPendingReleases && (\n <StyledAlert\n marginBottom={6}\n action={\n <Link href=\"https://strapi.io/pricing-cloud\" isExternal>\n {formatMessage({\n id: 'content-releases.pages.Releases.max-limit-reached.action',\n defaultMessage: 'Explore plans',\n })}\n </Link>\n }\n title={formatMessage(\n {\n id: 'content-releases.pages.Releases.max-limit-reached.title',\n defaultMessage:\n 'You have reached the {number} pending {number, plural, one {release} other {releases}} limit.',\n },\n { number: maximumReleases }\n )}\n onClose={() => {}}\n closeLabel=\"\"\n >\n {formatMessage({\n id: 'content-releases.pages.Releases.max-limit-reached.message',\n defaultMessage: 'Upgrade to manage an unlimited number of releases.',\n })}\n </StyledAlert>\n )}\n <Tabs.Root variant=\"simple\" onValueChange={handleTabChange} value={activeTab}>\n <Box paddingBottom={8}>\n <Tabs.List\n aria-label={formatMessage({\n id: 'content-releases.pages.Releases.tab-group.label',\n defaultMessage: 'Releases list',\n })}\n >\n <Tabs.Trigger value=\"pending\">\n {formatMessage(\n {\n id: 'content-releases.pages.Releases.tab.pending',\n defaultMessage: 'Pending ({count})',\n },\n {\n count: totalPendingReleases,\n }\n )}\n </Tabs.Trigger>\n <Tabs.Trigger value=\"done\">\n {formatMessage({\n id: 'content-releases.pages.Releases.tab.done',\n defaultMessage: 'Done',\n })}\n </Tabs.Trigger>\n </Tabs.List>\n <Divider />\n </Box>\n {/* Pending releases */}\n <Tabs.Content value=\"pending\">\n <ReleasesGrid\n sectionTitle=\"pending\"\n releases={response?.currentData?.data}\n isError={isError}\n />\n </Tabs.Content>\n {/* Done releases */}\n <Tabs.Content value=\"done\">\n <ReleasesGrid\n sectionTitle=\"done\"\n releases={response?.currentData?.data}\n isError={isError}\n />\n </Tabs.Content>\n </Tabs.Root>\n <Pagination.Root\n {...response?.currentData?.meta?.pagination}\n defaultPageSize={response?.currentData?.meta?.pagination?.pageSize}\n >\n <Pagination.PageSize options={['8', '16', '32', '64']} />\n <Pagination.Links />\n </Pagination.Root>\n </>\n </Layouts.Content>\n <ReleaseModal\n open={releaseModalShown}\n handleClose={toggleAddReleaseModal}\n handleSubmit={handleAddRelease}\n isLoading={isSubmittingForm}\n initialValues={{\n ...INITIAL_FORM_VALUES,\n timezone: data?.data.defaultTimezone ? data.data.defaultTimezone.split('&')[1] : null,\n }}\n />\n </Main>\n </Layouts.Root>\n );\n};\n\nexport { ReleasesPage, getBadgeProps };\n"],"names":["LinkCard","styled","Link","RelativeTime","BaseRelativeTime","getBadgeProps","status","color","textColor","backgroundColor","borderColor","ReleasesGrid","sectionTitle","releases","isError","formatMessage","useIntl","_jsx","Page","Error","length","EmptyStateLayout","content","id","defaultMessage","target","icon","EmptyDocuments","width","Grid","Root","gap","map","name","scheduledAt","Item","col","s","xs","direction","alignItems","tag","NavLink","to","isExternal","_jsxs","Flex","justifyContent","padding","hasRadius","background","shadow","height","Typography","variant","fontWeight","timestamp","Date","Badge","StyledAlert","Alert","INITIAL_FORM_VALUES","date","format","time","isScheduled","timezone","ReleasesPage","location","useLocation","releaseModalShown","setReleaseModalShown","React","useState","toggleNotification","useNotification","navigate","useNavigate","formatAPIError","useAPIErrorHandler","query","setQuery","useQueryParams","response","useGetReleasesQuery","data","isLoading","isLoadingSettings","useGetReleaseSettingsQuery","createRelease","isSubmittingForm","useCreateReleaseMutation","getFeature","useLicenseLimits","maximumReleases","trackUsage","useTracking","allowedActions","canCreate","useRBAC","PERMISSIONS","isLoadingReleases","isSuccess","activeTab","currentData","meta","useEffect","state","errors","type","title","message","replace","toggleAddReleaseModal","prev","Loading","totalPendingReleases","pendingReleasesCount","hasReachedMaximumPendingReleases","handleTabChange","tabValue","page","pageSize","pagination","filters","releasedAt","$notNull","handleAddRelease","toString","isFetchError","error","Layouts","Main","aria-busy","Header","secondaryAction","GradientBadge","label","subtitle","primaryAction","Button","startIcon","Plus","onClick","disabled","fullWidth","Content","_Fragment","marginBottom","action","href","number","onClose","closeLabel","Tabs","onValueChange","value","Box","paddingBottom","List","aria-label","Trigger","count","Divider","Pagination","defaultPageSize","PageSize","options","Links","ReleaseModal","open","handleClose","handleSubmit","initialValues","defaultTimezone","split"],"mappings":"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"}
1
+ {"version":3,"file":"ReleasesPage.js","sources":["../../../admin/src/pages/ReleasesPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Page,\n Pagination,\n useTracking,\n useAPIErrorHandler,\n useNotification,\n useQueryParams,\n useRBAC,\n isFetchError,\n Layouts,\n GradientBadge,\n} from '@strapi/admin/strapi-admin';\nimport { useLicenseLimits } from '@strapi/admin/strapi-admin/ee';\nimport {\n Alert,\n Badge,\n Box,\n Button,\n Divider,\n EmptyStateLayout,\n Flex,\n Grid,\n Main,\n Tabs,\n Typography,\n Link,\n} from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { EmptyDocuments } from '@strapi/icons/symbols';\nimport { format } from 'date-fns';\nimport { useIntl } from 'react-intl';\nimport { useNavigate, useLocation, NavLink } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { GetReleases, type Release } from '../../../shared/contracts/releases';\nimport { RelativeTime as BaseRelativeTime } from '../components/RelativeTime';\nimport { ReleaseModal, FormValues } from '../components/ReleaseModal';\nimport { PERMISSIONS } from '../constants';\nimport {\n useGetReleasesQuery,\n useGetReleaseSettingsQuery,\n GetReleasesQueryParams,\n useCreateReleaseMutation,\n} from '../services/release';\n\nconst EMPTY_RELEASES: NonNullable<ReleasesGridProps['releases']> = [];\n\n/* -------------------------------------------------------------------------------------------------\n * ReleasesGrid\n * -----------------------------------------------------------------------------------------------*/\ninterface ReleasesGridProps {\n sectionTitle: 'pending' | 'done';\n releases?: GetReleases.Response['data'];\n isError?: boolean;\n}\n\nconst LinkCard = styled(Link)`\n display: block;\n`;\n\nconst RelativeTime = styled(BaseRelativeTime)`\n display: inline-block;\n &::first-letter {\n text-transform: uppercase;\n }\n`;\n\nconst getBadgeProps = (status: Release['status']) => {\n let color;\n switch (status) {\n case 'ready':\n color = 'success';\n break;\n case 'blocked':\n color = 'warning';\n break;\n case 'failed':\n color = 'danger';\n break;\n case 'done':\n color = 'primary';\n break;\n case 'empty':\n default:\n color = 'neutral';\n }\n\n return {\n textColor: `${color}600`,\n backgroundColor: `${color}100`,\n borderColor: `${color}200`,\n };\n};\n\nconst ReleasesGrid = ({\n sectionTitle,\n releases = EMPTY_RELEASES,\n isError = false,\n}: ReleasesGridProps) => {\n const { formatMessage } = useIntl();\n\n if (isError) {\n return <Page.Error />;\n }\n\n if (releases?.length === 0) {\n return (\n <EmptyStateLayout\n content={formatMessage(\n {\n id: 'content-releases.page.Releases.tab.emptyEntries',\n defaultMessage: 'No releases',\n },\n {\n target: sectionTitle,\n }\n )}\n icon={<EmptyDocuments width=\"16rem\" />}\n />\n );\n }\n\n return (\n <Grid.Root gap={4}>\n {releases.map(({ id, name, scheduledAt, status }) => (\n <Grid.Item col={3} s={6} xs={12} key={id} direction=\"column\" alignItems=\"stretch\">\n <LinkCard tag={NavLink} to={`${id}`} isExternal={false}>\n <Flex\n direction=\"column\"\n justifyContent=\"space-between\"\n padding={4}\n hasRadius\n background=\"neutral0\"\n shadow=\"tableShadow\"\n height=\"100%\"\n width=\"100%\"\n alignItems=\"start\"\n gap={4}\n >\n <Flex direction=\"column\" alignItems=\"start\" gap={1}>\n <Typography textColor=\"neutral800\" tag=\"h3\" variant=\"delta\" fontWeight=\"bold\">\n {name}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {scheduledAt ? (\n <RelativeTime timestamp={new Date(scheduledAt)} />\n ) : (\n formatMessage({\n id: 'content-releases.pages.Releases.not-scheduled',\n defaultMessage: 'Not scheduled',\n })\n )}\n </Typography>\n </Flex>\n <Badge {...getBadgeProps(status)}>{status}</Badge>\n </Flex>\n </LinkCard>\n </Grid.Item>\n ))}\n </Grid.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ReleasesPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledAlert = styled(Alert)`\n button {\n display: none;\n }\n p + div {\n margin-left: auto;\n }\n`;\n\nconst INITIAL_FORM_VALUES = {\n name: '',\n date: format(new Date(), 'yyyy-MM-dd'),\n time: '',\n isScheduled: true,\n scheduledAt: null,\n timezone: null,\n} satisfies FormValues;\n\nconst ReleasesPage = () => {\n const location = useLocation();\n const [releaseModalShown, setReleaseModalShown] = React.useState(false);\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const navigate = useNavigate();\n const { formatAPIError } = useAPIErrorHandler();\n const [{ query }, setQuery] = useQueryParams<GetReleasesQueryParams>();\n const response = useGetReleasesQuery(query);\n const { data, isLoading: isLoadingSettings } = useGetReleaseSettingsQuery();\n const [createRelease, { isLoading: isSubmittingForm }] = useCreateReleaseMutation();\n const { getFeature } = useLicenseLimits();\n const { maximumReleases = 3 } = getFeature('cms-content-releases') as {\n maximumReleases: number;\n };\n const { trackUsage } = useTracking();\n const {\n allowedActions: { canCreate },\n } = useRBAC(PERMISSIONS);\n\n const { isLoading: isLoadingReleases, isSuccess, isError } = response;\n const activeTab = response?.currentData?.meta?.activeTab || 'pending';\n\n // Check if we have some errors and show a notification to the user to explain the error\n React.useEffect(() => {\n if (location?.state?.errors) {\n toggleNotification({\n type: 'danger',\n title: formatMessage({\n id: 'content-releases.pages.Releases.notification.error.title',\n defaultMessage: 'Your request could not be processed.',\n }),\n message: formatMessage({\n id: 'content-releases.pages.Releases.notification.error.message',\n defaultMessage: 'Please try again or open another release.',\n }),\n });\n navigate('', { replace: true, state: null });\n }\n }, [formatMessage, location?.state?.errors, navigate, toggleNotification]);\n\n const toggleAddReleaseModal = () => {\n setReleaseModalShown((prev) => !prev);\n };\n\n if (isLoadingReleases || isLoadingSettings) {\n return <Page.Loading />;\n }\n\n const totalPendingReleases = (isSuccess && response.currentData?.meta?.pendingReleasesCount) || 0;\n const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;\n\n const handleTabChange = (tabValue: string) => {\n setQuery({\n page: 1,\n pageSize: response?.currentData?.meta?.pagination?.pageSize || 16,\n filters: {\n releasedAt: {\n $notNull: tabValue !== 'pending',\n },\n },\n });\n };\n\n const handleAddRelease = async ({ name, scheduledAt, timezone }: FormValues) => {\n const response = await createRelease({\n name,\n scheduledAt,\n timezone,\n });\n if ('data' in response) {\n // When the response returns an object with 'data', handle success\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'content-releases.modal.release-created-notification-success',\n defaultMessage: 'Release created.',\n }),\n });\n\n trackUsage('didCreateRelease');\n navigate(response.data.data.id.toString());\n } else if (isFetchError(response.error)) {\n // When the response returns an object with 'error', handle fetch error\n toggleNotification({\n type: 'danger',\n message: formatAPIError(response.error),\n });\n } else {\n // Otherwise, the response returns an object with 'error', handle a generic error\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n return (\n <Layouts.Root>\n <Main aria-busy={isLoadingReleases || isLoadingSettings}>\n <Layouts.Header\n title={formatMessage({\n id: 'content-releases.pages.Releases.title',\n defaultMessage: 'Releases',\n })}\n secondaryAction={\n <GradientBadge\n label={formatMessage({\n id: 'components.premiumFeature.title',\n defaultMessage: 'Premium feature',\n })}\n />\n }\n subtitle={formatMessage({\n id: 'content-releases.pages.Releases.header-subtitle',\n defaultMessage: 'Create and manage content updates',\n })}\n primaryAction={\n canCreate ? (\n <Button\n startIcon={<Plus />}\n onClick={toggleAddReleaseModal}\n disabled={hasReachedMaximumPendingReleases}\n fullWidth\n >\n {formatMessage({\n id: 'content-releases.header.actions.add-release',\n defaultMessage: 'New release',\n })}\n </Button>\n ) : null\n }\n />\n <Layouts.Content>\n <>\n {hasReachedMaximumPendingReleases && (\n <StyledAlert\n marginBottom={6}\n action={\n <Link href=\"https://strapi.io/pricing-cloud\" isExternal>\n {formatMessage({\n id: 'content-releases.pages.Releases.max-limit-reached.action',\n defaultMessage: 'Explore plans',\n })}\n </Link>\n }\n title={formatMessage(\n {\n id: 'content-releases.pages.Releases.max-limit-reached.title',\n defaultMessage:\n 'You have reached the {number} pending {number, plural, one {release} other {releases}} limit.',\n },\n { number: maximumReleases }\n )}\n onClose={() => {}}\n closeLabel=\"\"\n >\n {formatMessage({\n id: 'content-releases.pages.Releases.max-limit-reached.message',\n defaultMessage: 'Upgrade to manage an unlimited number of releases.',\n })}\n </StyledAlert>\n )}\n <Tabs.Root variant=\"simple\" onValueChange={handleTabChange} value={activeTab}>\n <Box paddingBottom={8}>\n <Tabs.List\n aria-label={formatMessage({\n id: 'content-releases.pages.Releases.tab-group.label',\n defaultMessage: 'Releases list',\n })}\n >\n <Tabs.Trigger value=\"pending\">\n {formatMessage(\n {\n id: 'content-releases.pages.Releases.tab.pending',\n defaultMessage: 'Pending ({count})',\n },\n {\n count: totalPendingReleases,\n }\n )}\n </Tabs.Trigger>\n <Tabs.Trigger value=\"done\">\n {formatMessage({\n id: 'content-releases.pages.Releases.tab.done',\n defaultMessage: 'Done',\n })}\n </Tabs.Trigger>\n </Tabs.List>\n <Divider />\n </Box>\n {/* Pending releases */}\n <Tabs.Content value=\"pending\">\n <ReleasesGrid\n sectionTitle=\"pending\"\n releases={response?.currentData?.data}\n isError={isError}\n />\n </Tabs.Content>\n {/* Done releases */}\n <Tabs.Content value=\"done\">\n <ReleasesGrid\n sectionTitle=\"done\"\n releases={response?.currentData?.data}\n isError={isError}\n />\n </Tabs.Content>\n </Tabs.Root>\n <Pagination.Root\n {...response?.currentData?.meta?.pagination}\n defaultPageSize={response?.currentData?.meta?.pagination?.pageSize}\n >\n <Pagination.PageSize options={['8', '16', '32', '64']} />\n <Pagination.Links />\n </Pagination.Root>\n </>\n </Layouts.Content>\n <ReleaseModal\n open={releaseModalShown}\n handleClose={toggleAddReleaseModal}\n handleSubmit={handleAddRelease}\n isLoading={isSubmittingForm}\n initialValues={{\n ...INITIAL_FORM_VALUES,\n timezone: data?.data.defaultTimezone ? data.data.defaultTimezone.split('&')[1] : null,\n }}\n />\n </Main>\n </Layouts.Root>\n );\n};\n\nexport { ReleasesPage, getBadgeProps };\n"],"names":["EMPTY_RELEASES","LinkCard","styled","Link","RelativeTime","BaseRelativeTime","getBadgeProps","status","color","textColor","backgroundColor","borderColor","ReleasesGrid","sectionTitle","releases","isError","formatMessage","useIntl","_jsx","Page","Error","length","EmptyStateLayout","content","id","defaultMessage","target","icon","EmptyDocuments","width","Grid","Root","gap","map","name","scheduledAt","Item","col","s","xs","direction","alignItems","tag","NavLink","to","isExternal","_jsxs","Flex","justifyContent","padding","hasRadius","background","shadow","height","Typography","variant","fontWeight","timestamp","Date","Badge","StyledAlert","Alert","INITIAL_FORM_VALUES","date","format","time","isScheduled","timezone","ReleasesPage","location","useLocation","releaseModalShown","setReleaseModalShown","React","useState","toggleNotification","useNotification","navigate","useNavigate","formatAPIError","useAPIErrorHandler","query","setQuery","useQueryParams","response","useGetReleasesQuery","data","isLoading","isLoadingSettings","useGetReleaseSettingsQuery","createRelease","isSubmittingForm","useCreateReleaseMutation","getFeature","useLicenseLimits","maximumReleases","trackUsage","useTracking","allowedActions","canCreate","useRBAC","PERMISSIONS","isLoadingReleases","isSuccess","activeTab","currentData","meta","useEffect","state","errors","type","title","message","replace","toggleAddReleaseModal","prev","Loading","totalPendingReleases","pendingReleasesCount","hasReachedMaximumPendingReleases","handleTabChange","tabValue","page","pageSize","pagination","filters","releasedAt","$notNull","handleAddRelease","toString","isFetchError","error","Layouts","Main","aria-busy","Header","secondaryAction","GradientBadge","label","subtitle","primaryAction","Button","startIcon","Plus","onClick","disabled","fullWidth","Content","_Fragment","marginBottom","action","href","number","onClose","closeLabel","Tabs","onValueChange","value","Box","paddingBottom","List","aria-label","Trigger","count","Divider","Pagination","defaultPageSize","PageSize","options","Links","ReleaseModal","open","handleClose","handleSubmit","initialValues","defaultTimezone","split"],"mappings":"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"}
@@ -14,6 +14,7 @@ import { ReleaseModal } from '../components/ReleaseModal.mjs';
14
14
  import { PERMISSIONS } from '../constants.mjs';
15
15
  import { useGetReleasesQuery, useGetReleaseSettingsQuery, useCreateReleaseMutation } from '../services/release.mjs';
16
16
 
17
+ const EMPTY_RELEASES = [];
17
18
  const LinkCard = styled(Link)`
18
19
  display: block;
19
20
  `;
@@ -48,7 +49,7 @@ const getBadgeProps = (status)=>{
48
49
  borderColor: `${color}200`
49
50
  };
50
51
  };
51
- const ReleasesGrid = ({ sectionTitle, releases = [], isError = false })=>{
52
+ const ReleasesGrid = ({ sectionTitle, releases = EMPTY_RELEASES, isError = false })=>{
52
53
  const { formatMessage } = useIntl();
53
54
  if (isError) {
54
55
  return /*#__PURE__*/ jsx(Page.Error, {});
@@ -1 +1 @@
1
- {"version":3,"file":"ReleasesPage.mjs","sources":["../../../admin/src/pages/ReleasesPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Page,\n Pagination,\n useTracking,\n useAPIErrorHandler,\n useNotification,\n useQueryParams,\n useRBAC,\n isFetchError,\n Layouts,\n GradientBadge,\n} from '@strapi/admin/strapi-admin';\nimport { useLicenseLimits } from '@strapi/admin/strapi-admin/ee';\nimport {\n Alert,\n Badge,\n Box,\n Button,\n Divider,\n EmptyStateLayout,\n Flex,\n Grid,\n Main,\n Tabs,\n Typography,\n Link,\n} from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { EmptyDocuments } from '@strapi/icons/symbols';\nimport { format } from 'date-fns';\nimport { useIntl } from 'react-intl';\nimport { useNavigate, useLocation, NavLink } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { GetReleases, type Release } from '../../../shared/contracts/releases';\nimport { RelativeTime as BaseRelativeTime } from '../components/RelativeTime';\nimport { ReleaseModal, FormValues } from '../components/ReleaseModal';\nimport { PERMISSIONS } from '../constants';\nimport {\n useGetReleasesQuery,\n useGetReleaseSettingsQuery,\n GetReleasesQueryParams,\n useCreateReleaseMutation,\n} from '../services/release';\n\n/* -------------------------------------------------------------------------------------------------\n * ReleasesGrid\n * -----------------------------------------------------------------------------------------------*/\ninterface ReleasesGridProps {\n sectionTitle: 'pending' | 'done';\n releases?: GetReleases.Response['data'];\n isError?: boolean;\n}\n\nconst LinkCard = styled(Link)`\n display: block;\n`;\n\nconst RelativeTime = styled(BaseRelativeTime)`\n display: inline-block;\n &::first-letter {\n text-transform: uppercase;\n }\n`;\n\nconst getBadgeProps = (status: Release['status']) => {\n let color;\n switch (status) {\n case 'ready':\n color = 'success';\n break;\n case 'blocked':\n color = 'warning';\n break;\n case 'failed':\n color = 'danger';\n break;\n case 'done':\n color = 'primary';\n break;\n case 'empty':\n default:\n color = 'neutral';\n }\n\n return {\n textColor: `${color}600`,\n backgroundColor: `${color}100`,\n borderColor: `${color}200`,\n };\n};\n\nconst ReleasesGrid = ({ sectionTitle, releases = [], isError = false }: ReleasesGridProps) => {\n const { formatMessage } = useIntl();\n\n if (isError) {\n return <Page.Error />;\n }\n\n if (releases?.length === 0) {\n return (\n <EmptyStateLayout\n content={formatMessage(\n {\n id: 'content-releases.page.Releases.tab.emptyEntries',\n defaultMessage: 'No releases',\n },\n {\n target: sectionTitle,\n }\n )}\n icon={<EmptyDocuments width=\"16rem\" />}\n />\n );\n }\n\n return (\n <Grid.Root gap={4}>\n {releases.map(({ id, name, scheduledAt, status }) => (\n <Grid.Item col={3} s={6} xs={12} key={id} direction=\"column\" alignItems=\"stretch\">\n <LinkCard tag={NavLink} to={`${id}`} isExternal={false}>\n <Flex\n direction=\"column\"\n justifyContent=\"space-between\"\n padding={4}\n hasRadius\n background=\"neutral0\"\n shadow=\"tableShadow\"\n height=\"100%\"\n width=\"100%\"\n alignItems=\"start\"\n gap={4}\n >\n <Flex direction=\"column\" alignItems=\"start\" gap={1}>\n <Typography textColor=\"neutral800\" tag=\"h3\" variant=\"delta\" fontWeight=\"bold\">\n {name}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {scheduledAt ? (\n <RelativeTime timestamp={new Date(scheduledAt)} />\n ) : (\n formatMessage({\n id: 'content-releases.pages.Releases.not-scheduled',\n defaultMessage: 'Not scheduled',\n })\n )}\n </Typography>\n </Flex>\n <Badge {...getBadgeProps(status)}>{status}</Badge>\n </Flex>\n </LinkCard>\n </Grid.Item>\n ))}\n </Grid.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ReleasesPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledAlert = styled(Alert)`\n button {\n display: none;\n }\n p + div {\n margin-left: auto;\n }\n`;\n\nconst INITIAL_FORM_VALUES = {\n name: '',\n date: format(new Date(), 'yyyy-MM-dd'),\n time: '',\n isScheduled: true,\n scheduledAt: null,\n timezone: null,\n} satisfies FormValues;\n\nconst ReleasesPage = () => {\n const location = useLocation();\n const [releaseModalShown, setReleaseModalShown] = React.useState(false);\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const navigate = useNavigate();\n const { formatAPIError } = useAPIErrorHandler();\n const [{ query }, setQuery] = useQueryParams<GetReleasesQueryParams>();\n const response = useGetReleasesQuery(query);\n const { data, isLoading: isLoadingSettings } = useGetReleaseSettingsQuery();\n const [createRelease, { isLoading: isSubmittingForm }] = useCreateReleaseMutation();\n const { getFeature } = useLicenseLimits();\n const { maximumReleases = 3 } = getFeature('cms-content-releases') as {\n maximumReleases: number;\n };\n const { trackUsage } = useTracking();\n const {\n allowedActions: { canCreate },\n } = useRBAC(PERMISSIONS);\n\n const { isLoading: isLoadingReleases, isSuccess, isError } = response;\n const activeTab = response?.currentData?.meta?.activeTab || 'pending';\n\n // Check if we have some errors and show a notification to the user to explain the error\n React.useEffect(() => {\n if (location?.state?.errors) {\n toggleNotification({\n type: 'danger',\n title: formatMessage({\n id: 'content-releases.pages.Releases.notification.error.title',\n defaultMessage: 'Your request could not be processed.',\n }),\n message: formatMessage({\n id: 'content-releases.pages.Releases.notification.error.message',\n defaultMessage: 'Please try again or open another release.',\n }),\n });\n navigate('', { replace: true, state: null });\n }\n }, [formatMessage, location?.state?.errors, navigate, toggleNotification]);\n\n const toggleAddReleaseModal = () => {\n setReleaseModalShown((prev) => !prev);\n };\n\n if (isLoadingReleases || isLoadingSettings) {\n return <Page.Loading />;\n }\n\n const totalPendingReleases = (isSuccess && response.currentData?.meta?.pendingReleasesCount) || 0;\n const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;\n\n const handleTabChange = (tabValue: string) => {\n setQuery({\n page: 1,\n pageSize: response?.currentData?.meta?.pagination?.pageSize || 16,\n filters: {\n releasedAt: {\n $notNull: tabValue !== 'pending',\n },\n },\n });\n };\n\n const handleAddRelease = async ({ name, scheduledAt, timezone }: FormValues) => {\n const response = await createRelease({\n name,\n scheduledAt,\n timezone,\n });\n if ('data' in response) {\n // When the response returns an object with 'data', handle success\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'content-releases.modal.release-created-notification-success',\n defaultMessage: 'Release created.',\n }),\n });\n\n trackUsage('didCreateRelease');\n navigate(response.data.data.id.toString());\n } else if (isFetchError(response.error)) {\n // When the response returns an object with 'error', handle fetch error\n toggleNotification({\n type: 'danger',\n message: formatAPIError(response.error),\n });\n } else {\n // Otherwise, the response returns an object with 'error', handle a generic error\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n return (\n <Layouts.Root>\n <Main aria-busy={isLoadingReleases || isLoadingSettings}>\n <Layouts.Header\n title={formatMessage({\n id: 'content-releases.pages.Releases.title',\n defaultMessage: 'Releases',\n })}\n secondaryAction={\n <GradientBadge\n label={formatMessage({\n id: 'components.premiumFeature.title',\n defaultMessage: 'Premium feature',\n })}\n />\n }\n subtitle={formatMessage({\n id: 'content-releases.pages.Releases.header-subtitle',\n defaultMessage: 'Create and manage content updates',\n })}\n primaryAction={\n canCreate ? (\n <Button\n startIcon={<Plus />}\n onClick={toggleAddReleaseModal}\n disabled={hasReachedMaximumPendingReleases}\n fullWidth\n >\n {formatMessage({\n id: 'content-releases.header.actions.add-release',\n defaultMessage: 'New release',\n })}\n </Button>\n ) : null\n }\n />\n <Layouts.Content>\n <>\n {hasReachedMaximumPendingReleases && (\n <StyledAlert\n marginBottom={6}\n action={\n <Link href=\"https://strapi.io/pricing-cloud\" isExternal>\n {formatMessage({\n id: 'content-releases.pages.Releases.max-limit-reached.action',\n defaultMessage: 'Explore plans',\n })}\n </Link>\n }\n title={formatMessage(\n {\n id: 'content-releases.pages.Releases.max-limit-reached.title',\n defaultMessage:\n 'You have reached the {number} pending {number, plural, one {release} other {releases}} limit.',\n },\n { number: maximumReleases }\n )}\n onClose={() => {}}\n closeLabel=\"\"\n >\n {formatMessage({\n id: 'content-releases.pages.Releases.max-limit-reached.message',\n defaultMessage: 'Upgrade to manage an unlimited number of releases.',\n })}\n </StyledAlert>\n )}\n <Tabs.Root variant=\"simple\" onValueChange={handleTabChange} value={activeTab}>\n <Box paddingBottom={8}>\n <Tabs.List\n aria-label={formatMessage({\n id: 'content-releases.pages.Releases.tab-group.label',\n defaultMessage: 'Releases list',\n })}\n >\n <Tabs.Trigger value=\"pending\">\n {formatMessage(\n {\n id: 'content-releases.pages.Releases.tab.pending',\n defaultMessage: 'Pending ({count})',\n },\n {\n count: totalPendingReleases,\n }\n )}\n </Tabs.Trigger>\n <Tabs.Trigger value=\"done\">\n {formatMessage({\n id: 'content-releases.pages.Releases.tab.done',\n defaultMessage: 'Done',\n })}\n </Tabs.Trigger>\n </Tabs.List>\n <Divider />\n </Box>\n {/* Pending releases */}\n <Tabs.Content value=\"pending\">\n <ReleasesGrid\n sectionTitle=\"pending\"\n releases={response?.currentData?.data}\n isError={isError}\n />\n </Tabs.Content>\n {/* Done releases */}\n <Tabs.Content value=\"done\">\n <ReleasesGrid\n sectionTitle=\"done\"\n releases={response?.currentData?.data}\n isError={isError}\n />\n </Tabs.Content>\n </Tabs.Root>\n <Pagination.Root\n {...response?.currentData?.meta?.pagination}\n defaultPageSize={response?.currentData?.meta?.pagination?.pageSize}\n >\n <Pagination.PageSize options={['8', '16', '32', '64']} />\n <Pagination.Links />\n </Pagination.Root>\n </>\n </Layouts.Content>\n <ReleaseModal\n open={releaseModalShown}\n handleClose={toggleAddReleaseModal}\n handleSubmit={handleAddRelease}\n isLoading={isSubmittingForm}\n initialValues={{\n ...INITIAL_FORM_VALUES,\n timezone: data?.data.defaultTimezone ? data.data.defaultTimezone.split('&')[1] : null,\n }}\n />\n </Main>\n </Layouts.Root>\n );\n};\n\nexport { ReleasesPage, getBadgeProps };\n"],"names":["LinkCard","styled","Link","RelativeTime","BaseRelativeTime","getBadgeProps","status","color","textColor","backgroundColor","borderColor","ReleasesGrid","sectionTitle","releases","isError","formatMessage","useIntl","_jsx","Page","Error","length","EmptyStateLayout","content","id","defaultMessage","target","icon","EmptyDocuments","width","Grid","Root","gap","map","name","scheduledAt","Item","col","s","xs","direction","alignItems","tag","NavLink","to","isExternal","_jsxs","Flex","justifyContent","padding","hasRadius","background","shadow","height","Typography","variant","fontWeight","timestamp","Date","Badge","StyledAlert","Alert","INITIAL_FORM_VALUES","date","format","time","isScheduled","timezone","ReleasesPage","location","useLocation","releaseModalShown","setReleaseModalShown","React","useState","toggleNotification","useNotification","navigate","useNavigate","formatAPIError","useAPIErrorHandler","query","setQuery","useQueryParams","response","useGetReleasesQuery","data","isLoading","isLoadingSettings","useGetReleaseSettingsQuery","createRelease","isSubmittingForm","useCreateReleaseMutation","getFeature","useLicenseLimits","maximumReleases","trackUsage","useTracking","allowedActions","canCreate","useRBAC","PERMISSIONS","isLoadingReleases","isSuccess","activeTab","currentData","meta","useEffect","state","errors","type","title","message","replace","toggleAddReleaseModal","prev","Loading","totalPendingReleases","pendingReleasesCount","hasReachedMaximumPendingReleases","handleTabChange","tabValue","page","pageSize","pagination","filters","releasedAt","$notNull","handleAddRelease","toString","isFetchError","error","Layouts","Main","aria-busy","Header","secondaryAction","GradientBadge","label","subtitle","primaryAction","Button","startIcon","Plus","onClick","disabled","fullWidth","Content","_Fragment","marginBottom","action","href","number","onClose","closeLabel","Tabs","onValueChange","value","Box","paddingBottom","List","aria-label","Trigger","count","Divider","Pagination","defaultPageSize","PageSize","options","Links","ReleaseModal","open","handleClose","handleSubmit","initialValues","defaultTimezone","split"],"mappings":"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"}
1
+ {"version":3,"file":"ReleasesPage.mjs","sources":["../../../admin/src/pages/ReleasesPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Page,\n Pagination,\n useTracking,\n useAPIErrorHandler,\n useNotification,\n useQueryParams,\n useRBAC,\n isFetchError,\n Layouts,\n GradientBadge,\n} from '@strapi/admin/strapi-admin';\nimport { useLicenseLimits } from '@strapi/admin/strapi-admin/ee';\nimport {\n Alert,\n Badge,\n Box,\n Button,\n Divider,\n EmptyStateLayout,\n Flex,\n Grid,\n Main,\n Tabs,\n Typography,\n Link,\n} from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { EmptyDocuments } from '@strapi/icons/symbols';\nimport { format } from 'date-fns';\nimport { useIntl } from 'react-intl';\nimport { useNavigate, useLocation, NavLink } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { GetReleases, type Release } from '../../../shared/contracts/releases';\nimport { RelativeTime as BaseRelativeTime } from '../components/RelativeTime';\nimport { ReleaseModal, FormValues } from '../components/ReleaseModal';\nimport { PERMISSIONS } from '../constants';\nimport {\n useGetReleasesQuery,\n useGetReleaseSettingsQuery,\n GetReleasesQueryParams,\n useCreateReleaseMutation,\n} from '../services/release';\n\nconst EMPTY_RELEASES: NonNullable<ReleasesGridProps['releases']> = [];\n\n/* -------------------------------------------------------------------------------------------------\n * ReleasesGrid\n * -----------------------------------------------------------------------------------------------*/\ninterface ReleasesGridProps {\n sectionTitle: 'pending' | 'done';\n releases?: GetReleases.Response['data'];\n isError?: boolean;\n}\n\nconst LinkCard = styled(Link)`\n display: block;\n`;\n\nconst RelativeTime = styled(BaseRelativeTime)`\n display: inline-block;\n &::first-letter {\n text-transform: uppercase;\n }\n`;\n\nconst getBadgeProps = (status: Release['status']) => {\n let color;\n switch (status) {\n case 'ready':\n color = 'success';\n break;\n case 'blocked':\n color = 'warning';\n break;\n case 'failed':\n color = 'danger';\n break;\n case 'done':\n color = 'primary';\n break;\n case 'empty':\n default:\n color = 'neutral';\n }\n\n return {\n textColor: `${color}600`,\n backgroundColor: `${color}100`,\n borderColor: `${color}200`,\n };\n};\n\nconst ReleasesGrid = ({\n sectionTitle,\n releases = EMPTY_RELEASES,\n isError = false,\n}: ReleasesGridProps) => {\n const { formatMessage } = useIntl();\n\n if (isError) {\n return <Page.Error />;\n }\n\n if (releases?.length === 0) {\n return (\n <EmptyStateLayout\n content={formatMessage(\n {\n id: 'content-releases.page.Releases.tab.emptyEntries',\n defaultMessage: 'No releases',\n },\n {\n target: sectionTitle,\n }\n )}\n icon={<EmptyDocuments width=\"16rem\" />}\n />\n );\n }\n\n return (\n <Grid.Root gap={4}>\n {releases.map(({ id, name, scheduledAt, status }) => (\n <Grid.Item col={3} s={6} xs={12} key={id} direction=\"column\" alignItems=\"stretch\">\n <LinkCard tag={NavLink} to={`${id}`} isExternal={false}>\n <Flex\n direction=\"column\"\n justifyContent=\"space-between\"\n padding={4}\n hasRadius\n background=\"neutral0\"\n shadow=\"tableShadow\"\n height=\"100%\"\n width=\"100%\"\n alignItems=\"start\"\n gap={4}\n >\n <Flex direction=\"column\" alignItems=\"start\" gap={1}>\n <Typography textColor=\"neutral800\" tag=\"h3\" variant=\"delta\" fontWeight=\"bold\">\n {name}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {scheduledAt ? (\n <RelativeTime timestamp={new Date(scheduledAt)} />\n ) : (\n formatMessage({\n id: 'content-releases.pages.Releases.not-scheduled',\n defaultMessage: 'Not scheduled',\n })\n )}\n </Typography>\n </Flex>\n <Badge {...getBadgeProps(status)}>{status}</Badge>\n </Flex>\n </LinkCard>\n </Grid.Item>\n ))}\n </Grid.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ReleasesPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledAlert = styled(Alert)`\n button {\n display: none;\n }\n p + div {\n margin-left: auto;\n }\n`;\n\nconst INITIAL_FORM_VALUES = {\n name: '',\n date: format(new Date(), 'yyyy-MM-dd'),\n time: '',\n isScheduled: true,\n scheduledAt: null,\n timezone: null,\n} satisfies FormValues;\n\nconst ReleasesPage = () => {\n const location = useLocation();\n const [releaseModalShown, setReleaseModalShown] = React.useState(false);\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const navigate = useNavigate();\n const { formatAPIError } = useAPIErrorHandler();\n const [{ query }, setQuery] = useQueryParams<GetReleasesQueryParams>();\n const response = useGetReleasesQuery(query);\n const { data, isLoading: isLoadingSettings } = useGetReleaseSettingsQuery();\n const [createRelease, { isLoading: isSubmittingForm }] = useCreateReleaseMutation();\n const { getFeature } = useLicenseLimits();\n const { maximumReleases = 3 } = getFeature('cms-content-releases') as {\n maximumReleases: number;\n };\n const { trackUsage } = useTracking();\n const {\n allowedActions: { canCreate },\n } = useRBAC(PERMISSIONS);\n\n const { isLoading: isLoadingReleases, isSuccess, isError } = response;\n const activeTab = response?.currentData?.meta?.activeTab || 'pending';\n\n // Check if we have some errors and show a notification to the user to explain the error\n React.useEffect(() => {\n if (location?.state?.errors) {\n toggleNotification({\n type: 'danger',\n title: formatMessage({\n id: 'content-releases.pages.Releases.notification.error.title',\n defaultMessage: 'Your request could not be processed.',\n }),\n message: formatMessage({\n id: 'content-releases.pages.Releases.notification.error.message',\n defaultMessage: 'Please try again or open another release.',\n }),\n });\n navigate('', { replace: true, state: null });\n }\n }, [formatMessage, location?.state?.errors, navigate, toggleNotification]);\n\n const toggleAddReleaseModal = () => {\n setReleaseModalShown((prev) => !prev);\n };\n\n if (isLoadingReleases || isLoadingSettings) {\n return <Page.Loading />;\n }\n\n const totalPendingReleases = (isSuccess && response.currentData?.meta?.pendingReleasesCount) || 0;\n const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;\n\n const handleTabChange = (tabValue: string) => {\n setQuery({\n page: 1,\n pageSize: response?.currentData?.meta?.pagination?.pageSize || 16,\n filters: {\n releasedAt: {\n $notNull: tabValue !== 'pending',\n },\n },\n });\n };\n\n const handleAddRelease = async ({ name, scheduledAt, timezone }: FormValues) => {\n const response = await createRelease({\n name,\n scheduledAt,\n timezone,\n });\n if ('data' in response) {\n // When the response returns an object with 'data', handle success\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'content-releases.modal.release-created-notification-success',\n defaultMessage: 'Release created.',\n }),\n });\n\n trackUsage('didCreateRelease');\n navigate(response.data.data.id.toString());\n } else if (isFetchError(response.error)) {\n // When the response returns an object with 'error', handle fetch error\n toggleNotification({\n type: 'danger',\n message: formatAPIError(response.error),\n });\n } else {\n // Otherwise, the response returns an object with 'error', handle a generic error\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n return (\n <Layouts.Root>\n <Main aria-busy={isLoadingReleases || isLoadingSettings}>\n <Layouts.Header\n title={formatMessage({\n id: 'content-releases.pages.Releases.title',\n defaultMessage: 'Releases',\n })}\n secondaryAction={\n <GradientBadge\n label={formatMessage({\n id: 'components.premiumFeature.title',\n defaultMessage: 'Premium feature',\n })}\n />\n }\n subtitle={formatMessage({\n id: 'content-releases.pages.Releases.header-subtitle',\n defaultMessage: 'Create and manage content updates',\n })}\n primaryAction={\n canCreate ? (\n <Button\n startIcon={<Plus />}\n onClick={toggleAddReleaseModal}\n disabled={hasReachedMaximumPendingReleases}\n fullWidth\n >\n {formatMessage({\n id: 'content-releases.header.actions.add-release',\n defaultMessage: 'New release',\n })}\n </Button>\n ) : null\n }\n />\n <Layouts.Content>\n <>\n {hasReachedMaximumPendingReleases && (\n <StyledAlert\n marginBottom={6}\n action={\n <Link href=\"https://strapi.io/pricing-cloud\" isExternal>\n {formatMessage({\n id: 'content-releases.pages.Releases.max-limit-reached.action',\n defaultMessage: 'Explore plans',\n })}\n </Link>\n }\n title={formatMessage(\n {\n id: 'content-releases.pages.Releases.max-limit-reached.title',\n defaultMessage:\n 'You have reached the {number} pending {number, plural, one {release} other {releases}} limit.',\n },\n { number: maximumReleases }\n )}\n onClose={() => {}}\n closeLabel=\"\"\n >\n {formatMessage({\n id: 'content-releases.pages.Releases.max-limit-reached.message',\n defaultMessage: 'Upgrade to manage an unlimited number of releases.',\n })}\n </StyledAlert>\n )}\n <Tabs.Root variant=\"simple\" onValueChange={handleTabChange} value={activeTab}>\n <Box paddingBottom={8}>\n <Tabs.List\n aria-label={formatMessage({\n id: 'content-releases.pages.Releases.tab-group.label',\n defaultMessage: 'Releases list',\n })}\n >\n <Tabs.Trigger value=\"pending\">\n {formatMessage(\n {\n id: 'content-releases.pages.Releases.tab.pending',\n defaultMessage: 'Pending ({count})',\n },\n {\n count: totalPendingReleases,\n }\n )}\n </Tabs.Trigger>\n <Tabs.Trigger value=\"done\">\n {formatMessage({\n id: 'content-releases.pages.Releases.tab.done',\n defaultMessage: 'Done',\n })}\n </Tabs.Trigger>\n </Tabs.List>\n <Divider />\n </Box>\n {/* Pending releases */}\n <Tabs.Content value=\"pending\">\n <ReleasesGrid\n sectionTitle=\"pending\"\n releases={response?.currentData?.data}\n isError={isError}\n />\n </Tabs.Content>\n {/* Done releases */}\n <Tabs.Content value=\"done\">\n <ReleasesGrid\n sectionTitle=\"done\"\n releases={response?.currentData?.data}\n isError={isError}\n />\n </Tabs.Content>\n </Tabs.Root>\n <Pagination.Root\n {...response?.currentData?.meta?.pagination}\n defaultPageSize={response?.currentData?.meta?.pagination?.pageSize}\n >\n <Pagination.PageSize options={['8', '16', '32', '64']} />\n <Pagination.Links />\n </Pagination.Root>\n </>\n </Layouts.Content>\n <ReleaseModal\n open={releaseModalShown}\n handleClose={toggleAddReleaseModal}\n handleSubmit={handleAddRelease}\n isLoading={isSubmittingForm}\n initialValues={{\n ...INITIAL_FORM_VALUES,\n timezone: data?.data.defaultTimezone ? data.data.defaultTimezone.split('&')[1] : null,\n }}\n />\n </Main>\n </Layouts.Root>\n );\n};\n\nexport { ReleasesPage, getBadgeProps };\n"],"names":["EMPTY_RELEASES","LinkCard","styled","Link","RelativeTime","BaseRelativeTime","getBadgeProps","status","color","textColor","backgroundColor","borderColor","ReleasesGrid","sectionTitle","releases","isError","formatMessage","useIntl","_jsx","Page","Error","length","EmptyStateLayout","content","id","defaultMessage","target","icon","EmptyDocuments","width","Grid","Root","gap","map","name","scheduledAt","Item","col","s","xs","direction","alignItems","tag","NavLink","to","isExternal","_jsxs","Flex","justifyContent","padding","hasRadius","background","shadow","height","Typography","variant","fontWeight","timestamp","Date","Badge","StyledAlert","Alert","INITIAL_FORM_VALUES","date","format","time","isScheduled","timezone","ReleasesPage","location","useLocation","releaseModalShown","setReleaseModalShown","React","useState","toggleNotification","useNotification","navigate","useNavigate","formatAPIError","useAPIErrorHandler","query","setQuery","useQueryParams","response","useGetReleasesQuery","data","isLoading","isLoadingSettings","useGetReleaseSettingsQuery","createRelease","isSubmittingForm","useCreateReleaseMutation","getFeature","useLicenseLimits","maximumReleases","trackUsage","useTracking","allowedActions","canCreate","useRBAC","PERMISSIONS","isLoadingReleases","isSuccess","activeTab","currentData","meta","useEffect","state","errors","type","title","message","replace","toggleAddReleaseModal","prev","Loading","totalPendingReleases","pendingReleasesCount","hasReachedMaximumPendingReleases","handleTabChange","tabValue","page","pageSize","pagination","filters","releasedAt","$notNull","handleAddRelease","toString","isFetchError","error","Layouts","Main","aria-busy","Header","secondaryAction","GradientBadge","label","subtitle","primaryAction","Button","startIcon","Plus","onClick","disabled","fullWidth","Content","_Fragment","marginBottom","action","href","number","onClose","closeLabel","Tabs","onValueChange","value","Box","paddingBottom","List","aria-label","Trigger","count","Divider","Pagination","defaultPageSize","PageSize","options","Links","ReleaseModal","open","handleClose","handleSubmit","initialValues","defaultTimezone","split"],"mappings":"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"}
@@ -5,7 +5,7 @@ var auditLogs = require('./audit-logs.js');
5
5
  var index = require('./utils/index.js');
6
6
  var documents = require('./middlewares/documents.js');
7
7
 
8
- const deleteReleasesActionsAndUpdateReleaseStatus = async (params)=>{
8
+ const deleteReleasesActionsAndUpdateReleaseStatus = async (params, strapi)=>{
9
9
  const releases = await strapi.db.query(constants.RELEASE_MODEL_UID).findMany({
10
10
  where: {
11
11
  actions: params
@@ -15,57 +15,55 @@ const deleteReleasesActionsAndUpdateReleaseStatus = async (params)=>{
15
15
  where: params
16
16
  });
17
17
  // We update the status of each release after delete the actions
18
- for (const release of releases){
19
- index.getService('release', {
20
- strapi
21
- }).updateReleaseStatus(release.id);
22
- }
18
+ await index.updateAffectedReleaseStatuses(releases, {
19
+ strapi
20
+ });
23
21
  };
24
- const bootstrap = async ({ strapi: strapi1 })=>{
25
- if (strapi1.ee.features.isEnabled('cms-content-releases')) {
26
- const contentTypesWithDraftAndPublish = Object.keys(strapi1.contentTypes).filter((uid)=>strapi1.contentTypes[uid]?.options?.draftAndPublish);
27
- strapi1.db.lifecycles.subscribe({
22
+ const bootstrap = async ({ strapi })=>{
23
+ if (strapi.ee.features.isEnabled('cms-content-releases')) {
24
+ const contentTypesWithDraftAndPublish = Object.keys(strapi.contentTypes).filter((uid)=>strapi.contentTypes[uid]?.options?.draftAndPublish);
25
+ strapi.db.lifecycles.subscribe({
28
26
  models: contentTypesWithDraftAndPublish,
29
27
  /**
30
28
  * deleteMany is still used outside documents service, for example when deleting a locale
31
29
  */ async afterDeleteMany (event) {
32
30
  try {
33
- const model = strapi1.getModel(event.model.uid);
31
+ const model = strapi.getModel(event.model.uid);
34
32
  // @ts-expect-error TODO: lifecycles types looks like are not 100% finished
35
33
  if (model.kind === 'collectionType' && model.options?.draftAndPublish) {
36
34
  const { where } = event.params;
37
- deleteReleasesActionsAndUpdateReleaseStatus({
35
+ await deleteReleasesActionsAndUpdateReleaseStatus({
38
36
  contentType: model.uid,
39
37
  locale: where?.locale ?? null,
40
38
  ...where?.documentId && {
41
39
  entryDocumentId: where.documentId
42
40
  }
43
- });
41
+ }, strapi);
44
42
  }
45
43
  } catch (error) {
46
44
  // If an error happens we don't want to block the delete entry flow, but we log the error
47
- strapi1.log.error('Error while deleting release actions after entry deleteMany', {
45
+ strapi.log.error('Error while deleting release actions after entry deleteMany', {
48
46
  error
49
47
  });
50
48
  }
51
49
  }
52
50
  });
53
51
  // We register middleware to handle ReleaseActions when changes on documents are made
54
- strapi1.documents.use(documents.deleteActionsOnDelete);
55
- strapi1.documents.use(documents.updateActionsOnUpdate);
52
+ strapi.documents.use(documents.deleteActionsOnDelete);
53
+ strapi.documents.use(documents.updateActionsOnUpdate);
56
54
  index.getService('scheduling', {
57
- strapi: strapi1
55
+ strapi
58
56
  }).syncFromDatabase().catch((err)=>{
59
- strapi1.log.error('Error while syncing scheduled jobs from the database in the content-releases plugin. This could lead to errors in the releases scheduling.');
57
+ strapi.log.error('Error while syncing scheduled jobs from the database in the content-releases plugin. This could lead to errors in the releases scheduling.');
60
58
  throw err;
61
59
  });
62
60
  Object.entries(constants.ALLOWED_WEBHOOK_EVENTS).forEach(([key, value])=>{
63
- strapi1.get('webhookStore').addAllowedEvent(key, value);
61
+ strapi.get('webhookStore').addAllowedEvent(key, value);
64
62
  });
65
63
  // Absent in CE, without the audit-logs license, or when disabled by config;
66
64
  // get() throws for services that were never added, so probe first.
67
- if (strapi1.has('audit-logs-lifecycle')) {
68
- auditLogs.registerAuditEvents(strapi1.get('audit-logs-lifecycle'));
65
+ if (strapi.has('audit-logs-lifecycle')) {
66
+ auditLogs.registerAuditEvents(strapi.get('audit-logs-lifecycle'));
69
67
  }
70
68
  }
71
69
  };
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.js","sources":["../../server/src/bootstrap.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\nimport type { Core, UID, Modules } from '@strapi/types';\n\nimport { RELEASE_ACTION_MODEL_UID, RELEASE_MODEL_UID, ALLOWED_WEBHOOK_EVENTS } from './constants';\nimport { registerAuditEvents } from './audit-logs';\nimport { getService } from './utils';\nimport { deleteActionsOnDelete, updateActionsOnUpdate } from './middlewares/documents';\n\ninterface DeleteManyParams {\n contentType: UID.ContentType;\n locale: string | null;\n entryDocumentId?: Modules.Documents.ID;\n}\n\nconst deleteReleasesActionsAndUpdateReleaseStatus = async (params: DeleteManyParams) => {\n const releases = await strapi.db.query(RELEASE_MODEL_UID).findMany({\n where: {\n actions: params,\n },\n });\n\n await strapi.db.query(RELEASE_ACTION_MODEL_UID).deleteMany({\n where: params,\n });\n\n // We update the status of each release after delete the actions\n for (const release of releases) {\n getService('release', { strapi }).updateReleaseStatus(release.id);\n }\n};\n\nexport const bootstrap = async ({ strapi }: { strapi: Core.Strapi }) => {\n if (strapi.ee.features.isEnabled('cms-content-releases')) {\n const contentTypesWithDraftAndPublish = Object.keys(strapi.contentTypes).filter(\n (uid: any) => strapi.contentTypes[uid]?.options?.draftAndPublish\n );\n\n strapi.db.lifecycles.subscribe({\n models: contentTypesWithDraftAndPublish,\n\n /**\n * deleteMany is still used outside documents service, for example when deleting a locale\n */\n async afterDeleteMany(event) {\n try {\n const model = strapi.getModel(event.model.uid as UID.Schema);\n // @ts-expect-error TODO: lifecycles types looks like are not 100% finished\n if (model.kind === 'collectionType' && model.options?.draftAndPublish) {\n const { where } = event.params;\n\n deleteReleasesActionsAndUpdateReleaseStatus({\n contentType: model.uid,\n locale: where?.locale ?? null,\n ...(where?.documentId && { entryDocumentId: where.documentId }),\n });\n }\n } catch (error) {\n // If an error happens we don't want to block the delete entry flow, but we log the error\n strapi.log.error('Error while deleting release actions after entry deleteMany', {\n error,\n });\n }\n },\n });\n\n // We register middleware to handle ReleaseActions when changes on documents are made\n strapi.documents.use(deleteActionsOnDelete);\n strapi.documents.use(updateActionsOnUpdate);\n\n getService('scheduling', { strapi })\n .syncFromDatabase()\n .catch((err: Error) => {\n strapi.log.error(\n 'Error while syncing scheduled jobs from the database in the content-releases plugin. This could lead to errors in the releases scheduling.'\n );\n\n throw err;\n });\n\n Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {\n strapi.get('webhookStore').addAllowedEvent(key, value);\n });\n\n // Absent in CE, without the audit-logs license, or when disabled by config;\n // get() throws for services that were never added, so probe first.\n if (strapi.has('audit-logs-lifecycle')) {\n registerAuditEvents(strapi.get('audit-logs-lifecycle'));\n }\n }\n};\n"],"names":["deleteReleasesActionsAndUpdateReleaseStatus","params","releases","strapi","db","query","RELEASE_MODEL_UID","findMany","where","actions","RELEASE_ACTION_MODEL_UID","deleteMany","release","getService","updateReleaseStatus","id","bootstrap","ee","features","isEnabled","contentTypesWithDraftAndPublish","Object","keys","contentTypes","filter","uid","options","draftAndPublish","lifecycles","subscribe","models","afterDeleteMany","event","model","getModel","kind","contentType","locale","documentId","entryDocumentId","error","log","documents","use","deleteActionsOnDelete","updateActionsOnUpdate","syncFromDatabase","catch","err","entries","ALLOWED_WEBHOOK_EVENTS","forEach","key","value","get","addAllowedEvent","has","registerAuditEvents"],"mappings":"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"}
1
+ {"version":3,"file":"bootstrap.js","sources":["../../server/src/bootstrap.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\nimport type { Core, UID, Modules } from '@strapi/types';\n\nimport { RELEASE_ACTION_MODEL_UID, RELEASE_MODEL_UID, ALLOWED_WEBHOOK_EVENTS } from './constants';\nimport { registerAuditEvents } from './audit-logs';\nimport { getService, updateAffectedReleaseStatuses } from './utils';\nimport { deleteActionsOnDelete, updateActionsOnUpdate } from './middlewares/documents';\n\ninterface DeleteManyParams {\n contentType: UID.ContentType;\n locale: string | null;\n entryDocumentId?: Modules.Documents.ID;\n}\n\nconst deleteReleasesActionsAndUpdateReleaseStatus = async (\n params: DeleteManyParams,\n strapi: Core.Strapi\n) => {\n const releases = await strapi.db.query(RELEASE_MODEL_UID).findMany({\n where: {\n actions: params,\n },\n });\n\n await strapi.db.query(RELEASE_ACTION_MODEL_UID).deleteMany({\n where: params,\n });\n\n // We update the status of each release after delete the actions\n await updateAffectedReleaseStatuses(releases, { strapi });\n};\n\nexport const bootstrap = async ({ strapi }: { strapi: Core.Strapi }) => {\n if (strapi.ee.features.isEnabled('cms-content-releases')) {\n const contentTypesWithDraftAndPublish = Object.keys(strapi.contentTypes).filter(\n (uid: any) => strapi.contentTypes[uid]?.options?.draftAndPublish\n );\n\n strapi.db.lifecycles.subscribe({\n models: contentTypesWithDraftAndPublish,\n\n /**\n * deleteMany is still used outside documents service, for example when deleting a locale\n */\n async afterDeleteMany(event) {\n try {\n const model = strapi.getModel(event.model.uid as UID.Schema);\n // @ts-expect-error TODO: lifecycles types looks like are not 100% finished\n if (model.kind === 'collectionType' && model.options?.draftAndPublish) {\n const { where } = event.params;\n\n await deleteReleasesActionsAndUpdateReleaseStatus(\n {\n contentType: model.uid,\n locale: where?.locale ?? null,\n ...(where?.documentId && { entryDocumentId: where.documentId }),\n },\n strapi\n );\n }\n } catch (error) {\n // If an error happens we don't want to block the delete entry flow, but we log the error\n strapi.log.error('Error while deleting release actions after entry deleteMany', {\n error,\n });\n }\n },\n });\n\n // We register middleware to handle ReleaseActions when changes on documents are made\n strapi.documents.use(deleteActionsOnDelete);\n strapi.documents.use(updateActionsOnUpdate);\n\n getService('scheduling', { strapi })\n .syncFromDatabase()\n .catch((err: Error) => {\n strapi.log.error(\n 'Error while syncing scheduled jobs from the database in the content-releases plugin. This could lead to errors in the releases scheduling.'\n );\n\n throw err;\n });\n\n Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {\n strapi.get('webhookStore').addAllowedEvent(key, value);\n });\n\n // Absent in CE, without the audit-logs license, or when disabled by config;\n // get() throws for services that were never added, so probe first.\n if (strapi.has('audit-logs-lifecycle')) {\n registerAuditEvents(strapi.get('audit-logs-lifecycle'));\n }\n }\n};\n"],"names":["deleteReleasesActionsAndUpdateReleaseStatus","params","strapi","releases","db","query","RELEASE_MODEL_UID","findMany","where","actions","RELEASE_ACTION_MODEL_UID","deleteMany","updateAffectedReleaseStatuses","bootstrap","ee","features","isEnabled","contentTypesWithDraftAndPublish","Object","keys","contentTypes","filter","uid","options","draftAndPublish","lifecycles","subscribe","models","afterDeleteMany","event","model","getModel","kind","contentType","locale","documentId","entryDocumentId","error","log","documents","use","deleteActionsOnDelete","updateActionsOnUpdate","getService","syncFromDatabase","catch","err","entries","ALLOWED_WEBHOOK_EVENTS","forEach","key","value","get","addAllowedEvent","has","registerAuditEvents"],"mappings":"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"}