@strapi/i18n 0.0.0-experimental.e60ec1829240dae21c1e1d29076681c322288813 → 0.0.0-experimental.e8d8fc824d0f6a695b2a9ebaa4680ed21c3645ca
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.
- package/LICENSE +18 -3
- package/dist/_chunks/{SettingsPage-CeqfDjsb.mjs → SettingsPage-B6QDUmu9.mjs} +117 -128
- package/dist/_chunks/SettingsPage-B6QDUmu9.mjs.map +1 -0
- package/dist/_chunks/{SettingsPage-Djqsdrzs.js → SettingsPage-BsHtr3lV.js} +118 -130
- package/dist/_chunks/SettingsPage-BsHtr3lV.js.map +1 -0
- package/dist/_chunks/{en-BuBc6LKZ.js → en-BKBz3tro.js} +14 -2
- package/dist/_chunks/en-BKBz3tro.js.map +1 -0
- package/dist/_chunks/{en-CnrTsjWS.mjs → en-DlXfy6Gy.mjs} +14 -2
- package/dist/_chunks/en-DlXfy6Gy.mjs.map +1 -0
- package/dist/_chunks/index-3XgwXL6T.js +1628 -0
- package/dist/_chunks/index-3XgwXL6T.js.map +1 -0
- package/dist/_chunks/index-iEQ79W05.mjs +1607 -0
- package/dist/_chunks/index-iEQ79W05.mjs.map +1 -0
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.mjs +2 -2
- package/dist/admin/src/components/BulkLocaleActionModal.d.ts +16 -0
- package/dist/admin/src/components/CMHeaderActions.d.ts +35 -3
- package/dist/admin/src/components/CreateLocale.d.ts +6 -6
- package/dist/admin/src/components/EditLocale.d.ts +5 -4
- package/dist/admin/src/components/LocaleListCell.d.ts +4 -4
- package/dist/admin/src/contentReleasesHooks/releaseDetailsView.d.ts +9 -5
- package/dist/admin/src/services/api.d.ts +2 -3
- package/dist/admin/src/services/locales.d.ts +1 -1
- package/dist/admin/src/services/relations.d.ts +7 -0
- package/dist/admin/src/utils/baseQuery.d.ts +4 -19
- package/dist/admin/src/utils/clean.d.ts +4 -0
- package/dist/admin/src/utils/schemas.d.ts +1 -0
- package/dist/server/index.js +418 -478
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +419 -478
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/src/bootstrap.d.ts +1 -4
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +21 -13
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +20 -10
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/permissions/actions.d.ts +14 -2
- package/dist/server/src/services/permissions/actions.d.ts.map +1 -1
- package/dist/server/src/services/permissions.d.ts +14 -2
- package/dist/server/src/services/permissions.d.ts.map +1 -1
- package/dist/server/src/services/sanitize/index.d.ts +11 -0
- package/dist/server/src/services/sanitize/index.d.ts.map +1 -0
- package/dist/server/src/utils/index.d.ts +2 -2
- package/dist/server/src/utils/index.d.ts.map +1 -1
- package/dist/shared/contracts/content-manager.d.ts +20 -1
- package/package.json +19 -20
- package/dist/_chunks/SettingsPage-CeqfDjsb.mjs.map +0 -1
- package/dist/_chunks/SettingsPage-Djqsdrzs.js.map +0 -1
- package/dist/_chunks/en-BuBc6LKZ.js.map +0 -1
- package/dist/_chunks/en-CnrTsjWS.mjs.map +0 -1
- package/dist/_chunks/index-BDU1w_fd.mjs +0 -1058
- package/dist/_chunks/index-BDU1w_fd.mjs.map +0 -1
- package/dist/_chunks/index-DMXJeGjN.js +0 -1082
- package/dist/_chunks/index-DMXJeGjN.js.map +0 -1
- package/dist/admin/src/components/Initializer.d.ts +0 -5
- package/dist/server/src/migrations/content-type/disable/index.d.ts +0 -3
- package/dist/server/src/migrations/content-type/disable/index.d.ts.map +0 -1
- package/dist/server/src/migrations/content-type/enable/index.d.ts +0 -3
- package/dist/server/src/migrations/content-type/enable/index.d.ts.map +0 -1
- package/dist/server/src/services/entity-service-decorator.d.ts +0 -29
- package/dist/server/src/services/entity-service-decorator.d.ts.map +0 -1
- package/strapi-server.js +0 -3
package/LICENSE
CHANGED
@@ -2,7 +2,21 @@ Copyright (c) 2015-present Strapi Solutions SAS
|
|
2
2
|
|
3
3
|
Portions of the Strapi software are licensed as follows:
|
4
4
|
|
5
|
-
* All software that resides under an "ee/" directory (the “EE Software”), if that directory exists, is licensed under the license defined
|
5
|
+
* All software that resides under an "ee/" directory (the “EE Software”), if that directory exists, is licensed under the license defined below.
|
6
|
+
|
7
|
+
Enterprise License
|
8
|
+
|
9
|
+
If you or the company you represent has entered into a written agreement referencing the Enterprise Edition of the Strapi source code available at
|
10
|
+
https://github.com/strapi/strapi, then such agreement applies to your use of the Enterprise Edition of the Strapi Software. If you or the company you
|
11
|
+
represent is using the Enterprise Edition of the Strapi Software in connection with a subscription to our cloud offering, then the agreement you have
|
12
|
+
agreed to with respect to our cloud offering and the licenses included in such agreement apply to your use of the Enterprise Edition of the Strapi Software.
|
13
|
+
Otherwise, the Strapi Enterprise Software License Agreement (found here https://strapi.io/enterprise-terms) applies to your use of the Enterprise Edition of the Strapi Software.
|
14
|
+
|
15
|
+
BY ACCESSING OR USING THE ENTERPRISE EDITION OF THE STRAPI SOFTWARE, YOU ARE AGREEING TO BE BOUND BY THE RELEVANT REFERENCED AGREEMENT.
|
16
|
+
IF YOU ARE NOT AUTHORIZED TO ACCEPT THESE TERMS ON BEHALF OF THE COMPANY YOU REPRESENT OR IF YOU DO NOT AGREE TO ALL OF THE RELEVANT TERMS AND CONDITIONS REFERENCED AND YOU
|
17
|
+
HAVE NOT OTHERWISE EXECUTED A WRITTEN AGREEMENT WITH STRAPI, YOU ARE NOT AUTHORIZED TO ACCESS OR USE OR ALLOW ANY USER TO ACCESS OR USE ANY PART OF
|
18
|
+
THE ENTERPRISE EDITION OF THE STRAPI SOFTWARE. YOUR ACCESS RIGHTS ARE CONDITIONAL ON YOUR CONSENT TO THE RELEVANT REFERENCED TERMS TO THE EXCLUSION OF ALL OTHER TERMS;
|
19
|
+
IF THE RELEVANT REFERENCED TERMS ARE CONSIDERED AN OFFER BY YOU, ACCEPTANCE IS EXPRESSLY LIMITED TO THE RELEVANT REFERENCED TERMS.
|
6
20
|
|
7
21
|
* All software outside of the above-mentioned directories or restrictions above is available under the "MIT Expat" license as set forth below.
|
8
22
|
|
@@ -18,5 +32,6 @@ furnished to do so, subject to the following conditions:
|
|
18
32
|
The above copyright notice and this permission notice shall be included in all
|
19
33
|
copies or substantial portions of the Software.
|
20
34
|
|
21
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
22
|
-
|
35
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
36
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
37
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
@@ -1,17 +1,20 @@
|
|
1
|
-
import { jsxs,
|
1
|
+
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
2
2
|
import * as React from "react";
|
3
3
|
import { useNotification, useAPIErrorHandler, useAuth, Form, useForm, InputRenderer, useField, ConfirmDialog, useRBAC, Page, Layouts } from "@strapi/admin/strapi-admin";
|
4
|
-
import {
|
4
|
+
import { Modal, Button, useId, Tabs, Flex, Typography, Divider, Box, Grid, Field, SingleSelect, SingleSelectOption, Dialog, IconButton, Table, Thead, Tr, Th, VisuallyHidden, Tbody, Td, EmptyStateLayout } from "@strapi/design-system";
|
5
5
|
import { EmptyDocuments } from "@strapi/icons/symbols";
|
6
6
|
import { useIntl } from "react-intl";
|
7
7
|
import { Plus, Check, Trash, Pencil } from "@strapi/icons";
|
8
8
|
import * as yup from "yup";
|
9
|
-
import { g as getTranslation, u as useCreateLocaleMutation, a as useGetDefaultLocalesQuery, b as
|
9
|
+
import { g as getTranslation, u as useCreateLocaleMutation, a as useGetDefaultLocalesQuery, b as useDeleteLocaleMutation, c as useUpdateLocaleMutation, d as useGetLocalesQuery, P as PERMISSIONS } from "./index-iEQ79W05.mjs";
|
10
|
+
const isBaseQueryError = (error) => {
|
11
|
+
return error.name !== void 0;
|
12
|
+
};
|
10
13
|
const CreateLocale = ({ disabled, variant = "default" }) => {
|
11
14
|
const { formatMessage } = useIntl();
|
12
15
|
const [visible, setVisible] = React.useState(false);
|
13
|
-
return /* @__PURE__ */ jsxs(
|
14
|
-
/* @__PURE__ */ jsx(
|
16
|
+
return /* @__PURE__ */ jsxs(Modal.Root, { open: visible, onOpenChange: setVisible, children: [
|
17
|
+
/* @__PURE__ */ jsx(Modal.Trigger, { children: /* @__PURE__ */ jsx(
|
15
18
|
Button,
|
16
19
|
{
|
17
20
|
variant,
|
@@ -24,16 +27,16 @@ const CreateLocale = ({ disabled, variant = "default" }) => {
|
|
24
27
|
defaultMessage: "Add new locale"
|
25
28
|
})
|
26
29
|
}
|
27
|
-
),
|
28
|
-
|
30
|
+
) }),
|
31
|
+
/* @__PURE__ */ jsx(CreateModal, { onClose: () => setVisible(false) })
|
29
32
|
] });
|
30
33
|
};
|
31
34
|
const LOCALE_SCHEMA = yup.object().shape({
|
32
|
-
code: yup.string().required({
|
35
|
+
code: yup.string().nullable().required({
|
33
36
|
id: "Settings.locales.modal.create.code.error",
|
34
37
|
defaultMessage: "Please select a locale"
|
35
38
|
}),
|
36
|
-
name: yup.string().max(50, {
|
39
|
+
name: yup.string().nullable().max(50, {
|
37
40
|
id: "Settings.locales.modal.create.name.error.min",
|
38
41
|
defaultMessage: "The locale display name can only be less than 50 characters."
|
39
42
|
}).required({
|
@@ -48,6 +51,7 @@ const initialFormValues = {
|
|
48
51
|
isDefault: false
|
49
52
|
};
|
50
53
|
const CreateModal = ({ onClose }) => {
|
54
|
+
const titleId = useId();
|
51
55
|
const { toggleNotification } = useNotification();
|
52
56
|
const {
|
53
57
|
_unstableFormatAPIError: formatAPIError,
|
@@ -86,8 +90,7 @@ const CreateModal = ({ onClose }) => {
|
|
86
90
|
});
|
87
91
|
}
|
88
92
|
};
|
89
|
-
|
90
|
-
return /* @__PURE__ */ jsx(ModalLayout, { onClose, labelledBy: titleId, children: /* @__PURE__ */ jsxs(
|
93
|
+
return /* @__PURE__ */ jsx(Modal.Content, { children: /* @__PURE__ */ jsxs(
|
91
94
|
Form,
|
92
95
|
{
|
93
96
|
method: "POST",
|
@@ -95,50 +98,37 @@ const CreateModal = ({ onClose }) => {
|
|
95
98
|
validationSchema: LOCALE_SCHEMA,
|
96
99
|
onSubmit: handleSubmit,
|
97
100
|
children: [
|
98
|
-
/* @__PURE__ */ jsx(
|
101
|
+
/* @__PURE__ */ jsx(Modal.Header, { children: /* @__PURE__ */ jsx(Modal.Title, { children: formatMessage({
|
99
102
|
id: getTranslation("Settings.list.actions.add"),
|
100
103
|
defaultMessage: "Add new locale"
|
101
104
|
}) }) }),
|
102
|
-
/* @__PURE__ */ jsx(
|
103
|
-
|
104
|
-
|
105
|
-
label: formatMessage({
|
105
|
+
/* @__PURE__ */ jsx(Modal.Body, { children: /* @__PURE__ */ jsxs(Tabs.Root, { variant: "simple", defaultValue: "basic", children: [
|
106
|
+
/* @__PURE__ */ jsxs(Flex, { justifyContent: "space-between", children: [
|
107
|
+
/* @__PURE__ */ jsx(Typography, { tag: "h2", variant: "beta", id: titleId, children: formatMessage({
|
106
108
|
id: getTranslation("Settings.locales.modal.title"),
|
107
|
-
defaultMessage: "
|
108
|
-
}),
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
/* @__PURE__ */ jsx(TabPanel, { children: /* @__PURE__ */ jsx(AdvancedForm, {}) })
|
131
|
-
] }) })
|
132
|
-
]
|
133
|
-
}
|
134
|
-
) }),
|
135
|
-
/* @__PURE__ */ jsx(
|
136
|
-
ModalFooter,
|
137
|
-
{
|
138
|
-
startActions: /* @__PURE__ */ jsx(Button, { variant: "tertiary", onClick: onClose, children: formatMessage({ id: "app.components.Button.cancel", defaultMessage: "Cancel" }) }),
|
139
|
-
endActions: /* @__PURE__ */ jsx(SubmitButton, {})
|
140
|
-
}
|
141
|
-
)
|
109
|
+
defaultMessage: "Configuration"
|
110
|
+
}) }),
|
111
|
+
/* @__PURE__ */ jsxs(Tabs.List, { "aria-labelledby": titleId, children: [
|
112
|
+
/* @__PURE__ */ jsx(Tabs.Trigger, { value: "basic", children: formatMessage({
|
113
|
+
id: getTranslation("Settings.locales.modal.base"),
|
114
|
+
defaultMessage: "Basic settings"
|
115
|
+
}) }),
|
116
|
+
/* @__PURE__ */ jsx(Tabs.Trigger, { value: "advanced", children: formatMessage({
|
117
|
+
id: getTranslation("Settings.locales.modal.advanced"),
|
118
|
+
defaultMessage: "Advanced settings"
|
119
|
+
}) })
|
120
|
+
] })
|
121
|
+
] }),
|
122
|
+
/* @__PURE__ */ jsx(Divider, {}),
|
123
|
+
/* @__PURE__ */ jsxs(Box, { paddingTop: 7, paddingBottom: 7, children: [
|
124
|
+
/* @__PURE__ */ jsx(Tabs.Content, { value: "basic", children: /* @__PURE__ */ jsx(BaseForm, {}) }),
|
125
|
+
/* @__PURE__ */ jsx(Tabs.Content, { value: "advanced", children: /* @__PURE__ */ jsx(AdvancedForm, {}) })
|
126
|
+
] })
|
127
|
+
] }) }),
|
128
|
+
/* @__PURE__ */ jsxs(Modal.Footer, { children: [
|
129
|
+
/* @__PURE__ */ jsx(Modal.Close, { children: /* @__PURE__ */ jsx(Button, { variant: "tertiary", children: formatMessage({ id: "app.components.Button.cancel", defaultMessage: "Cancel" }) }) }),
|
130
|
+
/* @__PURE__ */ jsx(SubmitButton, {})
|
131
|
+
] })
|
142
132
|
]
|
143
133
|
}
|
144
134
|
) });
|
@@ -153,8 +143,7 @@ const BaseForm = ({ mode = "create" }) => {
|
|
153
143
|
const { formatMessage } = useIntl();
|
154
144
|
const { toggleNotification } = useNotification();
|
155
145
|
const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
|
156
|
-
const { data: defaultLocales
|
157
|
-
const { data: locales = [] } = useGetLocalesQuery();
|
146
|
+
const { data: defaultLocales, error } = useGetDefaultLocalesQuery();
|
158
147
|
React.useEffect(() => {
|
159
148
|
if (error) {
|
160
149
|
toggleNotification({
|
@@ -163,7 +152,7 @@ const BaseForm = ({ mode = "create" }) => {
|
|
163
152
|
});
|
164
153
|
}
|
165
154
|
}, [error, formatAPIError, toggleNotification]);
|
166
|
-
if (!Array.isArray(defaultLocales)
|
155
|
+
if (!Array.isArray(defaultLocales)) {
|
167
156
|
return null;
|
168
157
|
}
|
169
158
|
const options = defaultLocales.map((locale) => ({
|
@@ -207,7 +196,7 @@ const BaseForm = ({ mode = "create" }) => {
|
|
207
196
|
label: formatMessage(field.label),
|
208
197
|
placeholder: field.placeholder ? formatMessage(field.placeholder) : void 0
|
209
198
|
}));
|
210
|
-
return /* @__PURE__ */ jsx(Grid, { gap: 4, children: translatedForm.map(({ size, ...field }) => /* @__PURE__ */ jsx(
|
199
|
+
return /* @__PURE__ */ jsx(Grid.Root, { gap: 4, children: translatedForm.map(({ size, ...field }) => /* @__PURE__ */ jsx(Grid.Item, { col: size, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsx(FormRenderer, { ...field }) }, field.name)) });
|
211
200
|
};
|
212
201
|
const AdvancedForm = ({ isDefaultLocale }) => {
|
213
202
|
const { formatMessage } = useIntl();
|
@@ -231,7 +220,7 @@ const AdvancedForm = ({ isDefaultLocale }) => {
|
|
231
220
|
hint: field.hint ? formatMessage(field.hint) : void 0,
|
232
221
|
label: formatMessage(field.label)
|
233
222
|
}));
|
234
|
-
return /* @__PURE__ */ jsx(Grid, { gap: 4, children: form.map(({ size, ...field }) => /* @__PURE__ */ jsx(
|
223
|
+
return /* @__PURE__ */ jsx(Grid.Root, { gap: 4, children: form.map(({ size, ...field }) => /* @__PURE__ */ jsx(Grid.Item, { col: size, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsx(FormRenderer, { ...field }) }, field.name)) });
|
235
224
|
};
|
236
225
|
const FormRenderer = (field) => {
|
237
226
|
switch (field.type) {
|
@@ -261,21 +250,21 @@ const EnumerationInput = ({
|
|
261
250
|
onChange(name, value2);
|
262
251
|
}
|
263
252
|
};
|
264
|
-
return /* @__PURE__ */
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
}
|
278
|
-
);
|
253
|
+
return /* @__PURE__ */ jsxs(Field.Root, { error, hint, name, required, children: [
|
254
|
+
/* @__PURE__ */ jsx(Field.Label, { children: label }),
|
255
|
+
/* @__PURE__ */ jsx(
|
256
|
+
SingleSelect,
|
257
|
+
{
|
258
|
+
disabled,
|
259
|
+
onChange: handleChange,
|
260
|
+
placeholder,
|
261
|
+
value,
|
262
|
+
children: options.map((option) => /* @__PURE__ */ jsx(SingleSelectOption, { value: option.value, children: option.label }, option.value))
|
263
|
+
}
|
264
|
+
),
|
265
|
+
/* @__PURE__ */ jsx(Field.Error, {}),
|
266
|
+
/* @__PURE__ */ jsx(Field.Hint, {})
|
267
|
+
] });
|
279
268
|
};
|
280
269
|
const DeleteLocale = ({ id, name }) => {
|
281
270
|
const { formatMessage } = useIntl();
|
@@ -297,6 +286,7 @@ const DeleteLocale = ({ id, name }) => {
|
|
297
286
|
defaultMessage: "Deleted locale"
|
298
287
|
})
|
299
288
|
});
|
289
|
+
setVisible(false);
|
300
290
|
} catch (err) {
|
301
291
|
toggleNotification({
|
302
292
|
type: "danger",
|
@@ -307,8 +297,8 @@ const DeleteLocale = ({ id, name }) => {
|
|
307
297
|
});
|
308
298
|
}
|
309
299
|
};
|
310
|
-
return /* @__PURE__ */ jsxs(
|
311
|
-
/* @__PURE__ */ jsx(
|
300
|
+
return /* @__PURE__ */ jsxs(Dialog.Root, { open: visible, onOpenChange: setVisible, children: [
|
301
|
+
/* @__PURE__ */ jsx(Dialog.Trigger, { children: /* @__PURE__ */ jsx(
|
312
302
|
IconButton,
|
313
303
|
{
|
314
304
|
onClick: () => setVisible(true),
|
@@ -321,11 +311,11 @@ const DeleteLocale = ({ id, name }) => {
|
|
321
311
|
name
|
322
312
|
}
|
323
313
|
),
|
324
|
-
|
325
|
-
|
314
|
+
variant: "ghost",
|
315
|
+
children: /* @__PURE__ */ jsx(Trash, {})
|
326
316
|
}
|
327
|
-
),
|
328
|
-
/* @__PURE__ */ jsx(ConfirmDialog, { onConfirm: handleConfirm
|
317
|
+
) }),
|
318
|
+
/* @__PURE__ */ jsx(ConfirmDialog, { onConfirm: handleConfirm })
|
329
319
|
] });
|
330
320
|
};
|
331
321
|
const EditLocale = (props) => {
|
@@ -345,14 +335,14 @@ const EditLocale = (props) => {
|
|
345
335
|
name: props.name
|
346
336
|
}
|
347
337
|
),
|
348
|
-
|
349
|
-
|
338
|
+
variant: "ghost",
|
339
|
+
children: /* @__PURE__ */ jsx(Pencil, {})
|
350
340
|
}
|
351
341
|
),
|
352
|
-
|
342
|
+
/* @__PURE__ */ jsx(EditModal, { ...props, open: visible, onOpenChange: setVisible })
|
353
343
|
] });
|
354
344
|
};
|
355
|
-
const EditModal = ({ id, code, isDefault, name,
|
345
|
+
const EditModal = ({ id, code, isDefault, name, open, onOpenChange }) => {
|
356
346
|
const { toggleNotification } = useNotification();
|
357
347
|
const {
|
358
348
|
_unstableFormatAPIError: formatAPIError,
|
@@ -360,7 +350,7 @@ const EditModal = ({ id, code, isDefault, name, onClose }) => {
|
|
360
350
|
} = useAPIErrorHandler();
|
361
351
|
const refetchPermissions = useAuth("EditModal", (state) => state.refetchPermissions);
|
362
352
|
const { formatMessage } = useIntl();
|
363
|
-
const titleId =
|
353
|
+
const titleId = useId();
|
364
354
|
const [updateLocale] = useUpdateLocaleMutation();
|
365
355
|
const handleSubmit = async ({ code: _code, ...data }, helpers) => {
|
366
356
|
try {
|
@@ -384,7 +374,7 @@ const EditModal = ({ id, code, isDefault, name, onClose }) => {
|
|
384
374
|
})
|
385
375
|
});
|
386
376
|
refetchPermissions();
|
387
|
-
|
377
|
+
onOpenChange(false);
|
388
378
|
} catch (err) {
|
389
379
|
toggleNotification({
|
390
380
|
type: "danger",
|
@@ -395,7 +385,7 @@ const EditModal = ({ id, code, isDefault, name, onClose }) => {
|
|
395
385
|
});
|
396
386
|
}
|
397
387
|
};
|
398
|
-
return /* @__PURE__ */ jsx(
|
388
|
+
return /* @__PURE__ */ jsx(Modal.Root, { open, onOpenChange, children: /* @__PURE__ */ jsx(Modal.Content, { children: /* @__PURE__ */ jsxs(
|
399
389
|
Form,
|
400
390
|
{
|
401
391
|
method: "PUT",
|
@@ -407,53 +397,45 @@ const EditModal = ({ id, code, isDefault, name, onClose }) => {
|
|
407
397
|
},
|
408
398
|
validationSchema: LOCALE_SCHEMA,
|
409
399
|
children: [
|
410
|
-
/* @__PURE__ */ jsx(
|
411
|
-
id: getTranslation("Settings.list.actions.edit"),
|
412
|
-
defaultMessage: "Edit a locale"
|
413
|
-
}) }) }),
|
414
|
-
/* @__PURE__ */ jsx(ModalBody, { children: /* @__PURE__ */ jsxs(
|
415
|
-
TabGroup,
|
400
|
+
/* @__PURE__ */ jsx(Modal.Header, { children: /* @__PURE__ */ jsx(Modal.Title, { children: formatMessage(
|
416
401
|
{
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
}),
|
421
|
-
variant: "simple",
|
422
|
-
children: [
|
423
|
-
/* @__PURE__ */ jsxs(Flex, { justifyContent: "space-between", children: [
|
424
|
-
/* @__PURE__ */ jsx(Typography, { as: "h2", variant: "beta", children: formatMessage({
|
425
|
-
id: getTranslation("Settings.locales.modal.title"),
|
426
|
-
defaultMessage: "Configuration"
|
427
|
-
}) }),
|
428
|
-
/* @__PURE__ */ jsxs(Tabs, { children: [
|
429
|
-
/* @__PURE__ */ jsx(Tab, { children: formatMessage({
|
430
|
-
id: getTranslation("Settings.locales.modal.base"),
|
431
|
-
defaultMessage: "Basic settings"
|
432
|
-
}) }),
|
433
|
-
/* @__PURE__ */ jsx(Tab, { children: formatMessage({
|
434
|
-
id: getTranslation("Settings.locales.modal.advanced"),
|
435
|
-
defaultMessage: "Advanced settings"
|
436
|
-
}) })
|
437
|
-
] })
|
438
|
-
] }),
|
439
|
-
/* @__PURE__ */ jsx(Divider, {}),
|
440
|
-
/* @__PURE__ */ jsx(Box, { paddingTop: 7, paddingBottom: 7, children: /* @__PURE__ */ jsxs(TabPanels, { children: [
|
441
|
-
/* @__PURE__ */ jsx(TabPanel, { children: /* @__PURE__ */ jsx(BaseForm, { mode: "edit" }) }),
|
442
|
-
/* @__PURE__ */ jsx(TabPanel, { children: /* @__PURE__ */ jsx(AdvancedForm, { isDefaultLocale: isDefault }) })
|
443
|
-
] }) })
|
444
|
-
]
|
445
|
-
}
|
446
|
-
) }),
|
447
|
-
/* @__PURE__ */ jsx(
|
448
|
-
ModalFooter,
|
402
|
+
id: getTranslation("Settings.list.actions.edit"),
|
403
|
+
defaultMessage: "Edit a locale"
|
404
|
+
},
|
449
405
|
{
|
450
|
-
|
451
|
-
endActions: /* @__PURE__ */ jsx(SubmitButton, {})
|
406
|
+
name
|
452
407
|
}
|
453
|
-
)
|
408
|
+
) }) }),
|
409
|
+
/* @__PURE__ */ jsx(Modal.Body, { children: /* @__PURE__ */ jsxs(Tabs.Root, { variant: "simple", defaultValue: "basic", children: [
|
410
|
+
/* @__PURE__ */ jsxs(Flex, { justifyContent: "space-between", children: [
|
411
|
+
/* @__PURE__ */ jsx(Typography, { tag: "h2", variant: "beta", id: titleId, children: formatMessage({
|
412
|
+
id: getTranslation("Settings.locales.modal.title"),
|
413
|
+
defaultMessage: "Configuration"
|
414
|
+
}) }),
|
415
|
+
/* @__PURE__ */ jsxs(Tabs.List, { "aria-labelledby": titleId, children: [
|
416
|
+
/* @__PURE__ */ jsx(Tabs.Trigger, { value: "basic", children: formatMessage({
|
417
|
+
id: getTranslation("Settings.locales.modal.base"),
|
418
|
+
defaultMessage: "Basic settings"
|
419
|
+
}) }),
|
420
|
+
/* @__PURE__ */ jsx(Tabs.Trigger, { value: "advanced", children: formatMessage({
|
421
|
+
id: getTranslation("Settings.locales.modal.advanced"),
|
422
|
+
defaultMessage: "Advanced settings"
|
423
|
+
}) })
|
424
|
+
] })
|
425
|
+
] }),
|
426
|
+
/* @__PURE__ */ jsx(Divider, {}),
|
427
|
+
/* @__PURE__ */ jsxs(Box, { paddingTop: 7, paddingBottom: 7, children: [
|
428
|
+
/* @__PURE__ */ jsx(Tabs.Content, { value: "basic", children: /* @__PURE__ */ jsx(BaseForm, { mode: "edit" }) }),
|
429
|
+
/* @__PURE__ */ jsx(Tabs.Content, { value: "advanced", children: /* @__PURE__ */ jsx(AdvancedForm, { isDefaultLocale: isDefault }) })
|
430
|
+
] })
|
431
|
+
] }) }),
|
432
|
+
/* @__PURE__ */ jsxs(Modal.Footer, { children: [
|
433
|
+
/* @__PURE__ */ jsx(Modal.Close, { children: /* @__PURE__ */ jsx(Button, { variant: "tertiary", children: formatMessage({ id: "app.components.Button.cancel", defaultMessage: "Cancel" }) }) }),
|
434
|
+
/* @__PURE__ */ jsx(SubmitButton, {})
|
435
|
+
] })
|
454
436
|
]
|
455
437
|
}
|
456
|
-
) });
|
438
|
+
) }) });
|
457
439
|
};
|
458
440
|
const LocaleTable = ({ locales = [], canDelete, canUpdate }) => {
|
459
441
|
const [editLocaleId, setEditLocaleId] = React.useState();
|
@@ -499,7 +481,14 @@ const LocaleTable = ({ locales = [], canDelete, canUpdate }) => {
|
|
499
481
|
]
|
500
482
|
}
|
501
483
|
),
|
502
|
-
|
484
|
+
/* @__PURE__ */ jsx(
|
485
|
+
EditModal,
|
486
|
+
{
|
487
|
+
...locale,
|
488
|
+
onOpenChange: () => setEditLocaleId(void 0),
|
489
|
+
open: editLocaleId === locale.id
|
490
|
+
}
|
491
|
+
)
|
503
492
|
] }, locale.id)) })
|
504
493
|
] });
|
505
494
|
};
|
@@ -562,4 +551,4 @@ export {
|
|
562
551
|
ProtectedSettingsPage,
|
563
552
|
SettingsPage
|
564
553
|
};
|
565
|
-
//# sourceMappingURL=SettingsPage-
|
554
|
+
//# sourceMappingURL=SettingsPage-B6QDUmu9.mjs.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"SettingsPage-B6QDUmu9.mjs","sources":["../../admin/src/utils/baseQuery.ts","../../admin/src/components/CreateLocale.tsx","../../admin/src/components/DeleteLocale.tsx","../../admin/src/components/EditLocale.tsx","../../admin/src/components/LocaleTable.tsx","../../admin/src/pages/SettingsPage.tsx"],"sourcesContent":["import { SerializedError } from '@reduxjs/toolkit';\nimport { type ApiError, type UnknownApiError } from '@strapi/admin/strapi-admin';\n\ntype BaseQueryError = ApiError | UnknownApiError | SerializedError;\n\nconst isBaseQueryError = (error: BaseQueryError): error is ApiError | UnknownApiError => {\n return error.name !== undefined;\n};\n\nexport { isBaseQueryError };\n","import * as React from 'react';\n\nimport {\n Form,\n type InputProps,\n InputRenderer,\n useField,\n type FormHelpers,\n useForm,\n useAPIErrorHandler,\n useNotification,\n useAuth,\n} from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Button,\n ButtonProps,\n Divider,\n Field,\n Flex,\n Grid,\n Modal,\n SingleSelect,\n SingleSelectOption,\n Tabs,\n Typography,\n useId,\n} from '@strapi/design-system';\nimport { Check, Plus } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport * as yup from 'yup';\n\nimport { CreateLocale } from '../../../shared/contracts/locales';\nimport { useCreateLocaleMutation, useGetDefaultLocalesQuery } from '../services/locales';\nimport { isBaseQueryError } from '../utils/baseQuery';\nimport { getTranslation } from '../utils/getTranslation';\n\n/* -------------------------------------------------------------------------------------------------\n * CreateLocale\n * -----------------------------------------------------------------------------------------------*/\n\ninterface CreateLocaleProps extends Pick<ButtonProps, 'disabled' | 'variant'> {}\n\nconst CreateLocale = ({ disabled, variant = 'default' }: CreateLocaleProps) => {\n const { formatMessage } = useIntl();\n const [visible, setVisible] = React.useState(false);\n\n return (\n <Modal.Root open={visible} onOpenChange={setVisible}>\n <Modal.Trigger>\n <Button\n variant={variant}\n disabled={disabled}\n startIcon={<Plus />}\n onClick={() => setVisible(true)}\n size=\"S\"\n >\n {formatMessage({\n id: getTranslation('Settings.list.actions.add'),\n defaultMessage: 'Add new locale',\n })}\n </Button>\n </Modal.Trigger>\n <CreateModal onClose={() => setVisible(false)} />\n </Modal.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * CreateModal\n * -----------------------------------------------------------------------------------------------*/\n\nconst LOCALE_SCHEMA = yup.object().shape({\n code: yup.string().nullable().required({\n id: 'Settings.locales.modal.create.code.error',\n defaultMessage: 'Please select a locale',\n }),\n name: yup\n .string()\n .nullable()\n .max(50, {\n id: 'Settings.locales.modal.create.name.error.min',\n defaultMessage: 'The locale display name can only be less than 50 characters.',\n })\n .required({\n id: 'Settings.locales.modal.create.name.error.required',\n defaultMessage: 'Please give the locale a display name',\n }),\n isDefault: yup.boolean(),\n});\n\ntype FormValues = CreateLocale.Request['body'];\n\nconst initialFormValues = {\n code: '',\n name: '',\n isDefault: false,\n} satisfies FormValues;\n\ntype ModalCreateProps = {\n onClose: () => void;\n};\n\nconst CreateModal = ({ onClose }: ModalCreateProps) => {\n const titleId = useId();\n const { toggleNotification } = useNotification();\n const {\n _unstableFormatAPIError: formatAPIError,\n _unstableFormatValidationErrors: formatValidationErrors,\n } = useAPIErrorHandler();\n const [createLocale] = useCreateLocaleMutation();\n const { formatMessage } = useIntl();\n const refetchPermissions = useAuth('CreateModal', (state) => state.refetchPermissions);\n\n const handleSubmit = async (values: FormValues, helpers: FormHelpers<FormValues>) => {\n try {\n const res = await createLocale(values);\n\n if ('error' in res) {\n if (isBaseQueryError(res.error) && res.error.name === 'ValidationError') {\n helpers.setErrors(formatValidationErrors(res.error));\n } else {\n toggleNotification({ type: 'danger', message: formatAPIError(res.error) });\n }\n\n return;\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTranslation('Settings.locales.modal.create.success'),\n defaultMessage: 'Created locale',\n }),\n });\n\n refetchPermissions();\n onClose();\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'notification.error',\n defaultMessage: 'An error occurred, please try again',\n }),\n });\n }\n };\n\n return (\n <Modal.Content>\n <Form\n method=\"POST\"\n initialValues={initialFormValues}\n validationSchema={LOCALE_SCHEMA}\n onSubmit={handleSubmit}\n >\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTranslation('Settings.list.actions.add'),\n defaultMessage: 'Add new locale',\n })}\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <Tabs.Root variant=\"simple\" defaultValue=\"basic\">\n <Flex justifyContent=\"space-between\">\n <Typography tag=\"h2\" variant=\"beta\" id={titleId}>\n {formatMessage({\n id: getTranslation('Settings.locales.modal.title'),\n defaultMessage: 'Configuration',\n })}\n </Typography>\n <Tabs.List aria-labelledby={titleId}>\n <Tabs.Trigger value=\"basic\">\n {formatMessage({\n id: getTranslation('Settings.locales.modal.base'),\n defaultMessage: 'Basic settings',\n })}\n </Tabs.Trigger>\n <Tabs.Trigger value=\"advanced\">\n {formatMessage({\n id: getTranslation('Settings.locales.modal.advanced'),\n defaultMessage: 'Advanced settings',\n })}\n </Tabs.Trigger>\n </Tabs.List>\n </Flex>\n\n <Divider />\n\n <Box paddingTop={7} paddingBottom={7}>\n <Tabs.Content value=\"basic\">\n <BaseForm />\n </Tabs.Content>\n <Tabs.Content value=\"advanced\">\n <AdvancedForm />\n </Tabs.Content>\n </Box>\n </Tabs.Root>\n </Modal.Body>\n <Modal.Footer>\n <Modal.Close>\n <Button variant=\"tertiary\">\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'Cancel' })}\n </Button>\n </Modal.Close>\n <SubmitButton />\n </Modal.Footer>\n </Form>\n </Modal.Content>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * SubmitButton\n * -----------------------------------------------------------------------------------------------*/\n\nconst SubmitButton = () => {\n const { formatMessage } = useIntl();\n const isSubmitting = useForm('SubmitButton', (state) => state.isSubmitting);\n const modified = useForm('SubmitButton', (state) => state.modified);\n\n return (\n <Button type=\"submit\" startIcon={<Check />} disabled={isSubmitting || !modified}>\n {formatMessage({ id: 'global.save', defaultMessage: 'Save' })}\n </Button>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * BaseForm\n * -----------------------------------------------------------------------------------------------*/\n\ninterface BaseFormProps {\n mode?: 'create' | 'edit';\n}\n\nconst BaseForm = ({ mode = 'create' }: BaseFormProps) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const { data: defaultLocales, error } = useGetDefaultLocalesQuery();\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n if (!Array.isArray(defaultLocales)) {\n return null;\n }\n\n const options = defaultLocales.map((locale) => ({\n label: locale.name,\n value: locale.code,\n }));\n\n const translatedForm = [\n {\n disabled: mode !== 'create',\n label: {\n id: getTranslation('Settings.locales.modal.create.code.label'),\n defaultMessage: 'Locales',\n },\n name: 'code',\n options,\n placeholder: {\n id: 'components.placeholder.select',\n defaultMessage: 'Select',\n },\n required: true,\n size: 6,\n type: 'enumeration' as const,\n },\n {\n hint: {\n id: getTranslation('Settings.locales.modal.create.name.label.description'),\n defaultMessage: 'Locale will be displayed under that name in the administration panel',\n },\n label: {\n id: getTranslation('Settings.locales.modal.create.name.label'),\n defaultMessage: 'Locale display name',\n },\n name: 'name',\n required: true,\n size: 6,\n type: 'string' as const,\n },\n ].map((field) => ({\n ...field,\n hint: field.hint ? formatMessage(field.hint) : undefined,\n label: formatMessage(field.label),\n placeholder: field.placeholder ? formatMessage(field.placeholder) : undefined,\n }));\n\n return (\n <Grid.Root gap={4}>\n {translatedForm.map(({ size, ...field }) => (\n <Grid.Item key={field.name} col={size} direction=\"column\" alignItems=\"stretch\">\n <FormRenderer {...field} />\n </Grid.Item>\n ))}\n </Grid.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AdvancedForm\n * -----------------------------------------------------------------------------------------------*/\n\ntype AdvancedFormProps = {\n isDefaultLocale?: boolean;\n};\n\nconst AdvancedForm = ({ isDefaultLocale }: AdvancedFormProps) => {\n const { formatMessage } = useIntl();\n\n const form = [\n {\n disabled: isDefaultLocale,\n hint: {\n id: getTranslation('Settings.locales.modal.advanced.setAsDefault.hint'),\n defaultMessage: 'One default locale is required, change it by selecting another one',\n },\n label: {\n id: getTranslation('Settings.locales.modal.advanced.setAsDefault'),\n defaultMessage: 'Set as default locale',\n },\n name: 'isDefault',\n size: 6,\n type: 'boolean' as const,\n },\n ].map((field) => ({\n ...field,\n hint: field.hint ? formatMessage(field.hint) : undefined,\n label: formatMessage(field.label),\n })) satisfies InputProps[];\n\n return (\n <Grid.Root gap={4}>\n {form.map(({ size, ...field }) => (\n <Grid.Item key={field.name} col={size} direction=\"column\" alignItems=\"stretch\">\n <FormRenderer {...field} />\n </Grid.Item>\n ))}\n </Grid.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * FormRenderer\n * -----------------------------------------------------------------------------------------------*/\n\nconst FormRenderer = (field: InputProps) => {\n switch (field.type) {\n /**\n * This will override the default input renderer\n * choice for `enumeration`.\n */\n case 'enumeration':\n return <EnumerationInput {...field} />;\n default:\n return <InputRenderer {...field} />;\n }\n};\n\nconst EnumerationInput = ({\n disabled,\n hint,\n label,\n name,\n options,\n placeholder,\n required,\n}: Extract<InputProps, { type: 'enumeration' }>) => {\n const { value, error, onChange } = useField(name);\n const { data: defaultLocales = [] } = useGetDefaultLocalesQuery();\n\n const handleChange = (value: string) => {\n if (Array.isArray(defaultLocales)) {\n // We know it exists because the options are created from the list of default locales\n const locale = defaultLocales.find((locale) => locale.code === value)!;\n\n onChange(name, value);\n // This lets us automatically fill the name field with the locale name\n onChange('name', locale.name);\n } else {\n onChange(name, value);\n }\n };\n\n return (\n <Field.Root error={error} hint={hint} name={name} required={required}>\n <Field.Label>{label}</Field.Label>\n <SingleSelect\n disabled={disabled}\n // @ts-expect-error – This will dissapear when the DS removes support for numbers to be returned by SingleSelect.\n onChange={handleChange}\n placeholder={placeholder}\n value={value}\n >\n {options.map((option) => (\n <SingleSelectOption value={option.value} key={option.value}>\n {option.label}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n <Field.Error />\n <Field.Hint />\n </Field.Root>\n );\n};\n\nexport { CreateLocale, BaseForm, AdvancedForm, SubmitButton, LOCALE_SCHEMA };\n","import * as React from 'react';\n\nimport { ConfirmDialog, useAPIErrorHandler, useNotification } from '@strapi/admin/strapi-admin';\nimport { Dialog, IconButton } from '@strapi/design-system';\nimport { Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { useDeleteLocaleMutation } from '../services/locales';\nimport { getTranslation } from '../utils/getTranslation';\n\nimport type { Locale } from '../../../shared/contracts/locales';\n\n/* -------------------------------------------------------------------------------------------------\n * DeleteLocale\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DeleteLocaleProps extends Locale {}\n\nconst DeleteLocale = ({ id, name }: DeleteLocaleProps) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const [visible, setVisible] = React.useState(false);\n\n const [deleteLocale] = useDeleteLocaleMutation();\n const handleConfirm = async () => {\n try {\n const res = await deleteLocale(id);\n\n if ('error' in res) {\n toggleNotification({ type: 'danger', message: formatAPIError(res.error) });\n\n return;\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTranslation('Settings.locales.modal.delete.success'),\n defaultMessage: 'Deleted locale',\n }),\n });\n\n setVisible(false);\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'notification.error',\n defaultMessage: 'An error occurred, please try again',\n }),\n });\n }\n };\n\n return (\n <Dialog.Root open={visible} onOpenChange={setVisible}>\n <Dialog.Trigger>\n <IconButton\n onClick={() => setVisible(true)}\n label={formatMessage(\n {\n id: getTranslation('Settings.list.actions.delete'),\n defaultMessage: 'Delete {name} locale',\n },\n {\n name,\n }\n )}\n variant=\"ghost\"\n >\n <Trash />\n </IconButton>\n </Dialog.Trigger>\n <ConfirmDialog onConfirm={handleConfirm} />\n </Dialog.Root>\n );\n};\n\nexport { DeleteLocale };\n","import * as React from 'react';\n\nimport {\n useNotification,\n useAPIErrorHandler,\n Form,\n FormHelpers,\n useAuth,\n} from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Button,\n Divider,\n Flex,\n IconButton,\n Modal,\n Tabs,\n Typography,\n useId,\n} from '@strapi/design-system';\nimport { Pencil } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { Locale, UpdateLocale } from '../../../shared/contracts/locales';\nimport { useUpdateLocaleMutation } from '../services/locales';\nimport { isBaseQueryError } from '../utils/baseQuery';\nimport { getTranslation } from '../utils/getTranslation';\n\nimport { AdvancedForm, BaseForm, LOCALE_SCHEMA, SubmitButton } from './CreateLocale';\n\n/* -------------------------------------------------------------------------------------------------\n * EditLocale\n * -----------------------------------------------------------------------------------------------*/\n\ninterface EditLocaleProps extends Omit<EditModalProps, 'open' | 'onOpenChange'> {}\n\nconst EditLocale = (props: EditLocaleProps) => {\n const { formatMessage } = useIntl();\n const [visible, setVisible] = React.useState(false);\n\n return (\n <>\n <IconButton\n onClick={() => setVisible(true)}\n label={formatMessage(\n {\n id: getTranslation('Settings.list.actions.edit'),\n defaultMessage: 'Edit {name} locale',\n },\n {\n name: props.name,\n }\n )}\n variant=\"ghost\"\n >\n <Pencil />\n </IconButton>\n <EditModal {...props} open={visible} onOpenChange={setVisible} />\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * EditModal\n * -----------------------------------------------------------------------------------------------*/\n\ninterface EditModalProps extends Pick<Locale, 'id' | 'isDefault' | 'name' | 'code'> {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\ntype FormValues = UpdateLocale.Request['body'] & { code: string };\n\n/**\n * @internal\n * @description Exported to be used when someone clicks on a table row.\n */\nconst EditModal = ({ id, code, isDefault, name, open, onOpenChange }: EditModalProps) => {\n const { toggleNotification } = useNotification();\n const {\n _unstableFormatAPIError: formatAPIError,\n _unstableFormatValidationErrors: formatValidationErrors,\n } = useAPIErrorHandler();\n const refetchPermissions = useAuth('EditModal', (state) => state.refetchPermissions);\n const { formatMessage } = useIntl();\n const titleId = useId();\n\n const [updateLocale] = useUpdateLocaleMutation();\n const handleSubmit = async (\n { code: _code, ...data }: FormValues,\n helpers: FormHelpers<FormValues>\n ) => {\n try {\n /**\n * We don't need to send the code, because the\n * code can never be changed.\n */\n const res = await updateLocale({\n id,\n ...data,\n });\n\n if ('error' in res) {\n if (isBaseQueryError(res.error) && res.error.name === 'ValidationError') {\n helpers.setErrors(formatValidationErrors(res.error));\n } else {\n toggleNotification({ type: 'danger', message: formatAPIError(res.error) });\n }\n\n return;\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTranslation('Settings.locales.modal.edit.success'),\n defaultMessage: 'Updated locale',\n }),\n });\n\n refetchPermissions();\n onOpenChange(false);\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'notification.error',\n defaultMessage: 'An error occurred, please try again',\n }),\n });\n }\n };\n\n return (\n <Modal.Root open={open} onOpenChange={onOpenChange}>\n <Modal.Content>\n <Form\n method=\"PUT\"\n onSubmit={handleSubmit}\n initialValues={{\n code,\n name,\n isDefault,\n }}\n validationSchema={LOCALE_SCHEMA}\n >\n <Modal.Header>\n <Modal.Title>\n {formatMessage(\n {\n id: getTranslation('Settings.list.actions.edit'),\n defaultMessage: 'Edit a locale',\n },\n {\n name,\n }\n )}\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <Tabs.Root variant=\"simple\" defaultValue=\"basic\">\n <Flex justifyContent=\"space-between\">\n <Typography tag=\"h2\" variant=\"beta\" id={titleId}>\n {formatMessage({\n id: getTranslation('Settings.locales.modal.title'),\n defaultMessage: 'Configuration',\n })}\n </Typography>\n <Tabs.List aria-labelledby={titleId}>\n <Tabs.Trigger value=\"basic\">\n {formatMessage({\n id: getTranslation('Settings.locales.modal.base'),\n defaultMessage: 'Basic settings',\n })}\n </Tabs.Trigger>\n <Tabs.Trigger value=\"advanced\">\n {formatMessage({\n id: getTranslation('Settings.locales.modal.advanced'),\n defaultMessage: 'Advanced settings',\n })}\n </Tabs.Trigger>\n </Tabs.List>\n </Flex>\n <Divider />\n <Box paddingTop={7} paddingBottom={7}>\n <Tabs.Content value=\"basic\">\n <BaseForm mode=\"edit\" />\n </Tabs.Content>\n <Tabs.Content value=\"advanced\">\n <AdvancedForm isDefaultLocale={isDefault} />\n </Tabs.Content>\n </Box>\n </Tabs.Root>\n </Modal.Body>\n <Modal.Footer>\n <Modal.Close>\n <Button variant=\"tertiary\">\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'Cancel' })}\n </Button>\n </Modal.Close>\n <SubmitButton />\n </Modal.Footer>\n </Form>\n </Modal.Content>\n </Modal.Root>\n );\n};\n\nexport { EditLocale, EditModal };\n","import * as React from 'react';\n\nimport {\n Flex,\n Table,\n Tbody,\n Td,\n Th,\n Thead,\n Tr,\n Typography,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { getTranslation } from '../utils/getTranslation';\n\nimport { DeleteLocale } from './DeleteLocale';\nimport { EditLocale, EditModal } from './EditLocale';\n\nimport type { Locale } from '../../../shared/contracts/locales';\n\n/* -------------------------------------------------------------------------------------------------\n * LocaleTable\n * -----------------------------------------------------------------------------------------------*/\n\ntype LocaleTableProps = {\n locales?: Locale[];\n canDelete?: boolean;\n canUpdate?: boolean;\n onDeleteLocale?: (locale: Locale) => void;\n onEditLocale?: (locale: Locale) => void;\n};\n\nconst LocaleTable = ({ locales = [], canDelete, canUpdate }: LocaleTableProps) => {\n const [editLocaleId, setEditLocaleId] = React.useState<Locale['id']>();\n const { formatMessage } = useIntl();\n\n const handleClick = (localeId: Locale['id']) => () => {\n if (canUpdate) {\n setEditLocaleId(localeId);\n }\n };\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 <React.Fragment key={locale.id}>\n <Tr\n onClick={handleClick(locale.id)}\n style={{ cursor: canUpdate ? 'pointer' : 'default' }}\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 {canUpdate && <EditLocale {...locale} />}\n {canDelete && !locale.isDefault && <DeleteLocale {...locale} />}\n </Flex>\n </Td>\n </Tr>\n <EditModal\n {...locale}\n onOpenChange={() => setEditLocaleId(undefined)}\n open={editLocaleId === locale.id}\n />\n </React.Fragment>\n ))}\n </Tbody>\n </Table>\n );\n};\n\nexport { LocaleTable };\nexport type { LocaleTableProps };\n","import * as React from 'react';\n\nimport {\n Page,\n useAPIErrorHandler,\n useNotification,\n useRBAC,\n Layouts,\n} from '@strapi/admin/strapi-admin';\nimport { EmptyStateLayout } from '@strapi/design-system';\nimport { EmptyDocuments } from '@strapi/icons/symbols';\nimport { useIntl } from 'react-intl';\n\nimport { CreateLocale } from '../components/CreateLocale';\nimport { LocaleTable } from '../components/LocaleTable';\nimport { PERMISSIONS } from '../constants';\nimport { useGetLocalesQuery } from '../services/locales';\nimport { getTranslation } from '../utils/getTranslation';\n\nconst SettingsPage = () => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const { data: locales, isLoading: isLoadingLocales, error } = useGetLocalesQuery();\n const {\n isLoading: isLoadingRBAC,\n allowedActions: { canUpdate, canCreate, canDelete },\n } = useRBAC(PERMISSIONS);\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n const isLoading = isLoadingLocales || isLoadingRBAC;\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (error || !Array.isArray(locales)) {\n return <Page.Error />;\n }\n\n return (\n <Page.Main tabIndex={-1}>\n <Layouts.Header\n primaryAction={<CreateLocale disabled={!canCreate} />}\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 <Layouts.Content>\n {locales.length > 0 ? (\n <LocaleTable locales={locales} canDelete={canDelete} canUpdate={canUpdate} />\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={<CreateLocale disabled={!canCreate} variant=\"secondary\" />}\n />\n )}\n </Layouts.Content>\n </Page.Main>\n );\n};\n\nconst ProtectedSettingsPage = () => {\n return (\n <Page.Protect permissions={PERMISSIONS.read}>\n <SettingsPage />\n </Page.Protect>\n );\n};\n\nexport { ProtectedSettingsPage, SettingsPage };\n"],"names":["value","locale"],"mappings":"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"}
|