payload-intl 1.1.2 → 1.2.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.
- package/README.md +62 -221
- package/dist/components/MessageController.d.ts +4 -6
- package/dist/components/MessageController.d.ts.map +1 -1
- package/dist/components/MessageController.js +25 -41
- package/dist/components/MessageController.js.map +1 -1
- package/dist/components/MessageFormContext.d.ts +29 -0
- package/dist/components/MessageFormContext.d.ts.map +1 -0
- package/dist/components/MessageFormContext.js +30 -0
- package/dist/components/MessageFormContext.js.map +1 -0
- package/dist/components/MessagesForm.d.ts +2 -2
- package/dist/components/MessagesForm.d.ts.map +1 -1
- package/dist/components/MessagesForm.js +126 -112
- package/dist/components/MessagesForm.js.map +1 -1
- package/dist/components/MessagesForm.module.css +41 -0
- package/dist/{exports/link.d.ts → components/MessagesLink.d.ts} +3 -3
- package/dist/components/MessagesLink.d.ts.map +1 -0
- package/dist/components/MessagesLink.js +19 -0
- package/dist/components/MessagesLink.js.map +1 -0
- package/dist/components/MessagesView.d.ts +10 -0
- package/dist/components/MessagesView.d.ts.map +1 -0
- package/dist/components/MessagesView.js +48 -0
- package/dist/components/MessagesView.js.map +1 -0
- package/dist/components/actions/JsonImport.d.ts.map +1 -1
- package/dist/components/actions/JsonImport.js +68 -61
- package/dist/components/actions/JsonImport.js.map +1 -1
- package/dist/components/actions/JsonImport.module.css +14 -0
- package/dist/components/actions/Move.d.ts.map +1 -1
- package/dist/components/actions/Move.js +41 -0
- package/dist/components/actions/Move.js.map +1 -0
- package/dist/components/actions/Move.module.css +8 -0
- package/dist/components/inputs/InputWrapper.d.ts +1 -1
- package/dist/components/inputs/InputWrapper.d.ts.map +1 -1
- package/dist/components/inputs/InputWrapper.js +31 -29
- package/dist/components/inputs/InputWrapper.js.map +1 -1
- package/dist/components/inputs/InputWrapper.module.css +34 -0
- package/dist/components/inputs/LexicalInput.d.ts +3 -3
- package/dist/components/inputs/LexicalInput.js +86 -0
- package/dist/components/inputs/LexicalInput.js.map +1 -0
- package/dist/components/inputs/MessageInput.d.ts +2 -2
- package/dist/components/inputs/MessageInput.d.ts.map +1 -1
- package/dist/components/inputs/MessageInput.js +110 -37
- package/dist/components/inputs/MessageInput.js.map +1 -1
- package/dist/components/inputs/MessageInput.module.css +25 -0
- package/dist/components/inputs/variables/VariableChip.d.ts +8 -2
- package/dist/components/inputs/variables/VariableChip.d.ts.map +1 -1
- package/dist/components/inputs/variables/VariableChip.js +86 -64
- package/dist/components/inputs/variables/VariableChip.js.map +1 -1
- package/dist/components/inputs/variables/VariableChip.module.css +66 -0
- package/dist/components/inputs/variables/VariableIcon.d.ts +1 -1
- package/dist/components/inputs/variables/VariableIcon.d.ts.map +1 -1
- package/dist/components/inputs/variables/VariableIcon.js +35 -0
- package/dist/components/inputs/variables/VariableIcon.js.map +1 -0
- package/dist/components/inputs/variables/VariableNode.d.ts +11 -0
- package/dist/components/inputs/variables/VariableNode.d.ts.map +1 -0
- package/dist/components/inputs/variables/VariableNode.js +36 -0
- package/dist/components/inputs/variables/VariableNode.js.map +1 -0
- package/dist/components/inputs/variables/VariableSuggestion.module.css +34 -0
- package/dist/components/inputs/variables/editors/DateVariableEditor.d.ts +2 -2
- package/dist/components/inputs/variables/editors/DateVariableEditor.d.ts.map +1 -1
- package/dist/components/inputs/variables/editors/DateVariableEditor.js +15 -0
- package/dist/components/inputs/variables/editors/DateVariableEditor.js.map +1 -0
- package/dist/components/inputs/variables/editors/PluralVariableEditor.d.ts +1 -1
- package/dist/components/inputs/variables/editors/PluralVariableEditor.d.ts.map +1 -1
- package/dist/components/inputs/variables/editors/PluralVariableEditor.js +191 -172
- package/dist/components/inputs/variables/editors/PluralVariableEditor.js.map +1 -1
- package/dist/components/inputs/variables/editors/PluralVariableEditor.module.css +149 -0
- package/dist/components/inputs/variables/editors/SelectVariableEditor.d.ts +1 -1
- package/dist/components/inputs/variables/editors/SelectVariableEditor.d.ts.map +1 -1
- package/dist/components/inputs/variables/editors/SelectVariableEditor.js +58 -52
- package/dist/components/inputs/variables/editors/SelectVariableEditor.js.map +1 -1
- package/dist/components/inputs/variables/editors/SelectVariableEditor.module.css +25 -0
- package/dist/components/inputs/variables/editors/TagVariableEditor.d.ts +1 -1
- package/dist/components/inputs/variables/editors/TagVariableEditor.d.ts.map +1 -1
- package/dist/components/inputs/variables/editors/TagVariableEditor.js +36 -32
- package/dist/components/inputs/variables/editors/TagVariableEditor.js.map +1 -1
- package/dist/components/inputs/variables/editors/TagVariableEditor.module.css +7 -0
- package/dist/components/inputs/variables/editors/TimeVariableEditor.d.ts +2 -2
- package/dist/components/inputs/variables/editors/TimeVariableEditor.d.ts.map +1 -1
- package/dist/components/inputs/variables/editors/TimeVariableEditor.js +15 -0
- package/dist/components/inputs/variables/editors/TimeVariableEditor.js.map +1 -0
- package/dist/components/inputs/variables/pickers/NumericVariablePicker.d.ts +1 -1
- package/dist/components/inputs/variables/pickers/NumericVariablePicker.d.ts.map +1 -1
- package/dist/components/inputs/variables/pickers/NumericVariablePicker.js +48 -51
- package/dist/components/inputs/variables/pickers/NumericVariablePicker.js.map +1 -1
- package/dist/components/inputs/variables/pickers/NumericVariablePicker.module.css +27 -0
- package/dist/components/inputs/variables/pickers/TemporalElementEditor.d.ts +1 -1
- package/dist/components/inputs/variables/pickers/TemporalElementEditor.d.ts.map +1 -1
- package/dist/components/inputs/variables/pickers/TemporalElementEditor.js +58 -0
- package/dist/components/inputs/variables/pickers/TemporalElementEditor.js.map +1 -0
- package/dist/components/inputs/variables/pickers/TemporalElementEditor.module.css +27 -0
- package/dist/components/layout/MessageField.d.ts +3 -3
- package/dist/components/layout/MessageField.d.ts.map +1 -1
- package/dist/components/layout/MessageField.js +56 -56
- package/dist/components/layout/MessageField.js.map +1 -1
- package/dist/components/layout/MessageField.module.css +19 -0
- package/dist/components/layout/MessagesTabs.d.ts +1 -1
- package/dist/components/layout/MessagesTabs.d.ts.map +1 -1
- package/dist/components/layout/MessagesTabs.js +40 -43
- package/dist/components/layout/MessagesTabs.js.map +1 -1
- package/dist/components/layout/MessagesTabs.module.css +21 -0
- package/dist/components/layout/MessagesTree.d.ts +3 -2
- package/dist/components/layout/MessagesTree.d.ts.map +1 -1
- package/dist/components/layout/MessagesTree.js +65 -67
- package/dist/components/layout/MessagesTree.js.map +1 -1
- package/dist/components/layout/MessagesTree.module.css +36 -0
- package/dist/const.d.ts +8 -9
- package/dist/const.d.ts.map +1 -1
- package/dist/const.js +16 -13
- package/dist/const.js.map +1 -1
- package/dist/endpoints/get-messages.d.ts +1 -1
- package/dist/endpoints/get-messages.d.ts.map +1 -1
- package/dist/endpoints/get-messages.js +7 -13
- package/dist/endpoints/get-messages.js.map +1 -1
- package/dist/endpoints/set-messages.d.ts +1 -1
- package/dist/endpoints/set-messages.d.ts.map +1 -1
- package/dist/endpoints/set-messages.js +61 -45
- package/dist/endpoints/set-messages.js.map +1 -1
- package/dist/entities.d.ts +5 -0
- package/dist/entities.d.ts.map +1 -0
- package/dist/entities.js +38 -0
- package/dist/entities.js.map +1 -0
- package/dist/exports/client.d.ts +2 -0
- package/dist/exports/client.d.ts.map +1 -0
- package/dist/exports/client.js +3 -0
- package/dist/exports/client.js.map +1 -0
- package/dist/exports/rsc.d.ts +2 -2
- package/dist/exports/rsc.d.ts.map +1 -1
- package/dist/exports/rsc.js +4 -7
- package/dist/exports/rsc.js.map +1 -1
- package/dist/hooks.d.ts +4 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +24 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +20 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +64 -80
- package/dist/index.js.map +1 -1
- package/dist/payload-types.d.ts +258 -0
- package/dist/payload-types.d.ts.map +1 -0
- package/dist/payload-types.js +15 -0
- package/dist/payload-types.js.map +1 -0
- package/dist/requests/fetchMessageFromAPI.d.ts +10 -0
- package/dist/requests/fetchMessageFromAPI.d.ts.map +1 -0
- package/dist/requests/fetchMessageFromAPI.js +15 -0
- package/dist/requests/fetchMessageFromAPI.js.map +1 -0
- package/dist/requests/fetchMessageFromPayload.d.ts +3 -0
- package/dist/requests/fetchMessageFromPayload.d.ts.map +1 -0
- package/dist/requests/fetchMessageFromPayload.js +29 -0
- package/dist/requests/fetchMessageFromPayload.js.map +1 -0
- package/dist/requests/fetchMessages.d.ts +3 -11
- package/dist/requests/fetchMessages.d.ts.map +1 -1
- package/dist/requests/fetchMessages.js +10 -40
- package/dist/requests/fetchMessages.js.map +1 -1
- package/dist/types.d.ts +7 -23
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/config.d.ts +3 -3
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +27 -17
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/error-handling.js +14 -12
- package/dist/utils/error-handling.js.map +1 -1
- package/dist/utils/format.d.ts +1 -1
- package/dist/utils/format.js +21 -13
- package/dist/utils/format.js.map +1 -1
- package/dist/utils/guards.d.ts +2 -1
- package/dist/utils/guards.js +8 -18
- package/dist/utils/guards.js.map +1 -1
- package/dist/utils/icu-tranform.d.ts +13 -18
- package/dist/utils/icu-tranform.d.ts.map +1 -1
- package/dist/utils/icu-tranform.js +140 -108
- package/dist/utils/icu-tranform.js.map +1 -1
- package/dist/utils/sanitize.d.ts +1 -1
- package/dist/utils/sanitize.js +36 -17
- package/dist/utils/sanitize.js.map +1 -1
- package/dist/utils/schema.d.ts +1 -3
- package/dist/utils/schema.d.ts.map +1 -1
- package/dist/utils/schema.js +42 -34
- package/dist/utils/schema.js.map +1 -1
- package/dist/utils/validate.d.ts +2 -2
- package/dist/utils/validate.js +52 -53
- package/dist/utils/validate.js.map +1 -1
- package/package.json +35 -52
- package/dist/components/inputs/variables/VariableSuggestion.d.ts +0 -9
- package/dist/components/inputs/variables/VariableSuggestion.d.ts.map +0 -1
- package/dist/components/inputs/variables/VariableSuggestion.js +0 -41
- package/dist/components/inputs/variables/VariableSuggestion.js.map +0 -1
- package/dist/components/inputs/variables/extension.d.ts +0 -4
- package/dist/components/inputs/variables/extension.d.ts.map +0 -1
- package/dist/components/inputs/variables/extension.js +0 -93
- package/dist/components/inputs/variables/extension.js.map +0 -1
- package/dist/context/messages-form.d.ts +0 -29
- package/dist/context/messages-form.d.ts.map +0 -1
- package/dist/context/messages-form.js +0 -26
- package/dist/context/messages-form.js.map +0 -1
- package/dist/exports/link.d.ts.map +0 -1
- package/dist/exports/link.js +0 -21
- package/dist/exports/link.js.map +0 -1
- package/dist/exports/view.d.ts +0 -10
- package/dist/exports/view.d.ts.map +0 -1
- package/dist/exports/view.js +0 -53
- package/dist/exports/view.js.map +0 -1
- package/dist/styles.css +0 -1
- package/dist/utils/cn.d.ts +0 -3
- package/dist/utils/cn.d.ts.map +0 -1
- package/dist/utils/cn.js +0 -9
- package/dist/utils/cn.js.map +0 -1
|
@@ -1,117 +1,131 @@
|
|
|
1
|
-
|
|
2
|
-
import { jsx as
|
|
3
|
-
import {
|
|
4
|
-
import { isEqual
|
|
5
|
-
import { useEffect
|
|
6
|
-
import { useForm
|
|
7
|
-
import { MessagesFormProvider
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import
|
|
14
|
-
function
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
values: l,
|
|
19
|
-
endpointUrl: b
|
|
20
|
-
}) {
|
|
21
|
-
const { setStepNav: f } = x();
|
|
22
|
-
j(() => {
|
|
23
|
-
f([{ label: "Intl Messages", url: "/intl" }]);
|
|
24
|
-
}, [f]);
|
|
25
|
-
const i = T({
|
|
26
|
-
defaultValues: l,
|
|
27
|
-
reValidateMode: "onChange"
|
|
28
|
-
}), [c, v] = w(Object.keys(a)[0]), N = async (e) => {
|
|
29
|
-
const r = d.loading("Saving..."), S = Object.entries(e).reduce((s, [n, h]) => (y(h, l[n]) || (s[n] = h), s), {});
|
|
30
|
-
try {
|
|
31
|
-
const s = await fetch(b, {
|
|
32
|
-
method: "PUT",
|
|
33
|
-
headers: {
|
|
34
|
-
"Content-Type": "application/json"
|
|
35
|
-
},
|
|
36
|
-
body: JSON.stringify(S)
|
|
37
|
-
});
|
|
38
|
-
if (!s.ok) {
|
|
39
|
-
const n = await F(s);
|
|
40
|
-
throw new Error(n);
|
|
41
|
-
}
|
|
42
|
-
i.reset(e), d.success("Saved", { id: r });
|
|
43
|
-
} catch (s) {
|
|
44
|
-
d.error(
|
|
45
|
-
`Failed to save: ${s instanceof Error ? s.message : "Unknown error"}`,
|
|
46
|
-
{ id: r }
|
|
47
|
-
);
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
return /* @__PURE__ */ t(E, { form: i, locales: u, children: /* @__PURE__ */ o(
|
|
51
|
-
"form",
|
|
52
|
-
{
|
|
53
|
-
className: "flex h-[calc(100vh-var(--app-header-height))] flex-col",
|
|
54
|
-
onSubmit: i.handleSubmit(N),
|
|
55
|
-
children: [
|
|
56
|
-
/* @__PURE__ */ o("div", { className: "sticky top-0 z-10 bg-background", children: [
|
|
57
|
-
/* @__PURE__ */ o("header", { className: "mb-6 flex items-center justify-between gap-4", children: [
|
|
58
|
-
/* @__PURE__ */ t("h1", { className: "text-4xl", children: "Messages" }),
|
|
59
|
-
/* @__PURE__ */ o("div", { className: "flex items-center gap-2", children: [
|
|
60
|
-
/* @__PURE__ */ t(C, {}),
|
|
61
|
-
/* @__PURE__ */ t(
|
|
62
|
-
M,
|
|
63
|
-
{
|
|
64
|
-
className: "my-0",
|
|
65
|
-
disabled: !i.formState.isDirty,
|
|
66
|
-
type: "submit",
|
|
67
|
-
children: "Save"
|
|
68
|
-
}
|
|
69
|
-
)
|
|
70
|
-
] })
|
|
71
|
-
] }),
|
|
72
|
-
m && /* @__PURE__ */ t(
|
|
73
|
-
I,
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Button, toast, useStepNav } from '@payloadcms/ui';
|
|
4
|
+
import { isEqual } from 'lodash-es';
|
|
5
|
+
import { useEffect, useState } from 'react';
|
|
6
|
+
import { useForm } from 'react-hook-form';
|
|
7
|
+
import { MessagesFormProvider } from '../components/MessageFormContext';
|
|
8
|
+
import { getErrorMessage } from '../utils/error-handling';
|
|
9
|
+
import { JsonImport } from './actions/JsonImport';
|
|
10
|
+
import { MessageField } from './layout/MessageField';
|
|
11
|
+
import { MessagesTabs } from './layout/MessagesTabs';
|
|
12
|
+
import { MessagesTree } from './layout/MessagesTree';
|
|
13
|
+
import styles from './MessagesForm.module.css';
|
|
14
|
+
export function MessagesForm({ locales, schema, tabs = false, values, endpointUrl }) {
|
|
15
|
+
const { setStepNav } = useStepNav();
|
|
16
|
+
useEffect(()=>{
|
|
17
|
+
setStepNav([
|
|
74
18
|
{
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
setActiveTab: v
|
|
19
|
+
label: 'Intl Messages',
|
|
20
|
+
url: '/intl'
|
|
78
21
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
{
|
|
100
|
-
|
|
101
|
-
nestingLevel: 0,
|
|
102
|
-
path: e,
|
|
103
|
-
schema: r
|
|
22
|
+
]);
|
|
23
|
+
}, [
|
|
24
|
+
setStepNav
|
|
25
|
+
]);
|
|
26
|
+
const form = useForm({
|
|
27
|
+
defaultValues: values,
|
|
28
|
+
reValidateMode: 'onChange'
|
|
29
|
+
});
|
|
30
|
+
const [activeTab, setActiveTab] = useState(Object.keys(schema)[0]);
|
|
31
|
+
const handleSubmit = async (currentValues)=>{
|
|
32
|
+
const toastId = toast.loading('Saving...');
|
|
33
|
+
const changes = Object.entries(currentValues).reduce((acc, [locale, value])=>{
|
|
34
|
+
const hasChanged = !isEqual(value, values[locale]);
|
|
35
|
+
if (!hasChanged) return acc;
|
|
36
|
+
acc[locale] = value;
|
|
37
|
+
return acc;
|
|
38
|
+
}, {});
|
|
39
|
+
try {
|
|
40
|
+
const response = await fetch(endpointUrl, {
|
|
41
|
+
method: 'PUT',
|
|
42
|
+
headers: {
|
|
43
|
+
'Content-Type': 'application/json'
|
|
104
44
|
},
|
|
105
|
-
|
|
106
|
-
|
|
45
|
+
body: JSON.stringify(changes)
|
|
46
|
+
});
|
|
47
|
+
if (!response.ok) {
|
|
48
|
+
const error = await getErrorMessage(response);
|
|
49
|
+
throw new Error(error);
|
|
50
|
+
}
|
|
51
|
+
form.reset(currentValues);
|
|
52
|
+
toast.success('Saved', {
|
|
53
|
+
id: toastId
|
|
54
|
+
});
|
|
55
|
+
} catch (error) {
|
|
56
|
+
toast.error(`Failed to save: ${error instanceof Error ? error.message : 'Unknown error'}`, {
|
|
57
|
+
id: toastId
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
return /*#__PURE__*/ _jsx(MessagesFormProvider, {
|
|
62
|
+
form: form,
|
|
63
|
+
locales: locales,
|
|
64
|
+
children: /*#__PURE__*/ _jsxs("form", {
|
|
65
|
+
className: styles.form,
|
|
66
|
+
onSubmit: form.handleSubmit(handleSubmit),
|
|
67
|
+
children: [
|
|
68
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
69
|
+
className: styles.stickyHeader,
|
|
70
|
+
children: [
|
|
71
|
+
/*#__PURE__*/ _jsxs("header", {
|
|
72
|
+
className: styles.header,
|
|
73
|
+
children: [
|
|
74
|
+
/*#__PURE__*/ _jsx("h1", {
|
|
75
|
+
className: styles.title,
|
|
76
|
+
children: "Messages"
|
|
77
|
+
}),
|
|
78
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
79
|
+
className: styles.actions,
|
|
80
|
+
children: [
|
|
81
|
+
/*#__PURE__*/ _jsx(JsonImport, {}),
|
|
82
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
83
|
+
className: styles.saveButton,
|
|
84
|
+
disabled: !form.formState.isDirty,
|
|
85
|
+
type: "submit",
|
|
86
|
+
children: "Save"
|
|
87
|
+
})
|
|
88
|
+
]
|
|
89
|
+
})
|
|
90
|
+
]
|
|
91
|
+
}),
|
|
92
|
+
tabs && /*#__PURE__*/ _jsx(MessagesTabs, {
|
|
93
|
+
activeTab: activeTab,
|
|
94
|
+
schema: schema,
|
|
95
|
+
setActiveTab: setActiveTab
|
|
96
|
+
})
|
|
97
|
+
]
|
|
98
|
+
}),
|
|
99
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
100
|
+
className: styles.content,
|
|
101
|
+
id: "messages-form-content",
|
|
102
|
+
children: [
|
|
103
|
+
!tabs && /*#__PURE__*/ _jsx(MessagesTree, {
|
|
104
|
+
nestingLevel: 0,
|
|
105
|
+
path: "",
|
|
106
|
+
schema: schema
|
|
107
|
+
}),
|
|
108
|
+
tabs && Object.entries(schema).map(([key, value])=>{
|
|
109
|
+
if (typeof value === 'string') {
|
|
110
|
+
return /*#__PURE__*/ _jsx(MessageField, {
|
|
111
|
+
hidden: activeTab !== key,
|
|
112
|
+
messageKey: key,
|
|
113
|
+
path: key,
|
|
114
|
+
schema: value
|
|
115
|
+
}, key);
|
|
116
|
+
}
|
|
117
|
+
return /*#__PURE__*/ _jsx(MessagesTree, {
|
|
118
|
+
hidden: activeTab !== key,
|
|
119
|
+
nestingLevel: 0,
|
|
120
|
+
path: key,
|
|
121
|
+
schema: value
|
|
122
|
+
}, key);
|
|
123
|
+
})
|
|
124
|
+
]
|
|
125
|
+
})
|
|
107
126
|
]
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
]
|
|
111
|
-
}
|
|
112
|
-
) });
|
|
127
|
+
})
|
|
128
|
+
});
|
|
113
129
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
};
|
|
117
|
-
//# sourceMappingURL=MessagesForm.js.map
|
|
130
|
+
|
|
131
|
+
//# sourceMappingURL=MessagesForm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../../src/components/MessagesForm.tsx"],"sourcesContent":["'use client';\n\nimport { Button, toast, useStepNav } from '@payloadcms/ui';\nimport { isEqual } from 'lodash-es';\nimport { useEffect, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport type { FormValues } from '@/components/MessageFormContext';\nimport { MessagesFormProvider } from '@/components/MessageFormContext';\nimport type {\n DeepPartial,\n Locale,\n Messages,\n MessagesSchema,\n Translations,\n} from '@/types';\nimport { getErrorMessage } from '@/utils/error-handling';\nimport { JsonImport } from './actions/JsonImport';\nimport { MessageField } from './layout/MessageField';\nimport { MessagesTabs } from './layout/MessagesTabs';\nimport { MessagesTree } from './layout/MessagesTree';\nimport styles from './MessagesForm.module.css';\n\ninterface MessagesFormProps {\n locales: Locale[];\n schema: MessagesSchema;\n tabs?: boolean;\n values: Translations<DeepPartial<Messages>>;\n endpointUrl: string;\n}\n\nexport function MessagesForm({\n locales,\n schema,\n tabs = false,\n values,\n endpointUrl,\n}: MessagesFormProps): React.ReactNode {\n const { setStepNav } = useStepNav();\n useEffect(() => {\n setStepNav([{ label: 'Intl Messages', url: '/intl' }]);\n }, [setStepNav]);\n\n const form = useForm<FormValues>({\n defaultValues: values,\n reValidateMode: 'onChange',\n });\n const [activeTab, setActiveTab] = useState(Object.keys(schema)[0]);\n\n const handleSubmit = async (currentValues: FormValues) => {\n const toastId = toast.loading('Saving...');\n const changes = Object.entries(currentValues).reduce<\n Translations<Messages>\n >((acc, [locale, value]) => {\n const hasChanged = !isEqual(value, values[locale]);\n if (!hasChanged) return acc;\n acc[locale] = value;\n return acc;\n }, {});\n\n try {\n const response = await fetch(endpointUrl, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(changes),\n });\n\n if (!response.ok) {\n const error = await getErrorMessage(response);\n throw new Error(error);\n }\n\n form.reset(currentValues);\n toast.success('Saved', { id: toastId });\n } catch (error) {\n toast.error(\n `Failed to save: ${error instanceof Error ? error.message : 'Unknown error'}`,\n { id: toastId },\n );\n }\n };\n\n return (\n <MessagesFormProvider form={form} locales={locales}>\n <form className={styles.form} onSubmit={form.handleSubmit(handleSubmit)}>\n <div className={styles.stickyHeader}>\n <header className={styles.header}>\n <h1 className={styles.title}>Messages</h1>\n <div className={styles.actions}>\n <JsonImport />\n <Button\n className={styles.saveButton}\n disabled={!form.formState.isDirty}\n type=\"submit\"\n >\n Save\n </Button>\n </div>\n </header>\n\n {tabs && (\n <MessagesTabs\n activeTab={activeTab}\n schema={schema}\n setActiveTab={setActiveTab}\n />\n )}\n </div>\n\n <div className={styles.content} id=\"messages-form-content\">\n {!tabs && <MessagesTree nestingLevel={0} path=\"\" schema={schema} />}\n {tabs &&\n Object.entries(schema).map(([key, value]) => {\n if (typeof value === 'string') {\n return (\n <MessageField\n hidden={activeTab !== key}\n key={key}\n messageKey={key}\n path={key}\n schema={value}\n />\n );\n }\n return (\n <MessagesTree\n hidden={activeTab !== key}\n key={key}\n nestingLevel={0}\n path={key}\n schema={value}\n />\n );\n })}\n </div>\n </form>\n </MessagesFormProvider>\n );\n}\n"],"names":["Button","toast","useStepNav","isEqual","useEffect","useState","useForm","MessagesFormProvider","getErrorMessage","JsonImport","MessageField","MessagesTabs","MessagesTree","styles","MessagesForm","locales","schema","tabs","values","endpointUrl","setStepNav","label","url","form","defaultValues","reValidateMode","activeTab","setActiveTab","Object","keys","handleSubmit","currentValues","toastId","loading","changes","entries","reduce","acc","locale","value","hasChanged","response","fetch","method","headers","body","JSON","stringify","ok","error","Error","reset","success","id","message","className","onSubmit","div","stickyHeader","header","h1","title","actions","saveButton","disabled","formState","isDirty","type","content","nestingLevel","path","map","key","hidden","messageKey"],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
.form {
|
|
2
|
+
display: flex;
|
|
3
|
+
height: calc(100vh - var(--app-header-height));
|
|
4
|
+
flex-direction: column;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.stickyHeader {
|
|
8
|
+
position: sticky;
|
|
9
|
+
top: 0;
|
|
10
|
+
z-index: 10;
|
|
11
|
+
background-color: var(--theme-bg);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.header {
|
|
15
|
+
margin-bottom: 1.5rem;
|
|
16
|
+
display: flex;
|
|
17
|
+
align-items: center;
|
|
18
|
+
justify-content: space-between;
|
|
19
|
+
gap: 1rem;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.title {
|
|
23
|
+
font-size: var(--font-size-2xl);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.actions {
|
|
27
|
+
display: flex;
|
|
28
|
+
align-items: center;
|
|
29
|
+
gap: 0.5rem;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.saveButton {
|
|
33
|
+
margin-block: 0;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.content {
|
|
37
|
+
min-height: 0;
|
|
38
|
+
overflow-y: auto;
|
|
39
|
+
padding-top: 2rem;
|
|
40
|
+
padding-bottom: 4rem;
|
|
41
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { PayloadRequest } from 'payload';
|
|
2
|
-
import { MessagesGuard } from '../types';
|
|
1
|
+
import type { PayloadRequest } from 'payload';
|
|
2
|
+
import type { MessagesGuard } from '../types';
|
|
3
3
|
export interface MessagesLinkProps {
|
|
4
4
|
access?: MessagesGuard;
|
|
5
5
|
req: PayloadRequest;
|
|
6
6
|
}
|
|
7
7
|
export declare function MessagesLink({ access, req, }: MessagesLinkProps): Promise<import("react/jsx-runtime").JSX.Element | null>;
|
|
8
|
-
//# sourceMappingURL=
|
|
8
|
+
//# sourceMappingURL=MessagesLink.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessagesLink.d.ts","sourceRoot":"","sources":["../../src/components/MessagesLink.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,GAAG,EAAE,cAAc,CAAC;CACrB;AAED,wBAAsB,YAAY,CAAC,EACjC,MAAmB,EACnB,GAAG,GACJ,EAAE,iBAAiB,2DAanB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Button } from '@payloadcms/ui';
|
|
3
|
+
import { getAdminURL } from '@repo/common';
|
|
4
|
+
import { IconWorld } from '@tabler/icons-react';
|
|
5
|
+
export async function MessagesLink({ access = ()=>true, req }) {
|
|
6
|
+
const hasAccess = await access(req);
|
|
7
|
+
if (!hasAccess) return null;
|
|
8
|
+
return /*#__PURE__*/ _jsx(Button, {
|
|
9
|
+
buttonStyle: "tab",
|
|
10
|
+
el: "link",
|
|
11
|
+
to: getAdminURL({
|
|
12
|
+
req,
|
|
13
|
+
path: '/intl'
|
|
14
|
+
}),
|
|
15
|
+
children: /*#__PURE__*/ _jsx(IconWorld, {})
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=MessagesLink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/MessagesLink.tsx"],"sourcesContent":["import { Button } from '@payloadcms/ui';\nimport { getAdminURL } from '@repo/common';\nimport { IconWorld } from '@tabler/icons-react';\nimport type { PayloadRequest } from 'payload';\nimport type { MessagesGuard } from '@/types';\n\nexport interface MessagesLinkProps {\n access?: MessagesGuard;\n req: PayloadRequest;\n}\n\nexport async function MessagesLink({\n access = () => true,\n req,\n}: MessagesLinkProps) {\n const hasAccess = await access(req);\n if (!hasAccess) return null;\n\n return (\n <Button\n buttonStyle=\"tab\"\n el=\"link\"\n to={getAdminURL({ req, path: '/intl' })}\n >\n <IconWorld />\n </Button>\n );\n}\n"],"names":["Button","getAdminURL","IconWorld","MessagesLink","access","req","hasAccess","buttonStyle","el","to","path"],"mappings":";AAAA,SAASA,MAAM,QAAQ,iBAAiB;AACxC,SAASC,WAAW,QAAQ,eAAe;AAC3C,SAASC,SAAS,QAAQ,sBAAsB;AAShD,OAAO,eAAeC,aAAa,EACjCC,SAAS,IAAM,IAAI,EACnBC,GAAG,EACe;IAClB,MAAMC,YAAY,MAAMF,OAAOC;IAC/B,IAAI,CAACC,WAAW,OAAO;IAEvB,qBACE,KAACN;QACCO,aAAY;QACZC,IAAG;QACHC,IAAIR,YAAY;YAAEI;YAAKK,MAAM;QAAQ;kBAErC,cAAA,KAACR;;AAGP"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AdminViewServerProps } from 'payload';
|
|
2
|
+
import type { Locale, Messages, MessagesGuard } from '../types';
|
|
3
|
+
export interface MessagesViewProps {
|
|
4
|
+
locales: Locale[];
|
|
5
|
+
schema: Messages;
|
|
6
|
+
tabs: boolean | undefined;
|
|
7
|
+
access: MessagesGuard;
|
|
8
|
+
}
|
|
9
|
+
export declare function MessagesView({ access, initPageResult: { req, locale, permissions, visibleEntities }, locales, params, payload, schema, searchParams, tabs, }: AdminViewServerProps & MessagesViewProps): Promise<import("react/jsx-runtime").JSX.Element>;
|
|
10
|
+
//# sourceMappingURL=MessagesView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessagesView.d.ts","sourceRoot":"","sources":["../../src/components/MessagesView.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,KAAK,EAEV,MAAM,EACN,QAAQ,EACR,aAAa,EAEd,MAAM,SAAS,CAAC;AAKjB,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,QAAQ,CAAC;IACjB,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B,MAAM,EAAE,aAAa,CAAC;CACvB;AAED,wBAAsB,YAAY,CAAC,EACjC,MAAM,EACN,cAAc,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,EAC7D,OAAO,EACP,MAAM,EACN,OAAO,EACP,MAAM,EACN,YAAY,EACZ,IAAY,GACb,EAAE,oBAAoB,GAAG,iBAAiB,oDA6C1C"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { DefaultTemplate } from '@payloadcms/next/templates';
|
|
3
|
+
import { Gutter } from '@payloadcms/ui';
|
|
4
|
+
import { getAdminURL } from '@repo/common';
|
|
5
|
+
import { RedirectType, redirect } from 'next/navigation';
|
|
6
|
+
import { sanitizeMessages } from '../utils/sanitize';
|
|
7
|
+
import { fetchMessages } from '../requests/fetchMessages';
|
|
8
|
+
import { MessagesForm } from './MessagesForm';
|
|
9
|
+
export async function MessagesView({ access, initPageResult: { req, locale, permissions, visibleEntities }, locales, params, payload, schema, searchParams, tabs = false }) {
|
|
10
|
+
const apiUrl = payload.getAPIURL();
|
|
11
|
+
const endpointUrl = apiUrl.endsWith('/') ? `${apiUrl}intl-plugin` : `${apiUrl}/intl-plugin`;
|
|
12
|
+
const hasAccess = await access(req);
|
|
13
|
+
if (!hasAccess) redirect(getAdminURL({
|
|
14
|
+
req
|
|
15
|
+
}), RedirectType.replace);
|
|
16
|
+
const translations = {};
|
|
17
|
+
for (const locale of locales){
|
|
18
|
+
const messages = await fetchMessages(payload, locale);
|
|
19
|
+
translations[locale] = sanitizeMessages(schema, messages);
|
|
20
|
+
}
|
|
21
|
+
return /*#__PURE__*/ _jsx(DefaultTemplate, {
|
|
22
|
+
i18n: req.i18n,
|
|
23
|
+
locale: locale,
|
|
24
|
+
params: params,
|
|
25
|
+
payload: req.payload,
|
|
26
|
+
permissions: permissions,
|
|
27
|
+
searchParams: searchParams,
|
|
28
|
+
user: req.user || undefined,
|
|
29
|
+
viewActions: payload.config.admin.components.actions.filter((action)=>{
|
|
30
|
+
if (typeof action !== 'object') {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
return action.exportName !== 'MessagesLink';
|
|
34
|
+
}),
|
|
35
|
+
visibleEntities: visibleEntities,
|
|
36
|
+
children: /*#__PURE__*/ _jsx(Gutter, {
|
|
37
|
+
children: /*#__PURE__*/ _jsx(MessagesForm, {
|
|
38
|
+
endpointUrl: endpointUrl,
|
|
39
|
+
locales: locales,
|
|
40
|
+
schema: schema,
|
|
41
|
+
tabs: tabs,
|
|
42
|
+
values: translations
|
|
43
|
+
})
|
|
44
|
+
})
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
//# sourceMappingURL=MessagesView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/MessagesView.tsx"],"sourcesContent":["import { DefaultTemplate } from '@payloadcms/next/templates';\nimport { Gutter } from '@payloadcms/ui';\nimport { getAdminURL } from '@repo/common';\nimport { RedirectType, redirect } from 'next/navigation';\nimport type { AdminViewServerProps } from 'payload';\nimport type {\n DeepPartial,\n Locale,\n Messages,\n MessagesGuard,\n Translations,\n} from '@/types';\nimport { sanitizeMessages } from '@/utils/sanitize';\nimport { fetchMessages } from '../requests/fetchMessages';\nimport { MessagesForm } from './MessagesForm';\n\nexport interface MessagesViewProps {\n locales: Locale[];\n schema: Messages;\n tabs: boolean | undefined;\n access: MessagesGuard;\n}\n\nexport async function MessagesView({\n access,\n initPageResult: { req, locale, permissions, visibleEntities },\n locales,\n params,\n payload,\n schema,\n searchParams,\n tabs = false,\n}: AdminViewServerProps & MessagesViewProps) {\n const apiUrl = payload.getAPIURL();\n const endpointUrl = apiUrl.endsWith('/')\n ? `${apiUrl}intl-plugin`\n : `${apiUrl}/intl-plugin`;\n\n const hasAccess = await access(req);\n if (!hasAccess) redirect(getAdminURL({ req }), RedirectType.replace);\n\n const translations: Translations<DeepPartial<Messages>> = {};\n\n for (const locale of locales) {\n const messages = await fetchMessages(payload, locale);\n\n translations[locale] = sanitizeMessages(schema, messages);\n }\n\n return (\n <DefaultTemplate\n i18n={req.i18n}\n locale={locale}\n params={params}\n payload={req.payload}\n permissions={permissions}\n searchParams={searchParams}\n user={req.user || undefined}\n viewActions={payload.config.admin.components.actions.filter((action) => {\n if (typeof action !== 'object') {\n return true;\n }\n return action.exportName !== 'MessagesLink';\n })}\n visibleEntities={visibleEntities}\n >\n <Gutter>\n <MessagesForm\n endpointUrl={endpointUrl}\n locales={locales}\n schema={schema}\n tabs={tabs}\n values={translations}\n />\n </Gutter>\n </DefaultTemplate>\n );\n}\n"],"names":["DefaultTemplate","Gutter","getAdminURL","RedirectType","redirect","sanitizeMessages","fetchMessages","MessagesForm","MessagesView","access","initPageResult","req","locale","permissions","visibleEntities","locales","params","payload","schema","searchParams","tabs","apiUrl","getAPIURL","endpointUrl","endsWith","hasAccess","replace","translations","messages","i18n","user","undefined","viewActions","config","admin","components","actions","filter","action","exportName","values"],"mappings":";AAAA,SAASA,eAAe,QAAQ,6BAA6B;AAC7D,SAASC,MAAM,QAAQ,iBAAiB;AACxC,SAASC,WAAW,QAAQ,eAAe;AAC3C,SAASC,YAAY,EAAEC,QAAQ,QAAQ,kBAAkB;AASzD,SAASC,gBAAgB,QAAQ,mBAAmB;AACpD,SAASC,aAAa,QAAQ,4BAA4B;AAC1D,SAASC,YAAY,QAAQ,iBAAiB;AAS9C,OAAO,eAAeC,aAAa,EACjCC,MAAM,EACNC,gBAAgB,EAAEC,GAAG,EAAEC,MAAM,EAAEC,WAAW,EAAEC,eAAe,EAAE,EAC7DC,OAAO,EACPC,MAAM,EACNC,OAAO,EACPC,MAAM,EACNC,YAAY,EACZC,OAAO,KAAK,EAC6B;IACzC,MAAMC,SAASJ,QAAQK,SAAS;IAChC,MAAMC,cAAcF,OAAOG,QAAQ,CAAC,OAChC,GAAGH,OAAO,WAAW,CAAC,GACtB,GAAGA,OAAO,YAAY,CAAC;IAE3B,MAAMI,YAAY,MAAMhB,OAAOE;IAC/B,IAAI,CAACc,WAAWrB,SAASF,YAAY;QAAES;IAAI,IAAIR,aAAauB,OAAO;IAEnE,MAAMC,eAAoD,CAAC;IAE3D,KAAK,MAAMf,UAAUG,QAAS;QAC5B,MAAMa,WAAW,MAAMtB,cAAcW,SAASL;QAE9Ce,YAAY,CAACf,OAAO,GAAGP,iBAAiBa,QAAQU;IAClD;IAEA,qBACE,KAAC5B;QACC6B,MAAMlB,IAAIkB,IAAI;QACdjB,QAAQA;QACRI,QAAQA;QACRC,SAASN,IAAIM,OAAO;QACpBJ,aAAaA;QACbM,cAAcA;QACdW,MAAMnB,IAAImB,IAAI,IAAIC;QAClBC,aAAaf,QAAQgB,MAAM,CAACC,KAAK,CAACC,UAAU,CAACC,OAAO,CAACC,MAAM,CAAC,CAACC;YAC3D,IAAI,OAAOA,WAAW,UAAU;gBAC9B,OAAO;YACT;YACA,OAAOA,OAAOC,UAAU,KAAK;QAC/B;QACAzB,iBAAiBA;kBAEjB,cAAA,KAACb;sBACC,cAAA,KAACM;gBACCgB,aAAaA;gBACbR,SAASA;gBACTG,QAAQA;gBACRE,MAAMA;gBACNoB,QAAQb;;;;AAKlB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JsonImport.d.ts","sourceRoot":"","sources":["../../../src/components/actions/JsonImport.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"JsonImport.d.ts","sourceRoot":"","sources":["../../../src/components/actions/JsonImport.tsx"],"names":[],"mappings":"AAQA,wBAAgB,UAAU,4CAiEzB"}
|
|
@@ -1,63 +1,70 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Button
|
|
3
|
-
import { IconBraces
|
|
4
|
-
import { useRef
|
|
5
|
-
import { useMessagesForm
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const e = t.target.files?.[0];
|
|
16
|
-
if (!s || !e) {
|
|
17
|
-
t.target.value = "";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { Button } from '@payloadcms/ui';
|
|
3
|
+
import { IconBraces } from '@tabler/icons-react';
|
|
4
|
+
import { useRef, useState } from 'react';
|
|
5
|
+
import { useMessagesForm } from '../../components/MessageFormContext';
|
|
6
|
+
import styles from './JsonImport.module.css';
|
|
7
|
+
export function JsonImport() {
|
|
8
|
+
const { locales, setValue } = useMessagesForm();
|
|
9
|
+
const inputRef = useRef(null);
|
|
10
|
+
const [selectedLocale, setSelectedLocale] = useState();
|
|
11
|
+
const handleImportJSON = (event)=>{
|
|
12
|
+
const file = event.target.files?.[0];
|
|
13
|
+
if (!selectedLocale || !file) {
|
|
14
|
+
event.target.value = '';
|
|
18
15
|
return;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
16
|
+
}
|
|
17
|
+
const reader = new FileReader();
|
|
18
|
+
reader.onload = (readerEvent)=>{
|
|
19
|
+
const text = readerEvent.target?.result;
|
|
20
|
+
const data = JSON.parse(text);
|
|
21
|
+
// FIMXE this does not cause the form to re-render
|
|
22
|
+
setValue(selectedLocale, data, {
|
|
23
|
+
shouldDirty: true,
|
|
24
|
+
shouldValidate: true
|
|
25
|
+
});
|
|
26
|
+
setSelectedLocale(undefined);
|
|
27
|
+
// Clear the input value to allow re-selection of the same or different file
|
|
28
|
+
event.target.value = '';
|
|
29
|
+
};
|
|
30
|
+
reader.readAsText(file);
|
|
31
|
+
};
|
|
32
|
+
return /*#__PURE__*/ _jsxs(_Fragment, {
|
|
33
|
+
children: [
|
|
34
|
+
/*#__PURE__*/ _jsx("input", {
|
|
35
|
+
accept: ".json",
|
|
36
|
+
hidden: true,
|
|
37
|
+
onChange: handleImportJSON,
|
|
38
|
+
ref: inputRef,
|
|
39
|
+
type: "file"
|
|
40
|
+
}),
|
|
41
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
42
|
+
buttonStyle: "subtle",
|
|
43
|
+
className: styles.button,
|
|
44
|
+
icon: /*#__PURE__*/ _jsx(IconBraces, {
|
|
45
|
+
className: styles.icon
|
|
46
|
+
}),
|
|
47
|
+
iconPosition: "left",
|
|
48
|
+
SubMenuPopupContent: ({ close })=>/*#__PURE__*/ _jsx("div", {
|
|
49
|
+
className: styles.submenu,
|
|
50
|
+
children: locales.map((locale)=>/*#__PURE__*/ _jsxs(Button, {
|
|
51
|
+
buttonStyle: "subtle",
|
|
52
|
+
onClick: ()=>{
|
|
53
|
+
setSelectedLocale(locale);
|
|
54
|
+
inputRef.current?.click();
|
|
55
|
+
close();
|
|
56
|
+
},
|
|
57
|
+
size: "small",
|
|
58
|
+
children: [
|
|
59
|
+
locale,
|
|
60
|
+
".json"
|
|
61
|
+
]
|
|
62
|
+
}, locale))
|
|
63
|
+
}),
|
|
64
|
+
children: "Import"
|
|
65
|
+
})
|
|
66
|
+
]
|
|
67
|
+
});
|
|
59
68
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
};
|
|
63
|
-
//# sourceMappingURL=JsonImport.js.map
|
|
69
|
+
|
|
70
|
+
//# sourceMappingURL=JsonImport.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../../../src/components/actions/JsonImport.tsx"],"sourcesContent":["import { Button } from '@payloadcms/ui';\nimport { IconBraces } from '@tabler/icons-react';\nimport { useRef, useState } from 'react';\n\nimport { useMessagesForm } from '@/components/MessageFormContext';\n\nimport styles from './JsonImport.module.css';\n\nexport function JsonImport() {\n const { locales, setValue } = useMessagesForm();\n const inputRef = useRef<HTMLInputElement>(null);\n const [selectedLocale, setSelectedLocale] = useState<string>();\n\n const handleImportJSON = (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n if (!selectedLocale || !file) {\n event.target.value = '';\n return;\n }\n\n const reader = new FileReader();\n reader.onload = (readerEvent) => {\n const text = readerEvent.target?.result as string;\n const data = JSON.parse(text);\n // FIMXE this does not cause the form to re-render\n setValue(selectedLocale, data, {\n shouldDirty: true,\n shouldValidate: true,\n });\n setSelectedLocale(undefined);\n // Clear the input value to allow re-selection of the same or different file\n event.target.value = '';\n };\n reader.readAsText(file);\n };\n\n return (\n <>\n <input\n accept=\".json\"\n hidden\n onChange={handleImportJSON}\n ref={inputRef}\n type=\"file\"\n />\n <Button\n buttonStyle=\"subtle\"\n className={styles.button}\n icon={<IconBraces className={styles.icon} />}\n iconPosition=\"left\"\n SubMenuPopupContent={({ close }) => (\n <div className={styles.submenu}>\n {locales.map((locale) => (\n <Button\n buttonStyle=\"subtle\"\n key={locale}\n onClick={() => {\n setSelectedLocale(locale);\n inputRef.current?.click();\n close();\n }}\n size=\"small\"\n >\n {locale}.json\n </Button>\n ))}\n </div>\n )}\n >\n Import\n </Button>\n </>\n );\n}\n"],"names":["Button","IconBraces","useRef","useState","useMessagesForm","styles","JsonImport","locales","setValue","inputRef","selectedLocale","setSelectedLocale","handleImportJSON","event","file","target","files","value","reader","FileReader","onload","readerEvent","text","result","data","JSON","parse","shouldDirty","shouldValidate","undefined","readAsText","input","accept","hidden","onChange","ref","type","buttonStyle","className","button","icon","iconPosition","SubMenuPopupContent","close","div","submenu","map","locale","onClick","current","click","size"],"mappings":";AAAA,SAASA,MAAM,QAAQ,iBAAiB;AACxC,SAASC,UAAU,QAAQ,sBAAsB;AACjD,SAASC,MAAM,EAAEC,QAAQ,QAAQ,QAAQ;AAEzC,SAASC,eAAe,QAAQ,kCAAkC;AAElE,OAAOC,YAAY,0BAA0B;AAE7C,OAAO,SAASC;IACd,MAAM,EAAEC,OAAO,EAAEC,QAAQ,EAAE,GAAGJ;IAC9B,MAAMK,WAAWP,OAAyB;IAC1C,MAAM,CAACQ,gBAAgBC,kBAAkB,GAAGR;IAE5C,MAAMS,mBAAmB,CAACC;QACxB,MAAMC,OAAOD,MAAME,MAAM,CAACC,KAAK,EAAE,CAAC,EAAE;QACpC,IAAI,CAACN,kBAAkB,CAACI,MAAM;YAC5BD,MAAME,MAAM,CAACE,KAAK,GAAG;YACrB;QACF;QAEA,MAAMC,SAAS,IAAIC;QACnBD,OAAOE,MAAM,GAAG,CAACC;YACf,MAAMC,OAAOD,YAAYN,MAAM,EAAEQ;YACjC,MAAMC,OAAOC,KAAKC,KAAK,CAACJ;YACxB,kDAAkD;YAClDd,SAASE,gBAAgBc,MAAM;gBAC7BG,aAAa;gBACbC,gBAAgB;YAClB;YACAjB,kBAAkBkB;YAClB,4EAA4E;YAC5EhB,MAAME,MAAM,CAACE,KAAK,GAAG;QACvB;QACAC,OAAOY,UAAU,CAAChB;IACpB;IAEA,qBACE;;0BACE,KAACiB;gBACCC,QAAO;gBACPC,MAAM;gBACNC,UAAUtB;gBACVuB,KAAK1B;gBACL2B,MAAK;;0BAEP,KAACpC;gBACCqC,aAAY;gBACZC,WAAWjC,OAAOkC,MAAM;gBACxBC,oBAAM,KAACvC;oBAAWqC,WAAWjC,OAAOmC,IAAI;;gBACxCC,cAAa;gBACbC,qBAAqB,CAAC,EAAEC,KAAK,EAAE,iBAC7B,KAACC;wBAAIN,WAAWjC,OAAOwC,OAAO;kCAC3BtC,QAAQuC,GAAG,CAAC,CAACC,uBACZ,MAAC/C;gCACCqC,aAAY;gCAEZW,SAAS;oCACPrC,kBAAkBoC;oCAClBtC,SAASwC,OAAO,EAAEC;oCAClBP;gCACF;gCACAQ,MAAK;;oCAEJJ;oCAAO;;+BARHA;;0BAad;;;;AAKP"}
|