chore: merge develop into v5/main (#20126)

This commit is contained in:
markkaylor 2024-04-16 18:06:25 +02:00 committed by GitHub
parent e2d1ee0951
commit 80e532931b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
43 changed files with 772 additions and 154 deletions

View File

@ -49,6 +49,12 @@ const config = {
watch: process.env.TYPEDOC_WATCH,
},
],
[
'@cmfcmf/docusaurus-search-local',
{
indexBlog: false,
},
],
],
presets: [
[

View File

@ -26,6 +26,7 @@
]
},
"dependencies": {
"@cmfcmf/docusaurus-search-local": "1.1.0",
"@docusaurus/core": "3.1.1",
"@docusaurus/preset-classic": "3.1.1",
"@mdx-js/react": "^3.0.0",

View File

@ -5,6 +5,16 @@ __metadata:
version: 8
cacheKey: 10
"@algolia/autocomplete-core@npm:1.17.0":
version: 1.17.0
resolution: "@algolia/autocomplete-core@npm:1.17.0"
dependencies:
"@algolia/autocomplete-plugin-algolia-insights": "npm:1.17.0"
"@algolia/autocomplete-shared": "npm:1.17.0"
checksum: 09b0beaf3e742db9f278d951a76a51ef328ac7545564d692d54c0d9e54600e1836a9f03281585bd3cc056c0afa8f9cb9936755aab6b7e46492d463b76f117410
languageName: node
linkType: hard
"@algolia/autocomplete-core@npm:1.9.3":
version: 1.9.3
resolution: "@algolia/autocomplete-core@npm:1.9.3"
@ -15,6 +25,33 @@ __metadata:
languageName: node
linkType: hard
"@algolia/autocomplete-js@npm:^1.8.2":
version: 1.17.0
resolution: "@algolia/autocomplete-js@npm:1.17.0"
dependencies:
"@algolia/autocomplete-core": "npm:1.17.0"
"@algolia/autocomplete-preset-algolia": "npm:1.17.0"
"@algolia/autocomplete-shared": "npm:1.17.0"
htm: "npm:^3.1.1"
preact: "npm:^10.13.2"
peerDependencies:
"@algolia/client-search": ">= 4.5.1 < 6"
algoliasearch: ">= 4.9.1 < 6"
checksum: e40576eeaf245242d44453c7c1c4860a239ab7b85d8ab59b53fa8479e248dce8ecf9adc91162f2c7f0d37b2da0c123010efa6975714abd0f56dd7d7e99dab674
languageName: node
linkType: hard
"@algolia/autocomplete-plugin-algolia-insights@npm:1.17.0":
version: 1.17.0
resolution: "@algolia/autocomplete-plugin-algolia-insights@npm:1.17.0"
dependencies:
"@algolia/autocomplete-shared": "npm:1.17.0"
peerDependencies:
search-insights: ">= 1 < 3"
checksum: 99fb44f998acf340bac6ba039e434e925c24d20d3ebca462e8a0b3e8091da239b19a5a18be4e2abd9dae58398cfd6843f9f630e300a394abe292164bbfe0dee3
languageName: node
linkType: hard
"@algolia/autocomplete-plugin-algolia-insights@npm:1.9.3":
version: 1.9.3
resolution: "@algolia/autocomplete-plugin-algolia-insights@npm:1.9.3"
@ -26,6 +63,18 @@ __metadata:
languageName: node
linkType: hard
"@algolia/autocomplete-preset-algolia@npm:1.17.0":
version: 1.17.0
resolution: "@algolia/autocomplete-preset-algolia@npm:1.17.0"
dependencies:
"@algolia/autocomplete-shared": "npm:1.17.0"
peerDependencies:
"@algolia/client-search": ">= 4.9.1 < 6"
algoliasearch: ">= 4.9.1 < 6"
checksum: 9d1b879d56f123b974a1aabfeedce7204ba1dec11894d6642f3282d127beac63607dcfe5c79ea2948c35683288f436f916215c3f08ec9cddd2c8d102107a2ed6
languageName: node
linkType: hard
"@algolia/autocomplete-preset-algolia@npm:1.9.3":
version: 1.9.3
resolution: "@algolia/autocomplete-preset-algolia@npm:1.9.3"
@ -38,6 +87,16 @@ __metadata:
languageName: node
linkType: hard
"@algolia/autocomplete-shared@npm:1.17.0":
version: 1.17.0
resolution: "@algolia/autocomplete-shared@npm:1.17.0"
peerDependencies:
"@algolia/client-search": ">= 4.9.1 < 6"
algoliasearch: ">= 4.9.1 < 6"
checksum: 19d2937ece343c2ad99bb362a27ded5c08bde4b8b5eadc04d3de1371cb2bcee377f29f841abce9d4578160cb9e9406f6216cc06dad0128bff9d4b7115cffab9e
languageName: node
linkType: hard
"@algolia/autocomplete-shared@npm:1.9.3":
version: 1.9.3
resolution: "@algolia/autocomplete-shared@npm:1.9.3"
@ -48,6 +107,13 @@ __metadata:
languageName: node
linkType: hard
"@algolia/autocomplete-theme-classic@npm:^1.8.2":
version: 1.17.0
resolution: "@algolia/autocomplete-theme-classic@npm:1.17.0"
checksum: 17f9617d7cb9587d668f17991c9749ec04fa561891181e64613805b9528c37309ddad3192fced2763284a80df960b85c4fe17d8ff42cbab88f6e555050f8a859
languageName: node
linkType: hard
"@algolia/cache-browser-local-storage@npm:4.23.2":
version: 4.23.2
resolution: "@algolia/cache-browser-local-storage@npm:4.23.2"
@ -117,7 +183,7 @@ __metadata:
languageName: node
linkType: hard
"@algolia/client-search@npm:4.23.2":
"@algolia/client-search@npm:4.23.2, @algolia/client-search@npm:^4.12.0":
version: 4.23.2
resolution: "@algolia/client-search@npm:4.23.2"
dependencies:
@ -2033,6 +2099,28 @@ __metadata:
languageName: node
linkType: hard
"@cmfcmf/docusaurus-search-local@npm:1.1.0":
version: 1.1.0
resolution: "@cmfcmf/docusaurus-search-local@npm:1.1.0"
dependencies:
"@algolia/autocomplete-js": "npm:^1.8.2"
"@algolia/autocomplete-theme-classic": "npm:^1.8.2"
"@algolia/client-search": "npm:^4.12.0"
algoliasearch: "npm:^4.12.0"
cheerio: "npm:^1.0.0-rc.9"
clsx: "npm:^1.1.1"
lunr-languages: "npm:^1.4.0"
mark.js: "npm:^8.11.1"
peerDependencies:
"@docusaurus/core": ^2.0.0
nodejieba: ^2.5.0
peerDependenciesMeta:
nodejieba:
optional: true
checksum: 5c5692ab133873930fa1c0db07b09a13dfc4c3d95908e506c3cd72746ceedaf97d6d1328044921abe90d377d6a90cb277328ca8639ef10556b0b58d48681c067
languageName: node
linkType: hard
"@colors/colors@npm:1.5.0":
version: 1.5.0
resolution: "@colors/colors@npm:1.5.0"
@ -3914,7 +4002,7 @@ __metadata:
languageName: node
linkType: hard
"algoliasearch@npm:^4.18.0, algoliasearch@npm:^4.19.1":
"algoliasearch@npm:^4.12.0, algoliasearch@npm:^4.18.0, algoliasearch@npm:^4.19.1":
version: 4.23.2
resolution: "algoliasearch@npm:4.23.2"
dependencies:
@ -4546,7 +4634,7 @@ __metadata:
languageName: node
linkType: hard
"cheerio@npm:^1.0.0-rc.12":
"cheerio@npm:^1.0.0-rc.12, cheerio@npm:^1.0.0-rc.9":
version: 1.0.0-rc.12
resolution: "cheerio@npm:1.0.0-rc.12"
dependencies:
@ -5507,6 +5595,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "docs@workspace:."
dependencies:
"@cmfcmf/docusaurus-search-local": "npm:1.1.0"
"@docusaurus/core": "npm:3.1.1"
"@docusaurus/module-type-aliases": "npm:3.1.1"
"@docusaurus/preset-classic": "npm:3.1.1"
@ -6833,6 +6922,13 @@ __metadata:
languageName: node
linkType: hard
"htm@npm:^3.1.1":
version: 3.1.1
resolution: "htm@npm:3.1.1"
checksum: cb862dc5c9eac532937af7a9e26edd1e0e7939fc78a06efde4ae10b3a145f9506e644ff084c871dd808c315342b56fd0baa174a2a2cdf6071a4130ee0abee9e0
languageName: node
linkType: hard
"html-entities@npm:^2.3.2":
version: 2.3.3
resolution: "html-entities@npm:2.3.3"
@ -7900,6 +7996,13 @@ __metadata:
languageName: node
linkType: hard
"lunr-languages@npm:^1.4.0":
version: 1.14.0
resolution: "lunr-languages@npm:1.14.0"
checksum: bb17d7e481efcf262de930b2e0980e0b33790c80a0aec1aeb102f4a32ad4418971efeae2bb1b6841825c1b055fca68dea37aea871524e9d84a451a113076d933
languageName: node
linkType: hard
"lunr@npm:^2.3.9":
version: 2.3.9
resolution: "lunr@npm:2.3.9"
@ -7931,6 +8034,13 @@ __metadata:
languageName: node
linkType: hard
"mark.js@npm:^8.11.1":
version: 8.11.1
resolution: "mark.js@npm:8.11.1"
checksum: 3b01b9ea4761f2104ab1fbe2cc917c0a9ca580f778f62edde7eb95c6322330cba0ddc45f8aa163ef5b0b3b3eeba20df683b42831fbe5e8429ff3b4b4cecfd28a
languageName: node
linkType: hard
"markdown-extensions@npm:^2.0.0":
version: 2.0.0
resolution: "markdown-extensions@npm:2.0.0"
@ -10117,6 +10227,13 @@ __metadata:
languageName: node
linkType: hard
"preact@npm:^10.13.2":
version: 10.20.1
resolution: "preact@npm:10.20.1"
checksum: 894ac14b3ec6f8ca308b53fb14e12e57678248fd1faa24ae857f5e37d9c11b34833e6dd1ba8210a34de4d6d523462923b1f9c93d35ce433874affd056f2d0998
languageName: node
linkType: hard
"pretty-error@npm:^4.0.0":
version: 4.0.0
resolution: "pretty-error@npm:4.0.0"

View File

@ -32,6 +32,8 @@
"scripts": {
"build": "nx run-many --target=build --nx-ignore-cycles",
"build:size": "cd examples/getstarted && yarn build",
"build:ts": "nx run-many --target=build:ts --nx-ignore-cycles",
"build:watch": "nx watch --all --nx-ignore-cycles -- nx run \\$NX_PROJECT_NAME:build --nx-ignore-cycles",
"clean": "nx run-many --target=clean --nx-ignore-cycles",
"commit": "commit",
"doc:api": "node scripts/open-api/serve.js",
@ -70,11 +72,10 @@
"test:ts:packages": "nx run-many --target=test:ts --nx-ignore-cycles",
"test:unit": "jest --config jest.config.js",
"test:unit:all": "nx run-many --target=test:unit --nx-ignore-cycles",
"test:unit:watch": "run test:unit --watch",
"watch": "nx run-many --target=watch --nx-ignore-cycles"
"test:unit:watch": "run test:unit --watch"
},
"resolutions": {
"@strapi/design-system": "1.18.0-typescript.0",
"@strapi/design-system": "1.19.0-typescript.0",
"@types/koa": "2.13.4"
},
"devDependencies": {

View File

@ -78,8 +78,8 @@
"@radix-ui/react-context": "1.0.1",
"@radix-ui/react-toolbar": "1.0.4",
"@reduxjs/toolkit": "1.9.7",
"@strapi/design-system": "1.17.0",
"@strapi/icons": "1.16.0",
"@strapi/design-system": "1.18.0",
"@strapi/icons": "1.18.0",
"@strapi/permissions": "5.0.0-beta.3",
"@strapi/provider-audit-logs-local": "5.0.0-beta.3",
"@strapi/types": "5.0.0-beta.3",

View File

@ -60,8 +60,8 @@
"@radix-ui/react-toolbar": "1.0.4",
"@reduxjs/toolkit": "1.9.7",
"@sindresorhus/slugify": "1.1.0",
"@strapi/design-system": "1.17.0",
"@strapi/icons": "1.16.0",
"@strapi/design-system": "1.18.0",
"@strapi/icons": "1.18.0",
"@strapi/types": "5.0.0-beta.3",
"@strapi/utils": "5.0.0-beta.3",
"axios": "1.6.8",

View File

@ -346,7 +346,7 @@ export const CMReleasesContainer = () => {
alignItems="start"
borderWidth="1px"
borderStyle="solid"
borderColor={getReleaseColorVariant(release.action.type, '200')}
borderColor={getReleaseColorVariant(release.actions[0].type, '200')}
overflow="hidden"
hasRadius
>
@ -355,13 +355,13 @@ export const CMReleasesContainer = () => {
paddingBottom={3}
paddingLeft={4}
paddingRight={4}
background={getReleaseColorVariant(release.action.type, '100')}
background={getReleaseColorVariant(release.actions[0].type, '100')}
width="100%"
>
<Typography
fontSize={1}
variant="pi"
textColor={getReleaseColorVariant(release.action.type, '600')}
textColor={getReleaseColorVariant(release.actions[0].type, '600')}
>
{formatMessage(
{
@ -369,7 +369,7 @@ export const CMReleasesContainer = () => {
defaultMessage:
'{isPublish, select, true {Will be published in} other {Will be unpublished in}}',
},
{ isPublish: release.action.type === 'publish' }
{ isPublish: release.actions[0].type === 'publish' }
)}
</Typography>
</Box>
@ -409,7 +409,7 @@ export const CMReleasesContainer = () => {
<ReleaseActionMenu.EditReleaseItem releaseId={release.id} />
<ReleaseActionMenu.DeleteReleaseActionItem
releaseId={release.id}
actionId={release.action.id}
actionId={release.actions[0].id}
/>
</ReleaseActionMenu.Root>
) : null}

View File

@ -0,0 +1,168 @@
// import * as React from 'react';
// import { Box, Flex, Popover, Typography } from '@strapi/design-system';
// import { Link } from '@strapi/design-system/v2';
// import { Modules, UID } from '@strapi/types';
// import { useIntl } from 'react-intl';
// import styled from 'styled-components';
// import { useGetMappedEntriesInReleasesQuery } from '../services/release';
// import { useTypedSelector } from '../store/hooks';
// // TODO: Migrate to v5
// // import type { CMAdminConfiguration, ListLayoutRow } from '@strapi/admin/strapi-admin';
// type Entity = Modules.EntityService.Result<UID.Schema>;
// const Button = styled.button`
// svg {
// > g,
// path {
// fill: ${({ theme }) => theme.colors.neutral500};
// }
// }
// &:hover {
// svg {
// > g,
// path {
// fill: ${({ theme }) => theme.colors.neutral600};
// }
// }
// }
// &:active {
// svg {
// > g,
// path {
// fill: ${({ theme }) => theme.colors.neutral400};
// }
// }
// }
// `;
// const ActionWrapper = styled(Flex)`
// svg {
// height: ${4 / 16}rem;
// }
// `;
// /* -------------------------------------------------------------------------------------------------
// * useReleasesList
// * -----------------------------------------------------------------------------------------------*/
// const useReleasesList = (entryId: string | number) => {
// const { uid: contentTypeUid } = useTypedSelector(
// (state) => state['content-manager_listView'].contentType
// );
// const listViewData = useTypedSelector((state) => state['content-manager_listView'].data);
// // @ts-expect-error Fix when migrating to v5
// const entriesIds = listViewData.map((entry) => entry.id);
// const response = useGetMappedEntriesInReleasesQuery(
// { contentTypeUid, entriesIds },
// { skip: !entriesIds || !contentTypeUid || entriesIds.length === 0 }
// );
// const mappedEntriesInReleases = response.data || {};
// // @ts-expect-error Fix when migrating releases
// return mappedEntriesInReleases?.[entryId] || [];
// };
// /* -------------------------------------------------------------------------------------------------
// * addColumnToTableHook
// * -----------------------------------------------------------------------------------------------*/
// // TODO: Migrate to v5
// // interface AddColumnToTableHookArgs {
// // layout: {
// // components: Record<string, CMAdminConfiguration>;
// // contentType: CMAdminConfiguration;
// // };
// // displayedHeaders: ListLayoutRow[];
// // }
// const addColumnToTableHook = ({ displayedHeaders, layout }: any) => {
// const { contentType } = layout;
// if (!contentType.options?.draftAndPublish) {
// return { displayedHeaders, layout };
// }
// return {
// displayedHeaders: [
// ...displayedHeaders,
// {
// key: '__release_key__',
// fieldSchema: { type: 'string' },
// metadatas: { label: 'To be released in', searchable: true, sortable: false },
// name: 'releasedAt',
// cellFormatter: (props: Entity) => <ReleaseListCell {...props} />,
// },
// ],
// layout,
// };
// };
// /* -------------------------------------------------------------------------------------------------
// * ReleaseListCell
// * -----------------------------------------------------------------------------------------------*/
// interface ReleaseListCellProps {
// id: Entity['id'];
// }
// const ReleaseListCell = ({ id }: ReleaseListCellProps) => {
// const releases = useReleasesList(id);
// const [visible, setVisible] = React.useState(false);
// const buttonRef = React.useRef<HTMLButtonElement>(null);
// const { formatMessage } = useIntl();
// const handleTogglePopover = () => setVisible((prev) => !prev);
// return (
// <Flex onClick={(e) => e.stopPropagation()}>
// <Button type="button" onClick={handleTogglePopover} ref={buttonRef}>
// <ActionWrapper height="2rem" width="2rem">
// <Typography style={{ maxWidth: '252px', cursor: 'pointer' }} textColor="neutral800">
// {releases.length > 0
// ? formatMessage(
// {
// id: 'content-releases.content-manager.list-view.releases-number',
// defaultMessage: '{number} {number, plural, one {release} other {releases}}',
// },
// {
// number: releases.length,
// }
// )
// : '-'}
// </Typography>
// <Flex>
// {/* {releases.length > 0 && <SortIcon />} */}
// {visible && (
// <Popover
// onDismiss={handleTogglePopover}
// source={buttonRef as React.MutableRefObject<HTMLElement>}
// spacing={16}
// >
// <ul>
// {releases.map(
// // @ts-expect-error fix when migrating to v5
// ({ id, name }) => (
// <Box key={id} padding={3} as="li">
// <Link href={`/admin/plugins/content-releases/${id}`} isExternal={false}>
// {name}
// </Link>
// </Box>
// ))}
// </ul>
// </Popover>
// )}
// </Flex>
// </ActionWrapper>
// </Button>
// </Flex>
// );
// };
// export { ReleaseListCell, addColumnToTableHook };
// export type { ReleaseListCellProps };

View File

@ -85,7 +85,7 @@ describe('CMReleasesContainer', () => {
rest.get('/content-releases', (req, res, ctx) => {
return res(
ctx.json({
data: [{ name: 'release1', id: '1', action: { type: 'publish' } }],
data: [{ name: 'release1', id: '1', actions: [{ type: 'publish' }] }],
})
);
})
@ -112,8 +112,8 @@ describe('CMReleasesContainer', () => {
return res(
ctx.json({
data: [
{ name: 'release1', id: '1', action: { type: 'publish' } },
{ name: 'release2', id: '2', action: { type: 'unpublish' } },
{ name: 'release1', id: '1', actions: [{ type: 'publish' }] },
{ name: 'release2', id: '2', actions: [{ type: 'unpublish' }] },
],
})
);
@ -142,7 +142,7 @@ describe('CMReleasesContainer', () => {
{
name: 'release1',
id: '1',
action: { type: 'publish' },
actions: [{ type: 'publish' }],
scheduledAt: '2024-01-01T10:00:00.000Z',
timezone: 'Europe/Paris',
},

View File

@ -2,6 +2,7 @@ import { PaperPlane } from '@strapi/icons';
import { CMReleasesContainer } from './components/CMReleasesContainer';
import { ReleaseAction } from './components/ReleaseAction';
// import { addColumnToTableHook } from './components/ReleaseListCell';
import { PERMISSIONS } from './constants';
import { pluginId } from './pluginId';
import { releaseApi } from './services/release';
@ -15,6 +16,12 @@ import type { Plugin } from '@strapi/types';
const admin: Plugin.Config.AdminInput = {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
register(app: StrapiApp) {
/**
* Hook that adds the locale column in the Release Details table
* @constant
* @type {string}
*/
app.createHook('ContentReleases/pages/ReleaseDetails/add-locale-in-releases');
if (window.strapi.features.isEnabled('cms-content-releases')) {
app.addMenuLink({
to: `plugins/${pluginId}`,
@ -52,6 +59,8 @@ const admin: Plugin.Config.AdminInput = {
actions.splice(deleteActionIndex, 0, ReleaseAction);
return actions;
});
// Hook that adds a column into the CM's LV table
// app.registerHook('Admin/CM/pages/ListView/inject-column-in-table', addColumnToTableHook);
} else if (
!window.strapi.features.isEnabled('cms-content-releases') &&
window.strapi?.flags?.promoteEE

View File

@ -11,6 +11,7 @@ import {
useNotification,
useQueryParams,
useRBAC,
useStrapiApp,
} from '@strapi/admin/strapi-admin';
import {
Button,
@ -482,6 +483,7 @@ const ReleaseDetailsLayout = ({
* ReleaseDetailsBody
* -----------------------------------------------------------------------------------------------*/
const GROUP_BY_OPTIONS = ['contentType', 'locale', 'action'] as const;
const GROUP_BY_OPTIONS_NO_LOCALE = ['contentType', 'action'] as const;
const getGroupByOptionLabel = (value: (typeof GROUP_BY_OPTIONS)[number]) => {
if (value === 'locale') {
return {
@ -521,6 +523,22 @@ const ReleaseDetailsBody = ({ releaseId }: ReleaseDetailsBodyProps) => {
const {
allowedActions: { canUpdate },
} = useRBAC(PERMISSIONS);
const runHookWaterfall = useStrapiApp('ReleaseDetailsPage', (state) => state.runHookWaterfall);
// TODO: Migrated displayedHeader to v5
const { hasI18nEnabled }: { displayedHeaders: any; hasI18nEnabled: boolean } = runHookWaterfall(
'ContentReleases/pages/ReleaseDetails/add-locale-in-releases',
{
displayedHeaders: {
label: formatMessage({
id: 'content-releases.page.ReleaseDetails.table.header.label.locale',
defaultMessage: 'locale',
}),
name: 'locale',
},
hasI18nEnabled: false,
}
);
const release = releaseData?.data;
const selectedGroupBy = query?.groupBy || 'contentType';
@ -643,6 +661,7 @@ const ReleaseDetailsBody = ({ releaseId }: ReleaseDetailsBodyProps) => {
defaultMessage: 'Group by',
});
const headers = [
// ...displayedHeaders,
{
label: formatMessage({
id: 'content-releases.page.ReleaseDetails.table.header.label.name',
@ -650,13 +669,6 @@ const ReleaseDetailsBody = ({ releaseId }: ReleaseDetailsBodyProps) => {
}),
name: 'name',
},
{
label: formatMessage({
id: 'content-releases.page.ReleaseDetails.table.header.label.locale',
defaultMessage: 'locale',
}),
name: 'locale',
},
{
label: formatMessage({
id: 'content-releases.page.ReleaseDetails.table.header.label.content-type',
@ -683,6 +695,7 @@ const ReleaseDetailsBody = ({ releaseId }: ReleaseDetailsBodyProps) => {
]
: []),
];
const options = hasI18nEnabled ? GROUP_BY_OPTIONS : GROUP_BY_OPTIONS_NO_LOCALE;
return (
<ContentLayout>
@ -705,7 +718,7 @@ const ReleaseDetailsBody = ({ releaseId }: ReleaseDetailsBodyProps) => {
value={formatMessage(getGroupByOptionLabel(selectedGroupBy))}
onChange={(value) => setQuery({ groupBy: value as ReleaseActionGroupBy })}
>
{GROUP_BY_OPTIONS.map((option) => (
{options.map((option) => (
<SingleSelectOption key={option} value={option}>
{formatMessage(getGroupByOptionLabel(option))}
</SingleSelectOption>
@ -741,9 +754,12 @@ const ReleaseDetailsBody = ({ releaseId }: ReleaseDetailsBodyProps) => {
contentType.mainFieldValue || entry.id
}`}</Typography>
</Td>
<Td width="10%">
<Typography>{`${locale?.name ? locale.name : '-'}`}</Typography>
</Td>
{hasI18nEnabled && (
<Td width="10%">
<Typography>{`${locale?.name ? locale.name : '-'}`}</Typography>
</Td>
)}
<Td width="10%">
<Typography>{contentType.displayName || ''}</Typography>
</Td>

View File

@ -272,7 +272,6 @@ const ReleasesPage = () => {
});
trackUsage('didCreateRelease');
navigate(response.data.data.id.toString());
} else if (isAxiosError(response.error)) {
// When the response returns an object with 'error', handle axios error

View File

@ -24,7 +24,7 @@ jest.mock('@strapi/plugin-content-manager/strapi-admin', () => ({
unstable_useDocument: jest.fn().mockReturnValue({ validate: jest.fn().mockReturnValue({}) }),
}));
describe('Releases details page', () => {
describe.skip('Releases details page', () => {
it('renders the details page with no release-actions', async () => {
server.use(
rest.get('/content-releases/:releaseId', (req, res, ctx) =>

View File

@ -22,6 +22,7 @@ import type {
UpdateRelease,
GetRelease,
PublishRelease,
MapEntriesToReleases,
} from '../../../shared/contracts/releases';
export interface GetReleasesQueryParams {
@ -50,7 +51,7 @@ type GetReleasesTabResponse = GetReleases.Response & {
const releaseApi = createApi({
reducerPath: pluginId,
baseQuery: axiosBaseQuery,
tagTypes: ['Release', 'ReleaseAction'],
tagTypes: ['Release', 'ReleaseAction', 'EntriesInRelease'],
endpoints: (build) => {
return {
getReleasesForEntry: build.query<
@ -200,6 +201,7 @@ const releaseApi = createApi({
invalidatesTags: [
{ type: 'Release', id: 'LIST' },
{ type: 'ReleaseAction', id: 'LIST' },
{ type: 'EntriesInRelease' },
],
}),
updateReleaseAction: build.mutation<
@ -255,6 +257,7 @@ const releaseApi = createApi({
{ type: 'Release', id: 'LIST' },
{ type: 'Release', id: arg.params.releaseId },
{ type: 'ReleaseAction', id: 'LIST' },
{ type: 'EntriesInRelease' },
],
}),
publishRelease: build.mutation<PublishRelease.Response, PublishRelease.Request['params']>({
@ -273,7 +276,25 @@ const releaseApi = createApi({
method: 'DELETE',
};
},
invalidatesTags: () => [{ type: 'Release', id: 'LIST' }],
invalidatesTags: () => [{ type: 'Release', id: 'LIST' }, { type: 'EntriesInRelease' }],
}),
getMappedEntriesInReleases: build.query<
MapEntriesToReleases.Response['data'],
MapEntriesToReleases.Request['query']
>({
query(params) {
return {
url: '/content-releases/mapEntriesToReleases',
method: 'GET',
config: {
params,
},
};
},
transformResponse(response: MapEntriesToReleases.Response) {
return response.data;
},
providesTags: [{ type: 'EntriesInRelease' }],
}),
};
},
@ -292,6 +313,7 @@ const {
usePublishReleaseMutation,
useDeleteReleaseActionMutation,
useDeleteReleaseMutation,
useGetMappedEntriesInReleasesQuery,
} = releaseApi;
export {
@ -307,5 +329,6 @@ export {
usePublishReleaseMutation,
useDeleteReleaseActionMutation,
useDeleteReleaseMutation,
useGetMappedEntriesInReleasesQuery,
releaseApi,
};

View File

@ -24,6 +24,7 @@
"content-manager-list-view.add-to-release.notification.success.title": "Successfully added to release.",
"content-manager-list-view.add-to-release.notification.success.message": "{entriesAlreadyInRelease} out of {totalEntries} entries were already in the release.",
"content-manager.notification.entry-error": "Failed to get entry data",
"content-manager.list-view.releases-number": "{number} {number, plural, one {release} other {releases}}",
"plugin.name": "Releases",
"pages.Releases.title": "Releases",
"pages.Releases.header-subtitle": "Create and manage content updates",

View File

@ -55,8 +55,8 @@
},
"dependencies": {
"@reduxjs/toolkit": "1.9.7",
"@strapi/design-system": "1.17.0",
"@strapi/icons": "1.16.0",
"@strapi/design-system": "1.18.0",
"@strapi/icons": "1.18.0",
"@strapi/types": "workspace:*",
"@strapi/utils": "5.0.0-beta.3",
"axios": "1.6.8",

View File

@ -265,4 +265,85 @@ describe('Release controller', () => {
expect(strapi.service('admin::user').sanitizeUser).toHaveBeenCalled();
});
});
describe('mapEntriesToReleases', () => {
it('should throw an error if contentTypeUid or entriesIds are missing', async () => {
const ctx = {
query: {},
};
// @ts-expect-error partial context
await expect(() => releaseController.mapEntriesToReleases(ctx)).rejects.toThrow(
'Missing required query parameters'
);
});
it('should call findManyWithContentTypeEntryAttached with correct parameters', async () => {
const ctx = {
query: {
contentTypeUid: 'api::kitchensink.kitchensink',
entriesIds: [1, 2, 3],
},
};
const mockRelease = {
id: 1,
name: 'Test Release',
actions: [
{
entry: {
id: 1,
},
},
],
};
mockFindManyWithContentTypeEntryAttached.mockResolvedValue([mockRelease]);
// @ts-expect-error partial context
await releaseController.mapEntriesToReleases(ctx);
expect(mockFindManyWithContentTypeEntryAttached).toHaveBeenCalledWith(
'api::kitchensink.kitchensink',
[1, 2, 3]
);
});
it('should map entries to releases correctly', async () => {
const ctx = {
query: {
contentTypeUid: 'api::kitchensink.kitchensink',
entriesIds: [1, 2, 3],
},
body: { data: {} },
};
const mockRelease = {
id: 1,
name: 'Test Release',
actions: [
{
entry: {
id: 1,
},
},
{
entry: {
id: 2,
},
},
],
};
mockFindManyWithContentTypeEntryAttached.mockResolvedValue([mockRelease]);
// @ts-expect-error partial context
await releaseController.mapEntriesToReleases(ctx);
expect(ctx.body.data).toEqual({
1: [{ id: 1, name: 'Test Release' }],
2: [{ id: 1, name: 'Test Release' }],
});
});
});
});

View File

@ -11,6 +11,7 @@ import type {
DeleteRelease,
GetContentTypeEntryReleases,
GetReleases,
MapEntriesToReleases,
} from '../../../shared/contracts/releases';
import type { UserInfo } from '../../../shared/types';
import { getService } from '../utils';
@ -106,6 +107,42 @@ const releaseController = {
ctx.body = { data };
},
async mapEntriesToReleases(ctx: Koa.Context) {
const { contentTypeUid, entriesIds } = ctx.query;
if (!contentTypeUid || !entriesIds) {
throw new errors.ValidationError('Missing required query parameters');
}
const releaseService = getService('release', { strapi });
const releasesWithActions = await releaseService.findManyWithContentTypeEntryAttached(
contentTypeUid,
entriesIds
);
const mappedEntriesInReleases = releasesWithActions.reduce(
// TODO: Fix for v5 removed mappedEntriedToRelease
(acc: MapEntriesToReleases.Response['data'], release: Release) => {
release.actions.forEach((action) => {
if (!acc[action.entry.id]) {
acc[action.entry.id] = [{ id: release.id, name: release.name }];
} else {
acc[action.entry.id].push({ id: release.id, name: release.name });
}
});
return acc;
},
// TODO: Fix for v5 removed mappedEntriedToRelease
{} as MapEntriesToReleases.Response['data']
);
ctx.body = {
data: mappedEntriesInReleases,
};
},
async create(ctx: Koa.Context) {
const user: UserInfo = ctx.state.user;
const releaseArgs = ctx.request.body as CreateRelease.Request['body'];
@ -121,9 +158,7 @@ const releaseController = {
});
ctx.created({
body: {
data: await permissionsManager.sanitizeOutput(release),
},
data: await permissionsManager.sanitizeOutput(release),
});
},

View File

@ -187,6 +187,11 @@ export async function disableContentTypeLocalized({ oldContentTypes, contentType
return;
}
const i18nPlugin = strapi.plugin('i18n');
if (!i18nPlugin) {
return;
}
for (const uid in contentTypes) {
if (!oldContentTypes[uid]) {
continue;
@ -195,7 +200,6 @@ export async function disableContentTypeLocalized({ oldContentTypes, contentType
const oldContentType = oldContentTypes[uid];
const contentType = contentTypes[uid];
const i18nPlugin = strapi.plugin('i18n');
const { isLocalizedContentType } = i18nPlugin.service('content-types');
// if i18N is disabled remove non default locales before sync
@ -216,6 +220,11 @@ export async function enableContentTypeLocalized({ oldContentTypes, contentTypes
return;
}
const i18nPlugin = strapi.plugin('i18n');
if (!i18nPlugin) {
return;
}
for (const uid in contentTypes) {
if (!oldContentTypes[uid]) {
continue;
@ -224,7 +233,6 @@ export async function enableContentTypeLocalized({ oldContentTypes, contentTypes
const oldContentType = oldContentTypes[uid];
const contentType = contentTypes[uid];
const i18nPlugin = strapi.plugin('i18n');
const { isLocalizedContentType } = i18nPlugin.service('content-types');
const { getDefaultLocale } = i18nPlugin.service('locales');

View File

@ -1,6 +1,22 @@
export default {
type: 'admin',
routes: [
{
method: 'GET',
path: '/mapEntriesToReleases',
handler: 'release.mapEntriesToReleases',
config: {
policies: [
'admin::isAuthenticatedAdmin',
{
name: 'admin::hasPermissions',
config: {
actions: ['plugin::content-releases.read'],
},
},
],
},
},
{
method: 'POST',
path: '/',

View File

@ -516,7 +516,7 @@ describe('release service', () => {
1
);
expect(releases).toEqual([{ name: 'test release', action: { type: 'publish' } }]);
expect(releases).toEqual([{ name: 'test release', actions: [{ type: 'publish' }] }]);
});
});

View File

@ -14,6 +14,7 @@ import type {
Release,
DeleteRelease,
GetContentTypeEntryReleases,
MapEntriesToReleases,
} from '../../../shared/contracts/releases';
import type {
CreateReleaseAction,
@ -260,13 +261,23 @@ const createReleaseService = ({ strapi }: { strapi: Core.Strapi }) => {
async findManyWithContentTypeEntryAttached(
contentTypeUid: GetContentTypeEntryReleases.Request['query']['contentTypeUid'],
entryId: GetContentTypeEntryReleases.Request['query']['entryId']
entriesIds:
| GetContentTypeEntryReleases.Request['query']['entryId']
| MapEntriesToReleases.Request['query']['entriesIds']
) {
// entriesIds could be an array or a single value
let entries = entriesIds;
if (!Array.isArray(entriesIds)) {
entries = [entriesIds];
}
const releases = await strapi.db.query(RELEASE_MODEL_UID).findMany({
where: {
actions: {
target_type: contentTypeUid,
target_id: entryId,
target_id: {
$in: entries,
},
},
releasedAt: {
$null: true,
@ -277,7 +288,14 @@ const createReleaseService = ({ strapi }: { strapi: Core.Strapi }) => {
actions: {
where: {
target_type: contentTypeUid,
target_id: entryId,
target_id: {
$in: entries,
},
},
populate: {
entry: {
select: ['id'],
},
},
},
},
@ -285,14 +303,14 @@ const createReleaseService = ({ strapi }: { strapi: Core.Strapi }) => {
return releases.map((release) => {
if (release.actions?.length) {
const [actionForEntry] = release.actions;
const actionsForEntry = release.actions;
// Remove the actions key to replace it with an action key
delete release.actions;
return {
...release,
action: actionForEntry,
actions: actionsForEntry,
};
}

View File

@ -27,7 +27,7 @@ export interface ReleaseDataResponse extends Omit<Release, 'actions'> {
}
export interface ReleaseForContentTypeEntryDataResponse extends Omit<Release, 'actions'> {
action: ReleaseAction;
actions: ReleaseAction[];
}
/**
@ -72,6 +72,24 @@ export declare namespace GetContentTypeEntryReleases {
}
}
/**
* GET /content-releases/mapEntriesToReleases - Map entries to releases
*/
export declare namespace MapEntriesToReleases {
export interface Request {
query: {
contentTypeUid: ReleaseAction['contentType'];
entriesIds: ReleaseAction['entry']['id'][];
};
}
export interface Response {
data: {
[entryId: ReleaseAction['entry']['id']]: Pick<Release, 'id' | 'name'>[];
};
}
}
/**
* GET /content-releases/:id - Get a single release
*/

View File

@ -58,9 +58,9 @@
"dependencies": {
"@reduxjs/toolkit": "1.9.7",
"@sindresorhus/slugify": "1.1.0",
"@strapi/design-system": "1.17.0",
"@strapi/design-system": "1.18.0",
"@strapi/generators": "5.0.0-beta.3",
"@strapi/icons": "1.16.0",
"@strapi/icons": "1.18.0",
"@strapi/utils": "5.0.0-beta.3",
"date-fns": "2.30.0",
"fs-extra": "10.1.0",

View File

@ -52,8 +52,8 @@
"watch": "pack-up watch"
},
"dependencies": {
"@strapi/design-system": "1.17.0",
"@strapi/icons": "1.16.0",
"@strapi/design-system": "1.18.0",
"@strapi/icons": "1.18.0",
"@strapi/provider-email-sendmail": "5.0.0-beta.3",
"@strapi/utils": "5.0.0-beta.3",
"lodash": "4.17.21",

View File

@ -13,13 +13,6 @@ exports[`AddStage should render a list of stages 1`] = `
width: 1px;
}
.c8 {
font-size: 0.75rem;
line-height: 1.33;
font-weight: 600;
color: #8e8ea9;
}
.c0 {
margin-left: -250px;
position: fixed;
@ -29,15 +22,6 @@ exports[`AddStage should render a list of stages 1`] = `
width: 31.25rem;
}
.c2 {
background: #ffffff;
padding-top: 12px;
padding-right: 16px;
padding-bottom: 12px;
padding-left: 16px;
box-shadow: 0px 1px 4px rgba(33,33,52,0.1);
}
.c1 {
-webkit-align-items: stretch;
-webkit-box-align: stretch;
@ -53,6 +37,22 @@ exports[`AddStage should render a list of stages 1`] = `
gap: 8px;
}
.c8 {
font-size: 0.75rem;
line-height: 1.33;
font-weight: 600;
color: #8e8ea9;
}
.c2 {
background: #ffffff;
padding-top: 12px;
padding-right: 16px;
padding-bottom: 12px;
padding-left: 16px;
box-shadow: 0px 1px 4px rgba(33,33,52,0.1);
}
.c4 {
-webkit-align-items: center;
-webkit-box-align: center;

View File

@ -180,6 +180,10 @@
"yup": "0.32.9"
},
"devDependencies": {
"@strapi/ts-zen": "^0.2.0",
"@types/bcryptjs": "2.4.3",
"@types/configstore": "5.0.1",
"@types/delegates": "1.0.0",
"@types/find-root": "1.1.4",
"@types/jest": "29.5.2",
"@types/lodash": "^4.14.191",

View File

@ -109,7 +109,9 @@ exports[`BrowseStep renders and match snapshot 1`] = `
.c6 {
background: #ffffff;
padding-top: 4px;
padding-right: 12px;
padding-bottom: 4px;
padding-left: 12px;
border-radius: 4px;
position: relative;

View File

@ -48,7 +48,9 @@ exports[`Upload - Configure | Settings initial render renders and matches the sn
.c7 {
background: #ffffff;
padding-top: 4px;
padding-right: 12px;
padding-bottom: 4px;
padding-left: 12px;
border-radius: 4px;
position: relative;

View File

@ -110,7 +110,9 @@ exports[`Upload - Configure initial render renders and matches the snapshot 1`]
.c26 {
background: #ffffff;
padding-top: 4px;
padding-right: 12px;
padding-bottom: 4px;
padding-left: 12px;
border-radius: 4px;
position: relative;

View File

@ -48,8 +48,8 @@
"watch": "pack-up watch"
},
"dependencies": {
"@strapi/design-system": "1.17.0",
"@strapi/icons": "1.16.0",
"@strapi/design-system": "1.18.0",
"@strapi/icons": "1.18.0",
"@strapi/provider-upload-local": "5.0.0-beta.3",
"@strapi/utils": "5.0.0-beta.3",
"axios": "1.6.8",

View File

@ -36,8 +36,8 @@
"test:ts:front": "run -T tsc -p admin/tsconfig.json"
},
"dependencies": {
"@strapi/design-system": "1.17.0",
"@strapi/icons": "1.16.0",
"@strapi/design-system": "1.18.0",
"@strapi/icons": "1.18.0",
"react-intl": "6.6.2"
},
"devDependencies": {

View File

@ -53,8 +53,8 @@
"watch": "strapi plugin:watch"
},
"dependencies": {
"@strapi/design-system": "1.17.0",
"@strapi/icons": "1.16.0",
"@strapi/design-system": "1.18.0",
"@strapi/icons": "1.18.0",
"react-colorful": "5.6.1",
"react-intl": "6.6.2"
},

View File

@ -54,8 +54,8 @@
"dependencies": {
"@reduxjs/toolkit": "1.9.7",
"@strapi/admin": "5.0.0-beta.3",
"@strapi/design-system": "1.17.0",
"@strapi/icons": "1.16.0",
"@strapi/design-system": "1.18.0",
"@strapi/icons": "1.18.0",
"@strapi/utils": "5.0.0-beta.3",
"axios": "1.6.8",
"bcryptjs": "2.4.3",

View File

@ -53,8 +53,8 @@
"@graphql-tools/schema": "8.5.1",
"@graphql-tools/utils": "^8.13.1",
"@koa/cors": "5.0.0",
"@strapi/design-system": "1.17.0",
"@strapi/icons": "1.16.0",
"@strapi/design-system": "1.18.0",
"@strapi/icons": "1.18.0",
"@strapi/utils": "5.0.0-beta.3",
"graphql": "^16.8.1",
"graphql-depth-limit": "^1.1.0",

View File

@ -0,0 +1,42 @@
import { Schema } from '@strapi/types';
/* -------------------------------------------------------------------------------------------------
* addLocaleToReleasesHook
* -----------------------------------------------------------------------------------------------*/
interface AddLocaleToReleasesHookArgs {
displayedHeaders: {
key: string;
fieldSchema: Schema.Attribute.Kind | 'custom';
metadatas: {
label: { id: string; defaultMessage: string };
searchable: boolean;
sortable: boolean;
};
name: string;
}[];
hasI18nEnabled: boolean;
}
const addLocaleToReleasesHook = ({ displayedHeaders = [] }: AddLocaleToReleasesHookArgs) => {
return {
displayedHeaders: [
// TODO: Fix when migrating to v5
// ...displayedHeaders,
{
key: '__locale__',
fieldSchema: { type: 'string' },
metadatas: {
label: {
id: 'content-releases.page.ReleaseDetails.table.header.label.locale',
defaultMessage: 'locale',
},
searchable: false,
sortable: false,
},
name: 'locale',
},
],
hasI18nEnabled: true,
};
};
export { addLocaleToReleasesHook };

View File

@ -13,6 +13,7 @@ import { LocalePicker } from './components/LocalePicker';
import { PERMISSIONS } from './constants';
import { mutateEditViewHook } from './contentManagerHooks/editView';
import { addColumnToTableHook } from './contentManagerHooks/listView';
import { addLocaleToReleasesHook } from './contentReleasesHooks/releaseDetailsView';
import { extendCTBAttributeInitialDataMiddleware } from './middlewares/extendCTBAttributeInitialData';
import { extendCTBInitialDataMiddleware } from './middlewares/extendCTBInitialData';
import { localeMiddleware } from './middlewares/rbac-middleware';
@ -45,6 +46,11 @@ export default {
// // Hook that adds a column into the CM's LV table
app.registerHook('Admin/CM/pages/ListView/inject-column-in-table', addColumnToTableHook);
app.registerHook('Admin/CM/pages/EditView/mutate-edit-view-layout', mutateEditViewHook);
// Hooks that checks if the locale is present in the release
app.registerHook(
'ContentReleases/pages/ReleaseDetails/add-locale-in-releases',
addLocaleToReleasesHook
);
// Add the settings link
app.addSettingsLink('global', {

View File

@ -53,8 +53,8 @@
},
"dependencies": {
"@reduxjs/toolkit": "1.9.7",
"@strapi/design-system": "1.17.0",
"@strapi/icons": "1.16.0",
"@strapi/design-system": "1.18.0",
"@strapi/icons": "1.18.0",
"@strapi/utils": "5.0.0-beta.3",
"axios": "1.6.8",
"lodash": "4.17.21",

View File

@ -51,8 +51,8 @@
},
"dependencies": {
"@sentry/node": "6.19.7",
"@strapi/design-system": "1.17.0",
"@strapi/icons": "1.16.0"
"@strapi/design-system": "1.18.0",
"@strapi/icons": "1.18.0"
},
"devDependencies": {
"@strapi/pack-up": "5.0.0",

View File

@ -46,8 +46,8 @@
"watch": "pack-up watch"
},
"dependencies": {
"@strapi/design-system": "1.17.0",
"@strapi/icons": "1.16.0",
"@strapi/design-system": "1.18.0",
"@strapi/icons": "1.18.0",
"@strapi/utils": "5.0.0-beta.3",
"bcryptjs": "2.4.3",
"formik": "2.4.5",

View File

@ -93,31 +93,52 @@ describeOnCondition(edition === 'EE')('Releases page', () => {
});
test.skip('A user should be able to perform bulk release on entries', async ({ page }) => {
await navToHeader(page, ['Content Manager', 'Article'], 'Article');
await test.step('bulk release', async () => {
// Navigate to the releases page
await page.getByRole('link', { name: 'Releases' }).click();
await page.getByRole('button', { name: 'New release' }).click();
await expect(page.getByRole('dialog', { name: 'New release' })).toBeVisible();
// Create a new release
const newReleaseName = 'The Diamond Dogs';
await page.getByRole('textbox', { name: 'Name' }).fill(newReleaseName);
// Uncheck default scheduling of a release and save
await page.getByRole('checkbox', { name: 'Schedule release' }).uncheck();
await page.getByRole('button', { name: 'Continue' }).click();
// Wait for client side redirect to created release
await page.waitForURL('/admin/plugins/content-releases/*');
await expect(page.getByRole('heading', { name: newReleaseName })).toBeVisible();
const publishedItems = page.getByRole('gridcell', { name: 'published' });
expect(publishedItems).toHaveCount(2);
const checkbox = page.getByRole('checkbox', { name: 'Select all entries' });
// Navigate to the content manager
await page.getByRole('link', { name: 'Open the Content Manager' }).click();
await expect(page).toHaveTitle('Content Manager');
await expect(page.getByRole('heading', { name: 'Article' })).toBeVisible();
expect(page.getByRole('gridcell', { name: 'published' })).toHaveCount(2);
// Select all entries to release
await checkbox.check();
const addToRelease = page.getByRole('button', { name: 'add to release' });
await addToRelease.click();
// Select all entries to release
await page.getByRole('checkbox', { name: 'Select all entries' }).check();
await page.getByRole('button', { name: 'add to release' }).click();
// Wait for the add to release dialog to appear
await page
.getByRole('combobox', {
name: 'Select a release',
})
.click();
// Wait for the add to release dialog to appear
await page
.getByRole('combobox', {
name: 'Select a release',
})
.click();
await page.getByRole('option', { name: 'Trent Crimm: The Independent' }).click();
const unpublishButton = page.getByText('unpublish', { exact: true });
await unpublishButton.click();
await page.getByText('continue').click();
await page.getByText(/Successfully added to release./).waitFor({
state: 'visible',
timeout: 5000,
await page.getByRole('option', { name: 'The Diamond Dogs' }).click();
await page.getByText('unpublish', { exact: true }).click();
await page.getByText('continue').click();
await page.getByText(/Successfully added to release./).waitFor({
state: 'visible',
timeout: 5000,
});
});
await test.step('releases should be updated in the release column of list view', async () => {
const releaseColumn = page.getByRole('button', { name: '2 releases' });
await releaseColumn.first().click();
await expect(page.getByText('The Diamond Dogs')).toBeVisible();
await expect(page.getByText('Trent Crimm: The Independent')).toBeVisible();
});
});
});

View File

@ -89,6 +89,7 @@ test.describe('Settings', () => {
.fill('Magliette');
await page.getByRole('button', { name: 'There is 1 missing component' }).click();
await page.getByRole('button', { name: 'Hero image' }).click();
await expect(page.getByText('content (2)')).toBeVisible();
await page.getByRole('button', { name: 'Publish' }).click();
await findAndClose(page, 'Success:Published');
});

119
yarn.lock
View File

@ -7113,8 +7113,8 @@ __metadata:
"@reduxjs/toolkit": "npm:1.9.7"
"@strapi/admin-test-utils": "npm:5.0.0-beta.3"
"@strapi/data-transfer": "npm:5.0.0-beta.3"
"@strapi/design-system": "npm:1.17.0"
"@strapi/icons": "npm:1.16.0"
"@strapi/design-system": "npm:1.18.0"
"@strapi/icons": "npm:1.18.0"
"@strapi/pack-up": "npm:5.0.0"
"@strapi/permissions": "npm:5.0.0-beta.3"
"@strapi/provider-audit-logs-local": "npm:5.0.0-beta.3"
@ -7208,8 +7208,8 @@ __metadata:
"@reduxjs/toolkit": "npm:1.9.7"
"@strapi/admin": "npm:5.0.0-beta.3"
"@strapi/admin-test-utils": "npm:5.0.0-beta.3"
"@strapi/design-system": "npm:1.17.0"
"@strapi/icons": "npm:1.16.0"
"@strapi/design-system": "npm:1.18.0"
"@strapi/icons": "npm:1.18.0"
"@strapi/pack-up": "npm:5.0.0"
"@strapi/plugin-content-manager": "npm:5.0.0-beta.3"
"@strapi/types": "workspace:*"
@ -7382,9 +7382,9 @@ __metadata:
languageName: unknown
linkType: soft
"@strapi/design-system@npm:1.18.0-typescript.0":
version: 1.18.0-typescript.0
resolution: "@strapi/design-system@npm:1.18.0-typescript.0"
"@strapi/design-system@npm:1.19.0-typescript.0":
version: 1.19.0-typescript.0
resolution: "@strapi/design-system@npm:1.19.0-typescript.0"
dependencies:
"@codemirror/lang-json": "npm:^6.0.1"
"@floating-ui/react-dom": "npm:^2.0.8"
@ -7393,19 +7393,19 @@ __metadata:
"@radix-ui/react-dismissable-layer": "npm:^1.0.5"
"@radix-ui/react-dropdown-menu": "npm:^2.0.6"
"@radix-ui/react-focus-scope": "npm:1.0.4"
"@strapi/ui-primitives": "npm:1.18.0-typescript.0"
"@uiw/react-codemirror": "npm:^4.21.24"
aria-hidden: "npm:^1.2.3"
"@strapi/ui-primitives": "npm:1.19.0-typescript.0"
"@uiw/react-codemirror": "npm:^4.21.25"
aria-hidden: "npm:^1.2.4"
compute-scroll-into-view: "npm:^3.1.0"
prop-types: "npm:^15.8.1"
react-remove-scroll: "npm:^2.5.9"
peerDependencies:
"@strapi/icons": 1.18.0-typescript.0
"@strapi/icons": 1.19.0-typescript.0
react: ^17.0.0 || ^18.0.0
react-dom: ^17.0.0 || ^18.0.0
react-router-dom: ^5.2.0
styled-components: ^5.2.1
checksum: 718db7cc857eb8a027b64ba3f2286c044bb0885ad13e2b5805379362e84f09bca2d98cb93715931eaaa8b64c0ec872bcda1c948f2faf5f7fb89310a19905275a
checksum: faa85c3056eb6260ecca9dccc6418a94942b7d4ef8996885920fd5525460a0b1bf4ace16979dcd504c637f43205d316fdb22634deaea5667cb2df3901952dcd4
languageName: node
linkType: hard
@ -7488,6 +7488,16 @@ __metadata:
languageName: node
linkType: hard
"@strapi/icons@npm:1.18.0":
version: 1.18.0
resolution: "@strapi/icons@npm:1.18.0"
peerDependencies:
react: ^17.0.0 || ^18.0.0
react-dom: ^17.0.0 || ^18.0.0
checksum: b7f27d1293f56e402fdbc12e91a2a775c33dd1ca5bf901f78165136ef911fd44f1b4978919bf8eef1d6c1483afb7e8e6c177df4b54229632404ce8a989fba7f1
languageName: node
linkType: hard
"@strapi/logger@npm:5.0.0-beta.3, @strapi/logger@workspace:packages/utils/logger":
version: 0.0.0-use.local
resolution: "@strapi/logger@workspace:packages/utils/logger"
@ -7550,8 +7560,8 @@ __metadata:
version: 0.0.0-use.local
resolution: "@strapi/plugin-cloud@workspace:packages/plugins/cloud"
dependencies:
"@strapi/design-system": "npm:1.17.0"
"@strapi/icons": "npm:1.16.0"
"@strapi/design-system": "npm:1.18.0"
"@strapi/icons": "npm:1.18.0"
"@strapi/strapi": "npm:5.0.0-beta.3"
"@types/react": "npm:18.2.66"
"@types/react-dom": "npm:18.2.22"
@ -7577,8 +7587,8 @@ __metadata:
version: 0.0.0-use.local
resolution: "@strapi/plugin-color-picker@workspace:packages/plugins/color-picker"
dependencies:
"@strapi/design-system": "npm:1.17.0"
"@strapi/icons": "npm:1.16.0"
"@strapi/design-system": "npm:1.18.0"
"@strapi/icons": "npm:1.18.0"
"@strapi/strapi": "npm:5.0.0-beta.3"
"@testing-library/react": "npm:14.0.0"
"@testing-library/user-event": "npm:14.4.3"
@ -7608,8 +7618,8 @@ __metadata:
"@sindresorhus/slugify": "npm:1.1.0"
"@strapi/admin": "npm:5.0.0-beta.3"
"@strapi/database": "workspace:*"
"@strapi/design-system": "npm:1.17.0"
"@strapi/icons": "npm:1.16.0"
"@strapi/design-system": "npm:1.18.0"
"@strapi/icons": "npm:1.18.0"
"@strapi/pack-up": "npm:5.0.0"
"@strapi/types": "npm:5.0.0-beta.3"
"@strapi/utils": "npm:5.0.0-beta.3"
@ -7670,9 +7680,9 @@ __metadata:
"@reduxjs/toolkit": "npm:1.9.7"
"@sindresorhus/slugify": "npm:1.1.0"
"@strapi/admin": "npm:5.0.0-beta.3"
"@strapi/design-system": "npm:1.17.0"
"@strapi/design-system": "npm:1.18.0"
"@strapi/generators": "npm:5.0.0-beta.3"
"@strapi/icons": "npm:1.16.0"
"@strapi/icons": "npm:1.18.0"
"@strapi/pack-up": "npm:5.0.0"
"@strapi/types": "npm:5.0.0-beta.3"
"@strapi/utils": "npm:5.0.0-beta.3"
@ -7712,8 +7722,8 @@ __metadata:
"@reduxjs/toolkit": "npm:1.9.7"
"@strapi/admin": "npm:5.0.0-beta.3"
"@strapi/admin-test-utils": "npm:5.0.0-beta.3"
"@strapi/design-system": "npm:1.17.0"
"@strapi/icons": "npm:1.16.0"
"@strapi/design-system": "npm:1.18.0"
"@strapi/icons": "npm:1.18.0"
"@strapi/pack-up": "npm:5.0.0"
"@strapi/strapi": "npm:5.0.0-beta.3"
"@strapi/types": "npm:5.0.0-beta.3"
@ -7759,8 +7769,8 @@ __metadata:
resolution: "@strapi/plugin-email@workspace:packages/core/email"
dependencies:
"@strapi/admin": "npm:5.0.0-beta.3"
"@strapi/design-system": "npm:1.17.0"
"@strapi/icons": "npm:1.16.0"
"@strapi/design-system": "npm:1.18.0"
"@strapi/icons": "npm:1.18.0"
"@strapi/pack-up": "npm:5.0.0"
"@strapi/provider-email-sendmail": "npm:5.0.0-beta.3"
"@strapi/types": "npm:5.0.0-beta.3"
@ -7798,8 +7808,8 @@ __metadata:
"@graphql-tools/schema": "npm:8.5.1"
"@graphql-tools/utils": "npm:^8.13.1"
"@koa/cors": "npm:5.0.0"
"@strapi/design-system": "npm:1.17.0"
"@strapi/icons": "npm:1.16.0"
"@strapi/design-system": "npm:1.18.0"
"@strapi/icons": "npm:1.18.0"
"@strapi/strapi": "npm:5.0.0-beta.3"
"@strapi/types": "npm:5.0.0-beta.3"
"@strapi/utils": "npm:5.0.0-beta.3"
@ -7840,8 +7850,8 @@ __metadata:
"@reduxjs/toolkit": "npm:1.9.7"
"@strapi/admin": "npm:5.0.0-beta.3"
"@strapi/admin-test-utils": "npm:5.0.0-beta.3"
"@strapi/design-system": "npm:1.17.0"
"@strapi/icons": "npm:1.16.0"
"@strapi/design-system": "npm:1.18.0"
"@strapi/icons": "npm:1.18.0"
"@strapi/pack-up": "npm:5.0.0"
"@strapi/plugin-content-manager": "npm:5.0.0-beta.3"
"@strapi/types": "npm:5.0.0-beta.3"
@ -7875,8 +7885,8 @@ __metadata:
resolution: "@strapi/plugin-sentry@workspace:packages/plugins/sentry"
dependencies:
"@sentry/node": "npm:6.19.7"
"@strapi/design-system": "npm:1.17.0"
"@strapi/icons": "npm:1.16.0"
"@strapi/design-system": "npm:1.18.0"
"@strapi/icons": "npm:1.18.0"
"@strapi/pack-up": "npm:5.0.0"
"@strapi/strapi": "npm:5.0.0-beta.3"
react: "npm:^18.2.0"
@ -7897,8 +7907,8 @@ __metadata:
resolution: "@strapi/plugin-upload@workspace:packages/core/upload"
dependencies:
"@strapi/admin": "npm:5.0.0-beta.3"
"@strapi/design-system": "npm:1.17.0"
"@strapi/icons": "npm:1.16.0"
"@strapi/design-system": "npm:1.18.0"
"@strapi/icons": "npm:1.18.0"
"@strapi/pack-up": "npm:5.0.0"
"@strapi/provider-upload-local": "npm:5.0.0-beta.3"
"@strapi/types": "npm:5.0.0-beta.3"
@ -7950,8 +7960,8 @@ __metadata:
version: 0.0.0-use.local
resolution: "@strapi/plugin-users-permissions@workspace:packages/plugins/users-permissions"
dependencies:
"@strapi/design-system": "npm:1.17.0"
"@strapi/icons": "npm:1.16.0"
"@strapi/design-system": "npm:1.18.0"
"@strapi/icons": "npm:1.18.0"
"@strapi/pack-up": "npm:5.0.0"
"@strapi/strapi": "npm:5.0.0-beta.3"
"@strapi/utils": "npm:5.0.0-beta.3"
@ -8164,9 +8174,13 @@ __metadata:
"@strapi/plugin-i18n": "npm:5.0.0-beta.3"
"@strapi/plugin-upload": "npm:5.0.0-beta.3"
"@strapi/review-workflows": "npm:5.0.0-beta.3"
"@strapi/ts-zen": "npm:^0.2.0"
"@strapi/types": "npm:5.0.0-beta.3"
"@strapi/typescript-utils": "npm:5.0.0-beta.3"
"@strapi/utils": "npm:5.0.0-beta.3"
"@types/bcryptjs": "npm:2.4.3"
"@types/configstore": "npm:5.0.1"
"@types/delegates": "npm:1.0.0"
"@types/find-root": "npm:1.1.4"
"@types/jest": "npm:29.5.2"
"@types/lodash": "npm:^4.14.191"
@ -8289,9 +8303,9 @@ __metadata:
languageName: unknown
linkType: soft
"@strapi/ui-primitives@npm:1.18.0-typescript.0":
version: 1.18.0-typescript.0
resolution: "@strapi/ui-primitives@npm:1.18.0-typescript.0"
"@strapi/ui-primitives@npm:1.19.0-typescript.0":
version: 1.19.0-typescript.0
resolution: "@strapi/ui-primitives@npm:1.19.0-typescript.0"
dependencies:
"@radix-ui/number": "npm:^1.0.1"
"@radix-ui/primitive": "npm:^1.0.1"
@ -8317,7 +8331,7 @@ __metadata:
peerDependencies:
react: ^17.0.0 || ^18.0.0
react-dom: ^17.0.0 || ^18.0.0
checksum: 4581830e51110f22f984df6aae56a9e9babc34f3eb84f997b170929cc1763dacce21af647d0e74189269aa960646ac754d477d28c963a296e6c26fd6418520ba
checksum: a9759061fe6ddef65321bad1db85ac9a4af876abaeaa18c79baa5d37e6ac9aabd2266318b6fddc74d297544e116b1ecbed3066813b7677ecc75207efd214c3d8
languageName: node
linkType: hard
@ -10202,9 +10216,9 @@ __metadata:
languageName: node
linkType: hard
"@uiw/codemirror-extensions-basic-setup@npm:4.21.24":
version: 4.21.24
resolution: "@uiw/codemirror-extensions-basic-setup@npm:4.21.24"
"@uiw/codemirror-extensions-basic-setup@npm:4.21.25":
version: 4.21.25
resolution: "@uiw/codemirror-extensions-basic-setup@npm:4.21.25"
dependencies:
"@codemirror/autocomplete": "npm:^6.0.0"
"@codemirror/commands": "npm:^6.0.0"
@ -10221,19 +10235,19 @@ __metadata:
"@codemirror/search": ">=6.0.0"
"@codemirror/state": ">=6.0.0"
"@codemirror/view": ">=6.0.0"
checksum: 79537d7a828bca8dad95a0bae2c1a0b76ae77dc7d2c68b1f71871b114a0d58a2f593bdc05965062a0b95858bebb6c3f1f016f6efdc2eff1296f469a4e5044a75
checksum: 56b15f0e602d39b29787a601dad189e37a60a544a587e0b06ea5a817d4fcc30a4a80e1e1c4b4d51eb6ea508595cedf4787acaecf939b712fa957fd612b300fcb
languageName: node
linkType: hard
"@uiw/react-codemirror@npm:^4.21.24":
version: 4.21.24
resolution: "@uiw/react-codemirror@npm:4.21.24"
"@uiw/react-codemirror@npm:^4.21.25":
version: 4.21.25
resolution: "@uiw/react-codemirror@npm:4.21.25"
dependencies:
"@babel/runtime": "npm:^7.18.6"
"@codemirror/commands": "npm:^6.1.0"
"@codemirror/state": "npm:^6.1.1"
"@codemirror/theme-one-dark": "npm:^6.0.0"
"@uiw/codemirror-extensions-basic-setup": "npm:4.21.24"
"@uiw/codemirror-extensions-basic-setup": "npm:4.21.25"
codemirror: "npm:^6.0.0"
peerDependencies:
"@babel/runtime": ">=7.11.0"
@ -10243,7 +10257,7 @@ __metadata:
codemirror: ">=6.0.0"
react: ">=16.8.0"
react-dom: ">=16.8.0"
checksum: 02d1cb50595f0281b8f4f19f8bf0280f21cc9d5b2f8733c6443df72999005340d96cac15871b14f4bd905814f58579ea8efa5fda392067de5a070a26e5696bca
checksum: 53847803dc73832d29ca7345ebff8714d57a5c66c13f0c3e1de0a0dd41190a0c85cd2e8583a0baa709e56032422a099d2431649018b7a3d78612256fb4878c25
languageName: node
linkType: hard
@ -11004,7 +11018,7 @@ __metadata:
languageName: node
linkType: hard
"aria-hidden@npm:^1.1.1, aria-hidden@npm:^1.2.3":
"aria-hidden@npm:^1.1.1":
version: 1.2.3
resolution: "aria-hidden@npm:1.2.3"
dependencies:
@ -14105,13 +14119,20 @@ __metadata:
languageName: node
linkType: hard
"detect-libc@npm:^2.0.0, detect-libc@npm:^2.0.2":
"detect-libc@npm:^2.0.0":
version: 2.0.2
resolution: "detect-libc@npm:2.0.2"
checksum: 6118f30c0c425b1e56b9d2609f29bec50d35a6af0b762b6ad127271478f3bbfda7319ce869230cf1a351f2b219f39332cde290858553336d652c77b970f15de8
languageName: node
linkType: hard
"detect-libc@npm:^2.0.2":
version: 2.0.3
resolution: "detect-libc@npm:2.0.3"
checksum: b4ea018d623e077bd395f168a9e81db77370dde36a5b01d067f2ad7989924a81d31cb547ff764acb2aa25d50bb7fdde0b0a93bec02212b0cb430621623246d39
languageName: node
linkType: hard
"detect-newline@npm:^3.0.0":
version: 3.1.0
resolution: "detect-newline@npm:3.1.0"