From 86e7b1c26bd7d9f9c627bf28707129406a2b2e46 Mon Sep 17 00:00:00 2001 From: Josh <37798644+joshuaellis@users.noreply.github.com> Date: Mon, 13 May 2024 09:52:25 +0100 Subject: [PATCH 01/10] chore: update codebase to reflect DS changes --- .../hooks/use-drag-and-drop.mdx | 8 +- .../admin/src/components/FormInputs/Date.tsx | 2 +- .../admin/src/components/GuidedTour/Modal.tsx | 3 +- .../admin/src/components/MainNav/NavLink.tsx | 14 +- .../admin/admin/src/components/NpsSurvey.tsx | 15 +- .../admin/src/components/SearchInput.tsx | 6 +- .../core/admin/admin/src/components/Table.tsx | 9 +- .../src/components/tests/ContentBox.test.tsx | 15 +- .../Marketplace/components/NpmPackageCard.tsx | 2 +- .../components/NpmPackagesFilters.tsx | 4 +- .../Marketplace/components/SortSelect.tsx | 2 - .../Settings/components/Tokens/Table.tsx | 5 +- .../Settings/components/Tokens/TokenBox.tsx | 5 +- .../components/CollabsableContentType.tsx | 38 +- .../components/ContentTypesSection.tsx | 34 +- .../ApplicationInfo/components/LogoInput.tsx | 10 +- .../pages/Settings/pages/Roles/ListPage.tsx | 6 +- .../Roles/components/PluginsAndSettings.tsx | 81 ++-- .../pages/Roles/components/RoleRow.tsx | 25 +- .../pages/Settings/pages/Users/ListPage.tsx | 14 +- .../Users/components/MagicLinkWrapper.tsx | 4 +- .../Settings/pages/Webhooks/ListPage.tsx | 14 +- .../SettingsPage/pages/AuditLogs/ListPage.tsx | 10 +- .../pages/Users/components/CreateActionEE.tsx | 4 +- .../admin/src/components/ComponentIcon.tsx | 17 +- .../components/ConfigurationForm/Fields.tsx | 9 +- .../DragPreviews/ComponentDragPreview.tsx | 4 +- .../DragPreviews/RelationDragPreview.tsx | 2 +- .../EditView/components/DocumentActions.tsx | 1 + .../FormInputs/BlocksInput/BlocksContent.tsx | 6 +- .../components/FormInputs/Component/Input.tsx | 70 ++-- .../FormInputs/Component/Repeatable.tsx | 352 +++++++----------- .../DynamicZone/ComponentCategory.tsx | 102 +++-- .../DynamicZone/ComponentPicker.tsx | 23 +- .../DynamicZone/DynamicComponent.tsx | 119 ++---- .../DynamicZone/tests/ComponentCard.test.tsx | 18 +- .../tests/ComponentCategory.test.tsx | 22 +- .../tests/DynamicZoneLabel.test.tsx | 18 +- .../components/FormInputs/Relations.tsx | 3 +- .../FormInputs/Wysiwyg/WysiwygNav.tsx | 84 +++-- .../FormInputs/Wysiwyg/WysiwygStyles.tsx | 11 +- .../ListView/components/ViewSettingsMenu.tsx | 7 +- .../admin/src/components/ReleaseModal.tsx | 251 +++++++------ .../components/tests/ReleaseModal.test.tsx | 5 +- .../admin/src/pages/ReleaseDetailsPage.tsx | 10 +- .../admin/src/pages/ReleasesPage.tsx | 2 +- .../tests/AttributeOptions.test.tsx | 6 +- .../tests/index.test.tsx | 6 +- .../admin/src/components/GenericInputs.tsx | 2 +- .../src/components/IconPicker/IconPicker.tsx | 21 +- .../IconPicker/tests/IconPicker.test.tsx | 6 +- .../admin/src/components/ListRow.tsx | 14 +- .../admin/src/components/LimitsModal.tsx | 8 +- .../[id]/components/AssigneeSelect.tsx | 1 - .../routes/settings/components/AddStage.tsx | 6 +- .../settings/components/StageDragPreview.tsx | 13 +- .../src/routes/settings/components/Stages.tsx | 287 +++++++------- .../admin/src/routes/settings/index.tsx | 8 +- .../components/AssetCard/AssetCardBase.jsx | 10 +- .../BrowseStep/SearchAsset/index.jsx | 6 +- .../AssetDialog/BrowseStep/index.jsx | 13 +- .../PreviewBox/CroppingActions.jsx | 8 +- .../EditAssetDialog/PreviewBox/index.jsx | 15 +- .../Carousel/CarouselAssetActions.jsx | 10 +- .../src/components/TableList/TableRows.jsx | 4 +- .../admin/src/components/TableList/index.jsx | 2 +- .../src/pages/App/MediaLibrary/index.jsx | 10 +- packages/core/upload/package.json | 3 - .../documentation/admin/src/pages/App.tsx | 21 +- .../admin/src/components/DeleteLocale.tsx | 5 +- .../i18n/admin/src/components/EditLocale.tsx | 5 +- .../src/components/Permissions/index.jsx | 61 ++- .../EmailTemplates/components/EmailTable.jsx | 16 +- .../admin/src/pages/Providers/index.jsx | 7 +- .../pages/ListPage/components/TableBody.jsx | 8 +- 75 files changed, 910 insertions(+), 1138 deletions(-) diff --git a/docs/docs/docs/01-core/content-manager/hooks/use-drag-and-drop.mdx b/docs/docs/docs/01-core/content-manager/hooks/use-drag-and-drop.mdx index d5a00caf36e..0b4f699215c 100644 --- a/docs/docs/docs/01-core/content-manager/hooks/use-drag-and-drop.mdx +++ b/docs/docs/docs/01-core/content-manager/hooks/use-drag-and-drop.mdx @@ -57,7 +57,7 @@ const MyComponent = ({ onMoveItem }) => { role="button" tabIndex={0} aria-label="Drag" - noBorder + borderWidth={0} onKeyDown={handleKeyDown} > @@ -103,7 +103,7 @@ const MyComponent = ({ onDropItem }) => { role="button" tabIndex={0} aria-label="Drag" - noBorder + borderWidth={0} onKeyDown={handleKeyDown} > @@ -157,7 +157,7 @@ const MyComponent = ({ onMoveItem }) => { role="button" tabIndex={0} aria-label="Drag" - noBorder + borderWidth={0} onKeyDown={handleKeyDown} > @@ -256,7 +256,7 @@ You might notice in the [basic usage](#basic-usage) section this piece of code: role="button" tabIndex={0} aria-label="Drag" - noBorder + borderWidth={0} onKeyDown={handleKeyDown} > diff --git a/packages/core/admin/admin/src/components/FormInputs/Date.tsx b/packages/core/admin/admin/src/components/FormInputs/Date.tsx index 8321b90ec11..3e7e896da45 100644 --- a/packages/core/admin/admin/src/components/FormInputs/Date.tsx +++ b/packages/core/admin/admin/src/components/FormInputs/Date.tsx @@ -27,7 +27,7 @@ const DateInput = forwardRef( field.onChange(name, date); }} onClear={() => field.onChange(name, undefined)} - selectedDate={value} + value={value} {...props} /> diff --git a/packages/core/admin/admin/src/components/GuidedTour/Modal.tsx b/packages/core/admin/admin/src/components/GuidedTour/Modal.tsx index 143205846bf..277b38a5254 100644 --- a/packages/core/admin/admin/src/components/GuidedTour/Modal.tsx +++ b/packages/core/admin/admin/src/components/GuidedTour/Modal.tsx @@ -92,7 +92,8 @@ const GuidedTourModal = () => { { * -----------------------------------------------------------------------------------------------*/ const TooltipImpl = ({ children, label, position = 'right' }: NavLink.TooltipProps) => { return ( - + {children} ); @@ -111,9 +117,9 @@ namespace NavLink { } export interface TooltipProps { - position?: 'top' | 'bottom' | 'left' | 'right'; - label?: string; children: React.ReactNode; + label?: string; + position?: DSTooltipProps['side']; } } diff --git a/packages/core/admin/admin/src/components/NpsSurvey.tsx b/packages/core/admin/admin/src/components/NpsSurvey.tsx index 92d7229d9c5..5df8c089a13 100644 --- a/packages/core/admin/admin/src/components/NpsSurvey.tsx +++ b/packages/core/admin/admin/src/components/NpsSurvey.tsx @@ -14,7 +14,7 @@ import { import { Cross } from '@strapi/icons'; import { Formik, Form } from 'formik'; import { useIntl } from 'react-intl'; -import { styled, useTheme } from 'styled-components'; +import { styled } from 'styled-components'; import * as yup from 'yup'; import { useAppInfo } from '../features/AppInfo'; @@ -130,7 +130,6 @@ const checkIfShouldShowSurvey = (settings: NpsSurveySettings) => { }; const NpsSurvey = () => { - const theme = useTheme(); const { formatMessage } = useIntl(); const { npsSurveySettings, setNpsSurveySettings } = useNpsSurveySettings(); const [isFeedbackResponse, setIsFeedbackResponse] = React.useState(false); @@ -266,7 +265,7 @@ const NpsSurvey = () => { bottom={0} left="50%" transform="translateX(-50%)" - zIndex={theme.zIndices[2]} + zIndex="popover" width="50%" > {isFeedbackResponse ? ( @@ -277,7 +276,7 @@ const NpsSurvey = () => { })} ) : ( - + @@ -290,12 +289,14 @@ const NpsSurvey = () => { } - /> + > + + diff --git a/packages/core/admin/admin/src/components/SearchInput.tsx b/packages/core/admin/admin/src/components/SearchInput.tsx index 5ce0d6abaa8..28816f18d53 100644 --- a/packages/core/admin/admin/src/components/SearchInput.tsx +++ b/packages/core/admin/admin/src/components/SearchInput.tsx @@ -71,7 +71,6 @@ const SearchInput = ({ value={value} clearLabel={formatMessage({ id: 'clearLabel', defaultMessage: 'Clear' })} onClear={handleClear} - size="S" placeholder={placeholder} > {label} @@ -84,10 +83,11 @@ const SearchInput = ({ } label={formatMessage({ id: 'global.search', defaultMessage: 'Search' })} onClick={handleToggle} - /> + > + + ); }; diff --git a/packages/core/admin/admin/src/components/Table.tsx b/packages/core/admin/admin/src/components/Table.tsx index 7e3ec7d8068..2ee34040f9e 100644 --- a/packages/core/admin/admin/src/components/Table.tsx +++ b/packages/core/admin/admin/src/components/Table.tsx @@ -198,12 +198,9 @@ const HeaderCell = ({ name, label, sortable }: TableHeader} - borderStyle="none" - /> + + + ) } > diff --git a/packages/core/admin/admin/src/components/tests/ContentBox.test.tsx b/packages/core/admin/admin/src/components/tests/ContentBox.test.tsx index 34b2b4ff630..27af3696225 100644 --- a/packages/core/admin/admin/src/components/tests/ContentBox.test.tsx +++ b/packages/core/admin/admin/src/components/tests/ContentBox.test.tsx @@ -1,8 +1,6 @@ -import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { ExternalLink } from '@strapi/icons'; import { GlassesSquare } from '@strapi/icons/symbols'; -import { render as renderRTL, screen } from '@testing-library/react'; -import { IntlProvider } from 'react-intl'; +import { render as renderRTL, screen } from '@tests/utils'; import { ContentBox, ContentBoxProps } from '../ContentBox'; @@ -27,16 +25,7 @@ describe('ContentBox', () => { } titleEllipsis={false} {...props} - />, - { - wrapper: ({ children }) => ( - - - {children} - - - ), - } + /> ), }); diff --git a/packages/core/admin/admin/src/pages/Marketplace/components/NpmPackageCard.tsx b/packages/core/admin/admin/src/pages/Marketplace/components/NpmPackageCard.tsx index d7c94eb309d..077b7a842ee 100644 --- a/packages/core/admin/admin/src/pages/Marketplace/components/NpmPackageCard.tsx +++ b/packages/core/admin/admin/src/pages/Marketplace/components/NpmPackageCard.tsx @@ -345,7 +345,7 @@ const PackageStats = ({ githubStars = 0, npmDownloads = 0, npmPackageType }: Pac {githubStars}

- + )} diff --git a/packages/core/admin/admin/src/pages/Marketplace/components/NpmPackagesFilters.tsx b/packages/core/admin/admin/src/pages/Marketplace/components/NpmPackagesFilters.tsx index 22355ebf868..ad7c6156495 100644 --- a/packages/core/admin/admin/src/pages/Marketplace/components/NpmPackagesFilters.tsx +++ b/packages/core/admin/admin/src/pages/Marketplace/components/NpmPackagesFilters.tsx @@ -135,7 +135,8 @@ const NpmPackagesFilters = ({ }; const ButtonToggle = styled(Button)` - height: ${({ theme }) => theme.sizes.input.S}; + height: unset; + padding-block: 1.1rem; `; /* ------------------------------------------------------------------------------------------------- @@ -163,7 +164,6 @@ const FilterSelect = ({ data-testid={`${message}-button`} aria-label={message} placeholder={message} - size="M" onChange={onChange} onClear={onClear} value={value} diff --git a/packages/core/admin/admin/src/pages/Marketplace/components/SortSelect.tsx b/packages/core/admin/admin/src/pages/Marketplace/components/SortSelect.tsx index 99b24f66235..88d7230ef62 100644 --- a/packages/core/admin/admin/src/pages/Marketplace/components/SortSelect.tsx +++ b/packages/core/admin/admin/src/pages/Marketplace/components/SortSelect.tsx @@ -56,8 +56,6 @@ const SortSelect = ({ sortQuery, handleSelectChange }: SortSelectProps) => { return ( formatMessage(SORT_TYPES[sortQuery].selected)} onChange={(sortName) => { diff --git a/packages/core/admin/admin/src/pages/Settings/components/Tokens/Table.tsx b/packages/core/admin/admin/src/pages/Settings/components/Tokens/Table.tsx index 20a605ebc95..c84198e5460 100644 --- a/packages/core/admin/admin/src/pages/Settings/components/Tokens/Table.tsx +++ b/packages/core/admin/admin/src/pages/Settings/components/Tokens/Table.tsx @@ -223,8 +223,9 @@ const DeleteButton = ({ tokenName, onClickDelete, tokenType }: DeleteButtonProps )} name="delete" borderWidth={0} - icon={} - /> + > + +
setShowConfirmDialog(false)} onConfirm={handleClickDelete} diff --git a/packages/core/admin/admin/src/pages/Settings/components/Tokens/TokenBox.tsx b/packages/core/admin/admin/src/pages/Settings/components/Tokens/TokenBox.tsx index f9f251ecb7c..0ba29d3780a 100644 --- a/packages/core/admin/admin/src/pages/Settings/components/Tokens/TokenBox.tsx +++ b/packages/core/admin/admin/src/pages/Settings/components/Tokens/TokenBox.tsx @@ -47,9 +47,10 @@ export const TokenBox = ({ token, tokenType }: TokenBoxProps) => { })} onClick={handleClick(token)} borderWidth={0} - icon={} style={{ padding: 0, height: '1.6rem' }} - /> + > + + ) } diff --git a/packages/core/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollabsableContentType.tsx b/packages/core/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollabsableContentType.tsx index 838a7aad62e..8e0c6c93773 100644 --- a/packages/core/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollabsableContentType.tsx +++ b/packages/core/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollabsableContentType.tsx @@ -2,8 +2,6 @@ import * as React from 'react'; import { Accordion, - AccordionContent, - AccordionToggle, Box, BoxComponent, Checkbox, @@ -57,8 +55,6 @@ interface CollapsableContentTypeProps { label: ContentApiPermission['label']; orderNumber?: number; disabled?: boolean; - onExpanded?: (orderNumber: number) => void; - indexExpandendCollapsedContent: number | null; } export const CollapsableContentType = ({ @@ -66,40 +62,20 @@ export const CollapsableContentType = ({ label, orderNumber = 0, disabled = false, - onExpanded = () => null, - indexExpandendCollapsedContent = null, }: CollapsableContentTypeProps) => { const { value: { onChangeSelectAll, onChange, selectedActions, setSelectedAction, selectedAction }, } = useApiTokenPermissions(); - const [expanded, setExpanded] = React.useState(false); const { formatMessage } = useIntl(); - const handleExpandedAccordion = () => { - setExpanded((s) => !s); - onExpanded(orderNumber); - }; - - React.useEffect(() => { - if ( - indexExpandendCollapsedContent !== null && - indexExpandendCollapsedContent !== orderNumber && - expanded - ) { - setExpanded(false); - } - }, [indexExpandendCollapsedContent, orderNumber, expanded]); - const isActionSelected = (actionId: string) => actionId === selectedAction; return ( - - - + + + {capitalize(label)} + + {controllers?.map((controller) => { const allActionsSelected = controller.actions.every((action) => selectedActions.includes(action.actionId) @@ -169,7 +145,7 @@ export const CollapsableContentType = ({ ); })} - - + + ); }; diff --git a/packages/core/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/ContentTypesSection.tsx b/packages/core/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/ContentTypesSection.tsx index 08776d40593..2aa2d5dd8bb 100644 --- a/packages/core/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/ContentTypesSection.tsx +++ b/packages/core/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/ContentTypesSection.tsx @@ -1,6 +1,4 @@ -import * as React from 'react'; - -import { Box } from '@strapi/design-system'; +import { Accordion, Box } from '@strapi/design-system'; import { ContentApiPermission } from '../../../../../../../../shared/contracts/content-api/permissions'; @@ -11,26 +9,20 @@ interface ContentTypesSectionProps { } export const ContentTypesSection = ({ section = null, ...props }: ContentTypesSectionProps) => { - const [indexExpandedCollpsedContent, setIndexExpandedCollpsedContent] = React.useState< - null | number - >(null); - const handleExpandedCollpsedContentIndex = (index: number) => - setIndexExpandedCollpsedContent(index); - return ( - {section && - section.map((api, index) => ( - - ))} + + {section && + section.map((api, index) => ( + + ))} + ); }; diff --git a/packages/core/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.tsx b/packages/core/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.tsx index 77f9875d0ef..7b2b4db6d1e 100644 --- a/packages/core/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.tsx +++ b/packages/core/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.tsx @@ -114,8 +114,9 @@ const LogoInput = ({ id: 'Settings.application.customization.carousel.change-action', defaultMessage: 'Change logo', })} - icon={} - /> + > + + {customLogo?.url && ( } - /> + > + + )} } diff --git a/packages/core/admin/admin/src/pages/Settings/pages/Roles/ListPage.tsx b/packages/core/admin/admin/src/pages/Settings/pages/Roles/ListPage.tsx index dfd73f6acaf..f77f35d0901 100644 --- a/packages/core/admin/admin/src/pages/Settings/pages/Roles/ListPage.tsx +++ b/packages/core/admin/admin/src/pages/Settings/pages/Roles/ListPage.tsx @@ -234,19 +234,19 @@ const ListPage = () => { id: 'app.utils.duplicate', defaultMessage: 'Duplicate', }), - icon: , + children: , } satisfies RoleRowProps['icons'][number]), canUpdate && ({ onClick: () => navigate(role.id.toString()), label: formatMessage({ id: 'app.utils.edit', defaultMessage: 'Edit' }), - icon: , + children: , } satisfies RoleRowProps['icons'][number]), canDelete && ({ onClick: handleClickDelete(role), label: formatMessage({ id: 'global.delete', defaultMessage: 'Delete' }), - icon: , + children: , } satisfies RoleRowProps['icons'][number]), ].filter(Boolean) as RoleRowProps['icons'] } diff --git a/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.tsx b/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.tsx index c358f762f44..a9a3095afa1 100644 --- a/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.tsx +++ b/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.tsx @@ -2,8 +2,6 @@ import * as React from 'react'; import { Accordion, - AccordionContent, - AccordionToggle, Box, BoxComponent, Checkbox, @@ -49,28 +47,22 @@ const PluginsAndSettingsPermissions = ({ layout, ...restProps }: PluginsAndSettingsPermissionsProps) => { - const [openedCategory, setOpenedCategory] = React.useState(null); - - const handleOpenCategory = (categoryName: string) => { - setOpenedCategory(categoryName === openedCategory ? null : categoryName); - }; - return ( - {layout.map(({ category, categoryId, childrenForm }, index) => { - return ( - - ); - })} + + {layout.map(({ category, categoryId, childrenForm }, index) => { + return ( + + ); + })} + ); }; @@ -79,13 +71,12 @@ const PluginsAndSettingsPermissions = ({ * Row * -----------------------------------------------------------------------------------------------*/ -interface RowProps extends Pick { +interface RowProps + extends Pick, + Pick { kind: Exclude; name: string; isFormDisabled?: boolean; - isOpen?: boolean; - isWhite?: boolean; - onOpenCategory: (categoryName: string) => void; pathToData: string[]; } @@ -93,35 +84,27 @@ const Row = ({ childrenForm, kind, name, - isOpen = false, isFormDisabled = false, - isWhite, - onOpenCategory, + variant, pathToData, }: RowProps) => { const { formatMessage } = useIntl(); - const handleClick = () => { - onOpenCategory(name); - }; const categoryName = name.split('::').pop() ?? ''; return ( - - - - + + + + {capitalise(categoryName)} + + + {childrenForm.map(({ actions, subCategoryName, subCategoryId }) => ( ))} - - + + ); }; diff --git a/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/RoleRow.tsx b/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/RoleRow.tsx index 60d902ad56d..abd712e5403 100644 --- a/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/RoleRow.tsx +++ b/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/RoleRow.tsx @@ -4,7 +4,7 @@ import { useIntl } from 'react-intl'; import type { AdminRole } from '../../../../../hooks/useAdminRoles'; interface RoleRowProps extends Pick { - icons: Array>>; + icons: Array>>; rowIndex: number; canUpdate?: boolean; } @@ -51,18 +51,17 @@ const RoleRow = ({ e.stopPropagation()}> - {icons.map((icon, i) => - icon ? ( - - - - ) : null - )} + {icons.map((icon, i) => { + if (icon) { + return ( + + + + ); + } + + return null; + })} diff --git a/packages/core/admin/admin/src/pages/Settings/pages/Users/ListPage.tsx b/packages/core/admin/admin/src/pages/Settings/pages/Users/ListPage.tsx index c4c9f24827b..267d72f3d6f 100644 --- a/packages/core/admin/admin/src/pages/Settings/pages/Users/ListPage.tsx +++ b/packages/core/admin/admin/src/pages/Settings/pages/Users/ListPage.tsx @@ -186,9 +186,10 @@ const ListPageCE = () => { { id: 'app.component.table.edit', defaultMessage: 'Edit {target}' }, { target: getDisplayName(user) } )} - noBorder - icon={} - /> + borderWidth={0} + > + + ) : null} {canDelete ? ( { { id: 'global.delete-target', defaultMessage: 'Delete {target}' }, { target: getDisplayName(user) } )} - noBorder - icon={} - /> + borderWidth={0} + > + + ) : null}
diff --git a/packages/core/admin/admin/src/pages/Settings/pages/Users/components/MagicLinkWrapper.tsx b/packages/core/admin/admin/src/pages/Settings/pages/Users/components/MagicLinkWrapper.tsx index c60829f3ab3..2cf46d3a9bb 100644 --- a/packages/core/admin/admin/src/pages/Settings/pages/Users/components/MagicLinkWrapper.tsx +++ b/packages/core/admin/admin/src/pages/Settings/pages/Users/components/MagicLinkWrapper.tsx @@ -35,7 +35,9 @@ const MagicLinkWrapper = ({ children, target }: MagicLinkWrapperProps) => { return ( } onClick={handleClick} /> + + + } title={target} titleEllipsis diff --git a/packages/core/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.tsx b/packages/core/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.tsx index e98077ac72a..48c1dc497c7 100644 --- a/packages/core/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.tsx +++ b/packages/core/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.tsx @@ -342,9 +342,10 @@ const ListPage = () => { id: 'Settings.webhooks.events.update', defaultMessage: 'Update', })} - icon={} - noBorder - /> + borderWidth={0} + > + + )} {canDelete && ( { id: 'Settings.webhooks.events.delete', defaultMessage: 'Delete webhook', })} - icon={} - noBorder - /> + borderWidth={0} + > + + )} diff --git a/packages/core/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.tsx b/packages/core/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.tsx index 224c4645eca..3383bbbf6bb 100644 --- a/packages/core/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.tsx +++ b/packages/core/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.tsx @@ -186,13 +186,15 @@ const ListPage = () => { setQuery({ id: log.id })} - aria-label={formatMessage( + withTooltip={false} + label={formatMessage( { id: 'app.component.table.view', defaultMessage: '{target} details' }, { target: `${log.action} action` } )} - noBorder - icon={} - /> + borderWidth={0} + > + + diff --git a/packages/core/admin/ee/admin/src/pages/SettingsPage/pages/Users/components/CreateActionEE.tsx b/packages/core/admin/ee/admin/src/pages/SettingsPage/pages/Users/components/CreateActionEE.tsx index 94f9f836b4a..01369afe251 100644 --- a/packages/core/admin/ee/admin/src/pages/SettingsPage/pages/Users/components/CreateActionEE.tsx +++ b/packages/core/admin/ee/admin/src/pages/SettingsPage/pages/Users/components/CreateActionEE.tsx @@ -21,11 +21,11 @@ export const CreateActionEE = ({ onClick }: CreateActionCEProps) => { {!isNil(permittedSeats) && shouldStopCreate && ( diff --git a/packages/core/content-manager/admin/src/components/ComponentIcon.tsx b/packages/core/content-manager/admin/src/components/ComponentIcon.tsx index a255d5c74d8..42fbc1cfa2f 100644 --- a/packages/core/content-manager/admin/src/components/ComponentIcon.tsx +++ b/packages/core/content-manager/admin/src/components/ComponentIcon.tsx @@ -1,15 +1,21 @@ -import { Flex } from '@strapi/design-system'; +import * as React from 'react'; + +import { Flex, FlexProps } from '@strapi/design-system'; import * as Icons from '@strapi/icons'; import * as Symbols from '@strapi/icons/symbols'; import type { Struct } from '@strapi/types'; -interface ComponentIconProps { +interface ComponentIconProps extends FlexProps { showBackground?: boolean; icon?: Struct.ContentTypeSchemaInfo['icon']; } -const ComponentIcon = ({ showBackground = true, icon = 'dashboard' }: ComponentIconProps) => { +const ComponentIcon = ({ + showBackground = true, + icon = 'dashboard', + ...props +}: ComponentIconProps) => { const Icon = COMPONENT_ICONS[icon as keyof typeof COMPONENT_ICONS] || COMPONENT_ICONS.dashboard; return ( @@ -21,13 +27,14 @@ const ComponentIcon = ({ showBackground = true, icon = 'dashboard' }: ComponentI width={8} color="neutral600" borderRadius={showBackground ? '50%' : 0} + {...props} > ); }; -const COMPONENT_ICONS = { +const COMPONENT_ICONS: Record> = { alien: Icons.Alien, apps: Icons.GridNine, archive: Icons.Archive, @@ -155,5 +162,5 @@ const COMPONENT_ICONS = { write: Icons.Feather, }; -export { ComponentIcon }; +export { ComponentIcon, COMPONENT_ICONS }; export type { ComponentIconProps }; diff --git a/packages/core/content-manager/admin/src/components/ConfigurationForm/Fields.tsx b/packages/core/content-manager/admin/src/components/ConfigurationForm/Fields.tsx index 896cb2123de..b012a8bad1b 100644 --- a/packages/core/content-manager/admin/src/components/ConfigurationForm/Fields.tsx +++ b/packages/core/content-manager/admin/src/components/ConfigurationForm/Fields.tsx @@ -370,7 +370,8 @@ const Field = ({ attribute, components, name, index, onMoveField, onRemoveField > - + - + diff --git a/packages/core/content-manager/admin/src/components/DragPreviews/RelationDragPreview.tsx b/packages/core/content-manager/admin/src/components/DragPreviews/RelationDragPreview.tsx index dc09ae32875..9eb2feedd37 100644 --- a/packages/core/content-manager/admin/src/components/DragPreviews/RelationDragPreview.tsx +++ b/packages/core/content-manager/admin/src/components/DragPreviews/RelationDragPreview.tsx @@ -34,7 +34,7 @@ const RelationDragPreview = ({ status, displayedValue, width }: RelationDragPrev gap={4} > - + diff --git a/packages/core/content-manager/admin/src/pages/EditView/components/DocumentActions.tsx b/packages/core/content-manager/admin/src/pages/EditView/components/DocumentActions.tsx index d795c74805f..fcef6984ac7 100644 --- a/packages/core/content-manager/admin/src/pages/EditView/components/DocumentActions.tsx +++ b/packages/core/content-manager/admin/src/pages/EditView/components/DocumentActions.tsx @@ -842,6 +842,7 @@ const UnpublishAction: DocumentActionComponent = ({ direction="column" alignItems="flex-start" tag="fieldset" + borderWidth={0} gap={3} > diff --git a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.tsx b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.tsx index 043fa180a49..e837cb52149 100644 --- a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.tsx +++ b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.tsx @@ -236,7 +236,8 @@ const DragAndDropElement = ({ tag="div" role="button" tabIndex={0} - aria-label={formatMessage({ + withTooltip={false} + label={formatMessage({ id: getTranslation('components.DragHandle-label'), defaultMessage: 'Drag', })} @@ -270,7 +271,8 @@ const CloneDragItem = ({ children, dragHandleTopMargin }: CloneDragItemProps) => + - - - {label} - {attribute.repeatable && ( - <> ({Array.isArray(field.value) ? field.value.length : 0}) - )} - {required && *} - - {labelAction && {labelAction}} - + + {label} + {attribute.repeatable && ( + <> ({Array.isArray(field.value) ? field.value.length : 0}) + )} + {showResetComponent && ( } borderWidth={0} onClick={() => { field.onChange(name, null); }} - /> - )} - - - {/** - * if the field isn't repeatable then we display a button to start the field - * TODO: should this just live in the `NonRepeatableComponent`? - */} - {!attribute.repeatable && !field.value && ( - - )} - {!attribute.repeatable && field.value ? ( - - {props.children} - - ) : null} - {attribute.repeatable && ( - - {props.children} - + > + + )} - + {/** + * if the field isn't repeatable then we display a button to start the field + * TODO: should this just live in the `NonRepeatableComponent`? + */} + {!attribute.repeatable && !field.value && ( + + )} + {!attribute.repeatable && field.value ? ( + + {props.children} + + ) : null} + {attribute.repeatable && ( + + {props.children} + + )} + + ); }; diff --git a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/Component/Repeatable.tsx b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/Component/Repeatable.tsx index 8e535a17030..f56cd704efa 100644 --- a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/Component/Repeatable.tsx +++ b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/Component/Repeatable.tsx @@ -7,17 +7,11 @@ import { TextButton, VisuallyHidden, Accordion, - AccordionContent as DSAccordionContent, - AccordionToggle, IconButton, - Typography, - KeyboardNavigable, useComposedRefs, GridItem, Grid, - FlexComponent, BoxComponent, - IconButtonComponent, } from '@strapi/design-system'; import { Plus, Drag, Trash } from '@strapi/icons'; import { getEmptyImage } from 'react-dnd-html5-backend'; @@ -28,6 +22,7 @@ import { styled } from 'styled-components'; import { ItemTypes } from '../../../../../constants/dragAndDrop'; import { useDoc } from '../../../../../hooks/useDocument'; import { useDragAndDrop, type UseDragAndDropOptions } from '../../../../../hooks/useDragAndDrop'; +import { usePrev } from '../../../../../hooks/usePrev'; import { getIn } from '../../../../../utils/objects'; import { getTranslation } from '../../../../../utils/translations'; import { transformDocument } from '../../../utils/data'; @@ -66,7 +61,7 @@ const RepeatableComponent = ({ const removeFieldRow = useForm('RepeatableComponent', (state) => state.removeFieldRow); const { max = Infinity } = attribute; - const [collapseToOpen, setCollapseToOpen] = React.useState(null); + const [collapseToOpen, setCollapseToOpen] = React.useState(''); const [liveText, setLiveText] = React.useState(''); /** @@ -94,14 +89,25 @@ const RepeatableComponent = ({ return undefined; }, [search, name, value]); + const prevValue = usePrev(value); + + React.useEffect(() => { + /** + * When we add a new item to the array, we want to open the collapse. + */ + if (prevValue && prevValue.length < value.length) { + setCollapseToOpen(value[value.length - 1].__temp_key__); + } + }, [value, prevValue]); + React.useEffect(() => { - if (typeof componentTmpKeyWithFocussedField === 'number') { + if (typeof componentTmpKeyWithFocussedField === 'string') { setCollapseToOpen(componentTmpKeyWithFocussedField); } }, [componentTmpKeyWithFocussedField]); const toggleCollapses = () => { - setCollapseToOpen(null); + setCollapseToOpen(''); }; const handleClick = () => { @@ -139,12 +145,8 @@ const RepeatableComponent = ({ moveFieldRow(name, currentIndex, newIndex); }; - const handleToggle = (key: number) => () => { - if (collapseToOpen === key) { - setCollapseToOpen(null); - } else { - setCollapseToOpen(key); - } + const handleValueChange = (key: string) => { + setCollapseToOpen(key); }; const getItemPos = (index: number) => `${index + 1} of ${value.length}`; @@ -210,205 +212,137 @@ const RepeatableComponent = ({ })} {liveText} - - - {value.map(({ __temp_key__: key, id }, index) => { - const nameWithIndex = `${name}.${index}`; - return ( - + {value.map(({ __temp_key__: key, id }, index) => { + const nameWithIndex = `${name}.${index}`; + return ( + + { + removeFieldRow(name, index); + toggleCollapses(); + }} + toggleCollapses={toggleCollapses} + onCancel={handleCancel} + onDropItem={handleDropItem} + onGrabItem={handleGrabItem} + __temp_key__={key} > - { - removeFieldRow(name, index); - toggleCollapses(); - }} - toggleCollapses={toggleCollapses} - onCancel={handleCancel} - onDropItem={handleDropItem} - onGrabItem={handleGrabItem} - > - {layout.map((row, index) => { - return ( - - {row.map(({ size, ...field }) => { - /** - * Layouts are built from schemas so they don't understand the complete - * schema tree, for components we append the parent name to the field name - * because this is the structure for the data & permissions also understand - * the nesting involved. - */ - const completeFieldName = `${nameWithIndex}.${field.name}`; - - return ( - - {children({ ...field, name: completeFieldName })} - - ); - })} - - ); - })} - - - ); + {layout.map((row, index) => { + return ( + + {row.map(({ size, ...field }) => { + /** + * Layouts are built from schemas so they don't understand the complete + * schema tree, for components we append the parent name to the field name + * because this is the structure for the data & permissions also understand + * the nesting involved. + */ + const completeFieldName = `${nameWithIndex}.${field.name}`; + + return ( + + {children({ ...field, name: completeFieldName })} + + ); + })} + + ); + })} + + + ); + })} + }> + {formatMessage({ + id: getTranslation('containers.EditView.add.new-entry'), + defaultMessage: 'Add an entry', })} - - - - }> - {formatMessage({ - id: getTranslation('containers.EditView.add.new-entry'), - defaultMessage: 'Add an entry', - })} - - - - + + ); }; +const AccordionRoot = styled(Accordion.Root)<{ $error?: string }>` + border: 1px solid + ${({ theme, $error }) => ($error ? theme.colors.danger600 : theme.colors.neutral200)}; +`; + const TextButtonCustom = styled(TextButton)` - height: 100%; width: 100%; - border-radius: 0 0 4px 4px; display: flex; justify-content: center; - span { - font-weight: 600; - font-size: 14px; - } -`; - -/* ------------------------------------------------------------------------------------------------- - * Accordion - * -----------------------------------------------------------------------------------------------*/ - -const AccordionFooter = styled(Box)` - overflow: hidden; - border-bottom: 1px solid ${({ theme }) => theme.colors.neutral200}; - border-right: 1px solid ${({ theme }) => theme.colors.neutral200}; - border-left: 1px solid ${({ theme }) => theme.colors.neutral200}; - border-radius: 0 0 ${({ theme }) => theme.borderRadius} ${({ theme }) => theme.borderRadius}; -`; + border-top: 1px solid ${({ theme }) => theme.colors.neutral200}; + padding-inline: ${(props) => props.theme.spaces[6]}; + padding-block: ${(props) => props.theme.spaces[3]}; -const AccordionContent = styled(Box)` - border-bottom: none; + &:not([disabled]) { + cursor: pointer; - /* add the borders and make sure the top is transparent to avoid jumping with the hover effect */ - & > div > div { - border: 1px solid ${({ theme }) => theme.colors.neutral200}; - border-top-color: transparent; - } - - /* the top accordion _does_ need a border though */ - & > div:first-child > div { - border-top: 1px solid ${({ theme }) => theme.colors.neutral200}; - } - - /* Reset all the border-radius' */ - & > div > div, - & > div > div > div { - border-radius: unset; + &:hover { + background-color: ${(props) => props.theme.colors.primary100}; + } } - /* Give the border radius back to the first accordion */ - & > div:first-child > div, - & > div:first-child > div > div { - border-radius: ${({ theme }) => theme.borderRadius} ${({ theme }) => theme.borderRadius} 0 0; + span { + font-weight: 600; + font-size: 1.4rem; + line-height: 2.4rem; } - & > div > div[data-strapi-expanded='true'] { - border: 1px solid ${({ theme }) => theme.colors.primary600}; + @media (prefers-reduced-motion: no-preference) { + transition: background-color 120ms ${(props) => props.theme.easings.easeOutQuad}; } `; -interface AccordionGroupProps { - children: React.ReactNode; - error?: string; -} - -const AccordionGroup = ({ children, error }: AccordionGroupProps) => { - return ( - - {children} - {error && ( - - - {error} - - - )} - - ); -}; - /* ------------------------------------------------------------------------------------------------- * Field * -----------------------------------------------------------------------------------------------*/ -const CustomIconButton = styled(IconButton)<{ $expanded?: boolean }>` - background-color: transparent; - color: ${({ theme, $expanded }) => - $expanded ? theme.colors.primary600 : theme.colors.neutral600}; - - &:hover { - color: ${({ theme }) => theme.colors.primary600}; - } -`; - -const ActionsFlex = styled(Flex)<{ $expanded?: boolean }>` - & .drag-handle { - background: unset; - color: ${({ theme, $expanded }) => ($expanded ? theme.colors.primary600 : undefined)}; - - &:hover { - color: ${({ theme }) => theme.colors.primary600}; - } - } -`; - interface ComponentProps extends Pick, Pick { attribute: Schema.Attribute.Component<`${string}.${string}`, boolean>; disabled?: boolean; index: number; - isOpen?: boolean; name: string; - onClickToggle: () => void; onDeleteComponent?: React.MouseEventHandler; toggleCollapses: () => void; children: React.ReactNode; + __temp_key__: string; } const Component = ({ disabled, index, - isOpen, name, mainField = { name: 'id', type: 'integer', }, children, - onClickToggle, onDeleteComponent, toggleCollapses, + __temp_key__, ...dragProps }: ComponentProps) => { const { formatMessage } = useIntl(); @@ -447,52 +381,46 @@ const Component = ({ }, [dragPreviewRef, index]); const composedAccordionRefs = useComposedRefs(accordionRef, dragRef); - const composedBoxRefs = useComposedRefs(boxRef, dropRef); + const composedBoxRefs = useComposedRefs( + boxRef as React.RefObject, + dropRef + ); return ( - + <> {isDragging ? ( ) : ( - - - } - /> - e.stopPropagation()} - data-handler-id={handlerId} - label={formatMessage({ - id: getTranslation('components.DragHandle-label'), - defaultMessage: 'Drag', - })} - onKeyDown={handleKeyDown} - > - - - - ) - } - title={displayValue} - togglePosition="left" - /> - + + + {displayValue} + + + + + e.stopPropagation()} + data-handler-id={handlerId} + label={formatMessage({ + id: getTranslation('components.DragHandle-label'), + defaultMessage: 'Drag', + })} + onKeyDown={handleKeyDown} + > + + + + + {children} - - + + )} - + ); }; diff --git a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.tsx b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.tsx index 5d81a044f5f..ca08161de2f 100644 --- a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.tsx +++ b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.tsx @@ -2,9 +2,6 @@ import * as React from 'react'; import { Accordion, - AccordionContent, - AccordionToggle, - AccordionVariant, Box, Flex, FlexComponent, @@ -23,91 +20,76 @@ interface ComponentCategoryProps { displayName: string; icon?: string; }>; - isOpen?: boolean; onAddComponent: ( componentUid: string ) => React.MouseEventHandler & React.MouseEventHandler; - onToggle: (category: string) => void; - variant?: AccordionVariant; + variant?: Accordion.Variant; } const ComponentCategory = ({ category, components = [], variant = 'primary', - isOpen, onAddComponent, - onToggle, }: ComponentCategoryProps) => { const { formatMessage } = useIntl(); - const handleToggle = () => { - onToggle(category); - }; - return ( - - - - - - {components.map(({ uid, displayName, icon }) => ( - - - + + + + {formatMessage({ id: category, defaultMessage: category })} + + + + + {components.map(({ uid, displayName, icon }) => ( + + + - - {displayName} - - - - ))} - - - - + + {displayName} + + + + ))} + + + ); }; -const Grid = styled.div` +const Grid = styled(Box)` display: grid; grid-template-columns: repeat(auto-fit, 14rem); grid-gap: ${({ theme }) => theme.spaces[1]}; `; -const ComponentName = styled(Typography)``; - const ComponentBox = styled>(Flex)` + color: ${({ theme }) => theme.colors.neutral600}; + cursor: pointer; + + @media (prefers-reduced-motion: no-preference) { + transition: color 120ms ${(props) => props.theme.easings.easeOutQuad}; + } + &:focus, &:hover { border: 1px solid ${({ theme }) => theme.colors.primary200}; background: ${({ theme }) => theme.colors.primary100}; - - ${ComponentName} { - color: ${({ theme }) => theme.colors.primary600}; - } - - /* > Flex > ComponentIcon */ - > div > div:first-child { - background: ${({ theme }) => theme.colors.primary200}; - color: ${({ theme }) => theme.colors.primary600}; - } + color: ${({ theme }) => theme.colors.primary600}; } `; diff --git a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.tsx b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.tsx index e2db493f637..8b13aab38b2 100644 --- a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.tsx +++ b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; -import { Box, Flex, KeyboardNavigable, Typography } from '@strapi/design-system'; +import { Box, Flex, Accordion, Typography } from '@strapi/design-system'; import { useIntl } from 'react-intl'; import { getTranslation } from '../../../../../utils/translations'; @@ -20,23 +20,8 @@ const ComponentPicker = ({ }: ComponentPickerProps) => { const { formatMessage } = useIntl(); - const [categoryToOpen, setCategoryToOpen] = React.useState(''); - - React.useEffect(() => { - const categoryKeys = Object.keys(dynamicComponentsByCategory); - - if (isOpen && categoryKeys.length > 0) { - setCategoryToOpen(categoryKeys[0]); - } - }, [isOpen, dynamicComponentsByCategory]); - const handleAddComponentToDz = (componentUid: string) => () => { onClickAddComponent(componentUid); - setCategoryToOpen(''); - }; - - const handleClickToggle = (categoryName: string) => { - setCategoryToOpen((currentCat) => (currentCat === categoryName ? '' : categoryName)); }; if (!isOpen) { @@ -63,19 +48,17 @@ const ComponentPicker = ({ - + {Object.entries(dynamicComponentsByCategory).map(([category, components], index) => ( ))} - + ); diff --git a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.tsx b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.tsx index 4309c539d62..2497185eb66 100644 --- a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.tsx +++ b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.tsx @@ -3,8 +3,6 @@ import * as React from 'react'; import { useForm } from '@strapi/admin/strapi-admin'; import { Accordion, - AccordionContent, - AccordionToggle, Box, Flex, Grid, @@ -22,7 +20,7 @@ import { getEmptyImage } from 'react-dnd-html5-backend'; import { useIntl } from 'react-intl'; import { styled } from 'styled-components'; -import { ComponentIcon } from '../../../../../components/ComponentIcon'; +import { COMPONENT_ICONS, ComponentIcon } from '../../../../../components/ComponentIcon'; import { ItemTypes } from '../../../../../constants/dragAndDrop'; import { useDocLayout } from '../../../../../hooks/useDocumentLayout'; import { type UseDragAndDropOptions, useDragAndDrop } from '../../../../../hooks/useDragAndDrop'; @@ -57,7 +55,6 @@ const DynamicComponent = ({ dynamicComponentsByCategory = {}, onAddComponent, }: DynamicComponentProps) => { - const [isOpen, setIsOpen] = React.useState(true); const { formatMessage } = useIntl(); const formValues = useForm('DynamicComponent', (state) => state.values); const { @@ -85,29 +82,6 @@ const DynamicComponent = ({ return { icon, displayName }; }, [componentUid, dynamicComponentsByCategory]); - // const fieldsErrors = Object.keys(formErrors).filter((errorKey) => { - // const errorKeysArray = errorKey.split('.'); - - // if (`${errorKeysArray[0]}.${errorKeysArray[1]}` === `${name}.${index}`) { - // return true; - // } - - // return false; - // }); - - // let errorMessage; - - // if (fieldsErrors.length > 0) { - // errorMessage = formatMessage({ - // id: getTranslation('components.DynamicZone.error-message'), - // defaultMessage: 'The component contains error(s)', - // }); - // } - - const handleToggle = () => { - setIsOpen((s) => !s); - }; - const [{ handlerId, isDragging, handleKeyDown }, boxRef, dropRef, dragRef, dragPreviewRef] = useDragAndDrop(!disabled, { type: `${ItemTypes.DYNAMIC_ZONE}_${name}`, @@ -130,8 +104,8 @@ const DynamicComponent = ({ const composedBoxRefs = useComposedRefs(boxRef, dropRef); const accordionActions = disabled ? null : ( - - + - + e.stopPropagation()} data-handler-id={handlerId} ref={dragRef} @@ -213,7 +184,7 @@ const DynamicComponent = ({ - + ); return ( @@ -225,59 +196,45 @@ const DynamicComponent = ({ {isDragging ? ( ) : ( - - } - action={accordionActions} - title={`${displayName} ${title}`} - togglePosition="left" - /> - - - - {components[componentUid]?.layout?.map((row, rowInd) => ( - - {row.map(({ size, ...field }) => { - const fieldName = `${name}.${index}.${field.name}`; - - return ( - - - - ); - })} - - ))} - - - - + + + + {`${displayName} ${title}`} + {accordionActions} + + + + + {components[componentUid]?.layout?.map((row, rowInd) => ( + + {row.map(({ size, ...field }) => { + const fieldName = `${name}.${index}.${field.name}`; + + return ( + + + + ); + })} + + ))} + + + + + )} ); }; -const ActionsFlex = styled(Flex)` - /* - we need to remove the background from the button but we can't - wrap the element in styled because it breaks the forwardedAs which - we need for drag handler to work on firefox - */ - div[role='button'] { - background: transparent; - } -`; - -const IconButtonCustom = styled(IconButton)` - background-color: transparent; - - svg { - fill: ${({ theme }) => theme.colors.neutral600}; - } -`; - // TODO: Delete once https://github.com/strapi/design-system/pull/858 // is merged and released. const StyledBox = styled(Box)` diff --git a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/tests/ComponentCard.test.tsx b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/tests/ComponentCard.test.tsx index 6d4f4aa9fbd..595bb985625 100644 --- a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/tests/ComponentCard.test.tsx +++ b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/tests/ComponentCard.test.tsx @@ -1,20 +1,12 @@ -import { lightTheme, ThemeProvider } from '@strapi/design-system'; -import { fireEvent, render } from '@testing-library/react'; +import { screen, render } from '@tests/utils'; -import { ComponentCard, ComponentCardProps } from '../ComponentCard'; +import { ComponentCard } from '../ComponentCard'; describe('ComponentCard', () => { - const setup = (props?: Partial) => - render( - - test - - ); - - it('should call the onClick handler when passed', () => { + it('should call the onClick handler when passed', async () => { const onClick = jest.fn(); - const { getByText } = setup({ onClick }); - fireEvent.click(getByText('test')); + const { user } = render(test); + await user.click(screen.getByText('test')); expect(onClick).toHaveBeenCalled(); }); }); diff --git a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/tests/ComponentCategory.test.tsx b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/tests/ComponentCategory.test.tsx index c0b30d6230d..e2f19f05929 100644 --- a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/tests/ComponentCategory.test.tsx +++ b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/tests/ComponentCategory.test.tsx @@ -4,19 +4,11 @@ import { ComponentCategory, ComponentCategoryProps } from '../ComponentCategory' describe('ComponentCategory', () => { const render = (props?: Partial) => ({ - ...renderRTL( - - ), + ...renderRTL(), }); it('should render my array of components when passed and the accordion is open', () => { const { getByRole } = render({ - isOpen: true, components: [ { uid: 'test.test', @@ -37,21 +29,9 @@ describe('ComponentCategory', () => { expect(getByText(/myCategory/)).toBeInTheDocument(); }); - it('should call the onToggle callback when the accordion trigger is pressed', async () => { - const onToggle = jest.fn(); - const { getByRole, user } = render({ - onToggle, - }); - - await user.click(getByRole('button', { name: /testing/ })); - - expect(onToggle).toHaveBeenCalledWith('testing'); - }); - it('should call onAddComponent with the componentUid when a ComponentCard is clicked', async () => { const onAddComponent = jest.fn(); const { getByRole, user } = render({ - isOpen: true, onAddComponent, components: [ { diff --git a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/tests/DynamicZoneLabel.test.tsx b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/tests/DynamicZoneLabel.test.tsx index bbc74f47fa0..f74b4f90f34 100644 --- a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/tests/DynamicZoneLabel.test.tsx +++ b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/tests/DynamicZoneLabel.test.tsx @@ -1,27 +1,19 @@ -import { lightTheme, ThemeProvider, Tooltip } from '@strapi/design-system'; import { Earth } from '@strapi/icons'; -import { render as renderRTL } from '@testing-library/react'; -import { IntlProvider } from 'react-intl'; +import { render as renderRTL } from 'tests/utils'; import { DynamicZoneLabel, DynamicZoneLabelProps } from '../DynamicZoneLabel'; const LabelAction = () => { return ( - - - + ); }; describe('DynamicZoneLabel', () => { const Component = (props?: Partial) => ( - - - - - + ); const render = (props?: Partial) => renderRTL(); diff --git a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/Relations.tsx b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/Relations.tsx index 55a1f5f2a0f..a4070bf54de 100644 --- a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/Relations.tsx +++ b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/Relations.tsx @@ -937,7 +937,8 @@ const ListItem = ({ data, index, style }: ListItemProps) => { tag="div" role="button" tabIndex={0} - aria-label={formatMessage({ + withTooltip={false} + label={formatMessage({ id: getTranslation('components.RelationInput.icon-button-aria-label'), defaultMessage: 'Drag', })} diff --git a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.tsx b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.tsx index 654047c3e03..cc9b79651da 100644 --- a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.tsx +++ b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.tsx @@ -81,12 +81,7 @@ const WysiwygNav = ({ > - + h1 h2 h3 @@ -97,12 +92,20 @@ const WysiwygNav = ({ - } /> - } /> - } /> + + + + + + + + + - } /> + + + {!isExpandMode && ( @@ -129,7 +132,6 @@ const WysiwygNav = ({ onActionClick(value, editorRef)} > @@ -147,28 +149,28 @@ const WysiwygNav = ({ onClick={() => onActionClick('Bold', editorRef)} label="Bold" name="Bold" - icon={} - /> + > + + onActionClick('Italic', editorRef)} label="Italic" name="Italic" - icon={} - /> + > + + onActionClick('Underline', editorRef)} label="Underline" name="Underline" - icon={} - /> + > + + - } - /> + + + {visiblePopover && ( @@ -177,28 +179,32 @@ const WysiwygNav = ({ onClick={() => onActionClick('Strikethrough', editorRef, handleTogglePopover)} label="Strikethrough" name="Strikethrough" - icon={} - /> + > + + onActionClick('BulletList', editorRef, handleTogglePopover)} label="BulletList" name="BulletList" - icon={} - /> + > + + onActionClick('NumberList', editorRef, handleTogglePopover)} label="NumberList" name="NumberList" - icon={} - /> + > + + onActionClick('Code', editorRef, handleTogglePopover)} label="Code" name="Code" - icon={} - /> + > + + { handleTogglePopover(); @@ -206,21 +212,23 @@ const WysiwygNav = ({ }} label="Image" name="Image" - icon={} - /> + > + + onActionClick('Link', editorRef, handleTogglePopover)} label="Link" name="Link" - // eslint-disable-next-line jsx-a11y/anchor-is-valid - icon={} - /> + > + + onActionClick('Quote', editorRef, handleTogglePopover)} label="Quote" name="Quote" - icon={} - /> + > + + diff --git a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.tsx b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.tsx index 47425351e4d..30e184d079b 100644 --- a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.tsx +++ b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.tsx @@ -1,8 +1,13 @@ -import { BaseButton, IconButton, IconButtonGroup } from '@strapi/design-system'; +import { + BaseButton, + IconButton, + IconButtonComponent, + IconButtonGroup, +} from '@strapi/design-system'; import { styled } from 'styled-components'; // NAV BUTTONS -export const CustomIconButton = styled(IconButton)` +export const CustomIconButton = styled(IconButton)` padding: ${({ theme }) => theme.spaces[2]}; /* Trick to prevent the outline from overflowing because of the general outline-offset */ outline-offset: -2px !important; @@ -24,7 +29,7 @@ export const MainButtons = styled(IconButtonGroup)` margin-left: ${({ theme }) => theme.spaces[4]}; `; -export const MoreButton = styled(IconButton)` +export const MoreButton = styled(IconButton)` margin: ${({ theme }) => `0 ${theme.spaces[2]}`}; padding: ${({ theme }) => theme.spaces[2]}; diff --git a/packages/core/content-manager/admin/src/pages/ListView/components/ViewSettingsMenu.tsx b/packages/core/content-manager/admin/src/pages/ListView/components/ViewSettingsMenu.tsx index 74a13742793..a791b3599a6 100644 --- a/packages/core/content-manager/admin/src/pages/ListView/components/ViewSettingsMenu.tsx +++ b/packages/core/content-manager/admin/src/pages/ListView/components/ViewSettingsMenu.tsx @@ -44,14 +44,15 @@ const ViewSettingsMenu = (props: ViewSettingsMenuProps) => { return ( <> } label={formatMessage({ id: 'components.ViewSettings.tooltip', defaultMessage: 'View Settings', })} ref={cogButtonRef} onClick={handleToggle} - /> + > + + {isVisible && ( + {formatMessage({ diff --git a/packages/core/content-releases/admin/src/components/ReleaseModal.tsx b/packages/core/content-releases/admin/src/components/ReleaseModal.tsx index 72e0c943acc..8d319ee590e 100644 --- a/packages/core/content-releases/admin/src/components/ReleaseModal.tsx +++ b/packages/core/content-releases/admin/src/components/ReleaseModal.tsx @@ -29,7 +29,7 @@ import { getTimezoneOffset } from '../utils/time'; export interface FormValues { name: string; - date: string | null; + date?: string; time: string; timezone: string | null; isScheduled?: boolean; @@ -106,131 +106,136 @@ export const ReleaseModal = ({ validationSchema={RELEASE_SCHEMA} validateOnChange={false} > - {({ values, errors, handleChange, setFieldValue }) => ( -
- - - - - {formatMessage({ - id: 'content-releases.modal.form.input.label.release-name', - defaultMessage: 'Name', - })} - - - - - - { - setFieldValue('isScheduled', event.target.checked); - if (!event.target.checked) { - // Clear scheduling info from a release on unchecking schedule release, which reset scheduling info in DB - setFieldValue('date', null); - setFieldValue('time', ''); - setFieldValue('timezone', null); - } else { - // On ticking back schedule release date, time and timezone should be restored to the initial state - setFieldValue('date', initialValues.date); - setFieldValue('time', initialValues.time); - setFieldValue('timezone', initialValues.timezone ?? systemTimezone?.value); - } - }} - > - + {({ values, errors, handleChange, setFieldValue }) => { + return ( + + + + + {formatMessage({ - id: 'modal.form.input.label.schedule-release', - defaultMessage: 'Schedule release', + id: 'content-releases.modal.form.input.label.release-name', + defaultMessage: 'Name', })} - - - - {values.isScheduled && ( - <> - - - - - {formatMessage({ - id: 'content-releases.modal.form.input.label.date', - defaultMessage: 'Date', - })} - - { - const isoFormatDate = date - ? formatISO(date, { representation: 'date' }) - : null; - setFieldValue('date', isoFormatDate); - }} - clearLabel={formatMessage({ - id: 'content-releases.modal.form.input.clearLabel', - defaultMessage: 'Clear', - })} - onClear={() => { - setFieldValue('date', null); - }} - selectedDate={values.date || undefined} - minDate={utcToZonedTime(new Date(), values.timezone.split('&')[1])} - /> - - - - - - - {formatMessage({ - id: 'content-releases.modal.form.input.label.time', - defaultMessage: 'Time', - })} - - { - setFieldValue('time', time); - }} - clearLabel={formatMessage({ - id: 'content-releases.modal.form.input.clearLabel', - defaultMessage: 'Clear', - })} - onClear={() => { - setFieldValue('time', ''); - }} - value={values.time || undefined} - /> - - - - - - - )} - - - - {formatMessage({ id: 'cancel', defaultMessage: 'Cancel' })} - - } - endActions={ - - } - /> - - )} +
+ + + {formatMessage({ id: 'cancel', defaultMessage: 'Cancel' })} + + } + endActions={ + + } + /> + + ); + }} ); diff --git a/packages/core/content-releases/admin/src/components/tests/ReleaseModal.test.tsx b/packages/core/content-releases/admin/src/components/tests/ReleaseModal.test.tsx index f11ec15e0c3..6d463a75fa9 100644 --- a/packages/core/content-releases/admin/src/components/tests/ReleaseModal.test.tsx +++ b/packages/core/content-releases/admin/src/components/tests/ReleaseModal.test.tsx @@ -1,6 +1,5 @@ import { fireEvent } from '@testing-library/react'; import { render, screen, waitFor } from '@tests/utils'; -import { MemoryRouter } from 'react-router-dom'; import { pluginId } from '../../pluginId'; import { ReleaseModal } from '../ReleaseModal'; @@ -24,7 +23,7 @@ describe('ReleaseModal', () => { , { @@ -44,7 +43,7 @@ describe('ReleaseModal', () => { ); diff --git a/packages/core/content-releases/admin/src/pages/ReleaseDetailsPage.tsx b/packages/core/content-releases/admin/src/pages/ReleaseDetailsPage.tsx index 5271e0c3479..e2bd3af589d 100644 --- a/packages/core/content-releases/admin/src/pages/ReleaseDetailsPage.tsx +++ b/packages/core/content-releases/admin/src/pages/ReleaseDetailsPage.tsx @@ -19,7 +19,6 @@ import { unstable_useDocument } from '@strapi/content-manager/strapi-admin'; import { Button, Flex, - IconButton, Main, Tr, Td, @@ -374,17 +373,16 @@ const ReleaseDetailsLayout = ({ - The Icon doesn't actually show unless you hack it with some padding...and it's still a little strange */} } variant="tertiary" - /> + > + + {/* TODO: Using Menu instead of SimpleMenu mainly because there is no positioning provided from the DS, Refactor this once fixed in the DS @@ -889,7 +887,7 @@ const ReleaseDetailsPage = () => { const scheduledAt = releaseData?.scheduledAt && timezone ? utcToZonedTime(releaseData.scheduledAt, timezone) : null; // Just get the date and time to display without considering updated timezone time - const date = scheduledAt ? format(scheduledAt, 'yyyy-MM-dd') : null; + const date = scheduledAt ? format(scheduledAt, 'yyyy-MM-dd') : undefined; const time = scheduledAt ? format(scheduledAt, 'HH:mm') : ''; const handleEditRelease = async (values: FormValues) => { diff --git a/packages/core/content-releases/admin/src/pages/ReleasesPage.tsx b/packages/core/content-releases/admin/src/pages/ReleasesPage.tsx index bfe6c50fae3..fc7dad698d2 100644 --- a/packages/core/content-releases/admin/src/pages/ReleasesPage.tsx +++ b/packages/core/content-releases/admin/src/pages/ReleasesPage.tsx @@ -174,7 +174,7 @@ const StyledAlert = styled(Alert)` const INITIAL_FORM_VALUES = { name: '', - date: null, + date: undefined, time: '', isScheduled: true, scheduledAt: null, diff --git a/packages/core/content-type-builder/admin/src/components/AttributeOptions/tests/AttributeOptions.test.tsx b/packages/core/content-type-builder/admin/src/components/AttributeOptions/tests/AttributeOptions.test.tsx index 8e53bd072d7..4cae04792e6 100644 --- a/packages/core/content-type-builder/admin/src/components/AttributeOptions/tests/AttributeOptions.test.tsx +++ b/packages/core/content-type-builder/admin/src/components/AttributeOptions/tests/AttributeOptions.test.tsx @@ -1,5 +1,5 @@ import { useStrapiApp } from '@strapi/admin/strapi-admin'; -import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { DesignSystemProvider } from '@strapi/design-system'; import { fireEvent, render, screen } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; import { MemoryRouter } from 'react-router-dom'; @@ -58,7 +58,7 @@ const mockAttributes: IconByType[][] = [ const makeApp = () => { return ( - + { /> - + ); }; diff --git a/packages/core/content-type-builder/admin/src/components/ContentTypeBuilderNav/tests/index.test.tsx b/packages/core/content-type-builder/admin/src/components/ContentTypeBuilderNav/tests/index.test.tsx index 8ecf91c07f3..5aa4826d2ad 100644 --- a/packages/core/content-type-builder/admin/src/components/ContentTypeBuilderNav/tests/index.test.tsx +++ b/packages/core/content-type-builder/admin/src/components/ContentTypeBuilderNav/tests/index.test.tsx @@ -1,6 +1,6 @@ /* eslint-disable check-file/filename-naming-convention */ import { Layouts } from '@strapi/admin/strapi-admin'; -import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { DesignSystemProvider } from '@strapi/design-system'; import { render } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; import { MemoryRouter } from 'react-router-dom'; @@ -22,13 +22,13 @@ jest.mock('../useContentTypeBuilderMenu.ts', () => { const makeApp = () => { return ( - + }>
- + ); }; diff --git a/packages/core/content-type-builder/admin/src/components/GenericInputs.tsx b/packages/core/content-type-builder/admin/src/components/GenericInputs.tsx index c81b21835fe..a8488cd11be 100644 --- a/packages/core/content-type-builder/admin/src/components/GenericInputs.tsx +++ b/packages/core/content-type-builder/admin/src/components/GenericInputs.tsx @@ -298,7 +298,7 @@ const GenericInput = ({ }} onClear={() => onChange({ target: { name, value: null, type } })} placeholder={formattedPlaceholder} - selectedDate={value} + value={value} /> ); } diff --git a/packages/core/content-type-builder/admin/src/components/IconPicker/IconPicker.tsx b/packages/core/content-type-builder/admin/src/components/IconPicker/IconPicker.tsx index f0c441ca2fa..2e1d482f1dd 100644 --- a/packages/core/content-type-builder/admin/src/components/IconPicker/IconPicker.tsx +++ b/packages/core/content-type-builder/admin/src/components/IconPicker/IconPicker.tsx @@ -118,7 +118,6 @@ export const IconPicker = ({ intlLabel, name, onChange, value = '' }: IconPicker } - noBorder - /> + borderWidth={0} + > + + )} {value && ( } - noBorder - /> + borderWidth={0} + > + + )} diff --git a/packages/core/content-type-builder/admin/src/components/IconPicker/tests/IconPicker.test.tsx b/packages/core/content-type-builder/admin/src/components/IconPicker/tests/IconPicker.test.tsx index b4fd4c8f55b..f9f77239168 100644 --- a/packages/core/content-type-builder/admin/src/components/IconPicker/tests/IconPicker.test.tsx +++ b/packages/core/content-type-builder/admin/src/components/IconPicker/tests/IconPicker.test.tsx @@ -1,4 +1,4 @@ -import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { DesignSystemProvider } from '@strapi/design-system'; import { fireEvent, render } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { IntlProvider } from 'react-intl'; @@ -22,9 +22,9 @@ const setup = (props?: Partial) => { ...render(, { wrapper: ({ children }) => ( - + {children} - + ), }), diff --git a/packages/core/content-type-builder/admin/src/components/ListRow.tsx b/packages/core/content-type-builder/admin/src/components/ListRow.tsx index 6ad69fde0d2..c08c8b56d63 100644 --- a/packages/core/content-type-builder/admin/src/components/ListRow.tsx +++ b/packages/core/content-type-builder/admin/src/components/ListRow.tsx @@ -147,9 +147,10 @@ export const ListRow = memo( id: 'app.utils.edit', defaultMessage: 'Edit', })} ${name}`} - noBorder - icon={} - /> + borderWidth={0} + > + + )} { @@ -164,9 +165,10 @@ export const ListRow = memo( id: 'global.delete', defaultMessage: 'Delete', })} ${name}`} - noBorder - icon={} - /> + borderWidth={0} + > + + ) : ( diff --git a/packages/core/review-workflows/admin/src/components/LimitsModal.tsx b/packages/core/review-workflows/admin/src/components/LimitsModal.tsx index 491966965d7..5d8fa7e1971 100644 --- a/packages/core/review-workflows/admin/src/components/LimitsModal.tsx +++ b/packages/core/review-workflows/admin/src/components/LimitsModal.tsx @@ -92,13 +92,15 @@ const Root: React.FC> = ({ } - aria-label={formatMessage({ + withTooltip={false} + label={formatMessage({ id: 'global.close', defaultMessage: 'Close', })} onClick={onClose} - /> + > + + diff --git a/packages/core/review-workflows/admin/src/routes/content-manager/[model]/[id]/components/AssigneeSelect.tsx b/packages/core/review-workflows/admin/src/routes/content-manager/[model]/[id]/components/AssigneeSelect.tsx index a40d7bcd5b1..c23cf2935ad 100644 --- a/packages/core/review-workflows/admin/src/routes/content-manager/[model]/[id]/components/AssigneeSelect.tsx +++ b/packages/core/review-workflows/admin/src/routes/content-manager/[model]/[id]/components/AssigneeSelect.tsx @@ -127,7 +127,6 @@ const AssigneeSelect = () => { })} disabled={(!isLoadingPermissions && !isLoading && users.length === 0) || !id} value={currentAssignee ? currentAssignee.id.toString() : null} - // @ts-expect-error - DS Combobox wants to return number or string, this will be fixed in V2. onChange={handleChange} onClear={() => handleChange(null)} placeholder={formatMessage({ diff --git a/packages/core/review-workflows/admin/src/routes/settings/components/AddStage.tsx b/packages/core/review-workflows/admin/src/routes/settings/components/AddStage.tsx index cacf2abc8c2..5ac3e4bb8da 100644 --- a/packages/core/review-workflows/admin/src/routes/settings/components/AddStage.tsx +++ b/packages/core/review-workflows/admin/src/routes/settings/components/AddStage.tsx @@ -1,4 +1,4 @@ -import { Box, ButtonProps, Flex, Typography } from '@strapi/design-system'; +import { Box, BoxComponent, ButtonProps, Flex, Typography } from '@strapi/design-system'; import { PlusCircle } from '@strapi/icons'; import { styled } from 'styled-components'; @@ -7,7 +7,7 @@ export const AddStage = ({ children, ...props }: ButtonProps) => { { ); }; -const StyledButton = styled(Box)` +const StyledButton = styled>(Box)` border-radius: 26px; color: ${({ theme }) => theme.colors.neutral500}; diff --git a/packages/core/review-workflows/admin/src/routes/settings/components/StageDragPreview.tsx b/packages/core/review-workflows/admin/src/routes/settings/components/StageDragPreview.tsx index 249746c00ae..2eb75cae3aa 100644 --- a/packages/core/review-workflows/admin/src/routes/settings/components/StageDragPreview.tsx +++ b/packages/core/review-workflows/admin/src/routes/settings/components/StageDragPreview.tsx @@ -1,6 +1,5 @@ import { Flex, Typography } from '@strapi/design-system'; import { CaretDown } from '@strapi/icons'; -import { styled } from 'styled-components'; interface StageDragPreviewType { name: string | null; @@ -19,7 +18,7 @@ const StageDragPreview = ({ name }: StageDragPreviewType) => { shadow="tableShadow" width="30rem" > - { justifyContent="center" width={6} > - - + + {name} ); }; -const Toggle = styled(Flex)` - svg path { - fill: ${({ theme }) => theme.colors.neutral600}; - } -`; - export { StageDragPreview }; export type { StageDragPreviewType }; diff --git a/packages/core/review-workflows/admin/src/routes/settings/components/Stages.tsx b/packages/core/review-workflows/admin/src/routes/settings/components/Stages.tsx index bad75f6935f..171a6227f2e 100644 --- a/packages/core/review-workflows/admin/src/routes/settings/components/Stages.tsx +++ b/packages/core/review-workflows/admin/src/routes/settings/components/Stages.tsx @@ -14,8 +14,6 @@ import { Flex, MultiSelectOption, Accordion, - AccordionContent, - AccordionToggle, Grid, GridItem, IconButton, @@ -28,7 +26,6 @@ import { useComposedRefs, Menu, MenuItem, - IconButtonComponent, Field, } from '@strapi/design-system'; import { Duplicate, Drag, More, EyeStriked } from '@strapi/icons'; @@ -57,7 +54,7 @@ interface StagesProps { isCreating?: boolean; } -const Stages = ({ canDelete = true, canUpdate = true, isCreating = false }: StagesProps) => { +const Stages = ({ canDelete = true, canUpdate = true }: StagesProps) => { const { formatMessage } = useIntl(); const { trackUsage } = useTracking(); const addFieldRow = useForm('Stages', (state) => state.addFieldRow); @@ -93,7 +90,6 @@ const Stages = ({ canDelete = true, canUpdate = true, isCreating = false }: Stag canReorder={stages.length > 1} canUpdate={canUpdate} stagesCount={stages.length} - isOpen={isCreating} {...stage} /> @@ -131,7 +127,6 @@ interface StageProps extends WorkflowStage { canDelete?: boolean; canReorder?: boolean; canUpdate?: boolean; - isOpen?: boolean; index: number; stagesCount: number; } @@ -141,7 +136,6 @@ const Stage = ({ canDelete = false, canReorder = false, canUpdate = false, - isOpen: isOpenDefault = false, stagesCount, name, permissions, @@ -150,7 +144,6 @@ const Stage = ({ const [liveText, setLiveText] = React.useState(); const { formatMessage } = useIntl(); const { trackUsage } = useTracking(); - const [isOpen, setIsOpen] = React.useState(isOpenDefault); const stageErrors = useForm('Stages', (state) => state.errors.stages as object[]); const error = stageErrors?.[index]; const addFieldRow = useForm('Stage', (state) => state.addFieldRow); @@ -244,6 +237,8 @@ const Stage = ({ addFieldRow('stages', { name, color, permissions }); }; + const id = React.useId(); + return ( {liveText && {liveText}} @@ -257,143 +252,139 @@ const Stage = ({ display="block" hasRadius padding={6} - shadow="tableShadow" /> ) : ( - { - setIsOpen(!isOpen); - - if (!isOpen) { + { + if (value) { trackUsage('willEditStage'); } }} - expanded={isOpen} - shadow="tableShadow" - error={Object.values(error ?? {})[0]} - hasErrorMessage={false} + defaultValue={id} + $error={Object.values(error ?? {}).length > 0} > - - - - - - {formatMessage({ - id: '[tbdb].components.DynamicZone.more-actions', - defaultMessage: 'More actions', + + + {name} + + {canDelete || canUpdate ? ( + <> + + + + + {formatMessage({ + id: '[tbdb].components.DynamicZone.more-actions', + defaultMessage: 'More actions', + })} + + + {/* z-index needs to be as big as the one defined for the wrapper in Stages, otherwise the menu + * disappears behind the accordion + */} + + + {canUpdate && ( + + {formatMessage({ + id: 'Settings.review-workflows.stage.delete', + defaultMessage: 'Duplicate stage', + })} + + )} + + {canDelete && ( + removeFieldRow('stages', index)}> + {formatMessage({ + id: 'Settings.review-workflows.stage.delete', + defaultMessage: 'Delete', + })} + + )} + + + + + {canUpdate && ( + - - {/* z-index needs to be as big as the one defined for the wrapper in Stages, otherwise the menu - * disappears behind the accordion - */} - - - {canUpdate && ( - - {formatMessage({ - id: 'Settings.review-workflows.stage.delete', - defaultMessage: 'Duplicate stage', - })} - - )} - - {canDelete && ( - removeFieldRow('stages', index)}> - {formatMessage({ - id: 'Settings.review-workflows.stage.delete', - defaultMessage: 'Delete', - })} - - )} - - - - - {canUpdate && ( - e.stopPropagation()} - onKeyDown={handleKeyDown} - > - - - )} - - ) - } - /> - - - {[ - { - disabled: !canUpdate, - label: formatMessage({ - id: 'Settings.review-workflows.stage.name.label', - defaultMessage: 'Stage name', - }), - name: `stages.${index}.name`, - required: true, - size: 6, - type: 'string' as const, - }, - { - disabled: !canUpdate, - label: formatMessage({ - id: 'content-manager.reviewWorkflows.stage.color', - defaultMessage: 'Color', - }), - name: `stages.${index}.color`, - required: true, - size: 6, - type: 'color' as const, - }, - { - disabled: !canUpdate, - label: formatMessage({ - id: 'Settings.review-workflows.stage.permissions.label', - defaultMessage: 'Roles that can change this stage', - }), - name: `stages.${index}.permissions`, - placeholder: formatMessage({ - id: 'Settings.review-workflows.stage.permissions.placeholder', - defaultMessage: 'Select a role', - }), - required: true, - size: 6, - type: 'permissions' as const, - }, - ].map(({ size, ...field }) => ( - - - - ))} - - - + onClick={(e) => e.stopPropagation()} + onKeyDown={handleKeyDown} + > + + + )} + + ) : null} + + + + + {[ + { + disabled: !canUpdate, + label: formatMessage({ + id: 'Settings.review-workflows.stage.name.label', + defaultMessage: 'Stage name', + }), + name: `stages.${index}.name`, + required: true, + size: 6, + type: 'string' as const, + }, + { + disabled: !canUpdate, + label: formatMessage({ + id: 'content-manager.reviewWorkflows.stage.color', + defaultMessage: 'Color', + }), + name: `stages.${index}.color`, + required: true, + size: 6, + type: 'color' as const, + }, + { + disabled: !canUpdate, + label: formatMessage({ + id: 'Settings.review-workflows.stage.permissions.label', + defaultMessage: 'Roles that can change this stage', + }), + name: `stages.${index}.permissions`, + placeholder: formatMessage({ + id: 'Settings.review-workflows.stage.permissions.placeholder', + defaultMessage: 'Select a role', + }), + required: true, + size: 6, + type: 'permissions' as const, + }, + ].map(({ size, ...field }) => ( + + + + ))} + + + + )} ); }; +const AccordionRoot = styled(Accordion.Root)<{ $error?: boolean }>` + border: 1px solid + ${({ theme, $error }) => ($error ? theme.colors.danger600 : theme.colors.neutral200)}; +`; + const DeleteMenuItem = styled(MenuItem)` color: ${({ theme }) => theme.colors.danger600}; `; @@ -411,23 +402,6 @@ const ContextMenuTrigger = styled(Menu.Trigger)` } `; -const DragIconButton = styled>(IconButton)` - align-items: center; - border-radius: ${({ theme }) => theme.borderRadius}; - display: flex; - justify-content: center; - - &:hover, - &:focus { - background-color: ${({ theme }) => theme.colors.neutral100}; - } - - svg { - height: auto; - width: ${({ theme }) => theme.spaces[3]}; - } -`; - /* ------------------------------------------------------------------------------------------------- * InputRenderer * -----------------------------------------------------------------------------------------------*/ @@ -581,7 +555,7 @@ const PermissionsField = ({ disabled, name, placeholder, required }: Permissions id: 'components.NotAllowedInput.text', defaultMessage: 'No permissions to see this field', })} - startAction={} + startAction={} type="text" value="" /> @@ -641,7 +615,6 @@ const PermissionsField = ({ disabled, name, placeholder, required }: Permissions } label={formatMessage({ id: 'Settings.review-workflows.stage.permissions.apply.label', defaultMessage: 'Apply to all stages', @@ -649,7 +622,9 @@ const PermissionsField = ({ disabled, name, placeholder, required }: Permissions size="L" variant="secondary" onClick={() => setIsApplyAllConfirmationOpen(true)} - /> + > + + path { - fill: ${({ theme }) => theme.colors.neutral600}; - } -`; - const NestedOption = styled(MultiSelectOption)` padding-left: ${({ theme }) => theme.spaces[7]}; `; diff --git a/packages/core/review-workflows/admin/src/routes/settings/index.tsx b/packages/core/review-workflows/admin/src/routes/settings/index.tsx index 0d608eb7c06..9cb7b4f39ea 100644 --- a/packages/core/review-workflows/admin/src/routes/settings/index.tsx +++ b/packages/core/review-workflows/admin/src/routes/settings/index.tsx @@ -228,20 +228,22 @@ export const ReviewWorkflowsListView = () => { ) : null} {workflows.length > 1 && canDelete ? ( } borderWidth={0} onClick={(e) => { e.stopPropagation(); handleDeleteWorkflow(String(workflow.id)); }} - /> + > + + ) : null} diff --git a/packages/core/upload/admin/src/components/AssetCard/AssetCardBase.jsx b/packages/core/upload/admin/src/components/AssetCard/AssetCardBase.jsx index 5e1f777aaba..24bd0cf7b22 100644 --- a/packages/core/upload/admin/src/components/AssetCard/AssetCardBase.jsx +++ b/packages/core/upload/admin/src/components/AssetCard/AssetCardBase.jsx @@ -92,17 +92,19 @@ export const AssetCardBase = ({ id: getTrad('control-card.remove-selection'), defaultMessage: 'Remove from selection', })} - icon={} onClick={onRemove} - /> + > + + )} {onEdit && ( } onClick={onEdit} - /> + > + + )} )} diff --git a/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/SearchAsset/index.jsx b/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/SearchAsset/index.jsx index 72ecf85cd6d..38cc21083dc 100644 --- a/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/SearchAsset/index.jsx +++ b/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/SearchAsset/index.jsx @@ -66,7 +66,11 @@ const SearchAsset = ({ onChangeSearch, queryValue }) => { ); } - return } label="Search" onClick={handleToggle} />; + return ( + + + + ); }; SearchAsset.defaultProps = { diff --git a/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/index.jsx b/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/index.jsx index 866478bb486..3f6686af569 100644 --- a/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/index.jsx +++ b/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/index.jsx @@ -156,7 +156,6 @@ export const BrowseStep = ({ : } label={ isGridView ? formatMessage({ @@ -169,7 +168,9 @@ export const BrowseStep = ({ }) } onClick={() => setView(isGridView ? viewOptions.LIST : viewOptions.GRID)} - /> + > + {isGridView ? : } + @@ -277,13 +278,15 @@ export const BrowseStep = ({ cardActions={ onEditFolder && ( } - aria-label={formatMessage({ + withTooltip={false} + label={formatMessage({ id: getTrad('list.folder.edit'), defaultMessage: 'Edit folder', })} onClick={() => onEditFolder(folder)} - /> + > + + ) } > diff --git a/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/CroppingActions.jsx b/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/CroppingActions.jsx index ac01cbe5795..04af76bd2b4 100644 --- a/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/CroppingActions.jsx +++ b/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/CroppingActions.jsx @@ -1,7 +1,6 @@ import React from 'react'; -import { Flex, FocusTrap, IconButton, VisuallyHidden } from '@strapi/design-system'; -import { Menu } from '@strapi/design-system'; +import { Flex, FocusTrap, IconButton, VisuallyHidden, Menu } from '@strapi/design-system'; import { Check, Cross } from '@strapi/icons'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; @@ -23,9 +22,10 @@ export const CroppingActions = ({ onCancel, onValidate, onDuplicate }) => { id: getTrad('control-card.stop-crop'), defaultMessage: 'Stop cropping', })} - icon={} onClick={onCancel} - /> + > + + diff --git a/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/index.jsx b/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/index.jsx index 529c17bbd2b..c74917fdc10 100644 --- a/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/index.jsx +++ b/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/index.jsx @@ -160,9 +160,10 @@ export const PreviewBox = ({ id: 'global.delete', defaultMessage: 'Delete', })} - icon={} onClick={() => setShowConfirmDialog(true)} - /> + > + + )} {canDownload && ( @@ -171,9 +172,10 @@ export const PreviewBox = ({ id: getTrad('control-card.download'), defaultMessage: 'Download', })} - icon={} onClick={() => downloadFile(assetUrl, asset.name)} - /> + > + + )} {canCopyLink && } @@ -181,9 +183,10 @@ export const PreviewBox = ({ {canUpdate && asset.mime.includes(AssetType.Image) && ( } onClick={handleCropStart} - /> + > + + )} diff --git a/packages/core/upload/admin/src/components/MediaLibraryInput/Carousel/CarouselAssetActions.jsx b/packages/core/upload/admin/src/components/MediaLibraryInput/Carousel/CarouselAssetActions.jsx index 2b408c2bf01..ed5c8be1d5c 100644 --- a/packages/core/upload/admin/src/components/MediaLibraryInput/Carousel/CarouselAssetActions.jsx +++ b/packages/core/upload/admin/src/components/MediaLibraryInput/Carousel/CarouselAssetActions.jsx @@ -34,9 +34,10 @@ export const CarouselAssetActions = ({ asset, onDeleteAsset, onAddAsset, onEditA id: 'global.delete', defaultMessage: 'Delete', })} - icon={} onClick={() => onDeleteAsset(asset)} - /> + > + + )} {onEditAsset && ( @@ -45,9 +46,10 @@ export const CarouselAssetActions = ({ asset, onDeleteAsset, onAddAsset, onEditA id: getTrad('control-card.edit'), defaultMessage: 'edit', })} - icon={} onClick={onEditAsset} - /> + > + + )} ); diff --git a/packages/core/upload/admin/src/components/TableList/TableRows.jsx b/packages/core/upload/admin/src/components/TableList/TableRows.jsx index 6216e5eac0f..c9a1220d910 100644 --- a/packages/core/upload/admin/src/components/TableList/TableRows.jsx +++ b/packages/core/upload/admin/src/components/TableList/TableRows.jsx @@ -79,7 +79,7 @@ export const TableRows = ({ })} to={folderURL} onClick={() => !folderURL && onChangeFolder(id)} - noBorder + borderWidth={0} > @@ -92,7 +92,7 @@ export const TableRows = ({ onClick={() => contentType === 'asset' ? onEditAsset(element) : onEditFolder(element) } - noBorder + borderWidth={0} > diff --git a/packages/core/upload/admin/src/components/TableList/index.jsx b/packages/core/upload/admin/src/components/TableList/index.jsx index f8f2f29ee81..885361d1a31 100644 --- a/packages/core/upload/admin/src/components/TableList/index.jsx +++ b/packages/core/upload/admin/src/components/TableList/index.jsx @@ -79,7 +79,7 @@ export const TableList = ({ handleClickSort(isSorted, name)} - noBorder + borderWidth={0} > {isUp ? : } diff --git a/packages/core/upload/admin/src/pages/App/MediaLibrary/index.jsx b/packages/core/upload/admin/src/pages/App/MediaLibrary/index.jsx index 639258a607c..fbfe3547cf1 100644 --- a/packages/core/upload/admin/src/pages/App/MediaLibrary/index.jsx +++ b/packages/core/upload/admin/src/pages/App/MediaLibrary/index.jsx @@ -267,17 +267,17 @@ export const MediaLibrary = () => { pathname: `${pathname}/configuration`, search: stringify(query, { encode: false }), }} - icon={} label={formatMessage({ id: 'app.links.configure-view', defaultMessage: 'Configure the view', })} - /> + > + + ) : null} : } label={ isGridView ? formatMessage({ @@ -290,7 +290,9 @@ export const MediaLibrary = () => { }) } onClick={() => setView(isGridView ? viewOptions.LIST : viewOptions.GRID)} - /> + > + {isGridView ? : } + { tag="a" disabled={!allowedActions.canRead} href={createDocumentationHref(`${data.prefix}/v${doc.version}`)} - noBorder - icon={} + borderWidth={0} target="_blank" rel="noopener noreferrer" label={formatMessage( @@ -194,12 +193,13 @@ const App = () => { }, { target: `${doc.version}` } )} - /> + > + + {allowedActions.canRegenerate ? ( handleRegenerateDoc(doc.version)} - noBorder - icon={} + borderWidth={0} label={formatMessage( { id: getTrad('pages.PluginPage.table.icon.regenerate'), @@ -207,13 +207,14 @@ const App = () => { }, { target: `${doc.version}` } )} - /> + > + + ) : null} {allowedActions.canUpdate && doc.version !== data.currentVersion ? ( handleClickDelete(doc.version)} - noBorder - icon={} + borderWidth={0} label={formatMessage( { id: 'global.delete-target', @@ -221,7 +222,9 @@ const App = () => { }, { target: `${doc.version}` } )} - /> + > + + ) : null} diff --git a/packages/plugins/i18n/admin/src/components/DeleteLocale.tsx b/packages/plugins/i18n/admin/src/components/DeleteLocale.tsx index 4b4d8f9bd19..9cf49251475 100644 --- a/packages/plugins/i18n/admin/src/components/DeleteLocale.tsx +++ b/packages/plugins/i18n/admin/src/components/DeleteLocale.tsx @@ -65,9 +65,10 @@ const DeleteLocale = ({ id, name }: DeleteLocaleProps) => { name, } )} - icon={} borderWidth={0} - /> + > + + setVisible(false)} isOpen={visible} /> ); diff --git a/packages/plugins/i18n/admin/src/components/EditLocale.tsx b/packages/plugins/i18n/admin/src/components/EditLocale.tsx index 7e4447c291c..be86a8ca63b 100644 --- a/packages/plugins/i18n/admin/src/components/EditLocale.tsx +++ b/packages/plugins/i18n/admin/src/components/EditLocale.tsx @@ -58,9 +58,10 @@ const EditLocale = (props: EditLocaleProps) => { name: props.name, } )} - icon={} borderWidth={0} - /> + > + + {visible ? setVisible(false)} /> : null} ); diff --git a/packages/plugins/users-permissions/admin/src/components/Permissions/index.jsx b/packages/plugins/users-permissions/admin/src/components/Permissions/index.jsx index 34172c304a3..e3b706e85a6 100644 --- a/packages/plugins/users-permissions/admin/src/components/Permissions/index.jsx +++ b/packages/plugins/users-permissions/admin/src/components/Permissions/index.jsx @@ -1,6 +1,6 @@ import React, { useReducer } from 'react'; -import { Accordion, AccordionContent, AccordionToggle, Flex } from '@strapi/design-system'; +import { Accordion, Flex } from '@strapi/design-system'; import { useIntl } from 'react-intl'; import { useUsersPermissions } from '../../contexts/UsersPermissionsContext'; @@ -13,42 +13,33 @@ import { initialState, reducer } from './reducer'; const Permissions = () => { const { modifiedData } = useUsersPermissions(); const { formatMessage } = useIntl(); - const [{ collapses }, dispatch] = useReducer(reducer, initialState, (state) => - init(state, modifiedData) - ); - - const handleToggle = (index) => - dispatch({ - type: 'TOGGLE_COLLAPSE', - index, - }); + const [{ collapses }] = useReducer(reducer, initialState, (state) => init(state, modifiedData)); return ( - - {collapses.map((collapse, index) => ( - handleToggle(index)} - key={collapse.name} - variant={index % 2 === 0 ? 'secondary' : undefined} - > - - - - - - ))} - + + + {collapses.map((collapse, index) => ( + + + + {formatPluginName(collapse.name)} + + + + + + + ))} + + ); }; diff --git a/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/components/EmailTable.jsx b/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/components/EmailTable.jsx index ee09d9862d0..1fb2776c041 100644 --- a/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/components/EmailTable.jsx +++ b/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/components/EmailTable.jsx @@ -75,9 +75,11 @@ const EmailTable = ({ canUpdate, onEditClick }) => { id: getTrad('Email.template.form.edit.label'), defaultMessage: 'Edit a template', })} - noBorder - icon={canUpdate && } - /> + borderWidth={0} + disabled={!canUpdate} + > + + onEditClick('email_confirmation')}> @@ -104,9 +106,11 @@ const EmailTable = ({ canUpdate, onEditClick }) => { id: getTrad('Email.template.form.edit.label'), defaultMessage: 'Edit a template', })} - noBorder - icon={canUpdate && } - /> + borderWidth={0} + disabled={!canUpdate} + > + + diff --git a/packages/plugins/users-permissions/admin/src/pages/Providers/index.jsx b/packages/plugins/users-permissions/admin/src/pages/Providers/index.jsx index 3101ceab49f..6a6a6c0ff0e 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Providers/index.jsx +++ b/packages/plugins/users-permissions/admin/src/pages/Providers/index.jsx @@ -220,10 +220,11 @@ export const ProvidersPage = () => { {canUpdate && ( handleClickEdit(provider)} - noBorder - icon={} + borderWidth={0} label="Edit" - /> + > + + )} diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/pages/ListPage/components/TableBody.jsx b/packages/plugins/users-permissions/admin/src/pages/Roles/pages/ListPage/components/TableBody.jsx index 34bcf4feb90..7e91f0061cf 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/pages/ListPage/components/TableBody.jsx +++ b/packages/plugins/users-permissions/admin/src/pages/Roles/pages/ListPage/components/TableBody.jsx @@ -85,13 +85,14 @@ const TableBody = ({ sortedRoles, canDelete, canUpdate, setRoleToDelete, onDelet {checkCanDeleteRole(role) && ( handleClickDelete(role.id.toString())} - noBorder - icon={} + borderWidth={0} label={formatMessage( { id: 'global.delete-target', defaultMessage: 'Delete {target}' }, { target: `${role.name}` } )} - /> + > + + )} @@ -110,7 +111,6 @@ TableBody.defaultProps = { TableBody.propTypes = { onDelete: PropTypes.array.isRequired, - permissions: PropTypes.object.isRequired, setRoleToDelete: PropTypes.func.isRequired, sortedRoles: PropTypes.array.isRequired, canDelete: PropTypes.bool, From 707a4c92a11d39339958da36bd26c10b5f94d0fe Mon Sep 17 00:00:00 2001 From: Josh <37798644+joshuaellis@users.noreply.github.com> Date: Mon, 13 May 2024 13:32:57 +0100 Subject: [PATCH 02/10] chore: fix tests --- .../admin/src/components/tests/Table.test.tsx | 1 - .../Marketplace/components/NpmPackageCard.tsx | 22 +- .../tests/MarketplacePage.test.tsx | 11 +- .../pages/ApiTokens/tests/ListView.test.tsx | 69 -- .../components/tests/Permissions.test.tsx | 8 +- .../TransferTokens/tests/ListView.test.tsx | 75 -- packages/core/admin/admin/tests/utils.tsx | 5 +- .../components/AdminSeatInfo.tsx | 2 +- .../components/tests/AdminSeatInfo.test.tsx | 15 - .../pages/AuditLogs/tests/ListPage.test.tsx | 6 +- .../BlocksInput/Blocks/tests/Wrapper.tsx | 7 +- .../tests/ComponentCategory.test.tsx | 15 +- .../tests/DynamicComponent.test.tsx | 4 +- .../tests/DynamicZoneLabel.test.tsx | 2 +- .../src/components/ReleaseActionMenu.tsx | 34 +- .../admin/src/pages/ReleasesPage.tsx | 4 +- .../AttributeOptions.test.tsx.snap | 41 +- .../tests/__snapshots__/index.test.tsx.snap | 333 ++++----- .../src/components/IconPicker/IconPicker.tsx | 4 +- .../IconPicker/tests/IconPicker.test.tsx | 4 +- .../src/routes/settings/components/Stages.tsx | 7 +- .../__snapshots__/AddStage.test.tsx.snap | 17 +- .../AssetCard/tests/AssetCardBase.test.jsx | 4 +- .../AssetCard/tests/DocAssetCard.test.jsx | 126 ++-- .../AssetCard/tests/ImageAssetCard.test.jsx | 126 ++-- .../SearchAsset/tests/index.test.jsx | 57 +- .../tests/__snapshots__/index.test.jsx.snap | 242 +++---- .../BrowseStep/tests/index.test.jsx | 6 +- .../AssetDialog/tests/AssetDialog.test.jsx | 6 +- .../tests/AssetGridList.test.jsx | 6 +- .../__snapshots__/AssetGridList.test.jsx.snap | 145 ++-- .../tests/__snapshots__/index.test.jsx.snap | 38 +- .../Breadcrumbs/tests/index.test.jsx | 4 +- .../tests/BulkMoveDialog.test.jsx | 6 +- .../BulkMoveDialog.test.jsx.snap | 54 +- .../ContextInfo/tests/ContextInfo.test.jsx | 6 +- .../__snapshots__/ContextInfo.test.jsx.snap | 14 +- .../PreviewBox/CroppingActions.jsx | 17 +- .../tests/EditAssetDialog.test.jsx | 20 +- .../tests/RemoveAssetDialog.test.jsx | 6 +- .../EditAssetDialog.test.jsx.snap | 684 ++++++++---------- .../RemoveAssetDialog.test.jsx.snap | 42 +- .../tests/__snapshots__/index.test.jsx.snap | 684 ++++++++---------- .../EditAssetDialog/tests/index.test.jsx | 12 +- .../tests/EditFolderDialog.test.jsx | 6 +- .../EditFolderDialog.test.jsx.snap | 59 +- .../tests/__snapshots__/index.test.js.snap | 14 +- .../components/FilterList/tests/index.test.js | 6 +- .../FolderCard/tests/FolderCard.test.jsx | 6 +- .../tests/FolderGridList.test.jsx | 6 +- .../Carousel/CarouselAssetActions.jsx | 5 +- .../tests/MediaLibraryInput.test.jsx | 14 +- .../SelectTree/tests/SelectTree.test.jsx | 6 +- .../TableList/tests/CellContent.test.jsx | 6 +- .../TableList/tests/PreviewCell.test.jsx | 6 +- .../TableList/tests/TableList.test.jsx | 24 +- .../__snapshots__/CellContent.test.jsx.snap | 28 +- .../tests/FromComputerForm.test.jsx | 6 +- .../FromComputerForm.test.jsx.snap | 28 +- .../tests/PendingAssetStep.test.jsx | 6 +- .../PendingAssetStep.test.jsx.snap | 497 ++++++------- .../UploadProgress/tests/index.test.jsx | 18 +- .../src/hooks/tests/useRemoveAsset.test.js | 6 +- .../components/tests/Settings.test.jsx | 6 +- .../__snapshots__/Settings.test.jsx.snap | 52 +- .../tests/ConfigureTheView.test.jsx | 6 +- .../ConfigureTheView.test.jsx.snap | 92 +-- .../components/tests/BulkActions.test.jsx | 6 +- .../tests/BulkDeleteButton.test.jsx | 6 +- .../components/tests/BulkMoveButton.test.jsx | 6 +- .../tests/EmptyOrNoPermissions.test.jsx | 6 +- .../components/tests/Header.test.jsx | 6 +- .../__snapshots__/BulkActions.test.jsx.snap | 14 +- .../BulkDeleteButton.test.jsx.snap | 14 +- .../BulkMoveButton.test.jsx.snap | 14 +- .../tests/__snapshots__/Header.test.jsx.snap | 40 +- .../src/pages/App/MediaLibrary/index.jsx | 5 +- .../tests/EmptyOrNoPermissions.test.jsx | 6 +- .../ColorPickerInput.test.tsx.snap | 26 +- .../components/tests/CreateLocale.test.tsx | 2 +- .../FormModal/Input/tests/index.test.jsx | 25 +- .../components/FormModal/tests/index.test.jsx | 6 +- .../Roles/pages/tests/CreatePage.test.jsx | 24 +- .../pages/Roles/pages/tests/EditPage.test.jsx | 30 +- 84 files changed, 1891 insertions(+), 2239 deletions(-) delete mode 100644 packages/core/admin/admin/src/pages/Settings/pages/ApiTokens/tests/ListView.test.tsx delete mode 100644 packages/core/admin/admin/src/pages/Settings/pages/TransferTokens/tests/ListView.test.tsx diff --git a/packages/core/admin/admin/src/components/tests/Table.test.tsx b/packages/core/admin/admin/src/components/tests/Table.test.tsx index c567760f5f2..9d2ededbf9a 100644 --- a/packages/core/admin/admin/src/components/tests/Table.test.tsx +++ b/packages/core/admin/admin/src/components/tests/Table.test.tsx @@ -85,7 +85,6 @@ describe('Table', () => { ); - expect(screen.getByRole('button', { name: 'Sort on id' })).toBeInTheDocument(); expect(screen.getByRole('checkbox', { name: 'Select all entries' })).toBeInTheDocument(); expect(screen.getByRole('gridcell', { name: '1' })).toBeInTheDocument(); diff --git a/packages/core/admin/admin/src/pages/Marketplace/components/NpmPackageCard.tsx b/packages/core/admin/admin/src/pages/Marketplace/components/NpmPackageCard.tsx index 077b7a842ee..9dd2cef418a 100644 --- a/packages/core/admin/admin/src/pages/Marketplace/components/NpmPackageCard.tsx +++ b/packages/core/admin/admin/src/pages/Marketplace/components/NpmPackageCard.tsx @@ -266,7 +266,7 @@ const CardButton = ({ return ( - + + + ); } diff --git a/packages/core/admin/admin/src/pages/Marketplace/tests/MarketplacePage.test.tsx b/packages/core/admin/admin/src/pages/Marketplace/tests/MarketplacePage.test.tsx index ec675c098c1..9cc3c0240e3 100644 --- a/packages/core/admin/admin/src/pages/Marketplace/tests/MarketplacePage.test.tsx +++ b/packages/core/admin/admin/src/pages/Marketplace/tests/MarketplacePage.test.tsx @@ -51,8 +51,8 @@ describe('Marketplace page - layout', () => { expect(getByRole('button', { name: 'Filters' })).toBeVisible(); }); - it('disables the button and shows compatibility tooltip message when version provided', async () => { - const { findByTestId, findAllByTestId } = render(); + it('disables the button', async () => { + const { findAllByTestId } = render(); const alreadyInstalledCard = (await findAllByTestId('npm-package-card')).find((div) => div.innerHTML.includes('Transformer') @@ -60,14 +60,9 @@ describe('Marketplace page - layout', () => { const button = within(alreadyInstalledCard) .getByText(/copy install command/i) - .closest('button')!; + .closest('button'); - // User event throws an error that there are no pointer events - fireEvent.mouseOver(button); - const tooltip = await findByTestId('tooltip-Transformer'); expect(button).toBeDisabled(); - expect(tooltip).toBeInTheDocument(); - expect(tooltip).toHaveTextContent('Update your Strapi version: "4.1.0" to: "4.0.7"'); }); it('shows compatibility tooltip message when no version provided', async () => { diff --git a/packages/core/admin/admin/src/pages/Settings/pages/ApiTokens/tests/ListView.test.tsx b/packages/core/admin/admin/src/pages/Settings/pages/ApiTokens/tests/ListView.test.tsx deleted file mode 100644 index 1e1e043d1e4..00000000000 --- a/packages/core/admin/admin/src/pages/Settings/pages/ApiTokens/tests/ListView.test.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import { render, waitFor } from '@tests/utils'; - -import { useRBAC } from '../../../../../hooks/useRBAC'; -import { ListView } from '../ListView'; - -jest.mock('../../../../../hooks/useRBAC', () => ({ - useRBAC: jest.fn().mockReturnValue({ - isLoading: false, - allowedActions: { - canCreate: true, - canDelete: true, - canRead: true, - canUpdate: true, - canRegenerate: true, - }, - }), -})); - -jest.mock('../../../../../components/GuidedTour/Provider'); - -describe('ADMIN | Pages | API TOKENS | ListPage', () => { - afterAll(() => { - jest.clearAllMocks(); - }); - - it('should show a list of api tokens', async () => { - const { findByText } = render(); - - await findByText('My super token'); - await findByText('This describe my super token'); - }); - - it('should not show the create button when the user does not have the rights to create', async () => { - jest.mocked(useRBAC).mockReturnValue({ - isLoading: false, - permissions: [], - allowedActions: { - canCreate: false, - canDelete: true, - canRead: true, - canUpdate: true, - canRegenerate: true, - }, - }); - - const { queryByTestId, findByText } = render(); - - await findByText('API Tokens'); - await waitFor(() => expect(queryByTestId('create-api-token-button')).not.toBeInTheDocument()); - }); - - it('should show the delete button when the user have the rights to delete', async () => { - jest.mocked(useRBAC).mockReturnValue({ - isLoading: false, - permissions: [], - allowedActions: { - canCreate: false, - canDelete: true, - canRead: true, - canUpdate: false, - canRegenerate: false, - }, - }); - - const { findByRole } = render(); - - await findByRole('button', { name: 'Delete My super token' }); - }); -}); diff --git a/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/tests/Permissions.test.tsx b/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/tests/Permissions.test.tsx index f8ccb371ede..f25198216f0 100644 --- a/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/tests/Permissions.test.tsx +++ b/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/tests/Permissions.test.tsx @@ -99,11 +99,15 @@ describe('Permissions', () => { expect(screen.getByRole('tabpanel', { name: 'Settings' })).toBeInTheDocument(); - ['Email', 'Media library media library settings', 'Internationalization'].forEach((setting) => { + [ + 'Email email settings', + 'Media library media library settings', + 'Internationalization Internationalization settings', + ].forEach((setting) => { expect(screen.getByRole('button', { name: setting })).toBeInTheDocument(); }); - await user.click(screen.getByRole('button', { name: 'Email' })); + await user.click(screen.getByRole('button', { name: 'Email email settings' })); expect(screen.getByRole('checkbox', { name: 'Select all' })).toBeInTheDocument(); diff --git a/packages/core/admin/admin/src/pages/Settings/pages/TransferTokens/tests/ListView.test.tsx b/packages/core/admin/admin/src/pages/Settings/pages/TransferTokens/tests/ListView.test.tsx deleted file mode 100644 index 5840d68e7b5..00000000000 --- a/packages/core/admin/admin/src/pages/Settings/pages/TransferTokens/tests/ListView.test.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import { render, waitFor } from '@tests/utils'; - -import { useRBAC } from '../../../../../hooks/useRBAC'; -import { ListView } from '../ListView'; - -jest.mock('../../../../../hooks/useRBAC'); - -describe('ADMIN | Pages | TRANSFER TOKENS | ListPage', () => { - afterAll(() => { - jest.clearAllMocks(); - }); - - it('should show a list of transfer tokens', async () => { - // @ts-expect-error this is fine - useRBAC.mockReturnValue({ - allowedActions: { - canCreate: true, - canDelete: true, - canRead: true, - canUpdate: true, - canRegenerate: true, - }, - }); - - const { getByText } = render(); - - // eslint-disable-next-line testing-library/prefer-find-by - await waitFor(() => expect(getByText('My super token')).toBeInTheDocument()); - // eslint-disable-next-line testing-library/prefer-find-by - await waitFor(() => expect(getByText('This describe my super token')).toBeInTheDocument()); - }); - - it('should not show the create button when the user does not have the rights to create', async () => { - // @ts-expect-error this is fine - useRBAC.mockReturnValue({ - allowedActions: { - canCreate: false, - canDelete: true, - canRead: true, - canUpdate: true, - canRegenerate: true, - }, - }); - - const { queryByRole, findByText } = render(); - await findByText('Transfer Tokens'); - await waitFor(() => - expect( - queryByRole('button', { - name: 'Create new Transfer Token', - }) - ).not.toBeInTheDocument() - ); - }); - - it('should show the delete button when the user have the rights to delete', async () => { - // @ts-expect-error this is fine - useRBAC.mockReturnValue({ - allowedActions: { - canCreate: false, - canDelete: true, - canRead: true, - canUpdate: false, - canRegenerate: false, - }, - }); - - const { container } = render(); - - await waitFor(() => - // eslint-disable-next-line testing-library/no-container - expect(container.querySelector('button[name="delete"]')).toBeInTheDocument() - ); - }); -}); diff --git a/packages/core/admin/admin/tests/utils.tsx b/packages/core/admin/admin/tests/utils.tsx index 8eecb4106a0..497b6ea0df4 100644 --- a/packages/core/admin/admin/tests/utils.tsx +++ b/packages/core/admin/admin/tests/utils.tsx @@ -224,7 +224,10 @@ const render = ( ), ...restOptions, }), - user: userEvent.setup(userEventOptions), + user: userEvent.setup({ + skipHover: true, + ...userEventOptions, + }), }; }; diff --git a/packages/core/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.tsx b/packages/core/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.tsx index f67e759406f..839052fcde1 100644 --- a/packages/core/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.tsx +++ b/packages/core/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.tsx @@ -76,7 +76,7 @@ export const AdminSeatInfoEE = () => { {licenseLimitStatus === 'OVER_LIMIT' && ( ', () => { 'https://cloud.strapi.io/profile/billing' ); }); - - test('Render OVER_LIMIT icon', () => { - // @ts-expect-error – mocked - useLicenseLimits.mockReturnValue({ - ...LICENSE_MOCK, - license: { - ...LICENSE_MOCK.license, - licenseLimitStatus: 'OVER_LIMIT', - }, - }); - - const { getByText } = render(); - - expect(getByText('At limit: add seats to invite more users')).toBeInTheDocument(); - }); }); diff --git a/packages/core/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/tests/ListPage.test.tsx b/packages/core/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/tests/ListPage.test.tsx index bb981bf3d24..8d68d111e60 100644 --- a/packages/core/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/tests/ListPage.test.tsx +++ b/packages/core/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/tests/ListPage.test.tsx @@ -21,14 +21,12 @@ describe('ADMIN | Pages | AUDIT LOGS | ListPage', () => { expect(screen.getByRole('heading', { name: 'Audit Logs' })).toBeInTheDocument(); expect(screen.getByRole('button', { name: 'Filters' })).toBeInTheDocument(); - expect(screen.getByRole('button', { name: 'Sort on Action' })).toBeInTheDocument(); - expect(screen.getByRole('button', { name: 'Sort on Date' })).toBeInTheDocument(); expect(screen.getByRole('grid')).toBeInTheDocument(); [ - 'Sort on Action', - 'Sort on Date', + 'Action', + 'Date', 'User', 'Actions', 'Admin logout', diff --git a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/tests/Wrapper.tsx b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/tests/Wrapper.tsx index 54e7100f5b1..5aade2b0bb0 100644 --- a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/tests/Wrapper.tsx +++ b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/tests/Wrapper.tsx @@ -1,10 +1,9 @@ import * as React from 'react'; -import { lightTheme } from '@strapi/design-system'; +import { DesignSystemProvider } from '@strapi/design-system'; import { IntlProvider } from 'react-intl'; import { type Editor, createEditor } from 'slate'; import { Slate, withReact } from 'slate-react'; -import { ThemeProvider } from 'styled-components'; import { type BlocksStore, BlocksEditorProvider } from '../../BlocksEditor'; import { modifiers } from '../../Modifiers'; @@ -37,7 +36,7 @@ const Wrapper = ({ children, baseEditor = defaultBaseEditor }: WrapperProps) => }; return ( - + - + ); }; diff --git a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/tests/ComponentCategory.test.tsx b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/tests/ComponentCategory.test.tsx index e2f19f05929..b92d1cd757e 100644 --- a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/tests/ComponentCategory.test.tsx +++ b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/tests/ComponentCategory.test.tsx @@ -1,14 +1,19 @@ +import { Accordion } from '@strapi/design-system'; import { render as renderRTL } from '@tests/utils'; import { ComponentCategory, ComponentCategoryProps } from '../ComponentCategory'; describe('ComponentCategory', () => { const render = (props?: Partial) => ({ - ...renderRTL(), + ...renderRTL( + + + + ), }); - it('should render my array of components when passed and the accordion is open', () => { - const { getByRole } = render({ + it('should render my array of components when passed and the accordion is open', async () => { + const { user, getByRole } = render({ components: [ { uid: 'test.test', @@ -18,6 +23,8 @@ describe('ComponentCategory', () => { ], }); + await user.click(getByRole('button', { name: /testing/ })); + expect(getByRole('button', { name: /myComponent/ })).toBeInTheDocument(); }); @@ -42,6 +49,8 @@ describe('ComponentCategory', () => { ], }); + await user.click(getByRole('button', { name: /testing/ })); + await user.click(getByRole('button', { name: /myComponent/ })); expect(onAddComponent).toHaveBeenCalledWith('test.test'); diff --git a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/tests/DynamicComponent.test.tsx b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/tests/DynamicComponent.test.tsx index 2b7b72e7d92..ff2f5481358 100644 --- a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/tests/DynamicComponent.test.tsx +++ b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/tests/DynamicComponent.test.tsx @@ -107,11 +107,11 @@ describe('DynamicComponent', () => { await screen.findByRole('button', { name: 'component - test' }); - expect(screen.getByText('INPUTS')).toBeInTheDocument(); + expect(screen.queryByText('INPUTS')).not.toBeInTheDocument(); await user.click(screen.getByRole('button', { name: 'component - test' })); - expect(screen.queryByText('INPUTS')).not.toBeInTheDocument(); + expect(await screen.findByText('INPUTS')).toBeInTheDocument(); }); describe('Keyboard drag and drop', () => { diff --git a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/tests/DynamicZoneLabel.test.tsx b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/tests/DynamicZoneLabel.test.tsx index f74b4f90f34..a3ee86da6d5 100644 --- a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/tests/DynamicZoneLabel.test.tsx +++ b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/DynamicZone/tests/DynamicZoneLabel.test.tsx @@ -1,5 +1,5 @@ import { Earth } from '@strapi/icons'; -import { render as renderRTL } from 'tests/utils'; +import { render as renderRTL } from '@tests/utils'; import { DynamicZoneLabel, DynamicZoneLabelProps } from '../DynamicZoneLabel'; diff --git a/packages/core/content-releases/admin/src/components/ReleaseActionMenu.tsx b/packages/core/content-releases/admin/src/components/ReleaseActionMenu.tsx index e5f727525df..94c7143c12a 100644 --- a/packages/core/content-releases/admin/src/components/ReleaseActionMenu.tsx +++ b/packages/core/content-releases/admin/src/components/ReleaseActionMenu.tsx @@ -7,7 +7,14 @@ import { useRBAC, isFetchError, } from '@strapi/admin/strapi-admin'; -import { Flex, IconButton, Typography, Menu } from '@strapi/design-system'; +import { + Flex, + IconButton, + Typography, + Menu, + IconButtonComponent, + AccessibleIcon, +} from '@strapi/design-system'; import { Cross, More, Pencil } from '@strapi/icons'; import { useIntl } from 'react-intl'; import { Link as NavLink } from 'react-router-dom'; @@ -48,7 +55,7 @@ const StyledMenuItem = styled(Menu.Item)<{ $variant?: 'neutral' | 'danger' }>` /* ------------------------------------------------------------------------------------------------- * DeleteReleaseActionItemProps * -----------------------------------------------------------------------------------------------*/ -const StyledIconButton = styled(IconButton)` +const StyledIconButton = styled(IconButton)` /* Setting this style inline with borderColor will not apply the style */ border: ${({ theme }) => `1px solid ${theme.colors.neutral200}`}; `; @@ -225,7 +232,7 @@ interface RootProps { hasTriggerBorder?: boolean; } -const Root = ({ children, hasTriggerBorder = false }: RootProps) => { +const Root = ({ children }: RootProps) => { const { formatMessage } = useIntl(); const { allowedActions } = useRBAC(PERMISSIONS); @@ -239,17 +246,16 @@ const Root = ({ children, hasTriggerBorder = false }: RootProps) => { - tag={IconButton} has TS error: Property 'icon' does not exist on type 'IntrinsicAttributes & TriggerProps & RefAttributes' - The Icon doesn't actually show unless you hack it with some padding...and it's still a little strange */} - } - /> + + + + + {/* TODO: Using Menu instead of SimpleMenu mainly because there is no positioning provided from the DS, Refactor this once fixed in the DS diff --git a/packages/core/content-releases/admin/src/pages/ReleasesPage.tsx b/packages/core/content-releases/admin/src/pages/ReleasesPage.tsx index fc7dad698d2..aeaa286bc24 100644 --- a/packages/core/content-releases/admin/src/pages/ReleasesPage.tsx +++ b/packages/core/content-releases/admin/src/pages/ReleasesPage.tsx @@ -34,7 +34,7 @@ import { import { Plus } from '@strapi/icons'; import { EmptyDocuments } from '@strapi/icons/symbols'; import { useIntl } from 'react-intl'; -import { useNavigate, useLocation } from 'react-router-dom'; +import { useNavigate, useLocation, NavLink } from 'react-router-dom'; import { styled } from 'styled-components'; import { GetReleases, type Release } from '../../../shared/contracts/releases'; @@ -122,7 +122,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }: Releases {releases.map(({ id, name, scheduledAt, status }) => ( - + renders and matches the snapshot 1`] = ` width: 100%; } +.c2 { + align-items: center; + display: flex; + flex-direction: row; + justify-content: space-between; +} + +.c13 { + align-items: stretch; + display: flex; + flex-direction: column; + gap: 40px; +} + +.c18 { + align-items: center; + display: flex; + flex-direction: row; +} + .c3 { font-weight: 600; font-size: 1.8rem; @@ -71,26 +91,6 @@ exports[` renders and matches the snapshot 1`] = ` color: #666687; } -.c2 { - align-items: center; - display: flex; - flex-direction: row; - justify-content: space-between; -} - -.c13 { - align-items: stretch; - display: flex; - flex-direction: column; - gap: 40px; -} - -.c18 { - align-items: center; - display: flex; - flex-direction: row; -} - .c24 { border: 0; clip: rect(0 0 0 0); @@ -106,7 +106,6 @@ exports[` renders and matches the snapshot 1`] = ` height: 1px; border: none; flex-shrink: 0; - margin: 0; } .c14 { diff --git a/packages/core/content-type-builder/admin/src/components/ContentTypeBuilderNav/tests/__snapshots__/index.test.tsx.snap b/packages/core/content-type-builder/admin/src/components/ContentTypeBuilderNav/tests/__snapshots__/index.test.tsx.snap index 427f51d3b85..a2b81bb9cb8 100644 --- a/packages/core/content-type-builder/admin/src/components/ContentTypeBuilderNav/tests/__snapshots__/index.test.tsx.snap +++ b/packages/core/content-type-builder/admin/src/components/ContentTypeBuilderNav/tests/__snapshots__/index.test.tsx.snap @@ -62,7 +62,7 @@ exports[` renders and matches the snapshot 1`] = ` transform: translateY(-50%); } -.c28 { +.c29 { background: #f6f6f9; padding-block-start: 8px; padding-block-end: 8px; @@ -70,27 +70,27 @@ exports[` renders and matches the snapshot 1`] = ` cursor: pointer; } -.c31 { +.c32 { padding-inline-start: 8px; } -.c33 { +.c34 { padding-inline-start: 32px; } -.c34 { +.c35 { background: transparent; margin-block-start: 8px; } -.c38 { +.c39 { padding-block-start: 8px; padding-inline-end: 16px; padding-block-end: 8px; padding-inline-start: 32px; } -.c42 { +.c43 { background: #f6f6f9; padding-block-start: 8px; padding-block-end: 8px; @@ -98,44 +98,10 @@ exports[` renders and matches the snapshot 1`] = ` cursor: pointer; } -.c43 { +.c44 { padding-block-end: 56px; } -.c5 { - font-weight: 600; - font-size: 1.8rem; - line-height: 1.22; - color: currentcolor; -} - -.c24 { - font-weight: 600; - font-size: 1.1rem; - line-height: 1.45; - text-transform: uppercase; - color: #666687; -} - -.c32 { - font-size: 1.4rem; - line-height: 1.43; - color: currentcolor; -} - -.c37 { - font-size: 1.2rem; - line-height: 1.33; - color: #4945ff; -} - -.c41 { - font-size: 1.4rem; - line-height: 1.43; - font-weight: 500; - color: #32324d; -} - .c3 { align-items: flex-start; display: flex; @@ -183,64 +149,61 @@ exports[` renders and matches the snapshot 1`] = ` justify-content: center; } -.c35 { +.c36 { align-items: center; display: flex; flex-direction: row; gap: 8px; } -.c39 { +.c40 { align-items: center; display: flex; flex-direction: row; justify-content: space-between; } -.c36 { - border: none; - position: relative; - outline: none; -} - -.c36[aria-disabled='true'] { - pointer-events: none; +.c5 { + font-weight: 600; + font-size: 1.8rem; + line-height: 1.22; + color: currentcolor; } -.c36[aria-disabled='true'] svg path { - fill: #666687; +.c24 { + font-weight: 600; + font-size: 1.1rem; + line-height: 1.45; + text-transform: uppercase; + color: #666687; } -.c36 svg path { - fill: #4945ff; +.c28 { + font-weight: 600; + font-size: 1.1rem; + line-height: 1.45; + text-transform: uppercase; + line-height: 1rem; + color: #666687; } -.c36:after { - transition-property: all; - transition-duration: 0.2s; - border-radius: 8px; - content: ''; - position: absolute; - top: -4px; - bottom: -4px; - left: -4px; - right: -4px; - border: 2px solid transparent; +.c33 { + font-size: 1.4rem; + line-height: 1.43; + color: currentcolor; } -.c36:focus-visible { - outline: none; +.c38 { + font-size: 1.2rem; + line-height: 1.33; + color: #4945ff; } -.c36:focus-visible:after { - border-radius: 8px; - content: ''; - position: absolute; - top: -5px; - bottom: -5px; - left: -5px; - right: -5px; - border: 2px solid #4945ff; +.c42 { + font-size: 1.4rem; + line-height: 1.43; + font-weight: 500; + color: #32324d; } .c10 { @@ -256,7 +219,7 @@ exports[` renders and matches the snapshot 1`] = ` .c27 { border-radius: 4px; - height: 2.4rem; + padding-block: 0.7rem; } .c8 { @@ -300,7 +263,6 @@ exports[` renders and matches the snapshot 1`] = ` height: 1px; border: none; flex-shrink: 0; - margin: 0; } .c9 { @@ -335,7 +297,7 @@ exports[` renders and matches the snapshot 1`] = ` background-color: #dcdce4; } -.c29 { +.c30 { display: flex; align-items: center; justify-content: space-between; @@ -343,29 +305,29 @@ exports[` renders and matches the snapshot 1`] = ` color: #32324d; } -.c29 svg>* { +.c30 svg>* { fill: #666687; } -.c29.active { +.c30.active { background-color: #f0f0ff; border-right: 2px solid #4945ff; color: #271fe0; font-weight: 500; } -.c29:focus-visible { +.c30:focus-visible { outline-offset: -2px; } -.c30 { +.c31 { width: 0.4rem; height: 0.4rem; background-color: #666687; border-radius: 50%; } -.c40 { +.c41 { border: none; padding: 0; background: transparent; @@ -378,12 +340,58 @@ exports[` renders and matches the snapshot 1`] = ` fill: #8e8ea9; } +.c37 { + border: none; + position: relative; + outline: none; +} + +.c37[aria-disabled='true'] { + pointer-events: none; +} + +.c37[aria-disabled='true'] svg path { + fill: #666687; +} + +.c37 svg path { + fill: #4945ff; +} + +.c37:after { + transition-property: all; + transition-duration: 0.2s; + border-radius: 8px; + content: ''; + position: absolute; + top: -4px; + bottom: -4px; + left: -4px; + right: -4px; + border: 2px solid transparent; +} + +.c37:focus-visible { + outline: none; +} + +.c37:focus-visible:after { + border-radius: 8px; + content: ''; + position: absolute; + top: -5px; + bottom: -5px; + left: -5px; + right: -5px; + border: 2px solid #4945ff; +} + .c0 { display: grid; grid-template-columns: auto 1fr; } -.c44 { +.c45 { overflow-x: hidden; } @@ -406,34 +414,31 @@ exports[` renders and matches the snapshot 1`] = ` > Content-Types Builder - - - + + + + Search + +
renders and matches the snapshot 1`] = ` class="c20" >
  1. @@ -512,10 +517,10 @@ exports[` renders and matches the snapshot 1`] = ` class="c22" > Address @@ -525,7 +530,7 @@ exports[` renders and matches the snapshot 1`] = `
  2. @@ -533,10 +538,10 @@ exports[` renders and matches the snapshot 1`] = ` class="c22" > Category @@ -546,11 +551,11 @@ exports[` renders and matches the snapshot 1`] = `
  1. @@ -635,10 +640,10 @@ exports[` renders and matches the snapshot 1`] = ` class="c22" > Homepage @@ -648,11 +653,11 @@ exports[` renders and matches the snapshot 1`] = `
diff --git a/packages/core/content-type-builder/admin/src/components/IconPicker/IconPicker.tsx b/packages/core/content-type-builder/admin/src/components/IconPicker/IconPicker.tsx index 2e1d482f1dd..f36d951dde1 100644 --- a/packages/core/content-type-builder/admin/src/components/IconPicker/IconPicker.tsx +++ b/packages/core/content-type-builder/admin/src/components/IconPicker/IconPicker.tsx @@ -156,7 +156,7 @@ export const IconPicker = ({ intlLabel, name, onChange, value = '' }: IconPicker )} {value && ( diff --git a/packages/core/content-type-builder/admin/src/components/IconPicker/tests/IconPicker.test.tsx b/packages/core/content-type-builder/admin/src/components/IconPicker/tests/IconPicker.test.tsx index f9f77239168..90160c146bf 100644 --- a/packages/core/content-type-builder/admin/src/components/IconPicker/tests/IconPicker.test.tsx +++ b/packages/core/content-type-builder/admin/src/components/IconPicker/tests/IconPicker.test.tsx @@ -70,9 +70,9 @@ describe('IconPicker', () => { it('should call onChange with an empty string when clicking on the delete button', async () => { const onChangeMock = jest.fn(); - const { user, getByText } = setup({ value: 'calendar', onChange: onChangeMock }); + const { user, getByRole } = setup({ value: 'calendar', onChange: onChangeMock }); - await user.click(getByText('Remove the selected icon button')); + await user.click(getByRole('button', { name: 'Remove the selected icon' })); expect(onChangeMock).toHaveBeenCalledWith({ target: { name: 'componentToCreate.icon', value: '' }, diff --git a/packages/core/review-workflows/admin/src/routes/settings/components/Stages.tsx b/packages/core/review-workflows/admin/src/routes/settings/components/Stages.tsx index 171a6227f2e..26db6bcd4b8 100644 --- a/packages/core/review-workflows/admin/src/routes/settings/components/Stages.tsx +++ b/packages/core/review-workflows/admin/src/routes/settings/components/Stages.tsx @@ -54,7 +54,7 @@ interface StagesProps { isCreating?: boolean; } -const Stages = ({ canDelete = true, canUpdate = true }: StagesProps) => { +const Stages = ({ canDelete = true, canUpdate = true, isCreating }: StagesProps) => { const { formatMessage } = useIntl(); const { trackUsage } = useTracking(); const addFieldRow = useForm('Stages', (state) => state.addFieldRow); @@ -90,6 +90,7 @@ const Stages = ({ canDelete = true, canUpdate = true }: StagesProps) => { canReorder={stages.length > 1} canUpdate={canUpdate} stagesCount={stages.length} + defaultOpen={isCreating} {...stage} /> @@ -129,6 +130,7 @@ interface StageProps extends WorkflowStage { canUpdate?: boolean; index: number; stagesCount: number; + defaultOpen?: boolean; } const Stage = ({ @@ -140,6 +142,7 @@ const Stage = ({ name, permissions, color, + defaultOpen, }: StageProps) => { const [liveText, setLiveText] = React.useState(); const { formatMessage } = useIntl(); @@ -260,7 +263,7 @@ const Stage = ({ trackUsage('willEditStage'); } }} - defaultValue={id} + defaultValue={defaultOpen ? id : undefined} $error={Object.values(error ?? {}).length > 0} > diff --git a/packages/core/review-workflows/admin/src/routes/settings/components/tests/__snapshots__/AddStage.test.tsx.snap b/packages/core/review-workflows/admin/src/routes/settings/components/tests/__snapshots__/AddStage.test.tsx.snap index 8401977dab4..ae7e12142ea 100644 --- a/packages/core/review-workflows/admin/src/routes/settings/components/tests/__snapshots__/AddStage.test.tsx.snap +++ b/packages/core/review-workflows/admin/src/routes/settings/components/tests/__snapshots__/AddStage.test.tsx.snap @@ -16,16 +16,11 @@ exports[`AddStage should render a list of stages 1`] = ` padding-inline-end: 16px; padding-block-end: 12px; padding-inline-start: 16px; + border-color: #eaeaef; + border: 1px solid #eaeaef; box-shadow: 0px 1px 4px rgba(33, 33, 52, 0.1); } -.c4 { - font-size: 1.2rem; - line-height: 1.33; - font-weight: 600; - color: currentcolor; -} - .c1 { align-items: stretch; display: flex; @@ -40,6 +35,13 @@ exports[`AddStage should render a list of stages 1`] = ` gap: 8px; } +.c4 { + font-size: 1.2rem; + line-height: 1.33; + font-weight: 600; + color: currentcolor; +} + .c6 { border: 0; clip: rect(0 0 0 0); @@ -69,7 +71,6 @@ exports[`AddStage should render a list of stages 1`] = ` class="c0 c1" />
- - - + + + + Edit + +
({ describe('ImageAssetCard', () => { it('snapshots the component', () => { const { container } = renderTL( - + { onEdit={jest.fn()} isUrlSigned={false} /> - + ); expect(container).toMatchInlineSnapshot(` @@ -82,27 +82,6 @@ describe('ImageAssetCard', () => { min-width: 20px; } - .c21 { - font-size: 1.2rem; - line-height: 1.33; - font-weight: 600; - color: #32324d; - } - - .c22 { - font-size: 1.2rem; - line-height: 1.33; - color: #666687; - } - - .c31 { - font-weight: 600; - font-size: 1.1rem; - line-height: 1.45; - text-transform: uppercase; - color: #666687; - } - .c3 { align-items: center; display: flex; @@ -136,6 +115,28 @@ describe('ImageAssetCard', () => { justify-content: center; } + .c21 { + font-size: 1.2rem; + line-height: 1.33; + font-weight: 600; + color: #32324d; + } + + .c22 { + font-size: 1.2rem; + line-height: 1.33; + color: #666687; + } + + .c31 { + font-weight: 600; + font-size: 1.1rem; + line-height: 1.45; + text-transform: uppercase; + line-height: 1rem; + color: #666687; + } + .c14 { border: 0; clip: rect(0 0 0 0); @@ -149,7 +150,7 @@ describe('ImageAssetCard', () => { .c29 { border-radius: 4px; - height: 2.4rem; + padding-block: 0.7rem; } .c12 { @@ -190,12 +191,12 @@ describe('ImageAssetCard', () => { } .c7 { - height: 18px; - min-width: 18px; + min-width: 1.8rem; + height: 1.8rem; margin: 0; + appearance: none; border-radius: 4px; border: 1px solid #c0c0cf; - -webkit-appearance: none; background-color: #ffffff; cursor: pointer; } @@ -210,8 +211,8 @@ describe('ImageAssetCard', () => { display: block; position: relative; background: url("data:image/svg+xml,%3csvg%20width='10'%20height='8'%20viewBox='0%200%2010%208'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M8.55323%200.396973C8.63135%200.316355%208.76051%200.315811%208.83931%200.395768L9.86256%201.43407C9.93893%201.51157%209.93935%201.6359%209.86349%201.7139L4.06401%207.67724C3.9859%207.75755%203.85707%207.75805%203.77834%207.67834L0.13866%203.99333C0.0617798%203.91549%200.0617102%203.79032%200.138504%203.7124L1.16213%202.67372C1.24038%202.59432%201.36843%202.59422%201.4468%202.67348L3.92174%205.17647L8.55323%200.396973Z'%20fill='white'%20/%3e%3c/svg%3e") no-repeat no-repeat center center; - width: 10px; - height: 10px; + width: 1rem; + height: 1rem; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%); @@ -350,48 +351,41 @@ describe('ImageAssetCard', () => {
-
- -
+
- - - + + + + Edit + +
( - + - + ); describe('SearchAsset', () => { @@ -109,34 +109,31 @@ describe('SearchAsset', () => { }
- - - + + + + Search + + diff --git a/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/tests/__snapshots__/index.test.jsx.snap b/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/tests/__snapshots__/index.test.jsx.snap index cd53926cf3c..666677683aa 100644 --- a/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/tests/__snapshots__/index.test.jsx.snap +++ b/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/tests/__snapshots__/index.test.jsx.snap @@ -16,9 +16,9 @@ exports[`BrowseStep renders and match snapshot 1`] = ` .c5 { background: #ffffff; - padding-block-start: 4px; + padding-block-start: 8px; padding-inline-end: 12px; - padding-block-end: 4px; + padding-block-end: 8px; padding-inline-start: 12px; border-radius: 4px; position: relative; @@ -140,81 +140,6 @@ exports[`BrowseStep renders and match snapshot 1`] = ` padding-inline-start: 8px; } -.c10 { - font-size: 1.4rem; - line-height: 1.43; - display: block; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - color: #666687; -} - -.c18 { - font-size: 1.2rem; - line-height: 1.33; - font-weight: 600; - color: currentcolor; -} - -.c32 { - font-size: 1.2rem; - line-height: 1.33; - font-weight: 400; - color: #32324d; -} - -.c34 { - font-size: 1.2rem; - line-height: 1.33; - color: #8e8ea9; -} - -.c38 { - font-weight: 500; - font-size: 1.6rem; - line-height: 1.25; - font-weight: 500; - color: currentcolor; -} - -.c54 { - font-size: 1.4rem; - line-height: 1.43; - display: block; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - font-weight: 500; - color: currentcolor; -} - -.c56 { - font-size: 1.2rem; - line-height: 1.33; - display: block; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - color: #666687; -} - -.c63 { - font-size: 1.4rem; - line-height: 1.43; - display: block; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - color: #32324d; -} - -.c65 { - font-size: 1.4rem; - line-height: 1.43; - color: #666687; -} - .c1 { align-items: stretch; display: flex; @@ -311,6 +236,81 @@ exports[`BrowseStep renders and match snapshot 1`] = ` gap: 4px; } +.c10 { + font-size: 1.4rem; + line-height: 1.43; + display: block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + color: #666687; +} + +.c18 { + font-size: 1.2rem; + line-height: 1.33; + font-weight: 600; + color: currentcolor; +} + +.c32 { + font-size: 1.2rem; + line-height: 1.33; + font-weight: 400; + color: #32324d; +} + +.c34 { + font-size: 1.2rem; + line-height: 1.33; + color: #8e8ea9; +} + +.c38 { + font-weight: 500; + font-size: 1.6rem; + line-height: 1.25; + font-weight: 500; + color: currentcolor; +} + +.c54 { + font-size: 1.4rem; + line-height: 1.43; + display: block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + font-weight: 500; + color: currentcolor; +} + +.c56 { + font-size: 1.2rem; + line-height: 1.33; + display: block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + color: #666687; +} + +.c63 { + font-size: 1.4rem; + line-height: 1.43; + display: block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + color: #32324d; +} + +.c65 { + font-size: 1.4rem; + line-height: 1.43; + color: #666687; +} + .c26 { border: 0; clip: rect(0 0 0 0); @@ -416,7 +416,6 @@ exports[`BrowseStep renders and match snapshot 1`] = ` .c7 { border: 1px solid #dcdce4; - min-height: 3.2rem; outline: none; box-shadow: 0; transition-property: border-color,box-shadow,fill; @@ -437,12 +436,13 @@ exports[`BrowseStep renders and match snapshot 1`] = ` } .c13>svg { - width: 1.2rem; fill: #666687; } .c11 { flex: 1; + font-size: 1.4rem; + line-height: 2.2rem; } .c12 { @@ -733,48 +733,12 @@ exports[`BrowseStep renders and match snapshot 1`] = `
- - - -
- - +
+
@@ -953,11 +947,6 @@ exports[`BrowseStep renders and match snapshot 1`] = ` class="c23 c24 c16 c25" type="button" > - - Edit folder - + + Edit folder + @@ -987,7 +981,7 @@ exports[`BrowseStep renders and match snapshot 1`] = ` >
-
- -
+
-
-
- -
- mov_bbb.mp4 -
-
-
+ + +
+ mov_bbb.mp4 +
+
); expect(container).toMatchSnapshot(); diff --git a/packages/core/upload/admin/src/components/ContextInfo/tests/__snapshots__/ContextInfo.test.jsx.snap b/packages/core/upload/admin/src/components/ContextInfo/tests/__snapshots__/ContextInfo.test.jsx.snap index 6d7dfebcaf0..c385c87c1cf 100644 --- a/packages/core/upload/admin/src/components/ContextInfo/tests/__snapshots__/ContextInfo.test.jsx.snap +++ b/packages/core/upload/admin/src/components/ContextInfo/tests/__snapshots__/ContextInfo.test.jsx.snap @@ -10,6 +10,13 @@ exports[`ContextInfo renders 1`] = ` border-radius: 4px; } +.c3 { + align-items: stretch; + display: flex; + flex-direction: column; + gap: 4px; +} + .c4 { font-weight: 600; font-size: 1.1rem; @@ -24,13 +31,6 @@ exports[`ContextInfo renders 1`] = ` color: #4a4a6a; } -.c3 { - align-items: stretch; - display: flex; - flex-direction: column; - gap: 4px; -} - .c6 { border: 0; clip: rect(0 0 0 0); diff --git a/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/CroppingActions.jsx b/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/CroppingActions.jsx index 04af76bd2b4..8abfb9d05d6 100644 --- a/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/CroppingActions.jsx +++ b/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/CroppingActions.jsx @@ -28,13 +28,16 @@ export const CroppingActions = ({ onCancel, onValidate, onDuplicate }) => { - - - {formatMessage({ - id: getTrad('control-card.crop'), - defaultMessage: 'Crop', - })} - + render( - + - + , { container: document.getElementById('app') } ); @@ -170,7 +170,7 @@ describe('', () => { it('opens the delete dialog when pressing the delete button when the user is allowed to update', () => { renderCompo({ canUpdate: true, canCopyLink: false, canDownload: false }); - fireEvent.click(screen.getByLabelText('Delete')); + fireEvent.click(screen.getByRole('button', { name: 'Delete' })); expect(screen.getByText('Confirmation')).toBeVisible(); expect(screen.getByText('Are you sure?')).toBeVisible(); @@ -179,13 +179,13 @@ describe('', () => { it('does not open the delete dialog when the user is not allowed to update', () => { renderCompo({ canUpdate: false, canCopyLink: false, canDownload: false }); - expect(screen.queryByLabelText('Delete')).not.toBeInTheDocument(); + expect(screen.queryByRole('button', { name: 'Delete' })).not.toBeInTheDocument(); }); it('copies the link and shows a notification when pressing "Copy link" and the user has permission to copy', async () => { renderCompo({ canUpdate: false, canCopyLink: true, canDownload: false }); - fireEvent.click(screen.getByLabelText('Copy link')); + fireEvent.click(screen.getByRole('button', { name: 'Copy link' })); await waitFor(() => expect(screen.getByText('Link copied into the clipboard')).toBeInTheDocument() @@ -195,13 +195,13 @@ describe('', () => { it('hides the copy link button when the user is not allowed to see it', () => { renderCompo({ canUpdate: false, canCopyLink: false, canDownload: false }); - expect(screen.queryByLabelText('Copy link')).not.toBeInTheDocument(); + expect(screen.queryByRole('button', { name: 'Copy link' })).not.toBeInTheDocument(); }); it('downloads the file when pressing "Download" and the user has the right to download', () => { renderCompo({ canUpdate: false, canCopyLink: false, canDownload: true }); - fireEvent.click(screen.getByLabelText('Download')); + fireEvent.click(screen.getByRole('button', { name: 'Download' })); expect(downloadFile).toHaveBeenCalledWith( 'http://localhost:1337/uploads/Screenshot_2_5d4a574d61.png', 'Screenshot 2.png' @@ -217,13 +217,13 @@ describe('', () => { it('shows the crop link when the user is allowed to update', () => { renderCompo({ canUpdate: true, canCopyLink: false, canDownload: false }); - expect(screen.getByLabelText('Crop')).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'Crop' })).toBeInTheDocument(); }); it('hides the crop link when the user is not allowed to update', () => { renderCompo({ canUpdate: false, canCopyLink: false, canDownload: false }); - expect(screen.queryByLabelText('Crop')).not.toBeInTheDocument(); + expect(screen.queryByRole('button', { name: 'Crop' })).not.toBeInTheDocument(); }); }); diff --git a/packages/core/upload/admin/src/components/EditAssetDialog/tests/RemoveAssetDialog.test.jsx b/packages/core/upload/admin/src/components/EditAssetDialog/tests/RemoveAssetDialog.test.jsx index 87dbf96959e..8f8c3f99730 100644 --- a/packages/core/upload/admin/src/components/EditAssetDialog/tests/RemoveAssetDialog.test.jsx +++ b/packages/core/upload/admin/src/components/EditAssetDialog/tests/RemoveAssetDialog.test.jsx @@ -1,7 +1,7 @@ import React from 'react'; import { NotificationsProvider } from '@strapi/admin/strapi-admin'; -import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { DesignSystemProvider } from '@strapi/design-system'; import { fireEvent, render, screen, waitFor } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; import { QueryClient, QueryClientProvider } from 'react-query'; @@ -91,13 +91,13 @@ const renderCompo = (handleCloseSpy = jest.fn()) => { return render( - + - + , { container: document.getElementById('app') } ); diff --git a/packages/core/upload/admin/src/components/EditAssetDialog/tests/__snapshots__/EditAssetDialog.test.jsx.snap b/packages/core/upload/admin/src/components/EditAssetDialog/tests/__snapshots__/EditAssetDialog.test.jsx.snap index fe840c287d6..0715214260d 100644 --- a/packages/core/upload/admin/src/components/EditAssetDialog/tests/__snapshots__/EditAssetDialog.test.jsx.snap +++ b/packages/core/upload/admin/src/components/EditAssetDialog/tests/__snapshots__/EditAssetDialog.test.jsx.snap @@ -10,21 +10,21 @@ exports[` renders and matches the snapshot 1`] = ` width: 50rem; } -.c6 { +.c3 { padding-inline-end: 40px; padding-inline-start: 40px; position: fixed; - z-index: 4; + z-index: 310; } -.c9 { +.c6 { background: #ffffff; border-radius: 4px; box-shadow: 0px 2px 15px rgba(33, 33, 52, 0.1); width: 83rem; } -.c10 { +.c7 { background: #f6f6f9; padding-block-start: 16px; padding-inline-end: 20px; @@ -32,7 +32,7 @@ exports[` renders and matches the snapshot 1`] = ` padding-inline-start: 20px; } -.c14 { +.c11 { background: #ffffff; padding-block: 8px; padding-inline: 8px; @@ -42,37 +42,29 @@ exports[` renders and matches the snapshot 1`] = ` cursor: pointer; } -.c17 { +.c14 { padding-block: 32px; padding-inline: 32px; } -.c21 { +.c18 { background: #eaeaef; border-radius: 4px; border-color: #dcdce4; border: 1px solid #dcdce4; } -.c23 { +.c20 { padding-inline-end: 12px; padding-inline-start: 12px; } -.c3 { - background: #212134; - padding-block: 8px; - padding-inline: 8px; - border-radius: 4px; - position: absolute; -} - -.c28 { +.c25 { padding-inline-end: 8px; padding-inline-start: 8px; } -.c30 { +.c27 { background: #f6f6f9; padding-block-start: 16px; padding-inline-end: 24px; @@ -81,15 +73,22 @@ exports[` renders and matches the snapshot 1`] = ` border-radius: 4px; } -.c34 { +.c31 { display: flex; } -.c40 { +.c33 { + padding-block-start: 8px; padding-inline-end: 12px; + padding-block-end: 8px; + padding-inline-start: 12px; } -.c45 { +.c38 { + padding-inline-end: 12px; +} + +.c43 { background: #4945ff; padding-block: 8px; padding-inline: 8px; @@ -101,54 +100,6 @@ exports[` renders and matches the snapshot 1`] = ` cursor: pointer; } -.c13 { - font-size: 1.4rem; - line-height: 1.43; - font-weight: 600; - color: #32324d; -} - -.c5 { - font-size: 1.2rem; - line-height: 1.33; - font-weight: 600; - color: #ffffff; -} - -.c32 { - font-weight: 600; - font-size: 1.1rem; - line-height: 1.45; - text-transform: uppercase; - color: #666687; -} - -.c33 { - font-size: 1.2rem; - line-height: 1.33; - color: #4a4a6a; -} - -.c35 { - font-size: 1.2rem; - line-height: 1.33; - font-weight: 600; - color: #32324d; -} - -.c39 { - font-size: 1.2rem; - line-height: 1.33; - color: #666687; -} - -.c47 { - font-size: 1.2rem; - line-height: 1.33; - font-weight: 600; - color: currentcolor; -} - .c1 { align-items: stretch; display: flex; @@ -156,49 +107,49 @@ exports[` renders and matches the snapshot 1`] = ` gap: 8px; } -.c7 { +.c4 { align-items: center; display: flex; flex-direction: row; justify-content: center; } -.c12 { +.c9 { align-items: center; display: flex; flex-direction: row; justify-content: space-between; } -.c24 { +.c21 { align-items: center; display: flex; flex-direction: row; justify-content: flex-end; } -.c26 { +.c23 { align-items: center; display: flex; flex-direction: row; gap: 4px; } -.c29 { +.c26 { align-items: stretch; display: flex; flex-direction: column; gap: 12px; } -.c31 { +.c28 { align-items: stretch; display: flex; flex-direction: column; gap: 4px; } -.c36 { +.c34 { align-items: center; display: flex; flex-direction: row; @@ -206,13 +157,54 @@ exports[` renders and matches the snapshot 1`] = ` justify-content: space-between; } -.c44 { +.c42 { align-items: center; display: flex; flex-direction: row; gap: 8px; } +.c10 { + font-size: 1.4rem; + line-height: 1.43; + font-weight: 600; + color: #32324d; +} + +.c29 { + font-weight: 600; + font-size: 1.1rem; + line-height: 1.45; + text-transform: uppercase; + color: #666687; +} + +.c30 { + font-size: 1.2rem; + line-height: 1.33; + color: #4a4a6a; +} + +.c32 { + font-size: 1.2rem; + line-height: 1.33; + font-weight: 600; + color: #32324d; +} + +.c37 { + font-size: 1.2rem; + line-height: 1.33; + color: #666687; +} + +.c45 { + font-size: 1.2rem; + line-height: 1.33; + font-weight: 600; + color: currentcolor; +} + .c2 { border: 0; clip: rect(0 0 0 0); @@ -224,16 +216,16 @@ exports[` renders and matches the snapshot 1`] = ` width: 1px; } -.c15 { +.c12 { position: relative; outline: none; } -.c15[aria-disabled='true'] { +.c12[aria-disabled='true'] { pointer-events: none; } -.c15:after { +.c12:after { transition-property: all; transition-duration: 0.2s; border-radius: 8px; @@ -246,11 +238,11 @@ exports[` renders and matches the snapshot 1`] = ` border: 2px solid transparent; } -.c15:focus-visible { +.c12:focus-visible { outline: none; } -.c15:focus-visible:after { +.c12:focus-visible:after { border-radius: 8px; content: ''; position: absolute; @@ -261,112 +253,104 @@ exports[` renders and matches the snapshot 1`] = ` border: 2px solid #4945ff; } -.c46 { +.c44 { height: 3.2rem; border: 1px solid #dcdce4; background: #ffffff; color: #32324d; } -.c46 svg { +.c44 svg { height: 1.2rem; } -.c46[aria-disabled='true'] { +.c44[aria-disabled='true'] { border: 1px solid #dcdce4; background: #eaeaef; color: #666687; } -.c46[aria-disabled='true']:active { +.c44[aria-disabled='true']:active { border: 1px solid #dcdce4; background: #eaeaef; color: #666687; } -.c46:hover { +.c44:hover { background-color: #f6f6f9; } -.c46:active { +.c44:active { background-color: #eaeaef; } -.c48 { +.c46 { height: 3.2rem; border: 1px solid #d9d8ff; background: #f0f0ff; color: #271fe0; } -.c48 svg { +.c46 svg { height: 1.2rem; } -.c48[aria-disabled='true'] { +.c46[aria-disabled='true'] { border: 1px solid #dcdce4; background: #eaeaef; color: #666687; } -.c48[aria-disabled='true']:active { +.c46[aria-disabled='true']:active { border: 1px solid #dcdce4; background: #eaeaef; color: #666687; } -.c48:hover { +.c46:hover { background-color: #ffffff; } -.c48:active { +.c46:active { background-color: #ffffff; border: 1px solid #4945ff; color: #4945ff; } -.c49 { +.c47 { height: 3.2rem; color: #ffffff; } -.c49 svg { +.c47 svg { height: 1.2rem; } -.c49[aria-disabled='true'] { +.c47[aria-disabled='true'] { border: 1px solid #dcdce4; background: #eaeaef; color: #666687; } -.c49[aria-disabled='true']:active { +.c47[aria-disabled='true']:active { border: 1px solid #dcdce4; background: #eaeaef; color: #666687; } -.c49:hover { +.c47:hover { border: 1px solid #7b79ff; background: #7b79ff; } -.c49:active { +.c47:active { border: 1px solid #4945ff; background: #4945ff; } -.c4 { - z-index: 4; - display: none; -} - -.c38 { +.c36 { border: none; border-radius: 4px; - padding: 0; - padding-bottom: 0.8rem; - padding-top: 0.8rem; color: #32324d; font-weight: 400; font-size: 1.4rem; @@ -376,21 +360,21 @@ exports[` renders and matches the snapshot 1`] = ` background: inherit; } -.c38 ::placeholder { +.c36 ::placeholder { color: #8e8ea9; opacity: 1; } -.c38[aria-disabled='true'] { +.c36[aria-disabled='true'] { color: inherit; } -.c38:focus { +.c36:focus { outline: none; box-shadow: none; } -.c37 { +.c35 { border: 1px solid #dcdce4; border-radius: 4px; background: #ffffff; @@ -400,119 +384,119 @@ exports[` renders and matches the snapshot 1`] = ` transition-duration: 0.2s; } -.c37:focus-within { +.c35:focus-within { border: 1px solid #4945ff; box-shadow: #4945ff 0px 0px 0px 2px; } -.c19 { +.c16 { display: grid; grid-template-columns: repeat(12, 1fr); gap: 16px; } -.c20 { +.c17 { grid-column: span 6; max-width: 100%; } -.c16 { +.c13 { border-color: #dcdce4; height: 3.2rem; width: 3.2rem; color: #8e8ea9; } -.c16:hover, -.c16:focus { +.c13:hover, +.c13:focus { color: #666687; } -.c16[aria-disabled='true'] { +.c13[aria-disabled='true'] { color: #666687; } -.c8 { +.c5 { background: #32324d1F; inset: 0; } -.c11 { +.c8 { border-radius: 4px 4px 0 0; border-bottom: 1px solid #eaeaef; } -.c43 { +.c41 { border-radius: 0 0 4px 4px; border-top: 1px solid #eaeaef; } -.c18 { +.c15 { overflow: auto; max-height: 60vh; } -.c41 { +.c39 { background: transparent; border: none; position: relative; z-index: 1; } -.c41 svg { +.c39 svg { height: 1.1rem; width: 1.1rem; } -.c41 svg path { +.c39 svg path { fill: #666687; } -.c42 { +.c40 { display: flex; background: none; border: none; } -.c42 svg { +.c40 svg { width: 0.9rem; } -.c22 { +.c19 { position: relative; } -.c27 { +.c24 { position: relative; text-align: center; background: repeating-conic-gradient( #f6f6f9 0% 25%, transparent 0% 50% ) 50%/20px 20px; } -.c27 svg { +.c24 svg { font-size: 4.8rem; height: 26.4rem; } -.c27 img, -.c27 video { +.c24 img, +.c24 video { margin: 0; padding: 0; max-height: 26.4rem; max-width: 100%; } -.c25 { +.c22 { height: 5.2rem; } @media (max-width: 1100px) { - .c20 { + .c17 { grid-column: span; } } @media (max-width: 550px) { - .c20 { + .c17 { grid-column: span 12; } } @@ -551,98 +535,33 @@ exports[` renders and matches the snapshot 1`] = ` class="" > - -
- -
-
- -
-
- -
-
-