payload-intl 0.0.1
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 +67 -0
- package/dist/components/MessageController.d.ts +14 -0
- package/dist/components/MessageController.js +64 -0
- package/dist/components/MessageController.js.map +1 -0
- package/dist/components/MessagesForm.d.ts +11 -0
- package/dist/components/MessagesForm.js +91 -0
- package/dist/components/MessagesForm.js.map +1 -0
- package/dist/components/actions/JsonImport.d.ts +1 -0
- package/dist/components/actions/Move.d.ts +3 -0
- package/dist/components/inputs/InputWrapper.d.ts +7 -0
- package/dist/components/inputs/InputWrapper.js +23 -0
- package/dist/components/inputs/InputWrapper.js.map +1 -0
- package/dist/components/inputs/MessageInput.d.ts +10 -0
- package/dist/components/inputs/MessageInput.js +52 -0
- package/dist/components/inputs/MessageInput.js.map +1 -0
- package/dist/components/inputs/RichTextInput.d.ts +8 -0
- package/dist/components/inputs/RichTextInput.js +81 -0
- package/dist/components/inputs/RichTextInput.js.map +1 -0
- package/dist/components/inputs/toolbar/AlignmentControls.d.ts +5 -0
- package/dist/components/inputs/toolbar/AlignmentControls.js +59 -0
- package/dist/components/inputs/toolbar/AlignmentControls.js.map +1 -0
- package/dist/components/inputs/toolbar/BlockElementSelect.d.ts +5 -0
- package/dist/components/inputs/toolbar/BlockElementSelect.js +129 -0
- package/dist/components/inputs/toolbar/BlockElementSelect.js.map +1 -0
- package/dist/components/inputs/toolbar/LinkEditor.d.ts +58 -0
- package/dist/components/inputs/toolbar/LinkEditor.js +230 -0
- package/dist/components/inputs/toolbar/LinkEditor.js.map +1 -0
- package/dist/components/inputs/toolbar/MarkControls.d.ts +5 -0
- package/dist/components/inputs/toolbar/MarkControls.js +47 -0
- package/dist/components/inputs/toolbar/MarkControls.js.map +1 -0
- package/dist/components/inputs/toolbar/RichTextToolbar.d.ts +6 -0
- package/dist/components/inputs/toolbar/RichTextToolbar.js +32 -0
- package/dist/components/inputs/toolbar/RichTextToolbar.js.map +1 -0
- package/dist/components/inputs/variables/VariableChip.d.ts +2 -0
- package/dist/components/inputs/variables/VariableChip.js +60 -0
- package/dist/components/inputs/variables/VariableChip.js.map +1 -0
- package/dist/components/inputs/variables/VariableSuggestion.d.ts +8 -0
- package/dist/components/inputs/variables/VariableSuggestion.js +40 -0
- package/dist/components/inputs/variables/VariableSuggestion.js.map +1 -0
- package/dist/components/inputs/variables/editors/DateVariableEditor.d.ts +9 -0
- package/dist/components/inputs/variables/editors/PluralVariableEditor.d.ts +9 -0
- package/dist/components/inputs/variables/editors/PluralVariableEditor.js +149 -0
- package/dist/components/inputs/variables/editors/PluralVariableEditor.js.map +1 -0
- package/dist/components/inputs/variables/editors/SelectVariableEditor.d.ts +6 -0
- package/dist/components/inputs/variables/editors/SelectVariableEditor.js +42 -0
- package/dist/components/inputs/variables/editors/SelectVariableEditor.js.map +1 -0
- package/dist/components/inputs/variables/editors/TagVariableEditor.d.ts +6 -0
- package/dist/components/inputs/variables/editors/TagVariableEditor.js +32 -0
- package/dist/components/inputs/variables/editors/TagVariableEditor.js.map +1 -0
- package/dist/components/inputs/variables/editors/TimeVariableEditor.d.ts +9 -0
- package/dist/components/inputs/variables/extension.d.ts +3 -0
- package/dist/components/inputs/variables/extension.js +93 -0
- package/dist/components/inputs/variables/extension.js.map +1 -0
- package/dist/components/inputs/variables/pickers/NumericVariablePicker.d.ts +6 -0
- package/dist/components/inputs/variables/pickers/NumericVariablePicker.js +49 -0
- package/dist/components/inputs/variables/pickers/NumericVariablePicker.js.map +1 -0
- package/dist/components/inputs/variables/pickers/TemporalElementEditor.d.ts +6 -0
- package/dist/components/layout/MessageField.d.ts +9 -0
- package/dist/components/layout/MessageField.js +46 -0
- package/dist/components/layout/MessageField.js.map +1 -0
- package/dist/components/layout/MessagesTabs.d.ts +8 -0
- package/dist/components/layout/MessagesTabs.js +43 -0
- package/dist/components/layout/MessagesTabs.js.map +1 -0
- package/dist/components/layout/MessagesTree.d.ts +9 -0
- package/dist/components/layout/MessagesTree.js +67 -0
- package/dist/components/layout/MessagesTree.js.map +1 -0
- package/dist/context/messages-form.d.ts +30 -0
- package/dist/endpoints/get-messages.d.ts +2 -0
- package/dist/endpoints/get-messages.js +13 -0
- package/dist/endpoints/get-messages.js.map +1 -0
- package/dist/endpoints/set-messages.d.ts +2 -0
- package/dist/endpoints/set-messages.js +47 -0
- package/dist/endpoints/set-messages.js.map +1 -0
- package/dist/exports/link.d.ts +7 -0
- package/dist/exports/link.js +20 -0
- package/dist/exports/link.js.map +1 -0
- package/dist/exports/rsc.d.ts +2 -0
- package/dist/exports/rsc.js +7 -0
- package/dist/exports/rsc.js.map +1 -0
- package/dist/exports/view.d.ts +10 -0
- package/dist/exports/view.js +56 -0
- package/dist/exports/view.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/requests/fetchMessages.d.ts +3 -0
- package/dist/requests/fetchMessages.js +29 -0
- package/dist/requests/fetchMessages.js.map +1 -0
- package/dist/styles.css +1 -0
- package/dist/types.d.ts +48 -0
- package/dist/utils/cn.d.ts +2 -0
- package/dist/utils/config.d.ts +11 -0
- package/dist/utils/config.js +19 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/format.d.ts +3 -0
- package/dist/utils/guards.d.ts +4 -0
- package/dist/utils/icu-tranform.d.ts +30 -0
- package/dist/utils/sanitize.d.ts +15 -0
- package/dist/utils/schema.d.ts +9 -0
- package/dist/utils/validate.d.ts +5 -0
- package/package.json +131 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { DateElement, TimeElement } from '../../../../types.ts';
|
|
2
|
+
export interface TemporalElementEditorProps {
|
|
3
|
+
element: DateElement | TimeElement;
|
|
4
|
+
onUpdate: (value: string) => void;
|
|
5
|
+
}
|
|
6
|
+
export declare function TemporalElementEditor({ element, onUpdate, }: TemporalElementEditorProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { MessageSchema } from '../../types.ts';
|
|
2
|
+
interface MessageFieldProps {
|
|
3
|
+
schema: MessageSchema;
|
|
4
|
+
messageKey: string;
|
|
5
|
+
path: string;
|
|
6
|
+
className?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function MessageField({ schema, messageKey, path, className, }: MessageFieldProps): React.ReactNode;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { useMemo as s } from "react";
|
|
2
|
+
import { useMessagesForm as c } from "@/context/messages-form";
|
|
3
|
+
import { cn as p } from "@/utils/cn";
|
|
4
|
+
import { toWords as v } from "@/utils/format";
|
|
5
|
+
import { parseMessageSchema as f } from "@/utils/schema";
|
|
6
|
+
import { createValidator as d } from "@/utils/validate";
|
|
7
|
+
import { MessageController as n } from "../MessageController.js";
|
|
8
|
+
function y({
|
|
9
|
+
schema: o,
|
|
10
|
+
messageKey: r,
|
|
11
|
+
path: l,
|
|
12
|
+
className: i
|
|
13
|
+
}) {
|
|
14
|
+
const { locales: a } = c(), e = s(() => f(o), [o]), m = s(
|
|
15
|
+
() => d(e.variables),
|
|
16
|
+
[e.variables]
|
|
17
|
+
);
|
|
18
|
+
return /* @__PURE__ */ React.createElement("div", { className: p("", i) }, e.description && /* @__PURE__ */ React.createElement("p", null, e.description), a.length === 1 ? /* @__PURE__ */ React.createElement(
|
|
19
|
+
n,
|
|
20
|
+
{
|
|
21
|
+
className: i,
|
|
22
|
+
type: e.type,
|
|
23
|
+
variables: e.variables,
|
|
24
|
+
label: v(r),
|
|
25
|
+
locale: a[0],
|
|
26
|
+
name: [a[0], l, r].join("."),
|
|
27
|
+
validate: m
|
|
28
|
+
}
|
|
29
|
+
) : /* @__PURE__ */ React.createElement("div", { className: "-mx-3 flex min-w-0 gap-4 overflow-x-auto overscroll-x-none px-3" }, a.map((t) => /* @__PURE__ */ React.createElement(
|
|
30
|
+
n,
|
|
31
|
+
{
|
|
32
|
+
key: t,
|
|
33
|
+
className: "flex-1",
|
|
34
|
+
type: e.type,
|
|
35
|
+
label: t.toUpperCase(),
|
|
36
|
+
locale: t,
|
|
37
|
+
variables: e.variables,
|
|
38
|
+
name: [t, l, r].join("."),
|
|
39
|
+
validate: m
|
|
40
|
+
}
|
|
41
|
+
))));
|
|
42
|
+
}
|
|
43
|
+
export {
|
|
44
|
+
y as MessageField
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=MessageField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageField.js","sources":["../../../src/components/layout/MessageField.tsx"],"sourcesContent":["import type { MessageSchema } from \"@/types\";\nimport { useMemo } from \"react\";\n\nimport { useMessagesForm } from \"@/context/messages-form\";\nimport { cn } from \"@/utils/cn\";\nimport { toWords } from \"@/utils/format\";\nimport { parseMessageSchema } from \"@/utils/schema\";\nimport { createValidator } from \"@/utils/validate\";\n\nimport { MessageController } from \"../MessageController\";\n\ninterface MessageFieldProps {\n schema: MessageSchema;\n messageKey: string;\n path: string;\n className?: string;\n}\n\nexport function MessageField({\n schema,\n messageKey,\n path,\n className,\n}: MessageFieldProps): React.ReactNode {\n const { locales } = useMessagesForm();\n\n const config = useMemo(() => parseMessageSchema(schema), [schema]);\n\n const validator = useMemo(\n () => createValidator(config.variables),\n [config.variables],\n );\n\n return (\n <div className={cn(\"\", className)}>\n {config.description && <p>{config.description}</p>}\n\n {locales.length === 1 ? (\n <MessageController\n className={className}\n type={config.type}\n variables={config.variables}\n label={toWords(messageKey)}\n locale={locales[0]}\n name={[locales[0], path, messageKey].join(\".\")}\n validate={validator}\n />\n ) : (\n <div className=\"-mx-3 flex min-w-0 gap-4 overflow-x-auto overscroll-x-none px-3\">\n {locales.map((locale) => (\n <MessageController\n key={locale}\n className=\"flex-1\"\n type={config.type}\n label={locale.toUpperCase()}\n locale={locale}\n variables={config.variables}\n name={[locale, path, messageKey].join(\".\")}\n validate={validator}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n"],"names":["MessageField","schema","messageKey","path","className","locales","useMessagesForm","config","useMemo","parseMessageSchema","validator","createValidator","cn","MessageController","toWords","locale"],"mappings":";;;;;;;AAkBO,SAASA,EAAa;AAAA,EAC3B,QAAAC;AAAA,EACA,YAAAC;AAAA,EACA,MAAAC;AAAA,EACA,WAAAC;AACF,GAAuC;AACrC,QAAM,EAAE,SAAAC,EAAA,IAAYC,EAAA,GAEdC,IAASC,EAAQ,MAAMC,EAAmBR,CAAM,GAAG,CAACA,CAAM,CAAC,GAE3DS,IAAYF;AAAA,IAChB,MAAMG,EAAgBJ,EAAO,SAAS;AAAA,IACtC,CAACA,EAAO,SAAS;AAAA,EAAA;AAGnB,6CACG,OAAA,EAAI,WAAWK,EAAG,IAAIR,CAAS,EAAA,GAC7BG,EAAO,eAAe,sBAAA,cAAC,WAAGA,EAAO,WAAY,GAE7CF,EAAQ,WAAW,IAClB,sBAAA;AAAA,IAACQ;AAAA,IAAA;AAAA,MACC,WAAAT;AAAA,MACA,MAAMG,EAAO;AAAA,MACb,WAAWA,EAAO;AAAA,MAClB,OAAOO,EAAQZ,CAAU;AAAA,MACzB,QAAQG,EAAQ,CAAC;AAAA,MACjB,MAAM,CAACA,EAAQ,CAAC,GAAGF,GAAMD,CAAU,EAAE,KAAK,GAAG;AAAA,MAC7C,UAAUQ;AAAA,IAAA;AAAA,EAAA,wCAGX,OAAA,EAAI,WAAU,qEACZL,EAAQ,IAAI,CAACU,MACZ,sBAAA;AAAA,IAACF;AAAA,IAAA;AAAA,MACC,KAAKE;AAAA,MACL,WAAU;AAAA,MACV,MAAMR,EAAO;AAAA,MACb,OAAOQ,EAAO,YAAA;AAAA,MACd,QAAAA;AAAA,MACA,WAAWR,EAAO;AAAA,MAClB,MAAM,CAACQ,GAAQZ,GAAMD,CAAU,EAAE,KAAK,GAAG;AAAA,MACzC,UAAUQ;AAAA,IAAA;AAAA,EAAA,CAEb,CACH,CAEJ;AAEJ;"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { MessagesSchema } from '../../types.ts';
|
|
2
|
+
interface MessagesTabsProps {
|
|
3
|
+
schema: MessagesSchema;
|
|
4
|
+
activeTab: string | undefined;
|
|
5
|
+
setActiveTab: (tab: string) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare function MessagesTabs({ schema, activeTab, setActiveTab, }: MessagesTabsProps): React.ReactNode;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Button as c } from "@payloadcms/ui";
|
|
2
|
+
import { get as i } from "lodash-es";
|
|
3
|
+
import { useCallback as p } from "react";
|
|
4
|
+
import { useFormState as b } from "react-hook-form";
|
|
5
|
+
import { useMessagesForm as u } from "@/context/messages-form";
|
|
6
|
+
import { cn as d } from "@/utils/cn";
|
|
7
|
+
import { toWords as f } from "@/utils/format";
|
|
8
|
+
function M({
|
|
9
|
+
schema: s,
|
|
10
|
+
activeTab: o,
|
|
11
|
+
setActiveTab: m
|
|
12
|
+
}) {
|
|
13
|
+
const { locales: t, control: a } = u(), { errors: e } = b({ control: a }), n = p(
|
|
14
|
+
(r) => t.some((l) => i(e, [l, r]) !== void 0),
|
|
15
|
+
[e, t]
|
|
16
|
+
);
|
|
17
|
+
return /* @__PURE__ */ React.createElement(
|
|
18
|
+
"div",
|
|
19
|
+
{
|
|
20
|
+
role: "tablist",
|
|
21
|
+
className: "overflow-x-auto border-b-2 border-border px-4 text-nowrap"
|
|
22
|
+
},
|
|
23
|
+
Object.keys(s).map((r) => /* @__PURE__ */ React.createElement(
|
|
24
|
+
c,
|
|
25
|
+
{
|
|
26
|
+
key: r,
|
|
27
|
+
size: "large",
|
|
28
|
+
className: d(
|
|
29
|
+
"my-0 rounded-b-none text-lg",
|
|
30
|
+
n(r) ? o === r ? "bg-error" : "text-error" : void 0
|
|
31
|
+
),
|
|
32
|
+
buttonStyle: o === r ? "pill" : "tab",
|
|
33
|
+
onClick: () => m(r),
|
|
34
|
+
type: "button"
|
|
35
|
+
},
|
|
36
|
+
f(r)
|
|
37
|
+
))
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
export {
|
|
41
|
+
M as MessagesTabs
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=MessagesTabs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessagesTabs.js","sources":["../../../src/components/layout/MessagesTabs.tsx"],"sourcesContent":["import type { MessagesSchema } from \"@/types\";\nimport { Button } from \"@payloadcms/ui\";\nimport { get } from \"lodash-es\";\nimport { useCallback } from \"react\";\nimport { useFormState } from \"react-hook-form\";\n\nimport { useMessagesForm } from \"@/context/messages-form\";\nimport { cn } from \"@/utils/cn\";\nimport { toWords } from \"@/utils/format\";\n\ninterface MessagesTabsProps {\n schema: MessagesSchema;\n activeTab: string | undefined;\n setActiveTab: (tab: string) => void;\n}\n\n// TODO add hash for current tab to url\nexport function MessagesTabs({\n schema,\n activeTab,\n setActiveTab,\n}: MessagesTabsProps): React.ReactNode {\n const { locales, control } = useMessagesForm();\n const { errors } = useFormState({ control });\n\n const hasErrors = useCallback(\n (key: string) => {\n return locales.some((locale) => get(errors, [locale, key]) !== undefined);\n },\n [errors, locales],\n );\n\n return (\n <div\n role=\"tablist\"\n className=\"overflow-x-auto border-b-2 border-border px-4 text-nowrap\"\n >\n {Object.keys(schema).map((key) => (\n <Button\n key={key}\n size=\"large\"\n className={cn(\n \"my-0 rounded-b-none text-lg\",\n hasErrors(key)\n ? activeTab === key\n ? \"bg-error\"\n : \"text-error\"\n : undefined,\n )}\n buttonStyle={activeTab === key ? \"pill\" : \"tab\"}\n onClick={() => setActiveTab(key)}\n type=\"button\"\n >\n {toWords(key)}\n </Button>\n ))}\n </div>\n );\n}\n"],"names":["MessagesTabs","schema","activeTab","setActiveTab","locales","control","useMessagesForm","errors","useFormState","hasErrors","useCallback","key","locale","get","Button","cn","toWords"],"mappings":";;;;;;;AAiBO,SAASA,EAAa;AAAA,EAC3B,QAAAC;AAAA,EACA,WAAAC;AAAA,EACA,cAAAC;AACF,GAAuC;AACrC,QAAM,EAAE,SAAAC,GAAS,SAAAC,EAAA,IAAYC,EAAA,GACvB,EAAE,QAAAC,EAAA,IAAWC,EAAa,EAAE,SAAAH,GAAS,GAErCI,IAAYC;AAAA,IAChB,CAACC,MACQP,EAAQ,KAAK,CAACQ,MAAWC,EAAIN,GAAQ,CAACK,GAAQD,CAAG,CAAC,MAAM,MAAS;AAAA,IAE1E,CAACJ,GAAQH,CAAO;AAAA,EAAA;AAGlB,SACE,sBAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAU;AAAA,IAAA;AAAA,IAET,OAAO,KAAKH,CAAM,EAAE,IAAI,CAACU,MACxB,sBAAA;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,KAAAH;AAAA,QACA,MAAK;AAAA,QACL,WAAWI;AAAA,UACT;AAAA,UACAN,EAAUE,CAAG,IACTT,MAAcS,IACZ,aACA,eACF;AAAA,QAAA;AAAA,QAEN,aAAaT,MAAcS,IAAM,SAAS;AAAA,QAC1C,SAAS,MAAMR,EAAaQ,CAAG;AAAA,QAC/B,MAAK;AAAA,MAAA;AAAA,MAEJK,EAAQL,CAAG;AAAA,IAAA,CAEf;AAAA,EAAA;AAGP;"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Messages } from '../../types.ts';
|
|
2
|
+
interface MessagesTreeProps {
|
|
3
|
+
path: string;
|
|
4
|
+
nestingLevel: number;
|
|
5
|
+
schema: Messages;
|
|
6
|
+
className?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function MessagesTree({ path, schema, nestingLevel, className, }: MessagesTreeProps): React.ReactNode;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Collapsible as p } from "@payloadcms/ui";
|
|
2
|
+
import { get as g } from "lodash-es";
|
|
3
|
+
import { useCallback as f } from "react";
|
|
4
|
+
import { useFormState as d } from "react-hook-form";
|
|
5
|
+
import { useMessagesForm as E } from "@/context/messages-form";
|
|
6
|
+
import { cn as a } from "@/utils/cn";
|
|
7
|
+
import { toWords as R } from "@/utils/format";
|
|
8
|
+
import { MessageField as N } from "./MessageField.js";
|
|
9
|
+
function b({
|
|
10
|
+
path: t,
|
|
11
|
+
schema: c,
|
|
12
|
+
nestingLevel: s = 0,
|
|
13
|
+
className: i
|
|
14
|
+
}) {
|
|
15
|
+
const { control: l, locales: m } = E(), { errors: o } = d({ control: l }), n = f(
|
|
16
|
+
(e) => m.some(
|
|
17
|
+
(r) => g(o, [r, t, e].join(".")) !== void 0
|
|
18
|
+
),
|
|
19
|
+
[o, m, t]
|
|
20
|
+
);
|
|
21
|
+
return /* @__PURE__ */ React.createElement("div", { className: a("grid gap-6", i) }, Object.entries(c).map(([e, r]) => /* @__PURE__ */ React.createElement(
|
|
22
|
+
"div",
|
|
23
|
+
{
|
|
24
|
+
key: e,
|
|
25
|
+
className: "grid min-w-0",
|
|
26
|
+
style: {
|
|
27
|
+
"--nesting-level": s
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
/* @__PURE__ */ React.createElement(
|
|
31
|
+
p,
|
|
32
|
+
{
|
|
33
|
+
className: "messages-tree-collapsible min-w-0",
|
|
34
|
+
header: /* @__PURE__ */ React.createElement(
|
|
35
|
+
"span",
|
|
36
|
+
{
|
|
37
|
+
className: a("text-xl", {
|
|
38
|
+
"text-error": n(e)
|
|
39
|
+
})
|
|
40
|
+
},
|
|
41
|
+
R(e)
|
|
42
|
+
)
|
|
43
|
+
},
|
|
44
|
+
typeof r == "string" ? /* @__PURE__ */ React.createElement(
|
|
45
|
+
N,
|
|
46
|
+
{
|
|
47
|
+
className: "min-w-0",
|
|
48
|
+
schema: r,
|
|
49
|
+
key: e,
|
|
50
|
+
messageKey: e,
|
|
51
|
+
path: t
|
|
52
|
+
}
|
|
53
|
+
) : /* @__PURE__ */ React.createElement(
|
|
54
|
+
b,
|
|
55
|
+
{
|
|
56
|
+
nestingLevel: s + 1,
|
|
57
|
+
path: [t, e].join("."),
|
|
58
|
+
schema: r
|
|
59
|
+
}
|
|
60
|
+
)
|
|
61
|
+
)
|
|
62
|
+
)));
|
|
63
|
+
}
|
|
64
|
+
export {
|
|
65
|
+
b as MessagesTree
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=MessagesTree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessagesTree.js","sources":["../../../src/components/layout/MessagesTree.tsx"],"sourcesContent":["import type { Messages } from \"@/types\";\nimport { Collapsible } from \"@payloadcms/ui\";\nimport { get } from \"lodash-es\";\nimport { useCallback } from \"react\";\nimport { useFormState } from \"react-hook-form\";\n\nimport { useMessagesForm } from \"@/context/messages-form\";\nimport { cn } from \"@/utils/cn\";\nimport { toWords } from \"@/utils/format\";\n\nimport { MessageField } from \"./MessageField\";\n\ninterface MessagesTreeProps {\n path: string;\n nestingLevel: number;\n schema: Messages;\n className?: string;\n}\n\nexport function MessagesTree({\n path,\n schema,\n nestingLevel = 0,\n className,\n}: MessagesTreeProps): React.ReactNode {\n const { control, locales } = useMessagesForm();\n const { errors } = useFormState({ control });\n\n const hasErrors = useCallback(\n (key: string) => {\n return locales.some(\n (locale) => get(errors, [locale, path, key].join(\".\")) !== undefined,\n );\n },\n [errors, locales, path],\n );\n\n return (\n <div className={cn(\"grid gap-6\", className)}>\n {Object.entries(schema).map(([key, value]) => (\n <div\n key={key}\n className=\"grid min-w-0\"\n style={\n {\n [\"--nesting-level\"]: nestingLevel,\n } as React.CSSProperties\n }\n >\n <Collapsible\n className=\"messages-tree-collapsible min-w-0\"\n header={\n <span\n className={cn(\"text-xl\", {\n \"text-error\": hasErrors(key),\n })}\n >\n {toWords(key)}\n </span>\n }\n >\n {typeof value === \"string\" ? (\n <MessageField\n className=\"min-w-0\"\n schema={value}\n key={key}\n messageKey={key}\n path={path}\n />\n ) : (\n <MessagesTree\n nestingLevel={nestingLevel + 1}\n path={[path, key].join(\".\")}\n schema={value}\n />\n )}\n </Collapsible>\n </div>\n ))}\n </div>\n );\n}\n"],"names":["MessagesTree","path","schema","nestingLevel","className","control","locales","useMessagesForm","errors","useFormState","hasErrors","useCallback","key","locale","get","cn","value","Collapsible","toWords","MessageField"],"mappings":";;;;;;;;AAmBO,SAASA,EAAa;AAAA,EAC3B,MAAAC;AAAA,EACA,QAAAC;AAAA,EACA,cAAAC,IAAe;AAAA,EACf,WAAAC;AACF,GAAuC;AACrC,QAAM,EAAE,SAAAC,GAAS,SAAAC,EAAA,IAAYC,EAAA,GACvB,EAAE,QAAAC,EAAA,IAAWC,EAAa,EAAE,SAAAJ,GAAS,GAErCK,IAAYC;AAAA,IAChB,CAACC,MACQN,EAAQ;AAAA,MACb,CAACO,MAAWC,EAAIN,GAAQ,CAACK,GAAQZ,GAAMW,CAAG,EAAE,KAAK,GAAG,CAAC,MAAM;AAAA,IAAA;AAAA,IAG/D,CAACJ,GAAQF,GAASL,CAAI;AAAA,EAAA;AAGxB,6CACG,OAAA,EAAI,WAAWc,EAAG,cAAcX,CAAS,EAAA,GACvC,OAAO,QAAQF,CAAM,EAAE,IAAI,CAAC,CAACU,GAAKI,CAAK,MACtC,sBAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAJ;AAAA,MACA,WAAU;AAAA,MACV,OACE;AAAA,QACG,mBAAoBT;AAAA,MAAA;AAAA,IACvB;AAAA,IAGF,sBAAA;AAAA,MAACc;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,QACE,sBAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWF,EAAG,WAAW;AAAA,cACvB,cAAcL,EAAUE,CAAG;AAAA,YAAA,CAC5B;AAAA,UAAA;AAAA,UAEAM,EAAQN,CAAG;AAAA,QAAA;AAAA,MACd;AAAA,MAGD,OAAOI,KAAU,WAChB,sBAAA;AAAA,QAACG;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,QAAQH;AAAA,UACR,KAAAJ;AAAA,UACA,YAAYA;AAAA,UACZ,MAAAX;AAAA,QAAA;AAAA,MAAA,IAGF,sBAAA;AAAA,QAACD;AAAA,QAAA;AAAA,UACC,cAAcG,IAAe;AAAA,UAC7B,MAAM,CAACF,GAAMW,CAAG,EAAE,KAAK,GAAG;AAAA,UAC1B,QAAQI;AAAA,QAAA;AAAA,MAAA;AAAA,IACV;AAAA,EAEJ,CAEH,CACH;AAEJ;"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Locales, Messages, RichTextEditorOptions, Translations } from '../types.ts';
|
|
2
|
+
import { UseFormReturn } from 'react-hook-form';
|
|
3
|
+
export type FormValues = Translations<Messages>;
|
|
4
|
+
interface MessagesFormProviderProps {
|
|
5
|
+
locales: Locales;
|
|
6
|
+
form: UseFormReturn<FormValues>;
|
|
7
|
+
richTextEditorOptions?: RichTextEditorOptions;
|
|
8
|
+
}
|
|
9
|
+
export declare function MessagesFormProvider({ locales, form, richTextEditorOptions, children, }: React.PropsWithChildren<MessagesFormProviderProps>): import("react").JSX.Element;
|
|
10
|
+
export declare const useMessagesForm: () => {
|
|
11
|
+
watch: import('react-hook-form').UseFormWatch<FormValues>;
|
|
12
|
+
getValues: import('react-hook-form').UseFormGetValues<FormValues>;
|
|
13
|
+
getFieldState: import('react-hook-form').UseFormGetFieldState<FormValues>;
|
|
14
|
+
setError: import('react-hook-form').UseFormSetError<FormValues>;
|
|
15
|
+
clearErrors: import('react-hook-form').UseFormClearErrors<FormValues>;
|
|
16
|
+
setValue: import('react-hook-form').UseFormSetValue<FormValues>;
|
|
17
|
+
trigger: import('react-hook-form').UseFormTrigger<FormValues>;
|
|
18
|
+
formState: import('react-hook-form').FormState<FormValues>;
|
|
19
|
+
resetField: import('react-hook-form').UseFormResetField<FormValues>;
|
|
20
|
+
reset: import('react-hook-form').UseFormReset<FormValues>;
|
|
21
|
+
handleSubmit: import('react-hook-form').UseFormHandleSubmit<FormValues, FormValues>;
|
|
22
|
+
unregister: import('react-hook-form').UseFormUnregister<FormValues>;
|
|
23
|
+
control: import('react-hook-form').Control<FormValues, any, FormValues>;
|
|
24
|
+
register: import('react-hook-form').UseFormRegister<FormValues>;
|
|
25
|
+
setFocus: import('react-hook-form').UseFormSetFocus<FormValues>;
|
|
26
|
+
subscribe: import('react-hook-form').UseFormSubscribe<FormValues>;
|
|
27
|
+
locales: Locales;
|
|
28
|
+
richTextEditorOptions?: RichTextEditorOptions;
|
|
29
|
+
};
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { fetchMessages as a } from "../requests/fetchMessages.js";
|
|
2
|
+
const n = {
|
|
3
|
+
handler: async (e) => {
|
|
4
|
+
const { locale: s } = e.routeParams, t = await a(e.payload, s);
|
|
5
|
+
return Response.json(t);
|
|
6
|
+
},
|
|
7
|
+
method: "get",
|
|
8
|
+
path: "/intl-plugin/:locale"
|
|
9
|
+
};
|
|
10
|
+
export {
|
|
11
|
+
n as getMessagesEndpoint
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=get-messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-messages.js","sources":["../../src/endpoints/get-messages.ts"],"sourcesContent":["import type { Endpoint, PayloadRequest } from \"payload\";\n\nimport { fetchMessages } from \"../requests/fetchMessages\";\n\nexport const getMessagesEndpoint: Endpoint = {\n handler: async (req: PayloadRequest) => {\n const { locale } = req.routeParams as { locale: string };\n const messages = await fetchMessages(req.payload, locale);\n return Response.json(messages);\n },\n method: \"get\",\n path: \"/intl-plugin/:locale\",\n};\n"],"names":["getMessagesEndpoint","req","locale","messages","fetchMessages"],"mappings":";AAIO,MAAMA,IAAgC;AAAA,EAC3C,SAAS,OAAOC,MAAwB;AACtC,UAAM,EAAE,QAAAC,MAAWD,EAAI,aACjBE,IAAW,MAAMC,EAAcH,EAAI,SAASC,CAAM;AACxD,WAAO,SAAS,KAAKC,CAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,EACR,MAAM;AACR;"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { getSupportedLocales as p, getPluginContext as d } from "@/utils/config";
|
|
2
|
+
const f = {
|
|
3
|
+
handler: async (a) => {
|
|
4
|
+
const { user: c } = await a.payload.auth({ headers: a.headers });
|
|
5
|
+
if (!c)
|
|
6
|
+
throw new Error("Unauthorized");
|
|
7
|
+
const e = await a.json?.();
|
|
8
|
+
if (!e)
|
|
9
|
+
throw new Error("No data provided");
|
|
10
|
+
const l = p(
|
|
11
|
+
a.payload.config.localization
|
|
12
|
+
), { collectionSlug: n } = d(a.payload.config);
|
|
13
|
+
for (const o of l) {
|
|
14
|
+
const s = e[o];
|
|
15
|
+
if (!s) continue;
|
|
16
|
+
const t = new File(
|
|
17
|
+
[JSON.stringify(s)],
|
|
18
|
+
`${o}-${Date.now()}.json`,
|
|
19
|
+
{
|
|
20
|
+
type: "application/json"
|
|
21
|
+
}
|
|
22
|
+
), i = {
|
|
23
|
+
name: t.name,
|
|
24
|
+
data: Buffer.from(await t.arrayBuffer()),
|
|
25
|
+
mimetype: t.type,
|
|
26
|
+
size: t.size
|
|
27
|
+
}, { docs: r } = await a.payload.update({
|
|
28
|
+
collection: n,
|
|
29
|
+
data: {},
|
|
30
|
+
file: i,
|
|
31
|
+
where: { locale: { equals: o } }
|
|
32
|
+
});
|
|
33
|
+
r.length === 0 && await a.payload.create({
|
|
34
|
+
collection: n,
|
|
35
|
+
data: { locale: o },
|
|
36
|
+
file: i
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
return Response.json({ success: !0 });
|
|
40
|
+
},
|
|
41
|
+
method: "put",
|
|
42
|
+
path: "/intl-plugin"
|
|
43
|
+
};
|
|
44
|
+
export {
|
|
45
|
+
f as setMessagesEndpoint
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=set-messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-messages.js","sources":["../../src/endpoints/set-messages.ts"],"sourcesContent":["import type { Messages, Translations } from \"@/types\";\nimport type { Endpoint, File, PayloadRequest } from \"payload\";\n\nimport { getPluginContext, getSupportedLocales } from \"@/utils/config\";\n\nexport const setMessagesEndpoint: Endpoint = {\n handler: async (req: PayloadRequest) => {\n const { user } = await req.payload.auth({ headers: req.headers });\n if (!user) {\n throw new Error(\"Unauthorized\");\n }\n\n const data = (await req.json?.()) as Translations<Messages> | undefined;\n if (!data) {\n throw new Error(\"No data provided\");\n }\n\n const supportedLocales = getSupportedLocales(\n req.payload.config.localization,\n );\n const { collectionSlug } = getPluginContext(req.payload.config);\n\n for (const locale of supportedLocales) {\n const messages = data[locale];\n if (!messages) continue;\n\n const rawFile = new File(\n [JSON.stringify(messages)],\n `${locale}-${Date.now()}.json`,\n {\n type: \"application/json\",\n },\n );\n\n const file: File = {\n name: rawFile.name,\n data: Buffer.from(await rawFile.arrayBuffer()),\n mimetype: rawFile.type,\n size: rawFile.size,\n };\n\n const { docs } = await req.payload.update({\n collection: collectionSlug,\n data: {},\n file,\n where: { locale: { equals: locale } },\n });\n if (docs.length === 0) {\n await req.payload.create({\n collection: collectionSlug,\n data: { locale },\n file,\n });\n }\n }\n\n return Response.json({ success: true });\n },\n method: \"put\",\n path: \"/intl-plugin\",\n};\n"],"names":["setMessagesEndpoint","req","user","data","supportedLocales","getSupportedLocales","collectionSlug","getPluginContext","locale","messages","rawFile","file","docs"],"mappings":";AAKO,MAAMA,IAAgC;AAAA,EAC3C,SAAS,OAAOC,MAAwB;AACtC,UAAM,EAAE,MAAAC,MAAS,MAAMD,EAAI,QAAQ,KAAK,EAAE,SAASA,EAAI,SAAS;AAChE,QAAI,CAACC;AACH,YAAM,IAAI,MAAM,cAAc;AAGhC,UAAMC,IAAQ,MAAMF,EAAI,OAAA;AACxB,QAAI,CAACE;AACH,YAAM,IAAI,MAAM,kBAAkB;AAGpC,UAAMC,IAAmBC;AAAA,MACvBJ,EAAI,QAAQ,OAAO;AAAA,IAAA,GAEf,EAAE,gBAAAK,EAAA,IAAmBC,EAAiBN,EAAI,QAAQ,MAAM;AAE9D,eAAWO,KAAUJ,GAAkB;AACrC,YAAMK,IAAWN,EAAKK,CAAM;AAC5B,UAAI,CAACC,EAAU;AAEf,YAAMC,IAAU,IAAI;AAAA,QAClB,CAAC,KAAK,UAAUD,CAAQ,CAAC;AAAA,QACzB,GAAGD,CAAM,IAAI,KAAK,KAAK;AAAA,QACvB;AAAA,UACE,MAAM;AAAA,QAAA;AAAA,MACR,GAGIG,IAAa;AAAA,QACjB,MAAMD,EAAQ;AAAA,QACd,MAAM,OAAO,KAAK,MAAMA,EAAQ,aAAa;AAAA,QAC7C,UAAUA,EAAQ;AAAA,QAClB,MAAMA,EAAQ;AAAA,MAAA,GAGV,EAAE,MAAAE,EAAA,IAAS,MAAMX,EAAI,QAAQ,OAAO;AAAA,QACxC,YAAYK;AAAA,QACZ,MAAM,CAAA;AAAA,QACN,MAAAK;AAAA,QACA,OAAO,EAAE,QAAQ,EAAE,QAAQH,IAAO;AAAA,MAAE,CACrC;AACD,MAAII,EAAK,WAAW,KAClB,MAAMX,EAAI,QAAQ,OAAO;AAAA,QACvB,YAAYK;AAAA,QACZ,MAAM,EAAE,QAAAE,EAAA;AAAA,QACR,MAAAG;AAAA,MAAA,CACD;AAAA,IAEL;AAEA,WAAO,SAAS,KAAK,EAAE,SAAS,IAAM;AAAA,EACxC;AAAA,EACA,QAAQ;AAAA,EACR,MAAM;AACR;"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { PayloadRequest } from 'payload';
|
|
2
|
+
import { MessagesGuard } from '../types.ts';
|
|
3
|
+
export interface MessagesLinkProps {
|
|
4
|
+
access?: MessagesGuard;
|
|
5
|
+
req: PayloadRequest;
|
|
6
|
+
}
|
|
7
|
+
export declare function MessagesLink({ access, req, }: MessagesLinkProps): Promise<import("react").JSX.Element | null>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Button as n } from "@payloadcms/ui";
|
|
2
|
+
import { IconWorld as a } from "@tabler/icons-react";
|
|
3
|
+
async function r({
|
|
4
|
+
access: e = () => !0,
|
|
5
|
+
req: t
|
|
6
|
+
}) {
|
|
7
|
+
return await e(t) ? /* @__PURE__ */ React.createElement(
|
|
8
|
+
n,
|
|
9
|
+
{
|
|
10
|
+
buttonStyle: "tab",
|
|
11
|
+
el: "link",
|
|
12
|
+
to: `${t.payload.getAdminURL()}/intl`
|
|
13
|
+
},
|
|
14
|
+
/* @__PURE__ */ React.createElement(a, null)
|
|
15
|
+
) : null;
|
|
16
|
+
}
|
|
17
|
+
export {
|
|
18
|
+
r as MessagesLink
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link.js","sources":["../../src/exports/link.tsx"],"sourcesContent":["import type { PayloadRequest } from \"payload\";\nimport { Button } from \"@payloadcms/ui\";\nimport { IconWorld } from \"@tabler/icons-react\";\n\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={`${req.payload.getAdminURL()}/intl`}\n >\n <IconWorld />\n </Button>\n );\n}\n"],"names":["MessagesLink","access","req","Button","IconWorld"],"mappings":";;AAWA,eAAsBA,EAAa;AAAA,EACjC,QAAAC,IAAS,MAAM;AAAA,EACf,KAAAC;AACF,GAAsB;AAEpB,SADkB,MAAMD,EAAOC,CAAG,IAIhC,sBAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,aAAY;AAAA,MACZ,IAAG;AAAA,MACH,IAAI,GAAGD,EAAI,QAAQ,aAAa;AAAA,IAAA;AAAA,wCAE/BE,GAAA,IAAU;AAAA,EAAA,IARQ;AAWzB;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rsc.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Locales, Messages, MessagesGuard, RichTextEditorOptions } from '../types.ts';
|
|
2
|
+
import { AdminViewServerProps } from 'payload';
|
|
3
|
+
export interface MessagesViewProps {
|
|
4
|
+
locales: Locales;
|
|
5
|
+
schema: Messages;
|
|
6
|
+
tabs: boolean | undefined;
|
|
7
|
+
access: MessagesGuard;
|
|
8
|
+
richTextEditorOptions?: RichTextEditorOptions;
|
|
9
|
+
}
|
|
10
|
+
export declare function MessagesView({ access, initPageResult, locales, params, payload, schema, searchParams, tabs, richTextEditorOptions, }: AdminViewServerProps & MessagesViewProps): Promise<import("react").JSX.Element>;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import l from "path";
|
|
2
|
+
import { DefaultTemplate as u } from "@payloadcms/next/templates";
|
|
3
|
+
import { Gutter as E } from "@payloadcms/ui";
|
|
4
|
+
import { redirect as d, RedirectType as g } from "next/navigation";
|
|
5
|
+
import { Toaster as v } from "sonner";
|
|
6
|
+
import { sanitizeMessages as A } from "@/utils/sanitize";
|
|
7
|
+
import { MessagesForm as M } from "../components/MessagesForm.js";
|
|
8
|
+
import { fetchMessages as h } from "../requests/fetchMessages.js";
|
|
9
|
+
async function k({
|
|
10
|
+
access: n,
|
|
11
|
+
initPageResult: e,
|
|
12
|
+
locales: o,
|
|
13
|
+
params: m,
|
|
14
|
+
payload: t,
|
|
15
|
+
schema: s,
|
|
16
|
+
searchParams: c,
|
|
17
|
+
tabs: a = !1,
|
|
18
|
+
richTextEditorOptions: p
|
|
19
|
+
}) {
|
|
20
|
+
await n(e.req) || d(t.getAdminURL(), g.replace);
|
|
21
|
+
const i = {};
|
|
22
|
+
for (const r of o) {
|
|
23
|
+
const f = await h(t, r);
|
|
24
|
+
i[r] = A(s, f);
|
|
25
|
+
}
|
|
26
|
+
return /* @__PURE__ */ React.createElement(
|
|
27
|
+
u,
|
|
28
|
+
{
|
|
29
|
+
i18n: e.req.i18n,
|
|
30
|
+
locale: e.locale,
|
|
31
|
+
params: m,
|
|
32
|
+
payload: e.req.payload,
|
|
33
|
+
permissions: e.permissions,
|
|
34
|
+
searchParams: c,
|
|
35
|
+
user: e.req.user || void 0,
|
|
36
|
+
viewActions: t.config.admin.components.actions.filter((r) => typeof r != "object" ? !0 : r.exportName !== "MessagesLink"),
|
|
37
|
+
visibleEntities: e.visibleEntities
|
|
38
|
+
},
|
|
39
|
+
/* @__PURE__ */ React.createElement(E, null, /* @__PURE__ */ React.createElement(
|
|
40
|
+
M,
|
|
41
|
+
{
|
|
42
|
+
locales: o,
|
|
43
|
+
schema: s,
|
|
44
|
+
tabs: a,
|
|
45
|
+
values: i,
|
|
46
|
+
endpointUrl: l.join(t.getAPIURL(), "intl-plugin"),
|
|
47
|
+
richTextEditorOptions: p
|
|
48
|
+
}
|
|
49
|
+
)),
|
|
50
|
+
/* @__PURE__ */ React.createElement(v, { position: "top-right" })
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
export {
|
|
54
|
+
k as MessagesView
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.js","sources":["../../src/exports/view.tsx"],"sourcesContent":["import path from \"path\";\nimport type {\n DeepPartial,\n Locales,\n Messages,\n MessagesGuard,\n RichTextEditorOptions,\n Translations,\n} from \"@/types\";\nimport type { AdminViewServerProps } from \"payload\";\nimport { DefaultTemplate } from \"@payloadcms/next/templates\";\nimport { Gutter } from \"@payloadcms/ui\";\nimport { redirect, RedirectType } from \"next/navigation\";\nimport { Toaster } from \"sonner\";\n\nimport { sanitizeMessages } from \"@/utils/sanitize\";\n\nimport { MessagesForm } from \"../components/MessagesForm\";\nimport { fetchMessages } from \"../requests/fetchMessages\";\n\nexport interface MessagesViewProps {\n locales: Locales;\n schema: Messages;\n tabs: boolean | undefined;\n access: MessagesGuard;\n richTextEditorOptions?: RichTextEditorOptions;\n}\n\nexport async function MessagesView({\n access,\n initPageResult,\n locales,\n params,\n payload,\n schema,\n searchParams,\n tabs = false,\n richTextEditorOptions,\n}: AdminViewServerProps & MessagesViewProps) {\n const hasAccess = await access(initPageResult.req);\n if (!hasAccess) redirect(payload.getAdminURL(), RedirectType.replace);\n\n const translations: Translations<DeepPartial<Messages>> = {};\n\n for (const locale of locales) {\n const messages = await fetchMessages(payload, locale);\n translations[locale] = sanitizeMessages(schema, messages);\n }\n return (\n <DefaultTemplate\n i18n={initPageResult.req.i18n}\n locale={initPageResult.locale}\n params={params}\n payload={initPageResult.req.payload}\n permissions={initPageResult.permissions}\n searchParams={searchParams}\n user={initPageResult.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={initPageResult.visibleEntities}\n >\n <Gutter>\n <MessagesForm\n locales={locales}\n schema={schema}\n tabs={tabs}\n values={translations}\n endpointUrl={path.join(payload.getAPIURL(), \"intl-plugin\")}\n richTextEditorOptions={richTextEditorOptions}\n />\n </Gutter>\n <Toaster position=\"top-right\" />\n </DefaultTemplate>\n );\n}\n"],"names":["MessagesView","access","initPageResult","locales","params","payload","schema","searchParams","tabs","richTextEditorOptions","redirect","RedirectType","translations","locale","messages","fetchMessages","sanitizeMessages","DefaultTemplate","action","Gutter","MessagesForm","path","Toaster"],"mappings":";;;;;;;;AA4BA,eAAsBA,EAAa;AAAA,EACjC,QAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,SAAAC;AAAA,EACA,QAAAC;AAAA,EACA,SAAAC;AAAA,EACA,QAAAC;AAAA,EACA,cAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,uBAAAC;AACF,GAA6C;AAE3C,EADkB,MAAMR,EAAOC,EAAe,GAAG,KACjCQ,EAASL,EAAQ,YAAA,GAAeM,EAAa,OAAO;AAEpE,QAAMC,IAAoD,CAAA;AAE1D,aAAWC,KAAUV,GAAS;AAC5B,UAAMW,IAAW,MAAMC,EAAcV,GAASQ,CAAM;AACpD,IAAAD,EAAaC,CAAM,IAAIG,EAAiBV,GAAQQ,CAAQ;AAAA,EAC1D;AACA,SACE,sBAAA;AAAA,IAACG;AAAA,IAAA;AAAA,MACC,MAAMf,EAAe,IAAI;AAAA,MACzB,QAAQA,EAAe;AAAA,MACvB,QAAAE;AAAA,MACA,SAASF,EAAe,IAAI;AAAA,MAC5B,aAAaA,EAAe;AAAA,MAC5B,cAAAK;AAAA,MACA,MAAML,EAAe,IAAI,QAAQ;AAAA,MACjC,aAAaG,EAAQ,OAAO,MAAM,WAAW,QAAQ,OAAO,CAACa,MACvD,OAAOA,KAAW,WACb,KAEFA,EAAO,eAAe,cAC9B;AAAA,MACD,iBAAiBhB,EAAe;AAAA,IAAA;AAAA,wCAE/BiB,GAAA,MACC,sBAAA;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,SAAAjB;AAAA,QACA,QAAAG;AAAA,QACA,MAAAE;AAAA,QACA,QAAQI;AAAA,QACR,aAAaS,EAAK,KAAKhB,EAAQ,UAAA,GAAa,aAAa;AAAA,QACzD,uBAAAI;AAAA,MAAA;AAAA,IAAA,CAEJ;AAAA,IACA,sBAAA,cAACa,GAAA,EAAQ,UAAS,YAAA,CAAY;AAAA,EAAA;AAGpC;"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Plugin } from 'payload';
|
|
2
|
+
import { MessagesPluginConfig } from './types.ts';
|
|
3
|
+
export declare const intlPlugin: ({ schema, tabs, collectionSlug, hooks, editorAccess, richTextEditorOptions, }: MessagesPluginConfig) => Plugin;
|
|
4
|
+
export { fetchMessages } from './requests/fetchMessages';
|
|
5
|
+
export type { MessagesPluginConfig, MessagesSchema, Messages, } from './types.ts';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/* empty css */
|
|
2
|
+
import { getMessagesEndpoint as p } from "./endpoints/get-messages.js";
|
|
3
|
+
import { setMessagesEndpoint as r } from "./endpoints/set-messages.js";
|
|
4
|
+
import { getSupportedLocales as l, attachPluginContext as m } from "./utils/config.js";
|
|
5
|
+
import { fetchMessages as w } from "./requests/fetchMessages.js";
|
|
6
|
+
const y = ({
|
|
7
|
+
schema: s,
|
|
8
|
+
tabs: n,
|
|
9
|
+
collectionSlug: t = "messages",
|
|
10
|
+
hooks: a,
|
|
11
|
+
editorAccess: o = (e) => e.user !== null,
|
|
12
|
+
richTextEditorOptions: i
|
|
13
|
+
}) => (e) => {
|
|
14
|
+
const d = l(e.localization);
|
|
15
|
+
return e.admin ??= {}, e.admin.components ??= {}, e.admin.components.actions ??= [], e.admin.components.actions.push({
|
|
16
|
+
exportName: "MessagesLink",
|
|
17
|
+
path: "payload-intl/rsc#MessagesLink"
|
|
18
|
+
}), e.admin.components.views = {
|
|
19
|
+
...e.admin.components.views,
|
|
20
|
+
intl: {
|
|
21
|
+
Component: {
|
|
22
|
+
path: "payload-intl/rsc#MessagesView",
|
|
23
|
+
serverProps: {
|
|
24
|
+
access: o,
|
|
25
|
+
locales: d,
|
|
26
|
+
schema: s,
|
|
27
|
+
tabs: n,
|
|
28
|
+
richTextEditorOptions: i
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
path: "/intl"
|
|
32
|
+
}
|
|
33
|
+
}, m(e, {
|
|
34
|
+
collectionSlug: t
|
|
35
|
+
}), e.collections ??= [], e.collections.push({
|
|
36
|
+
slug: t,
|
|
37
|
+
admin: {
|
|
38
|
+
hidden: !0
|
|
39
|
+
},
|
|
40
|
+
endpoints: [r, p],
|
|
41
|
+
fields: [
|
|
42
|
+
{
|
|
43
|
+
name: "locale",
|
|
44
|
+
type: "text",
|
|
45
|
+
required: !0
|
|
46
|
+
}
|
|
47
|
+
],
|
|
48
|
+
hooks: u(a),
|
|
49
|
+
indexes: [
|
|
50
|
+
{
|
|
51
|
+
fields: ["locale"]
|
|
52
|
+
}
|
|
53
|
+
],
|
|
54
|
+
upload: {
|
|
55
|
+
mimeTypes: ["application/json"]
|
|
56
|
+
}
|
|
57
|
+
}), e.endpoints ??= [], e.endpoints.push(p), e.endpoints.push(r), e;
|
|
58
|
+
}, u = (s) => {
|
|
59
|
+
if (!s)
|
|
60
|
+
return;
|
|
61
|
+
const { afterUpdate: n, ...t } = s;
|
|
62
|
+
if (!n)
|
|
63
|
+
return t;
|
|
64
|
+
const a = async ({ operation: o }) => {
|
|
65
|
+
o === "update" && await n();
|
|
66
|
+
};
|
|
67
|
+
return {
|
|
68
|
+
...t,
|
|
69
|
+
afterChange: [...t.afterChange ?? [], a]
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
export {
|
|
73
|
+
w as fetchMessages,
|
|
74
|
+
y as intlPlugin
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import \"./styles.css\";\n\nimport type {\n CollectionAfterChangeHook,\n CollectionConfig,\n LocalizationConfig,\n Plugin,\n} from \"payload\";\n\nimport type { MessagesViewProps } from \"./exports/view\";\nimport type { Locales, MessagesPluginConfig } from \"./types.ts\";\nimport { getMessagesEndpoint } from \"./endpoints/get-messages\";\nimport { setMessagesEndpoint } from \"./endpoints/set-messages\";\nimport { attachPluginContext, getSupportedLocales } from \"./utils/config\";\n\nexport const intlPlugin =\n ({\n schema,\n tabs,\n collectionSlug = \"messages\",\n hooks,\n editorAccess = (req) => req.user !== null,\n richTextEditorOptions,\n }: MessagesPluginConfig): Plugin =>\n (config) => {\n const locales = getSupportedLocales(config.localization);\n\n config.admin ??= {};\n config.admin.components ??= {};\n config.admin.components.actions ??= [];\n config.admin.components.actions.push({\n exportName: \"MessagesLink\",\n path: \"payload-intl/rsc#MessagesLink\",\n });\n\n config.admin.components.views = {\n ...config.admin.components.views,\n intl: {\n Component: {\n path: \"payload-intl/rsc#MessagesView\",\n serverProps: {\n access: editorAccess,\n locales,\n schema,\n tabs,\n richTextEditorOptions,\n } satisfies MessagesViewProps,\n },\n path: \"/intl\",\n },\n };\n\n attachPluginContext(config, {\n collectionSlug,\n });\n\n config.collections ??= [];\n config.collections.push({\n slug: collectionSlug,\n admin: {\n hidden: true,\n },\n endpoints: [setMessagesEndpoint, getMessagesEndpoint],\n fields: [\n {\n name: \"locale\",\n type: \"text\",\n required: true,\n },\n ],\n hooks: createHooks(hooks),\n indexes: [\n {\n fields: [\"locale\"],\n },\n ],\n upload: {\n mimeTypes: [\"application/json\"],\n },\n });\n\n config.endpoints ??= [];\n config.endpoints.push(getMessagesEndpoint);\n config.endpoints.push(setMessagesEndpoint);\n\n return config;\n };\n\nexport { fetchMessages } from \"./requests/fetchMessages\";\n\nexport type {\n MessagesPluginConfig,\n MessagesSchema,\n Messages,\n} from \"./types.ts\";\n\nconst createHooks = (\n hooks: MessagesPluginConfig[\"hooks\"],\n): CollectionConfig[\"hooks\"] => {\n if (!hooks) {\n return undefined;\n }\n const { afterUpdate, ...rest } = hooks;\n if (!afterUpdate) {\n return rest;\n }\n\n const afterUpdateHook: CollectionAfterChangeHook = async ({ operation }) => {\n if (operation === \"update\") {\n await afterUpdate();\n }\n return;\n };\n return {\n ...rest,\n afterChange: [...(rest.afterChange ?? []), afterUpdateHook],\n };\n};\n"],"names":["intlPlugin","schema","tabs","collectionSlug","hooks","editorAccess","req","richTextEditorOptions","config","locales","getSupportedLocales","attachPluginContext","setMessagesEndpoint","getMessagesEndpoint","createHooks","afterUpdate","rest","afterUpdateHook","operation"],"mappings":";;;;;AAeO,MAAMA,IACX,CAAC;AAAA,EACC,QAAAC;AAAA,EACA,MAAAC;AAAA,EACA,gBAAAC,IAAiB;AAAA,EACjB,OAAAC;AAAA,EACA,cAAAC,IAAe,CAACC,MAAQA,EAAI,SAAS;AAAA,EACrC,uBAAAC;AACF,MACA,CAACC,MAAW;AACV,QAAMC,IAAUC,EAAoBF,EAAO,YAAY;AAEvD,SAAAA,EAAO,UAAU,CAAA,GACjBA,EAAO,MAAM,eAAe,CAAA,GAC5BA,EAAO,MAAM,WAAW,YAAY,CAAA,GACpCA,EAAO,MAAM,WAAW,QAAQ,KAAK;AAAA,IACnC,YAAY;AAAA,IACZ,MAAM;AAAA,EAAA,CACP,GAEDA,EAAO,MAAM,WAAW,QAAQ;AAAA,IAC9B,GAAGA,EAAO,MAAM,WAAW;AAAA,IAC3B,MAAM;AAAA,MACJ,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,UACX,QAAQH;AAAA,UACR,SAAAI;AAAA,UACA,QAAAR;AAAA,UACA,MAAAC;AAAA,UACA,uBAAAK;AAAA,QAAA;AAAA,MACF;AAAA,MAEF,MAAM;AAAA,IAAA;AAAA,EACR,GAGFI,EAAoBH,GAAQ;AAAA,IAC1B,gBAAAL;AAAA,EAAA,CACD,GAEDK,EAAO,gBAAgB,CAAA,GACvBA,EAAO,YAAY,KAAK;AAAA,IACtB,MAAML;AAAA,IACN,OAAO;AAAA,MACL,QAAQ;AAAA,IAAA;AAAA,IAEV,WAAW,CAACS,GAAqBC,CAAmB;AAAA,IACpD,QAAQ;AAAA,MACN;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,UAAU;AAAA,MAAA;AAAA,IACZ;AAAA,IAEF,OAAOC,EAAYV,CAAK;AAAA,IACxB,SAAS;AAAA,MACP;AAAA,QACE,QAAQ,CAAC,QAAQ;AAAA,MAAA;AAAA,IACnB;AAAA,IAEF,QAAQ;AAAA,MACN,WAAW,CAAC,kBAAkB;AAAA,IAAA;AAAA,EAChC,CACD,GAEDI,EAAO,cAAc,CAAA,GACrBA,EAAO,UAAU,KAAKK,CAAmB,GACzCL,EAAO,UAAU,KAAKI,CAAmB,GAElCJ;AACT,GAUIM,IAAc,CAClBV,MAC8B;AAC9B,MAAI,CAACA;AACH;AAEF,QAAM,EAAE,aAAAW,GAAa,GAAGC,EAAA,IAASZ;AACjC,MAAI,CAACW;AACH,WAAOC;AAGT,QAAMC,IAA6C,OAAO,EAAE,WAAAC,QAAgB;AAC1E,IAAIA,MAAc,YAChB,MAAMH,EAAA;AAAA,EAGV;AACA,SAAO;AAAA,IACL,GAAGC;AAAA,IACH,aAAa,CAAC,GAAIA,EAAK,eAAe,CAAA,GAAKC,CAAe;AAAA,EAAA;AAE9D;"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { getPluginContext as s } from "@/utils/config";
|
|
2
|
+
async function a(n, e) {
|
|
3
|
+
const {
|
|
4
|
+
docs: [r]
|
|
5
|
+
} = await n.find({
|
|
6
|
+
collection: s(n.config).collectionSlug,
|
|
7
|
+
where: { locale: { equals: e } }
|
|
8
|
+
});
|
|
9
|
+
if (!r)
|
|
10
|
+
return console.warn(`No messages found for locale ${e}`), {};
|
|
11
|
+
const { url: o } = r, t = await fetch(o);
|
|
12
|
+
if (!t.ok)
|
|
13
|
+
throw new Error(
|
|
14
|
+
`Could not fetch messages for locale "${e}": The page returned an error.
|
|
15
|
+
|
|
16
|
+
${o}`
|
|
17
|
+
);
|
|
18
|
+
if (t.headers.get("content-type") !== "application/json")
|
|
19
|
+
throw new Error(
|
|
20
|
+
`Could not fetch messages for locale "${e}": The page did not return a JSON file.
|
|
21
|
+
|
|
22
|
+
${o}`
|
|
23
|
+
);
|
|
24
|
+
return await t.json();
|
|
25
|
+
}
|
|
26
|
+
export {
|
|
27
|
+
a as fetchMessages
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=fetchMessages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetchMessages.js","sources":["../../src/requests/fetchMessages.ts"],"sourcesContent":["import type { BasePayload } from \"payload\";\n\nimport { getPluginContext } from \"@/utils/config\";\n\nimport type { Messages } from \"../types\";\n\nexport async function fetchMessages(\n payload: BasePayload,\n locale: string,\n): Promise<Messages> {\n const {\n docs: [doc],\n } = await payload.find({\n collection: getPluginContext(payload.config).collectionSlug,\n where: { locale: { equals: locale } },\n });\n\n if (!doc) {\n console.warn(`No messages found for locale ${locale}`);\n return {};\n }\n\n const { url } = doc as unknown as { url: string };\n\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(\n `Could not fetch messages for locale \"${locale}\": The page returned an error.\\n\\n${url}`,\n );\n }\n\n if (response.headers.get(\"content-type\") !== \"application/json\") {\n throw new Error(\n `Could not fetch messages for locale \"${locale}\": The page did not return a JSON file.\\n\\n${url}`,\n );\n }\n\n return await response.json();\n}\n"],"names":["fetchMessages","payload","locale","doc","getPluginContext","url","response"],"mappings":";AAMA,eAAsBA,EACpBC,GACAC,GACmB;AACnB,QAAM;AAAA,IACJ,MAAM,CAACC,CAAG;AAAA,EAAA,IACR,MAAMF,EAAQ,KAAK;AAAA,IACrB,YAAYG,EAAiBH,EAAQ,MAAM,EAAE;AAAA,IAC7C,OAAO,EAAE,QAAQ,EAAE,QAAQC,IAAO;AAAA,EAAE,CACrC;AAED,MAAI,CAACC;AACH,mBAAQ,KAAK,gCAAgCD,CAAM,EAAE,GAC9C,CAAA;AAGT,QAAM,EAAE,KAAAG,MAAQF,GAEVG,IAAW,MAAM,MAAMD,CAAG;AAEhC,MAAI,CAACC,EAAS;AACZ,UAAM,IAAI;AAAA,MACR,wCAAwCJ,CAAM;AAAA;AAAA,EAAqCG,CAAG;AAAA,IAAA;AAI1F,MAAIC,EAAS,QAAQ,IAAI,cAAc,MAAM;AAC3C,UAAM,IAAI;AAAA,MACR,wCAAwCJ,CAAM;AAAA;AAAA,EAA8CG,CAAG;AAAA,IAAA;AAInG,SAAO,MAAMC,EAAS,KAAA;AACxB;"}
|