From 4a199413ce8e013a2df3627c343acb4f4edb82a2 Mon Sep 17 00:00:00 2001 From: soupette Date: Tue, 2 Nov 2021 09:24:02 +0100 Subject: [PATCH] Add combobox to i18n settings Signed-off-by: soupette --- .../src/components/LocaleSelect/index.js | 22 +- .../LocaleSelect/tests/LocaleSelect.test.js | 318 +++++++++--------- 2 files changed, 179 insertions(+), 161 deletions(-) diff --git a/packages/plugins/i18n/admin/src/components/LocaleSelect/index.js b/packages/plugins/i18n/admin/src/components/LocaleSelect/index.js index c11ff7a864..5941d3e713 100644 --- a/packages/plugins/i18n/admin/src/components/LocaleSelect/index.js +++ b/packages/plugins/i18n/admin/src/components/LocaleSelect/index.js @@ -1,6 +1,6 @@ /* eslint-disable react/jsx-indent */ import React from 'react'; -import { Select, Option } from '@strapi/design-system/Select'; +import { ComboboxOption, Combobox } from '@strapi/design-system/Combobox'; import { useIntl } from 'react-intl'; import PropTypes from 'prop-types'; import useLocales from '../../hooks/useLocales'; @@ -12,7 +12,7 @@ import { getTrad } from '../../utils'; * onClear props to prevent the Select from re-rendering N times when typing on a specific * key in a formik form */ -const LocaleSelect = React.memo(({ value, onLocaleChange, error }) => { +const LocaleSelect = React.memo(({ value, onClear, onLocaleChange, error }) => { const { formatMessage } = useIntl(); const { defaultLocales, isLoading } = useDefaultLocales(); const { locales } = useLocales(); @@ -25,13 +25,13 @@ const LocaleSelect = React.memo(({ value, onLocaleChange, error }) => { .filter(({ value: v }) => { const foundLocale = locales.find(({ code }) => code === v); - return !foundLocale; + return !foundLocale || foundLocale.code === value; }); const computedValue = value || ''; return ( - + ); }); LocaleSelect.defaultProps = { error: undefined, value: undefined, + onClear: () => {}, onLocaleChange: () => undefined, }; LocaleSelect.propTypes = { error: PropTypes.string, + onClear: PropTypes.func, onLocaleChange: PropTypes.func, value: PropTypes.string, }; diff --git a/packages/plugins/i18n/admin/src/components/LocaleSelect/tests/LocaleSelect.test.js b/packages/plugins/i18n/admin/src/components/LocaleSelect/tests/LocaleSelect.test.js index 8a9bda6c47..7590dd15be 100644 --- a/packages/plugins/i18n/admin/src/components/LocaleSelect/tests/LocaleSelect.test.js +++ b/packages/plugins/i18n/admin/src/components/LocaleSelect/tests/LocaleSelect.test.js @@ -54,49 +54,11 @@ describe('LocaleSelect', () => { const { container } = render(); expect(container.firstChild).toMatchInlineSnapshot(` - .c4 { - position: absolute; - left: 0; - right: 0; - bottom: 0; - top: 0; - width: 100%; - background: transparent; - border: none; - } - - .c4:focus { - outline: none; - } - - .c4[aria-disabled='true'] { - cursor: not-allowed; - } - - .c1 { - font-weight: 500; - font-size: 0.75rem; - line-height: 1.33; - color: #32324d; - } - .c8 { - font-weight: 400; - font-size: 0.875rem; - line-height: 1.43; - color: #666687; - } - - .c7 { - padding-right: 16px; - padding-left: 16px; - } - - .c9 { padding-left: 12px; } - .c2 { + .c3 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -118,17 +80,119 @@ describe('LocaleSelect', () => { -webkit-flex-direction: row; -ms-flex-direction: row; flex-direction: row; - -webkit-box-pack: justify; - -webkit-justify-content: space-between; - -ms-flex-pack: justify; - justify-content: space-between; -webkit-align-items: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + } + + .c9 { + background: transparent; + border: none; + position: relative; + z-index: 1; + } + + .c9 svg { + height: 0.6875rem; + width: 0.6875rem; + } + + .c9 svg path { + fill: #666687; + } + + .c10 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + background: none; + border: none; + } + + .c10 svg { + width: 0.375rem; + } + + .c2 { + font-weight: 500; + font-size: 0.75rem; + line-height: 1.33; + color: #32324d; } .c0 { + border: 0; + -webkit-clip: rect(0 0 0 0); + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; + } + + .c4 { + position: relative; + border: 1px solid #dcdce4; + padding-right: 12px; + padding-left: 12px; + border-radius: 4px; + background: #ffffff; + outline: none; + box-shadow: 0; + -webkit-transition-property: border-color,box-shadow,fill; + transition-property: border-color,box-shadow,fill; + -webkit-transition-duration: 0.2s; + transition-duration: 0.2s; + } + + .c4:focus-within { + border: 1px solid #4945ff; + box-shadow: #4945ff 0px 0px 0px 2px; + } + + .c6 { + display: grid; + -webkit-flex: 1 1 0%; + -ms-flex: 1 1 0%; + flex: 1 1 0%; + position: relative; + } + + .c7 { + display: inline-grid; + grid-area: 1 / 1 / 2 / 3; + grid-template-columns: 0px min-content; + background: transparent; + min-height: 2.5rem; + border: none; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + font-size: 0.875rem; + color: #32324d; + outline: none; + } + + .c7:focus-visible { + outline: none; + box-shadow: none; + outline-offset: 0; + } + + .c7[aria-disabled='true'] { + background: inherit; + color: inherit; + cursor: not-allowed; + } + + .c1 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -138,136 +202,84 @@ describe('LocaleSelect', () => { flex-direction: column; } - .c0 > * { + .c1 > * { margin-top: 0; margin-bottom: 0; } - .c0 > * + * { + .c1 > * + * { margin-top: 4px; } - .c3 { - position: relative; - border: 1px solid #dcdce4; - padding-right: 12px; - border-radius: 4px; - background: #ffffff; - overflow: hidden; - min-height: 2.5rem; - outline: none; - box-shadow: 0; - -webkit-transition-property: border-color,box-shadow,fill; - transition-property: border-color,box-shadow,fill; - -webkit-transition-duration: 0.2s; - transition-duration: 0.2s; - } - - .c3:focus-within { - border: 1px solid #4945ff; - box-shadow: #4945ff 0px 0px 0px 2px; - } - - .c10 { - background: transparent; - border: none; - position: relative; - z-index: 1; - } - - .c10 svg { - height: 0.6875rem; - width: 0.6875rem; - } - - .c10 svg path { - fill: #666687; - } - - .c11 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - background: none; - border: none; - } - - .c11 svg { - width: 0.375rem; - } - - .c6 { - width: 100%; - } -
+
- Locales - +
-
-
- - -
+ + +