{"version":3,"file":"SettingsPage-ER9Mz4Ia.mjs","sources":["../../admin/src/hooks/useAddLocale.ts","../../admin/src/hooks/useDefaultLocales.ts","../../admin/src/components/LocaleSelect.tsx","../../admin/src/components/CreateModal.tsx","../../admin/src/hooks/useDeleteLocale.ts","../../admin/src/components/DeleteModal.tsx","../../admin/src/hooks/useEditLocale.ts","../../admin/src/components/EditModal.tsx","../../admin/src/components/LocaleTable.tsx","../../admin/src/pages/SettingsPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useAPIErrorHandler, useFetchClient, useNotification } from '@strapi/helper-plugin';\nimport { AxiosError, type AxiosResponse } from 'axios';\nimport { useDispatch } from 'react-redux';\n\nimport { CreateLocale } from '../../../shared/contracts/locales';\nimport { ADD_LOCALE } from '../store/constants';\nimport { getTranslation } from '../utils/getTranslation';\n\nconst useAddLocale = () => {\n  const [isLoading, setLoading] = React.useState(false);\n  const dispatch = useDispatch();\n  const toggleNotification = useNotification();\n  const { post } = useFetchClient();\n  const { formatAPIError } = useAPIErrorHandler();\n\n  const persistLocale = async (locale: CreateLocale.Request['body']) => {\n    setLoading(true);\n\n    try {\n      const { data } = await post<\n        CreateLocale.Response,\n        AxiosResponse<CreateLocale.Response>,\n        CreateLocale.Request['body']\n      >('/i18n/locales', locale);\n\n      toggleNotification({\n        type: 'success',\n        message: { id: getTranslation('Settings.locales.modal.create.success') },\n      });\n\n      dispatch({ type: ADD_LOCALE, newLocale: data });\n    } catch (e) {\n      if (e instanceof AxiosError) {\n        toggleNotification({\n          type: 'warning',\n          message: formatAPIError(e),\n        });\n      } else {\n        toggleNotification({\n          type: 'warning',\n          message: { id: 'notification.error' },\n        });\n      }\n\n      throw e;\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  return { isAdding: isLoading, addLocale: persistLocale };\n};\n\nexport { useAddLocale };\n","import { useNotifyAT } from '@strapi/design-system';\nimport { useFetchClient, useNotification } from '@strapi/helper-plugin';\nimport { useIntl } from 'react-intl';\nimport { useQuery } from 'react-query';\n\nimport { getTranslation } from '../utils/getTranslation';\n\nimport type { GetISOLocales } from '../../../shared/contracts/iso-locales';\n\nconst useDefaultLocales = () => {\n  const { formatMessage } = useIntl();\n  const { notifyStatus } = useNotifyAT();\n  const toggleNotification = useNotification();\n  const { get } = useFetchClient();\n  const { isLoading, data } = useQuery(\n    ['plugin-i18n', 'locales'],\n    async () => {\n      const { data } = await get<GetISOLocales.Response>('/i18n/iso-locales');\n\n      if (Array.isArray(data)) {\n        return data;\n      } else {\n        /**\n         * We have to do this because the API could return an error or an array and while we expect\n         * the error to only return when the request fails, you can never be too sure.\n         */\n        throw new Error('The response is not an array.');\n      }\n    },\n    {\n      onSuccess() {\n        notifyStatus(\n          formatMessage({\n            id: getTranslation('Settings.locales.modal.locales.loaded'),\n            defaultMessage: 'The locales have been successfully loaded.',\n          })\n        );\n      },\n      onError() {\n        toggleNotification({\n          type: 'warning',\n          message: { id: 'notification.error' },\n        });\n      },\n      initialData: [],\n    }\n  );\n\n  return { defaultLocales: data, isLoading };\n};\n\nexport { useDefaultLocales };\n","import { Combobox, ComboboxOption, ComboboxProps } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { ISOLocale } from '../../../shared/contracts/iso-locales';\nimport { useDefaultLocales } from '../hooks/useDefaultLocales';\nimport { useLocales } from '../hooks/useLocales';\nimport { getTranslation } from '../utils/getTranslation';\n\ninterface LocaleSelectProps extends Pick<ComboboxProps, 'onClear' | 'error' | 'value'> {\n  onLocaleChange: (locale: ISOLocale) => void;\n}\n\n/**\n * The component is memoized and needs a useCallback over the onLocaleChange and\n * onClear props to prevent the Select from re-rendering N times when typing on a specific\n * key in a formik form\n */\nconst LocaleSelect = ({ value, onClear, onLocaleChange, error }: LocaleSelectProps) => {\n  const { formatMessage } = useIntl();\n  const { defaultLocales = [], isLoading } = useDefaultLocales();\n  const { locales } = useLocales();\n\n  const options = defaultLocales\n    .map((locale) => ({\n      label: locale.name,\n      value: locale.code,\n    }))\n    .filter((opt) => {\n      const foundLocale = locales.find(({ code }) => code === opt.value);\n      return !foundLocale || foundLocale.code === value;\n    });\n\n  const computedValue = value || '';\n\n  return (\n    <Combobox\n      aria-busy={isLoading}\n      error={error}\n      label={formatMessage({\n        id: getTranslation('Settings.locales.modal.locales.label'),\n        defaultMessage: 'Locales',\n      })}\n      value={computedValue}\n      onClear={onClear}\n      onChange={(selectedLocaleKey) => {\n        const selectedLocale = options.find((locale) => locale.value === selectedLocaleKey);\n\n        if (selectedLocale) {\n          onLocaleChange({ code: selectedLocale.value, name: selectedLocale.label });\n        }\n      }}\n      placeholder={formatMessage({\n        id: 'components.placeholder.select',\n        defaultMessage: 'Select',\n      })}\n    >\n      {options.map((option) => (\n        <ComboboxOption value={option.value} key={option.value}>\n          {option.label}\n        </ComboboxOption>\n      ))}\n    </Combobox>\n  );\n};\n\nexport { LocaleSelect };\nexport type { LocaleSelectProps };\n","import {\n  Box,\n  Button,\n  Checkbox,\n  Divider,\n  Flex,\n  Grid,\n  GridItem,\n  ModalBody,\n  ModalFooter,\n  ModalHeader,\n  ModalLayout,\n  Tab,\n  TabGroup,\n  TabPanel,\n  TabPanels,\n  Tabs,\n  TextInput,\n  Typography,\n} from '@strapi/design-system';\nimport { Form, translatedErrors, useRBACProvider } from '@strapi/helper-plugin';\nimport { Check } from '@strapi/icons';\nimport { Formik, useFormikContext } from 'formik';\nimport { useIntl } from 'react-intl';\nimport * as yup from 'yup';\n\nimport { CreateLocale } from '../../../shared/contracts/locales';\nimport { useAddLocale } from '../hooks/useAddLocale';\nimport { getTranslation } from '../utils/getTranslation';\n\nimport { LocaleSelect, LocaleSelectProps } from './LocaleSelect';\n\n/* -------------------------------------------------------------------------------------------------\n * CreateModal\n * -----------------------------------------------------------------------------------------------*/\n\nconst LOCALE_SCHEMA = yup.object().shape({\n  code: yup.string().required(),\n  name: yup\n    .string()\n    .max(50, 'Settings.locales.modal.locales.displayName.error')\n    .required(translatedErrors.required),\n  isDefault: yup.boolean(),\n});\n\ntype FormikValues = CreateLocale.Request['body'];\n\nconst initialFormValues = {\n  code: '',\n  name: '',\n  isDefault: false,\n} satisfies FormikValues;\n\ntype ModalCreateProps = {\n  onClose: () => void;\n};\n\nconst CreateModal = ({ onClose }: ModalCreateProps) => {\n  const { isAdding, addLocale } = useAddLocale();\n  const { formatMessage } = useIntl();\n  const { refetchPermissions } = useRBACProvider();\n\n  return (\n    <ModalLayout onClose={onClose} labelledBy=\"add-locale-title\">\n      <Formik\n        initialValues={initialFormValues}\n        onSubmit={async (values) => {\n          /**\n           * No need to explicitly call the onClose prop here\n           * since the all tree (from the root of the page) is destroyed and re-mounted\n           * because of the RBAC refreshing and the potential move of the default locale\n           */\n          await addLocale(values);\n\n          await refetchPermissions();\n        }}\n        validationSchema={LOCALE_SCHEMA}\n        validateOnChange={false}\n      >\n        <Form>\n          <ModalHeader>\n            <Typography fontWeight=\"bold\" textColor=\"neutral800\" as=\"h2\" id=\"add-locale-title\">\n              {formatMessage({\n                id: getTranslation('Settings.list.actions.add'),\n                defaultMessage: 'Add new locale',\n              })}\n            </Typography>\n          </ModalHeader>\n          <ModalBody>\n            <TabGroup\n              label={formatMessage({\n                id: getTranslation('Settings.locales.modal.title'),\n                defaultMessage: 'Configurations',\n              })}\n              id=\"tabs\"\n              variant=\"simple\"\n            >\n              <Flex justifyContent=\"space-between\">\n                <Typography as=\"h2\" variant=\"beta\">\n                  {formatMessage({\n                    id: getTranslation('Settings.locales.modal.title'),\n                    defaultMessage: 'Configurations',\n                  })}\n                </Typography>\n                <Tabs>\n                  <Tab>\n                    {formatMessage({\n                      id: getTranslation('Settings.locales.modal.base'),\n                      defaultMessage: 'Basic settings',\n                    })}\n                  </Tab>\n                  <Tab>\n                    {formatMessage({\n                      id: getTranslation('Settings.locales.modal.advanced'),\n                      defaultMessage: 'Advanced settings',\n                    })}\n                  </Tab>\n                </Tabs>\n              </Flex>\n\n              <Divider />\n\n              <Box paddingTop={7} paddingBottom={7}>\n                <TabPanels>\n                  <TabPanel>\n                    <BaseForm />\n                  </TabPanel>\n                  <TabPanel>\n                    <AdvancedForm />\n                  </TabPanel>\n                </TabPanels>\n              </Box>\n            </TabGroup>\n          </ModalBody>\n          <ModalFooter\n            startActions={\n              <Button variant=\"tertiary\" onClick={onClose}>\n                {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'Cancel' })}\n              </Button>\n            }\n            endActions={\n              <Button type=\"submit\" startIcon={<Check />} disabled={isAdding}>\n                {formatMessage({ id: 'global.save', defaultMessage: 'Save' })}\n              </Button>\n            }\n          />\n        </Form>\n      </Formik>\n    </ModalLayout>\n  );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * BaseForm\n * -----------------------------------------------------------------------------------------------*/\n\nconst BaseForm = () => {\n  const { formatMessage } = useIntl();\n  const { values, handleChange, setFieldValue, errors } = useFormikContext<FormikValues>();\n\n  /**\n   * This is needed because the LocaleSelect component is a memoized component\n   * since it renders ~500 locales and that formik would trigger a re-render on it without\n   * it\n   */\n  const handleLocaleChange: LocaleSelectProps['onLocaleChange'] = (nextLocale) => {\n    setFieldValue('name', nextLocale.name);\n    setFieldValue('code', nextLocale.code);\n  };\n  const handleClear = () => {\n    setFieldValue('displayName', '');\n    setFieldValue('code', '');\n  };\n\n  return (\n    <Grid gap={4}>\n      <GridItem col={6}>\n        <LocaleSelect\n          error={errors.code}\n          value={values.code}\n          onLocaleChange={handleLocaleChange}\n          onClear={handleClear}\n        />\n      </GridItem>\n\n      <GridItem col={6}>\n        <TextInput\n          name=\"name\"\n          label={formatMessage({\n            id: getTranslation('Settings.locales.modal.locales.displayName'),\n            defaultMessage: 'Locale display name',\n          })}\n          hint={formatMessage({\n            id: getTranslation('Settings.locales.modal.locales.displayName.description'),\n            defaultMessage: 'Locale will be displayed under that name in the administration panel',\n          })}\n          error={\n            errors.name\n              ? formatMessage({\n                  id: getTranslation('Settings.locales.modal.locales.displayName.error'),\n                  defaultMessage: 'The locale display name can only be less than 50 characters.',\n                })\n              : undefined\n          }\n          value={values.name}\n          onChange={handleChange}\n        />\n      </GridItem>\n    </Grid>\n  );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AdvancedForm\n * -----------------------------------------------------------------------------------------------*/\n\ntype AdvancedFormProps = {\n  isDefaultLocale?: boolean;\n};\n\nconst AdvancedForm = ({ isDefaultLocale }: AdvancedFormProps) => {\n  const { values, setFieldValue } = useFormikContext<FormikValues>();\n  const { formatMessage } = useIntl();\n\n  return (\n    <Checkbox\n      name=\"isDefault\"\n      hint={formatMessage({\n        id: getTranslation('Settings.locales.modal.advanced.setAsDefault.hint'),\n        defaultMessage: 'One default locale is required, change it by selecting another one',\n      })}\n      onChange={() => setFieldValue('isDefault', !values.isDefault)}\n      value={values.isDefault}\n      disabled={isDefaultLocale}\n    >\n      {formatMessage({\n        id: getTranslation('Settings.locales.modal.advanced.setAsDefault'),\n        defaultMessage: 'Set as default locale',\n      })}\n    </Checkbox>\n  );\n};\n\nexport { CreateModal, AdvancedForm, LOCALE_SCHEMA };\n","import { useState } from 'react';\n\nimport { useFetchClient, useNotification } from '@strapi/helper-plugin';\n\nimport { DeleteLocale } from '../../../shared/contracts/locales';\nimport { DELETE_LOCALE } from '../store/constants';\nimport { useTypedDispatch } from '../store/hooks';\nimport { getTranslation } from '../utils/getTranslation';\n\nconst useDeleteLocale = () => {\n  const [isLoading, setLoading] = useState(false);\n  const dispatch = useTypedDispatch();\n  const toggleNotification = useNotification();\n\n  const { del } = useFetchClient();\n\n  const removeLocale = async (id: DeleteLocale.Request['params']['id']) => {\n    try {\n      setLoading(true);\n\n      await del<DeleteLocale.Response>(`/i18n/locales/${id}`);\n\n      toggleNotification({\n        type: 'success',\n        message: { id: getTranslation('Settings.locales.modal.delete.success') },\n      });\n\n      dispatch({ type: DELETE_LOCALE, id });\n    } catch {\n      toggleNotification({\n        type: 'warning',\n        message: { id: 'notification.error' },\n      });\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  return { isDeleting: isLoading, deleteLocale: removeLocale };\n};\n\nexport { useDeleteLocale };\n","import { ConfirmDialog, ConfirmDialogProps } from '@strapi/helper-plugin';\n\nimport { useDeleteLocale } from '../hooks/useDeleteLocale';\nimport { Locale } from '../store/reducers';\n\ntype DeleteModalProps = {\n  localeToDelete: Locale;\n  onClose: ConfirmDialogProps['onToggleDialog'];\n};\n\nconst DeleteModal = ({ localeToDelete, onClose }: DeleteModalProps) => {\n  const { isDeleting, deleteLocale } = useDeleteLocale();\n  const isOpened = Boolean(localeToDelete);\n\n  const handleDelete = () => deleteLocale(localeToDelete.id).then(onClose);\n\n  return (\n    <ConfirmDialog\n      isConfirmButtonLoading={isDeleting}\n      onConfirm={handleDelete}\n      onToggleDialog={onClose}\n      isOpen={isOpened}\n    />\n  );\n};\n\nexport { DeleteModal };\n","import { useState } from 'react';\n\nimport { useFetchClient, useNotification } from '@strapi/helper-plugin';\nimport { AxiosResponse } from 'axios';\n\nimport { UpdateLocale } from '../../../shared/contracts/locales';\nimport { UPDATE_LOCALE } from '../store/constants';\nimport { useTypedDispatch } from '../store/hooks';\nimport { getTranslation } from '../utils/getTranslation';\n\nconst useEditLocale = () => {\n  const [isLoading, setLoading] = useState(false);\n  const dispatch = useTypedDispatch();\n  const toggleNotification = useNotification();\n  const { put } = useFetchClient();\n\n  const modifyLocale = async (\n    id: UpdateLocale.Request['params']['id'],\n    payload: UpdateLocale.Request['body']\n  ) => {\n    try {\n      setLoading(true);\n\n      const { data } = await put<\n        UpdateLocale.Response,\n        AxiosResponse<UpdateLocale.Response>,\n        UpdateLocale.Request['body']\n      >(`/i18n/locales/${id}`, payload);\n\n      if ('id' in data) {\n        toggleNotification({\n          type: 'success',\n          message: { id: getTranslation('Settings.locales.modal.edit.success') },\n        });\n\n        dispatch({ type: UPDATE_LOCALE, editedLocale: data });\n      } else {\n        throw new Error('Invalid response');\n      }\n    } catch {\n      toggleNotification({\n        type: 'warning',\n        message: { id: 'notification.error' },\n      });\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  return { isEditing: isLoading, editLocale: modifyLocale };\n};\n\nexport { useEditLocale };\n","import {\n  Box,\n  Button,\n  Divider,\n  Flex,\n  Grid,\n  GridItem,\n  ModalBody,\n  ModalFooter,\n  ModalHeader,\n  ModalLayout,\n  ModalLayoutProps,\n  SingleSelect,\n  SingleSelectOption,\n  Tab,\n  TabGroup,\n  TabPanel,\n  TabPanels,\n  Tabs,\n  TextInput,\n  Typography,\n} from '@strapi/design-system';\nimport { Form, useRBACProvider } from '@strapi/helper-plugin';\nimport { Check } from '@strapi/icons';\nimport { Formik, useFormikContext } from 'formik';\nimport { useIntl } from 'react-intl';\n\nimport { CreateLocale } from '../../../shared/contracts/locales';\nimport { useDefaultLocales } from '../hooks/useDefaultLocales';\nimport { useEditLocale } from '../hooks/useEditLocale';\nimport { Locale } from '../store/reducers';\nimport { getTranslation } from '../utils/getTranslation';\n\nimport { AdvancedForm, LOCALE_SCHEMA } from './CreateModal';\n\n/* -------------------------------------------------------------------------------------------------\n * EditModal\n * -----------------------------------------------------------------------------------------------*/\n\ninterface EditModalProps extends Pick<ModalLayoutProps, 'onClose'> {\n  locale: Locale;\n}\n\ntype FormikValues = CreateLocale.Request['body'];\n\nconst EditModal = ({ locale, onClose }: EditModalProps) => {\n  const { refetchPermissions } = useRBACProvider();\n  const { isEditing, editLocale } = useEditLocale();\n  const { formatMessage } = useIntl();\n\n  const handleSubmit = async ({ name, isDefault }: FormikValues) => {\n    await editLocale(locale.id, { name, isDefault });\n    await refetchPermissions();\n  };\n\n  return (\n    <ModalLayout onClose={onClose} labelledBy=\"edit-locale-title\">\n      <Formik\n        initialValues={\n          {\n            code: locale.code ?? '',\n            name: locale.name ?? '',\n            isDefault: Boolean(locale.isDefault),\n          } satisfies FormikValues\n        }\n        onSubmit={handleSubmit}\n        validationSchema={LOCALE_SCHEMA}\n      >\n        <Form>\n          <ModalHeader>\n            <Typography fontWeight=\"bold\" textColor=\"neutral800\" as=\"h2\" id=\"edit-locale-title\">\n              {formatMessage({\n                id: getTranslation('Settings.list.actions.edit'),\n                defaultMessage: 'Edit a locale',\n              })}\n            </Typography>\n          </ModalHeader>\n          <ModalBody>\n            <TabGroup\n              label={formatMessage({\n                id: getTranslation('Settings.locales.modal.title'),\n                defaultMessage: 'Configurations',\n              })}\n              id=\"tabs\"\n              variant=\"simple\"\n            >\n              <Flex justifyContent=\"space-between\">\n                <Typography as=\"h2\">\n                  {formatMessage({\n                    id: getTranslation('Settings.locales.modal.title'),\n                    defaultMessage: 'Configurations',\n                  })}\n                </Typography>\n                <Tabs>\n                  <Tab>\n                    {formatMessage({\n                      id: getTranslation('Settings.locales.modal.base'),\n                      defaultMessage: 'Basic settings',\n                    })}\n                  </Tab>\n                  <Tab>\n                    {formatMessage({\n                      id: getTranslation('Settings.locales.modal.advanced'),\n                      defaultMessage: 'Advanced settings',\n                    })}\n                  </Tab>\n                </Tabs>\n              </Flex>\n\n              <Divider />\n\n              <Box paddingTop={7} paddingBottom={7}>\n                <TabPanels>\n                  <TabPanel>\n                    <BaseForm locale={locale} />\n                  </TabPanel>\n                  <TabPanel>\n                    <AdvancedForm isDefaultLocale={Boolean(locale && locale.isDefault)} />\n                  </TabPanel>\n                </TabPanels>\n              </Box>\n            </TabGroup>\n          </ModalBody>\n\n          <ModalFooter\n            startActions={\n              <Button variant=\"tertiary\" onClick={onClose}>\n                {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'Cancel' })}\n              </Button>\n            }\n            endActions={\n              <Button type=\"submit\" startIcon={<Check />} disabled={isEditing}>\n                {formatMessage({ id: 'global.save', defaultMessage: 'Save' })}\n              </Button>\n            }\n          />\n        </Form>\n      </Formik>\n    </ModalLayout>\n  );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * BaseForm\n * -----------------------------------------------------------------------------------------------*/\n\ninterface BaseFormProps extends Pick<EditModalProps, 'locale'> {}\n\nconst BaseForm = ({ locale }: BaseFormProps) => {\n  const { formatMessage } = useIntl();\n  const { values, handleChange, errors } = useFormikContext<FormikValues>();\n  const { defaultLocales = [] } = useDefaultLocales();\n\n  const localeDetails = defaultLocales.find((row) => row.code === locale.code);\n\n  return (\n    <Grid gap={4}>\n      <GridItem col={6}>\n        <SingleSelect\n          label={formatMessage({\n            id: getTranslation('Settings.locales.modal.locales.label'),\n            defaultMessage: 'Locales',\n          })}\n          value={localeDetails?.code || locale.code}\n          disabled\n        >\n          <SingleSelectOption value={localeDetails?.code || locale.code}>\n            {localeDetails?.name || locale.code}\n          </SingleSelectOption>\n        </SingleSelect>\n      </GridItem>\n\n      <GridItem col={6}>\n        <TextInput\n          name=\"name\"\n          label={formatMessage({\n            id: getTranslation('Settings.locales.modal.locales.displayName'),\n            defaultMessage: 'Locale display name',\n          })}\n          hint={formatMessage({\n            id: getTranslation('Settings.locales.modal.locales.displayName.description'),\n            defaultMessage: 'Locale will be displayed under that name in the administration panel',\n          })}\n          error={\n            errors.name\n              ? formatMessage({\n                  id: getTranslation('Settings.locales.modal.locales.displayName.error'),\n                  defaultMessage: 'The locale display name can only be less than 50 characters.',\n                })\n              : undefined\n          }\n          value={values.name}\n          onChange={handleChange}\n        />\n      </GridItem>\n    </Grid>\n  );\n};\n\nexport { EditModal };\n","import {\n  Flex,\n  IconButton,\n  Table,\n  Tbody,\n  Td,\n  Th,\n  Thead,\n  Tr,\n  Typography,\n  VisuallyHidden,\n} from '@strapi/design-system';\nimport { onRowClick } from '@strapi/helper-plugin';\nimport { Pencil, Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { Locale } from '../store/reducers';\nimport { getTranslation } from '../utils/getTranslation';\n\ntype LocaleTableProps = {\n  locales?: Locale[];\n  canDelete?: boolean;\n  canEdit?: boolean;\n  onDeleteLocale: (locale: Locale) => void;\n  onEditLocale: (locale: Locale) => void;\n};\n\nconst LocaleTable = ({\n  locales = [],\n  onDeleteLocale,\n  onEditLocale,\n  canDelete = true,\n  canEdit = true,\n}: LocaleTableProps) => {\n  const { formatMessage } = useIntl();\n\n  return (\n    <Table colCount={4} rowCount={locales.length + 1}>\n      <Thead>\n        <Tr>\n          <Th>\n            <Typography variant=\"sigma\" textColor=\"neutral600\">\n              {formatMessage({\n                id: getTranslation('Settings.locales.row.id'),\n                defaultMessage: 'ID',\n              })}\n            </Typography>\n          </Th>\n          <Th>\n            <Typography variant=\"sigma\" textColor=\"neutral600\">\n              {formatMessage({\n                id: getTranslation('Settings.locales.row.displayName'),\n                defaultMessage: 'Display name',\n              })}\n            </Typography>\n          </Th>\n          <Th>\n            <Typography variant=\"sigma\" textColor=\"neutral600\">\n              {formatMessage({\n                id: getTranslation('Settings.locales.row.default-locale'),\n                defaultMessage: 'Default locale',\n              })}\n            </Typography>\n          </Th>\n          <Th>\n            <VisuallyHidden>Actions</VisuallyHidden>\n          </Th>\n        </Tr>\n      </Thead>\n      <Tbody>\n        {locales.map((locale) => (\n          <Tr\n            key={locale.id}\n            {...onRowClick({\n              fn: () => onEditLocale(locale),\n              condition: Boolean(onEditLocale),\n            })}\n          >\n            <Td>\n              <Typography textColor=\"neutral800\">{locale.id}</Typography>\n            </Td>\n            <Td>\n              <Typography textColor=\"neutral800\">{locale.name}</Typography>\n            </Td>\n            <Td>\n              <Typography textColor=\"neutral800\">\n                {locale.isDefault\n                  ? formatMessage({\n                      id: getTranslation('Settings.locales.default'),\n                      defaultMessage: 'Default',\n                    })\n                  : null}\n              </Typography>\n            </Td>\n            <Td>\n              <Flex gap={1} justifyContent=\"flex-end\" onClick={(e) => e.stopPropagation()}>\n                {canEdit && (\n                  <IconButton\n                    onClick={() => onEditLocale(locale)}\n                    label={formatMessage({\n                      id: getTranslation('Settings.list.actions.edit'),\n                      defaultMessage: 'Edit',\n                    })}\n                    icon={<Pencil />}\n                    borderWidth={0}\n                  />\n                )}\n                {canDelete && !locale.isDefault && (\n                  <IconButton\n                    onClick={() => onDeleteLocale(locale)}\n                    label={formatMessage({\n                      id: getTranslation('Settings.list.actions.delete'),\n                      defaultMessage: 'Delete',\n                    })}\n                    icon={<Trash />}\n                    borderWidth={0}\n                  />\n                )}\n              </Flex>\n            </Td>\n          </Tr>\n        ))}\n      </Tbody>\n    </Table>\n  );\n};\n\nexport { LocaleTable };\nexport type { LocaleTableProps };\n","import * as React from 'react';\n\nimport { Button, ContentLayout, EmptyStateLayout, HeaderLayout, Main } from '@strapi/design-system';\nimport {\n  CheckPagePermissions,\n  LoadingIndicatorPage,\n  useFocusWhenNavigate,\n  useRBAC,\n} from '@strapi/helper-plugin';\nimport { EmptyDocuments, Plus } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { CreateModal } from '../components/CreateModal';\nimport { DeleteModal } from '../components/DeleteModal';\nimport { EditModal } from '../components/EditModal';\nimport { LocaleTable, LocaleTableProps } from '../components/LocaleTable';\nimport { PERMISSIONS } from '../constants';\nimport { useLocales } from '../hooks/useLocales';\nimport { Locale } from '../store/reducers';\nimport { getTranslation } from '../utils/getTranslation';\n\nconst SettingsPage = () => {\n  const [isOpenedCreateModal, setIsOpenedCreateModal] = React.useState(false);\n  const [localeToDelete, setLocaleToDelete] = React.useState<Locale>();\n  const [localeToEdit, setLocaleToEdit] = React.useState<Locale>();\n  const { locales } = useLocales();\n  const { formatMessage } = useIntl();\n\n  const {\n    isLoading,\n    allowedActions: { canUpdate, canCreate, canDelete },\n  } = useRBAC(PERMISSIONS);\n\n  const handleToggleModalCreate = () => {\n    setIsOpenedCreateModal((s) => !s);\n  };\n\n  useFocusWhenNavigate();\n\n  // Delete actions\n  const closeModalToDelete = () => setLocaleToDelete(undefined);\n  const handleDeleteLocale: LocaleTableProps['onDeleteLocale'] = (locale) => {\n    setLocaleToDelete(locale);\n  };\n\n  // Edit actions\n  const closeModalToEdit = () => setLocaleToEdit(undefined);\n  const handleEditLocale: LocaleTableProps['onEditLocale'] = (locale) => {\n    setLocaleToEdit(locale);\n  };\n\n  if (isLoading) {\n    return <LoadingIndicatorPage />;\n  }\n\n  return (\n    <Main tabIndex={-1}>\n      <HeaderLayout\n        primaryAction={\n          <Button\n            disabled={!canCreate}\n            startIcon={<Plus />}\n            onClick={handleToggleModalCreate}\n            size=\"S\"\n          >\n            {formatMessage({\n              id: getTranslation('Settings.list.actions.add'),\n              defaultMessage: 'Add new locale',\n            })}\n          </Button>\n        }\n        title={formatMessage({\n          id: getTranslation('plugin.name'),\n          defaultMessage: 'Internationalization',\n        })}\n        subtitle={formatMessage({\n          id: getTranslation('Settings.list.description'),\n          defaultMessage: 'Configure the settings',\n        })}\n      />\n      <ContentLayout>\n        {locales?.length > 0 ? (\n          <LocaleTable\n            locales={locales}\n            canDelete={canDelete}\n            canEdit={canUpdate}\n            onDeleteLocale={handleDeleteLocale}\n            onEditLocale={handleEditLocale}\n          />\n        ) : (\n          <EmptyStateLayout\n            icon={<EmptyDocuments width={undefined} height={undefined} />}\n            content={formatMessage({\n              id: getTranslation('Settings.list.empty.title'),\n              defaultMessage: 'There are no locales',\n            })}\n            action={\n              <Button\n                disabled={!canCreate}\n                variant=\"secondary\"\n                startIcon={<Plus />}\n                onClick={handleToggleModalCreate}\n              >\n                {formatMessage({\n                  id: getTranslation('Settings.list.actions.add'),\n                  defaultMessage: 'Add new locale',\n                })}\n              </Button>\n            }\n          />\n        )}\n      </ContentLayout>\n\n      {isOpenedCreateModal && <CreateModal onClose={handleToggleModalCreate} />}\n      {localeToEdit && <EditModal onClose={closeModalToEdit} locale={localeToEdit} />}\n      {localeToDelete && (\n        <DeleteModal localeToDelete={localeToDelete} onClose={closeModalToDelete} />\n      )}\n    </Main>\n  );\n};\n\nconst ProtectedSettingsPage = () => {\n  return (\n    <CheckPagePermissions permissions={PERMISSIONS.read}>\n      <SettingsPage />\n    </CheckPagePermissions>\n  );\n};\n\nexport { ProtectedSettingsPage, SettingsPage };\n"],"names":["data","BaseForm"],"mappings":"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"}