@akemona-org/strapi-plugin-i18n 3.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +19 -0
  3. package/admin/src/assets/images/logo.svg +1 -0
  4. package/admin/src/components/CMEditViewCopyLocale/index.js +183 -0
  5. package/admin/src/components/CMEditViewCopyLocale/utils/cleanData.js +36 -0
  6. package/admin/src/components/CMEditViewCopyLocale/utils/generateOptions.js +22 -0
  7. package/admin/src/components/CMEditViewCopyLocale/utils/index.js +2 -0
  8. package/admin/src/components/CMEditViewCopyLocale/utils/removePasswordAndRelationsFieldFromData.js +54 -0
  9. package/admin/src/components/CMEditViewCopyLocale/utils/tests/cleanData.test.js +83 -0
  10. package/admin/src/components/CMEditViewCopyLocale/utils/tests/data.js +219 -0
  11. package/admin/src/components/CMEditViewCopyLocale/utils/tests/generateOptions.test.js +79 -0
  12. package/admin/src/components/CMEditViewCopyLocale/utils/tests/removePasswordAndRelationsFieldFromData.test.js +40 -0
  13. package/admin/src/components/CMEditViewInjectedComponents/index.js +58 -0
  14. package/admin/src/components/CMEditViewLocalePicker/Option.js +66 -0
  15. package/admin/src/components/CMEditViewLocalePicker/Wrapper.js +8 -0
  16. package/admin/src/components/CMEditViewLocalePicker/index.js +160 -0
  17. package/admin/src/components/CMEditViewLocalePicker/utils/addStatusColorToLocale.js +24 -0
  18. package/admin/src/components/CMEditViewLocalePicker/utils/createLocalesOption.js +20 -0
  19. package/admin/src/components/CMEditViewLocalePicker/utils/index.js +2 -0
  20. package/admin/src/components/CheckboxConfirmation/Wrapper.js +12 -0
  21. package/admin/src/components/CheckboxConfirmation/index.js +70 -0
  22. package/admin/src/components/DeleteModalAdditionalInfos/index.js +25 -0
  23. package/admin/src/components/LocaleList/index.js +101 -0
  24. package/admin/src/components/LocaleListCell/LocaleListCell.js +90 -0
  25. package/admin/src/components/LocaleListCell/tests/LocaleListCell.test.js +128 -0
  26. package/admin/src/components/LocalePicker/index.js +126 -0
  27. package/admin/src/components/LocaleRow/index.js +77 -0
  28. package/admin/src/components/ModalCreate/AdvancedForm.js +45 -0
  29. package/admin/src/components/ModalCreate/BaseForm.js +103 -0
  30. package/admin/src/components/ModalCreate/index.js +136 -0
  31. package/admin/src/components/ModalDelete/index.js +49 -0
  32. package/admin/src/components/ModalEdit/AdvancedForm.js +51 -0
  33. package/admin/src/components/ModalEdit/BaseForm.js +91 -0
  34. package/admin/src/components/ModalEdit/index.js +122 -0
  35. package/admin/src/components/SettingsModal.js +66 -0
  36. package/admin/src/components/index.js +2 -0
  37. package/admin/src/containers/Initializer.js +31 -0
  38. package/admin/src/containers/SettingsPage/LocaleSettingsPage.js +69 -0
  39. package/admin/src/containers/SettingsPage/index.js +33 -0
  40. package/admin/src/containers/SettingsPage/tests/SettingsPage.test.js +744 -0
  41. package/admin/src/containers/SettingsPage/tests/__snapshots__/SettingsPage.test.js.snap +241 -0
  42. package/admin/src/hooks/constants.js +6 -0
  43. package/admin/src/hooks/reducers.js +63 -0
  44. package/admin/src/hooks/tests/reducers.test.js +203 -0
  45. package/admin/src/hooks/useAddLocale/index.js +60 -0
  46. package/admin/src/hooks/useContentTypePermissions/index.js +16 -0
  47. package/admin/src/hooks/useDefaultLocales/index.js +27 -0
  48. package/admin/src/hooks/useDeleteLocale/index.js +45 -0
  49. package/admin/src/hooks/useEditLocale/index.js +46 -0
  50. package/admin/src/hooks/useHasI18n/index.js +13 -0
  51. package/admin/src/hooks/useLocales/index.js +35 -0
  52. package/admin/src/index.js +169 -0
  53. package/admin/src/middlewares/addCommonFieldsToInitialDataMiddleware.js +83 -0
  54. package/admin/src/middlewares/addLocaleColumnToListViewMiddleware.js +32 -0
  55. package/admin/src/middlewares/addLocaleToCollectionTypesMiddleware.js +25 -0
  56. package/admin/src/middlewares/addLocaleToSingleTypesMiddleware.js +25 -0
  57. package/admin/src/middlewares/extendCMEditViewLayoutMiddleware.js +159 -0
  58. package/admin/src/middlewares/extendCTBAttributeInitialDataMiddleware.js +58 -0
  59. package/admin/src/middlewares/extendCTBInitialDataMiddleware.js +33 -0
  60. package/admin/src/middlewares/index.js +21 -0
  61. package/admin/src/middlewares/localePermissionMiddleware.js +39 -0
  62. package/admin/src/middlewares/tests/addCommonFieldsToInitialDataMiddleware.test.js +97 -0
  63. package/admin/src/middlewares/tests/addLocaleColumnToListViewMiddleware.test.js +68 -0
  64. package/admin/src/middlewares/tests/addLocaleToCollectionTypesMiddleware.test.js +200 -0
  65. package/admin/src/middlewares/tests/addLocaleToSingleTypesMiddleware.test.js +193 -0
  66. package/admin/src/middlewares/tests/extendCMEditViewLayoutMiddleware.test.js +556 -0
  67. package/admin/src/middlewares/tests/extendCTBAttrributeInitialDataMiddleware.test.js +124 -0
  68. package/admin/src/middlewares/tests/extendCTBInitialDataMiddleware.test.js +92 -0
  69. package/admin/src/middlewares/tests/localePermissionMiddleware.test.js +150 -0
  70. package/admin/src/middlewares/utils/addLocaleToLinksSearch.js +56 -0
  71. package/admin/src/middlewares/utils/tests/addLocaleToLinksSearch.test.js +137 -0
  72. package/admin/src/permissions.js +9 -0
  73. package/admin/src/pluginId.js +5 -0
  74. package/admin/src/schemas.js +7 -0
  75. package/admin/src/selectors/selectCollectionTypesRelatedPermissions.js +4 -0
  76. package/admin/src/selectors/selectI18nLocales.js +3 -0
  77. package/admin/src/translations/en.json +60 -0
  78. package/admin/src/translations/fr.json +9 -0
  79. package/admin/src/translations/index.js +11 -0
  80. package/admin/src/translations/zh-Hans.json +60 -0
  81. package/admin/src/utils/getDefaultLocale.js +60 -0
  82. package/admin/src/utils/getInitialLocale.js +14 -0
  83. package/admin/src/utils/getLocaleFromQuery.js +7 -0
  84. package/admin/src/utils/getTrad.js +5 -0
  85. package/admin/src/utils/index.js +2 -0
  86. package/admin/src/utils/localizedFields.js +23 -0
  87. package/admin/src/utils/mutateCTBContentTypeSchema.js +66 -0
  88. package/admin/src/utils/tests/getDefaultLocale.test.js +337 -0
  89. package/admin/src/utils/tests/getInitialLocale.test.js +106 -0
  90. package/admin/src/utils/tests/mutateCTBContentTypeSchema.test.js +205 -0
  91. package/config/functions/bootstrap.js +57 -0
  92. package/config/functions/migrations/__tests__/content-type.test.js +255 -0
  93. package/config/functions/migrations/__tests__/field.test.js +150 -0
  94. package/config/functions/migrations/content-type/disable/index.js +34 -0
  95. package/config/functions/migrations/content-type/disable/migrate-for-bookshelf.js +58 -0
  96. package/config/functions/migrations/content-type/disable/migrate-for-mongoose.js +39 -0
  97. package/config/functions/migrations/content-type/enable/index.js +40 -0
  98. package/config/functions/migrations/content-type/utils/index.js +27 -0
  99. package/config/functions/migrations/field/__tests__/utils.test.js +53 -0
  100. package/config/functions/migrations/field/index.js +37 -0
  101. package/config/functions/migrations/field/migrate-for-bookshelf.js +72 -0
  102. package/config/functions/migrations/field/migrate-for-mongoose.js +24 -0
  103. package/config/functions/migrations/field/migrate.js +55 -0
  104. package/config/functions/migrations/field/utils.js +58 -0
  105. package/config/functions/register.js +46 -0
  106. package/config/policies/validateLocaleCreation.js +68 -0
  107. package/config/routes.json +64 -0
  108. package/constants/__tests__/index.test.js +27 -0
  109. package/constants/index.js +36 -0
  110. package/constants/iso-locales.json +2002 -0
  111. package/controllers/__tests__/content-types.test.js +113 -0
  112. package/controllers/__tests__/iso-locales.test.js +26 -0
  113. package/controllers/__tests__/locales.test.js +308 -0
  114. package/controllers/content-types.js +64 -0
  115. package/controllers/iso-locales.js +11 -0
  116. package/controllers/locales.js +104 -0
  117. package/domain/locale.js +10 -0
  118. package/middlewares/i18n/defaults.json +5 -0
  119. package/middlewares/i18n/index.js +28 -0
  120. package/models/Locale.settings.json +31 -0
  121. package/oas.yml +195 -0
  122. package/package.json +31 -0
  123. package/services/__tests__/__snapshots__/iso-locales.test.js.snap +2006 -0
  124. package/services/__tests__/content-types.test.js +545 -0
  125. package/services/__tests__/core-api.test.js +106 -0
  126. package/services/__tests__/entity-service-decorator.test.js +280 -0
  127. package/services/__tests__/iso-locales.test.js +11 -0
  128. package/services/__tests__/locales.test.js +237 -0
  129. package/services/__tests__/localizations.test.js +187 -0
  130. package/services/__tests__/metrics.test.js +90 -0
  131. package/services/content-types.js +200 -0
  132. package/services/core-api.js +296 -0
  133. package/services/entity-service-decorator.js +155 -0
  134. package/services/iso-locales.js +9 -0
  135. package/services/locales.js +97 -0
  136. package/services/localizations.js +65 -0
  137. package/services/metrics.js +24 -0
  138. package/services/permissions/actions.js +124 -0
  139. package/services/permissions/engine.js +63 -0
  140. package/services/permissions/sections-builder.js +48 -0
  141. package/services/permissions.js +11 -0
  142. package/tests/content-manager/list-relation.test.e2e.js +122 -0
  143. package/tests/graphql.test.e2e.js +120 -0
  144. package/tests/locales.test.e2e.js +414 -0
  145. package/utils/index.js +20 -0
  146. package/validation/content-types.js +30 -0
  147. package/validation/locales.js +39 -0
@@ -0,0 +1,49 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { Text } from '@buffetjs/core';
4
+ import { ModalConfirm } from 'strapi-helper-plugin';
5
+ import { useIntl } from 'react-intl';
6
+ import useDeleteLocale from '../../hooks/useDeleteLocale';
7
+ import { getTrad } from '../../utils';
8
+
9
+ const ModalDelete = ({ localeToDelete, onClose }) => {
10
+ const { isDeleting, deleteLocale } = useDeleteLocale();
11
+ const { formatMessage } = useIntl();
12
+ const isOpened = Boolean(localeToDelete);
13
+
14
+ const handleDelete = () => deleteLocale(localeToDelete.id).then(onClose);
15
+
16
+ return (
17
+ <ModalConfirm
18
+ confirmButtonLabel={{
19
+ id: getTrad('Settings.locales.modal.delete.confirm'),
20
+ }}
21
+ showButtonLoader={isDeleting}
22
+ isOpen={isOpened}
23
+ toggle={onClose}
24
+ onClosed={onClose}
25
+ onConfirm={handleDelete}
26
+ type="warning"
27
+ content={{
28
+ id: getTrad(`Settings.locales.modal.delete.message`),
29
+ }}
30
+ >
31
+ <Text fontWeight="bold">
32
+ {formatMessage({ id: getTrad('Settings.locales.modal.delete.secondMessage') })}
33
+ </Text>
34
+ </ModalConfirm>
35
+ );
36
+ };
37
+
38
+ ModalDelete.defaultProps = {
39
+ localeToDelete: undefined,
40
+ };
41
+
42
+ ModalDelete.propTypes = {
43
+ localeToDelete: PropTypes.shape({
44
+ id: PropTypes.number.isRequired,
45
+ }),
46
+ onClose: PropTypes.func.isRequired,
47
+ };
48
+
49
+ export default ModalDelete;
@@ -0,0 +1,51 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { Text, Checkbox, Padded } from '@buffetjs/core';
4
+ import { useFormikContext } from 'formik';
5
+ import { useIntl } from 'react-intl';
6
+ import { BaselineAlignment } from 'strapi-helper-plugin';
7
+ import { getTrad } from '../../utils';
8
+
9
+ const AdvancedForm = ({ isDefaultLocale }) => {
10
+ const { values, setFieldValue } = useFormikContext();
11
+ const { formatMessage } = useIntl();
12
+
13
+ return (
14
+ <div>
15
+ <BaselineAlignment top size="2px" />
16
+ <Padded bottom size="sm">
17
+ <Text color="grey" textTransform="uppercase">
18
+ {formatMessage({
19
+ id: getTrad('Settings.locales.modal.advanced.settings'),
20
+ })}
21
+ </Text>
22
+ </Padded>
23
+
24
+ <BaselineAlignment top size="10px" />
25
+ <Checkbox
26
+ id="default-checkbox"
27
+ name="default-checkbox"
28
+ onChange={() => setFieldValue('isDefault', !values.isDefault)}
29
+ message={formatMessage({
30
+ id: getTrad('Settings.locales.modal.advanced.setAsDefault'),
31
+ })}
32
+ someChecked={false}
33
+ value={values.isDefault}
34
+ disabled={isDefaultLocale}
35
+ htmlFor="default-checkbox"
36
+ />
37
+
38
+ <Text color="grey" fontSize="sm">
39
+ {formatMessage({
40
+ id: getTrad('Settings.locales.modal.advanced.setAsDefault.hint'),
41
+ })}
42
+ </Text>
43
+ </div>
44
+ );
45
+ };
46
+
47
+ AdvancedForm.propTypes = {
48
+ isDefaultLocale: PropTypes.bool.isRequired,
49
+ };
50
+
51
+ export default AdvancedForm;
@@ -0,0 +1,91 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { Label } from '@buffetjs/core';
4
+ import { Inputs } from '@buffetjs/custom';
5
+ import Select from 'react-select';
6
+ import { Col, Row } from 'reactstrap';
7
+ import { useIntl } from 'react-intl';
8
+ import { useTheme } from 'styled-components';
9
+ import { BaselineAlignment, selectStyles, DropdownIndicator } from 'strapi-helper-plugin';
10
+ import { useFormikContext } from 'formik';
11
+ import { getTrad } from '../../utils';
12
+
13
+ const BaseForm = ({ options, defaultOption }) => {
14
+ const { formatMessage } = useIntl();
15
+ const { values, handleChange } = useFormikContext();
16
+ const theme = useTheme();
17
+ const styles = selectStyles(theme);
18
+
19
+ return (
20
+ <Row>
21
+ <Col>
22
+ <span id="locale-code">
23
+ <Label htmlFor="">
24
+ {formatMessage({
25
+ id: getTrad('Settings.locales.modal.edit.locales.label'),
26
+ })}
27
+ </Label>
28
+ </span>
29
+
30
+ <BaselineAlignment top size="5px" />
31
+
32
+ <Select
33
+ aria-labelledby="locale-code"
34
+ options={options}
35
+ defaultValue={defaultOption}
36
+ isDisabled
37
+ components={{ DropdownIndicator }}
38
+ styles={{
39
+ ...styles,
40
+ control: (base, state) => ({ ...base, ...styles.control(base, state), height: '34px' }),
41
+ indicatorsContainer: (base, state) => ({
42
+ ...base,
43
+ ...styles.indicatorsContainer(base, state),
44
+ height: '32px',
45
+ }),
46
+ }}
47
+ />
48
+ </Col>
49
+ <Col>
50
+ <BaselineAlignment top size="2px" />
51
+
52
+ <Inputs
53
+ label={formatMessage({
54
+ id: getTrad('Settings.locales.modal.locales.displayName'),
55
+ })}
56
+ name="displayName"
57
+ description={formatMessage({
58
+ id: getTrad('Settings.locales.modal.locales.displayName.description'),
59
+ })}
60
+ type="text"
61
+ value={values.displayName}
62
+ onChange={handleChange}
63
+ validations={{
64
+ max: 50,
65
+ }}
66
+ translatedErrors={{
67
+ max: formatMessage({
68
+ id: getTrad('Settings.locales.modal.locales.displayName.error'),
69
+ }),
70
+ }}
71
+ />
72
+ </Col>
73
+ </Row>
74
+ );
75
+ };
76
+
77
+ BaseForm.defaultProps = {
78
+ defaultOption: undefined,
79
+ };
80
+
81
+ BaseForm.propTypes = {
82
+ options: PropTypes.arrayOf(
83
+ PropTypes.exact({ value: PropTypes.number.isRequired, label: PropTypes.string.isRequired })
84
+ ).isRequired,
85
+ defaultOption: PropTypes.exact({
86
+ value: PropTypes.number.isRequired,
87
+ label: PropTypes.string.isRequired,
88
+ }),
89
+ };
90
+
91
+ export default BaseForm;
@@ -0,0 +1,122 @@
1
+ import React, { useRef } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { Modal, ModalFooter, TabPanel, useGlobalContext } from 'strapi-helper-plugin';
4
+ import { useIntl } from 'react-intl';
5
+ import { Button } from '@buffetjs/core';
6
+ import { Formik } from 'formik';
7
+ import localeFormSchema from '../../schemas';
8
+ import useEditLocale from '../../hooks/useEditLocale';
9
+ import { getTrad } from '../../utils';
10
+ import BaseForm from './BaseForm';
11
+ import AdvancedForm from './AdvancedForm';
12
+ import SettingsModal from '../SettingsModal';
13
+
14
+ const ModalEdit = ({ localeToEdit, onClose, locales }) => {
15
+ const { isEditing, editLocale } = useEditLocale();
16
+ const shouldUpdateMenu = useRef(false);
17
+ const { updateMenu } = useGlobalContext();
18
+ const { formatMessage } = useIntl();
19
+ const isOpened = Boolean(localeToEdit);
20
+
21
+ const handleSubmit = ({ displayName, isDefault }) => {
22
+ const id = localeToEdit.id;
23
+ const name = displayName || localeToEdit.code;
24
+
25
+ return editLocale(id, { name, isDefault })
26
+ .then(() => {
27
+ shouldUpdateMenu.current = true;
28
+ })
29
+ .then(onClose);
30
+ };
31
+
32
+ const handleClose = () => {
33
+ if (shouldUpdateMenu.current) {
34
+ updateMenu();
35
+ }
36
+
37
+ shouldUpdateMenu.current = false;
38
+ };
39
+
40
+ let options = [];
41
+ let defaultOption;
42
+
43
+ if (localeToEdit) {
44
+ options = locales.map(locale => ({ label: locale.code, value: locale.id }));
45
+ defaultOption = options.find(option => option.value === localeToEdit.id);
46
+ }
47
+
48
+ return (
49
+ <Modal isOpen={isOpened} onToggle={onClose} onClosed={handleClose}>
50
+ <Formik
51
+ initialValues={{
52
+ displayName: localeToEdit ? localeToEdit.name : '',
53
+ isDefault: localeToEdit ? localeToEdit.isDefault : false,
54
+ }}
55
+ onSubmit={handleSubmit}
56
+ validationSchema={localeFormSchema}
57
+ >
58
+ {({ handleSubmit, errors }) => (
59
+ <form onSubmit={handleSubmit}>
60
+ <SettingsModal
61
+ title={formatMessage({
62
+ id: getTrad('Settings.locales.modal.title'),
63
+ })}
64
+ breadCrumb={[getTrad('Settings.list.actions.edit')]}
65
+ tabsAriaLabel={formatMessage({
66
+ id: getTrad('Settings.locales.modal.edit.tab.label'),
67
+ })}
68
+ tabsId="i18n-settings-tabs-edit"
69
+ >
70
+ <TabPanel>
71
+ <BaseForm options={options} defaultOption={defaultOption} />
72
+ </TabPanel>
73
+ <TabPanel>
74
+ <AdvancedForm isDefaultLocale={Boolean(localeToEdit && localeToEdit.isDefault)} />
75
+ </TabPanel>
76
+ </SettingsModal>
77
+
78
+ <ModalFooter>
79
+ <section>
80
+ <Button type="button" color="cancel" onClick={onClose}>
81
+ {formatMessage({ id: 'app.components.Button.cancel' })}
82
+ </Button>
83
+ <Button
84
+ color="success"
85
+ type="submit"
86
+ isLoading={isEditing}
87
+ disabled={Object.keys(errors).length > 0}
88
+ >
89
+ {formatMessage({ id: getTrad('Settings.locales.modal.edit.confirmation') })}
90
+ </Button>
91
+ </section>
92
+ </ModalFooter>
93
+ </form>
94
+ )}
95
+ </Formik>
96
+ </Modal>
97
+ );
98
+ };
99
+
100
+ ModalEdit.defaultProps = {
101
+ localeToEdit: undefined,
102
+ locales: [],
103
+ };
104
+
105
+ ModalEdit.propTypes = {
106
+ localeToEdit: PropTypes.shape({
107
+ id: PropTypes.number.isRequired,
108
+ name: PropTypes.string.isRequired,
109
+ code: PropTypes.string.isRequired,
110
+ isDefault: PropTypes.bool.isRequired,
111
+ }),
112
+ onClose: PropTypes.func.isRequired,
113
+ locales: PropTypes.arrayOf(
114
+ PropTypes.shape({
115
+ id: PropTypes.number,
116
+ name: PropTypes.string,
117
+ code: PropTypes.string,
118
+ })
119
+ ),
120
+ };
121
+
122
+ export default ModalEdit;
@@ -0,0 +1,66 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import {
4
+ ModalHeader,
5
+ HeaderModal,
6
+ HeaderModalTitle,
7
+ ModalForm,
8
+ Tabs,
9
+ TabsNav,
10
+ Tab,
11
+ TabsPanel,
12
+ } from 'strapi-helper-plugin';
13
+ import { useIntl } from 'react-intl';
14
+ import { getTrad } from '../utils';
15
+
16
+ const SettingsModal = ({ children, title, breadCrumb, tabsAriaLabel, tabsId }) => {
17
+ const { formatMessage } = useIntl();
18
+
19
+ return (
20
+ <>
21
+ <HeaderModal>
22
+ <ModalHeader headerBreadcrumbs={breadCrumb} />
23
+ </HeaderModal>
24
+
25
+ <div className="container-fluid">
26
+ <div className="container-fluid">
27
+ <HeaderModalTitle
28
+ style={{
29
+ fontSize: '1.8rem',
30
+ height: '65px',
31
+ fontWeight: 'bold',
32
+ alignItems: 'center',
33
+ marginBottom: '-39px',
34
+ paddingTop: '16px',
35
+ }}
36
+ >
37
+ {title}
38
+ </HeaderModalTitle>
39
+
40
+ <ModalForm>
41
+ <div style={{ marginTop: '-40px' }}>
42
+ <TabsNav defaultSelection={0} label={tabsAriaLabel} id={tabsId}>
43
+ <Tabs position="right">
44
+ <Tab>{formatMessage({ id: getTrad('Settings.locales.modal.base') })}</Tab>
45
+ <Tab>{formatMessage({ id: getTrad('Settings.locales.modal.advanced') })}</Tab>
46
+ </Tabs>
47
+
48
+ <TabsPanel>{children}</TabsPanel>
49
+ </TabsNav>
50
+ </div>
51
+ </ModalForm>
52
+ </div>
53
+ </div>
54
+ </>
55
+ );
56
+ };
57
+
58
+ SettingsModal.propTypes = {
59
+ children: PropTypes.node.isRequired,
60
+ title: PropTypes.string.isRequired,
61
+ breadCrumb: PropTypes.arrayOf(PropTypes.string).isRequired,
62
+ tabsAriaLabel: PropTypes.string.isRequired,
63
+ tabsId: PropTypes.string.isRequired,
64
+ };
65
+
66
+ export default SettingsModal;
@@ -0,0 +1,2 @@
1
+ // eslint-disable-next-line import/prefer-default-export
2
+ export { default as LocaleRow } from './LocaleRow';
@@ -0,0 +1,31 @@
1
+ /**
2
+ *
3
+ * Initializer
4
+ *
5
+ */
6
+
7
+ import { useEffect, useRef } from 'react';
8
+ import PropTypes from 'prop-types';
9
+ import pluginId from '../pluginId';
10
+ import useLocales from '../hooks/useLocales';
11
+
12
+ const Initializer = ({ updatePlugin }) => {
13
+ const { isLoading, locales } = useLocales();
14
+ const ref = useRef();
15
+
16
+ ref.current = updatePlugin;
17
+
18
+ useEffect(() => {
19
+ if (!isLoading && locales.length > 0) {
20
+ ref.current(pluginId, 'isReady', true);
21
+ }
22
+ }, [isLoading, locales]);
23
+
24
+ return null;
25
+ };
26
+
27
+ Initializer.propTypes = {
28
+ updatePlugin: PropTypes.func.isRequired,
29
+ };
30
+
31
+ export default Initializer;
@@ -0,0 +1,69 @@
1
+ import React, { useState } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { useIntl } from 'react-intl';
4
+ import { BaselineAlignment } from 'strapi-helper-plugin';
5
+ import { Header } from '@buffetjs/custom';
6
+ import { Button } from '@buffetjs/core';
7
+ import { getTrad } from '../../utils';
8
+ import LocaleList from '../../components/LocaleList';
9
+
10
+ const LocaleSettingsPage = ({
11
+ canReadLocale,
12
+ canCreateLocale,
13
+ canDeleteLocale,
14
+ canUpdateLocale,
15
+ }) => {
16
+ const { formatMessage } = useIntl();
17
+ const [isOpenedCreateModal, setIsOpenedCreateModal] = useState(false);
18
+
19
+ const handleToggleModalCreate = canCreateLocale
20
+ ? () => setIsOpenedCreateModal(s => !s)
21
+ : undefined;
22
+
23
+ const actions = [
24
+ {
25
+ label: formatMessage({ id: getTrad('Settings.list.actions.add') }),
26
+ onClick: handleToggleModalCreate,
27
+ color: 'primary',
28
+ type: 'button',
29
+ icon: true,
30
+ Component: props => (canCreateLocale ? <Button {...props} /> : null),
31
+ style: {
32
+ paddingLeft: 15,
33
+ paddingRight: 15,
34
+ },
35
+ },
36
+ ];
37
+
38
+ return (
39
+ <>
40
+ <Header
41
+ title={{
42
+ label: formatMessage({ id: getTrad('plugin.name') }),
43
+ }}
44
+ content={formatMessage({ id: getTrad('Settings.list.description') })}
45
+ actions={actions}
46
+ />
47
+
48
+ <BaselineAlignment top size="3px" />
49
+
50
+ {canReadLocale ? (
51
+ <LocaleList
52
+ canUpdateLocale={canUpdateLocale}
53
+ canDeleteLocale={canDeleteLocale}
54
+ onToggleCreateModal={handleToggleModalCreate}
55
+ isCreating={isOpenedCreateModal}
56
+ />
57
+ ) : null}
58
+ </>
59
+ );
60
+ };
61
+
62
+ LocaleSettingsPage.propTypes = {
63
+ canReadLocale: PropTypes.bool.isRequired,
64
+ canCreateLocale: PropTypes.bool.isRequired,
65
+ canUpdateLocale: PropTypes.bool.isRequired,
66
+ canDeleteLocale: PropTypes.bool.isRequired,
67
+ };
68
+
69
+ export default LocaleSettingsPage;
@@ -0,0 +1,33 @@
1
+ import React from 'react';
2
+ import { useUserPermissions } from 'strapi-helper-plugin';
3
+ import { useIntl } from 'react-intl';
4
+ import LocaleSettingsPage from './LocaleSettingsPage';
5
+ import i18nPermissions from '../../permissions';
6
+ import { getTrad } from '../../utils';
7
+
8
+ const ProtectedLocaleSettingsPage = () => {
9
+ const { formatMessage } = useIntl();
10
+ const {
11
+ isLoading,
12
+ allowedActions: { canRead, canUpdate, canCreate, canDelete },
13
+ } = useUserPermissions(i18nPermissions);
14
+
15
+ if (isLoading) {
16
+ return (
17
+ <div>
18
+ <p>{formatMessage({ id: getTrad('Settings.permissions.loading') })}</p>
19
+ </div>
20
+ );
21
+ }
22
+
23
+ return (
24
+ <LocaleSettingsPage
25
+ canReadLocale={canRead}
26
+ canCreateLocale={canCreate}
27
+ canUpdateLocale={canUpdate}
28
+ canDeleteLocale={canDelete}
29
+ />
30
+ );
31
+ };
32
+
33
+ export default ProtectedLocaleSettingsPage;