payload-intl 0.0.2 → 0.0.3

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.
@@ -1,15 +1,16 @@
1
1
  "use client";
2
- import { useStepNav as N, Button as R } from "@payloadcms/ui";
2
+ import { useStepNav as v, Button as N } from "@payloadcms/ui";
3
3
  import { isEqual as S } from "lodash-es";
4
4
  import { useEffect as M, useState as x } from "react";
5
5
  import { useForm as y } from "react-hook-form";
6
6
  import { toast as f } from "sonner";
7
7
  import { MessagesFormProvider as T } from "../context/messages-form.js";
8
8
  import { cn as d } from "../utils/cn.js";
9
- import { MessageField as j } from "./layout/MessageField.js";
10
- import { MessagesTabs as F } from "./layout/MessagesTabs.js";
9
+ import { JsonImport as j } from "./actions/JsonImport.js";
10
+ import { MessageField as F } from "./layout/MessageField.js";
11
+ import { MessagesTabs as O } from "./layout/MessagesTabs.js";
11
12
  import { MessagesTree as p } from "./layout/MessagesTree.js";
12
- function J({
13
+ function U({
13
14
  locales: g,
14
15
  schema: a,
15
16
  tabs: r = !1,
@@ -17,7 +18,7 @@ function J({
17
18
  endpointUrl: h,
18
19
  richTextEditorOptions: u
19
20
  }) {
20
- const { setStepNav: n } = N();
21
+ const { setStepNav: n } = v();
21
22
  M(() => {
22
23
  n([{ label: "Intl Messages", url: "/intl" }]);
23
24
  }, [n]);
@@ -25,13 +26,13 @@ function J({
25
26
  defaultValues: c,
26
27
  reValidateMode: "onChange"
27
28
  }), [m, b] = x(Object.keys(a)[0]), E = async (e) => {
28
- const t = f.loading("Saving..."), v = Object.entries(e).reduce((o, [i, l]) => S(l, c[i]) ? o : {
29
+ const t = f.loading("Saving..."), R = Object.entries(e).reduce((o, [i, l]) => S(l, c[i]) ? o : {
29
30
  ...o,
30
31
  [i]: l
31
32
  }, {});
32
33
  await fetch(h, {
33
34
  method: "PUT",
34
- body: JSON.stringify(v)
35
+ body: JSON.stringify(R)
35
36
  }), s.reset(e), f.success("Saved", { id: t });
36
37
  };
37
38
  return /* @__PURE__ */ React.createElement(
@@ -47,8 +48,8 @@ function J({
47
48
  className: "flex h-[calc(100vh-var(--app-header-height))] flex-col",
48
49
  onSubmit: s.handleSubmit(E)
49
50
  },
50
- /* @__PURE__ */ React.createElement("div", { className: "sticky top-0 z-10 bg-background" }, /* @__PURE__ */ React.createElement("header", { className: "mb-6 flex items-center justify-between gap-4" }, /* @__PURE__ */ React.createElement("h1", { className: "text-4xl" }, "Messages"), /* @__PURE__ */ React.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React.createElement(
51
- R,
51
+ /* @__PURE__ */ React.createElement("div", { className: "sticky top-0 z-10 bg-background" }, /* @__PURE__ */ React.createElement("header", { className: "mb-6 flex items-center justify-between gap-4" }, /* @__PURE__ */ React.createElement("h1", { className: "text-4xl" }, "Messages"), /* @__PURE__ */ React.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React.createElement(j, null), /* @__PURE__ */ React.createElement(
52
+ N,
52
53
  {
53
54
  className: "my-0",
54
55
  type: "submit",
@@ -56,7 +57,7 @@ function J({
56
57
  },
57
58
  "Save"
58
59
  ))), r && /* @__PURE__ */ React.createElement(
59
- F,
60
+ O,
60
61
  {
61
62
  schema: a,
62
63
  activeTab: m,
@@ -64,7 +65,7 @@ function J({
64
65
  }
65
66
  )),
66
67
  /* @__PURE__ */ React.createElement("div", { id: "messages-form-content", className: "overflow-y-auto pt-8 pb-16" }, !r && /* @__PURE__ */ React.createElement(p, { path: "", schema: a, nestingLevel: 0 }), r && Object.entries(a).map(([e, t]) => typeof t == "string" ? /* @__PURE__ */ React.createElement(
67
- j,
68
+ F,
68
69
  {
69
70
  schema: t,
70
71
  key: e,
@@ -86,6 +87,6 @@ function J({
86
87
  );
87
88
  }
88
89
  export {
89
- J as MessagesForm
90
+ U as MessagesForm
90
91
  };
91
92
  //# sourceMappingURL=MessagesForm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MessagesForm.js","sources":["../../src/components/MessagesForm.tsx"],"sourcesContent":["\"use client\";\n\nimport type { FormValues } from \"@/context/messages-form\";\nimport type {\n DeepPartial,\n Locales,\n Messages,\n MessagesSchema,\n RichTextEditorOptions,\n Translations,\n} from \"@/types\";\nimport { Button, useStepNav } from \"@payloadcms/ui\";\nimport { isEqual } from \"lodash-es\";\nimport { useEffect, useState } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { toast } from \"sonner\";\n\nimport { MessagesFormProvider } from \"@/context/messages-form\";\nimport { cn } from \"@/utils/cn\";\n\nimport { MessageField } from \"./layout/MessageField\";\nimport { MessagesTabs } from \"./layout/MessagesTabs\";\nimport { MessagesTree } from \"./layout/MessagesTree\";\n\ninterface MessagesFormProps {\n locales: Locales;\n schema: MessagesSchema;\n tabs?: boolean;\n values: Translations<DeepPartial<Messages>>;\n endpointUrl: string;\n richTextEditorOptions?: RichTextEditorOptions;\n}\n\nexport function MessagesForm({\n locales,\n schema,\n tabs = false,\n values,\n endpointUrl,\n richTextEditorOptions,\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) {\n return acc;\n }\n return {\n ...acc,\n [locale]: value,\n };\n }, {});\n\n await fetch(endpointUrl, {\n method: \"PUT\",\n body: JSON.stringify(changes),\n });\n\n form.reset(currentValues);\n toast.success(\"Saved\", { id: toastId });\n };\n\n return (\n <MessagesFormProvider\n form={form}\n locales={locales}\n richTextEditorOptions={richTextEditorOptions}\n >\n <form\n className=\"flex h-[calc(100vh-var(--app-header-height))] flex-col\"\n onSubmit={form.handleSubmit(handleSubmit)}\n >\n <div className=\"sticky top-0 z-10 bg-background\">\n <header className=\"mb-6 flex items-center justify-between gap-4\">\n <h1 className=\"text-4xl\">Messages</h1>\n <div className=\"flex items-center gap-2\">\n <Button\n className=\"my-0\"\n type=\"submit\"\n disabled={!form.formState.isDirty}\n >\n Save\n </Button>\n </div>\n </header>\n {tabs && (\n <MessagesTabs\n schema={schema}\n activeTab={activeTab}\n setActiveTab={setActiveTab}\n />\n )}\n </div>\n\n <div id=\"messages-form-content\" className=\"overflow-y-auto pt-8 pb-16\">\n {!tabs && <MessagesTree path=\"\" schema={schema} nestingLevel={0} />}\n {tabs &&\n Object.entries(schema).map(([key, value]) => {\n if (typeof value === \"string\") {\n return (\n <MessageField\n schema={value}\n key={key}\n className={cn({ hidden: activeTab !== key })}\n messageKey={key}\n path={key}\n />\n );\n }\n return (\n <MessagesTree\n className={cn({ hidden: activeTab !== key })}\n key={key}\n path={key}\n schema={value}\n nestingLevel={0}\n />\n );\n })}\n </div>\n </form>\n </MessagesFormProvider>\n );\n}\n"],"names":["MessagesForm","locales","schema","tabs","values","endpointUrl","richTextEditorOptions","setStepNav","useStepNav","useEffect","form","useForm","activeTab","setActiveTab","useState","handleSubmit","currentValues","toastId","toast","changes","acc","locale","value","isEqual","MessagesFormProvider","Button","MessagesTabs","MessagesTree","key","MessageField","cn"],"mappings":";;;;;;;;;;;AAiCO,SAASA,EAAa;AAAA,EAC3B,SAAAC;AAAA,EACA,QAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,QAAAC;AAAA,EACA,aAAAC;AAAA,EACA,uBAAAC;AACF,GAAuC;AACrC,QAAM,EAAE,YAAAC,EAAA,IAAeC,EAAA;AACvB,EAAAC,EAAU,MAAM;AACd,IAAAF,EAAW,CAAC,EAAE,OAAO,iBAAiB,KAAK,QAAA,CAAS,CAAC;AAAA,EACvD,GAAG,CAACA,CAAU,CAAC;AAEf,QAAMG,IAAOC,EAAoB;AAAA,IAC/B,eAAeP;AAAA,IACf,gBAAgB;AAAA,EAAA,CACjB,GACK,CAACQ,GAAWC,CAAY,IAAIC,EAAS,OAAO,KAAKZ,CAAM,EAAE,CAAC,CAAC,GAE3Da,IAAe,OAAOC,MAA8B;AACxD,UAAMC,IAAUC,EAAM,QAAQ,WAAW,GACnCC,IAAU,OAAO,QAAQH,CAAa,EAAE,OAE5C,CAACI,GAAK,CAACC,GAAQC,CAAK,MACAC,EAAQD,GAAOlB,EAAOiB,CAAM,CAAC,IAExCD,IAEF;AAAA,MACL,GAAGA;AAAA,MACH,CAACC,CAAM,GAAGC;AAAA,IAAA,GAEX,CAAA,CAAE;AAEL,UAAM,MAAMjB,GAAa;AAAA,MACvB,QAAQ;AAAA,MACR,MAAM,KAAK,UAAUc,CAAO;AAAA,IAAA,CAC7B,GAEDT,EAAK,MAAMM,CAAa,GACxBE,EAAM,QAAQ,SAAS,EAAE,IAAID,GAAS;AAAA,EACxC;AAEA,SACE,sBAAA;AAAA,IAACO;AAAA,IAAA;AAAA,MACC,MAAAd;AAAA,MACA,SAAAT;AAAA,MACA,uBAAAK;AAAA,IAAA;AAAA,IAEA,sBAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,UAAUI,EAAK,aAAaK,CAAY;AAAA,MAAA;AAAA,0CAEvC,OAAA,EAAI,WAAU,kCAAA,GACb,sBAAA,cAAC,YAAO,WAAU,+CAAA,GAChB,sBAAA,cAAC,MAAA,EAAG,WAAU,WAAA,GAAW,UAAQ,GACjC,sBAAA,cAAC,OAAA,EAAI,WAAU,0BAAA,GACb,sBAAA;AAAA,QAACU;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,MAAK;AAAA,UACL,UAAU,CAACf,EAAK,UAAU;AAAA,QAAA;AAAA,QAC3B;AAAA,MAAA,CAGH,CACF,GACCP,KACC,sBAAA;AAAA,QAACuB;AAAA,QAAA;AAAA,UACC,QAAAxB;AAAA,UACA,WAAAU;AAAA,UACA,cAAAC;AAAA,QAAA;AAAA,MAAA,CAGN;AAAA,MAEA,sBAAA,cAAC,OAAA,EAAI,IAAG,yBAAwB,WAAU,6BAAA,GACvC,CAACV,KAAQ,sBAAA,cAACwB,GAAA,EAAa,MAAK,IAAG,QAAAzB,GAAgB,cAAc,EAAA,CAAG,GAChEC,KACC,OAAO,QAAQD,CAAM,EAAE,IAAI,CAAC,CAAC0B,GAAKN,CAAK,MACjC,OAAOA,KAAU,WAEjB,sBAAA;AAAA,QAACO;AAAA,QAAA;AAAA,UACC,QAAQP;AAAA,UACR,KAAAM;AAAA,UACA,WAAWE,EAAG,EAAE,QAAQlB,MAAcgB,GAAK;AAAA,UAC3C,YAAYA;AAAA,UACZ,MAAMA;AAAA,QAAA;AAAA,MAAA,IAKV,sBAAA;AAAA,QAACD;AAAA,QAAA;AAAA,UACC,WAAWG,EAAG,EAAE,QAAQlB,MAAcgB,GAAK;AAAA,UAC3C,KAAAA;AAAA,UACA,MAAMA;AAAA,UACN,QAAQN;AAAA,UACR,cAAc;AAAA,QAAA;AAAA,MAAA,CAGnB,CACL;AAAA,IAAA;AAAA,EACF;AAGN;"}
1
+ {"version":3,"file":"MessagesForm.js","sources":["../../src/components/MessagesForm.tsx"],"sourcesContent":["\"use client\";\n\nimport type { FormValues } from \"@/context/messages-form\";\nimport type {\n DeepPartial,\n Locales,\n Messages,\n MessagesSchema,\n RichTextEditorOptions,\n Translations,\n} from \"@/types\";\nimport { Button, useStepNav } from \"@payloadcms/ui\";\nimport { isEqual } from \"lodash-es\";\nimport { useEffect, useState } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { toast } from \"sonner\";\n\nimport { MessagesFormProvider } from \"@/context/messages-form\";\nimport { cn } from \"@/utils/cn\";\n\nimport { JsonImport } from \"./actions/JsonImport\";\nimport { MessageField } from \"./layout/MessageField\";\nimport { MessagesTabs } from \"./layout/MessagesTabs\";\nimport { MessagesTree } from \"./layout/MessagesTree\";\n\ninterface MessagesFormProps {\n locales: Locales;\n schema: MessagesSchema;\n tabs?: boolean;\n values: Translations<DeepPartial<Messages>>;\n endpointUrl: string;\n richTextEditorOptions?: RichTextEditorOptions;\n}\n\nexport function MessagesForm({\n locales,\n schema,\n tabs = false,\n values,\n endpointUrl,\n richTextEditorOptions,\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) {\n return acc;\n }\n return {\n ...acc,\n [locale]: value,\n };\n }, {});\n\n await fetch(endpointUrl, {\n method: \"PUT\",\n body: JSON.stringify(changes),\n });\n\n form.reset(currentValues);\n toast.success(\"Saved\", { id: toastId });\n };\n\n return (\n <MessagesFormProvider\n form={form}\n locales={locales}\n richTextEditorOptions={richTextEditorOptions}\n >\n <form\n className=\"flex h-[calc(100vh-var(--app-header-height))] flex-col\"\n onSubmit={form.handleSubmit(handleSubmit)}\n >\n <div className=\"sticky top-0 z-10 bg-background\">\n <header className=\"mb-6 flex items-center justify-between gap-4\">\n <h1 className=\"text-4xl\">Messages</h1>\n <div className=\"flex items-center gap-2\">\n <JsonImport />\n <Button\n className=\"my-0\"\n type=\"submit\"\n disabled={!form.formState.isDirty}\n >\n Save\n </Button>\n </div>\n </header>\n {tabs && (\n <MessagesTabs\n schema={schema}\n activeTab={activeTab}\n setActiveTab={setActiveTab}\n />\n )}\n </div>\n\n <div id=\"messages-form-content\" className=\"overflow-y-auto pt-8 pb-16\">\n {!tabs && <MessagesTree path=\"\" schema={schema} nestingLevel={0} />}\n {tabs &&\n Object.entries(schema).map(([key, value]) => {\n if (typeof value === \"string\") {\n return (\n <MessageField\n schema={value}\n key={key}\n className={cn({ hidden: activeTab !== key })}\n messageKey={key}\n path={key}\n />\n );\n }\n return (\n <MessagesTree\n className={cn({ hidden: activeTab !== key })}\n key={key}\n path={key}\n schema={value}\n nestingLevel={0}\n />\n );\n })}\n </div>\n </form>\n </MessagesFormProvider>\n );\n}\n"],"names":["MessagesForm","locales","schema","tabs","values","endpointUrl","richTextEditorOptions","setStepNav","useStepNav","useEffect","form","useForm","activeTab","setActiveTab","useState","handleSubmit","currentValues","toastId","toast","changes","acc","locale","value","isEqual","MessagesFormProvider","JsonImport","Button","MessagesTabs","MessagesTree","key","MessageField","cn"],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import { Button as l } from "@payloadcms/ui";
2
+ import { IconBraces as d } from "@tabler/icons-react";
3
+ import { useRef as f, useState as R } from "react";
4
+ import { useMessagesForm as g } from "../../context/messages-form.js";
5
+ function h() {
6
+ const { locales: s, setValue: c } = g(), a = f(null), [o, n] = R(), u = (t) => {
7
+ const e = t.target.files?.[0];
8
+ if (!o || !e) {
9
+ t.target.value = "";
10
+ return;
11
+ }
12
+ const r = new FileReader();
13
+ r.onload = (i) => {
14
+ const m = i.target?.result, p = JSON.parse(m);
15
+ c(o, p, {
16
+ shouldDirty: !0,
17
+ shouldValidate: !0
18
+ }), n(void 0), t.target.value = "";
19
+ }, r.readAsText(e);
20
+ };
21
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(
22
+ "input",
23
+ {
24
+ ref: a,
25
+ accept: ".json",
26
+ hidden: !0,
27
+ onChange: u,
28
+ type: "file"
29
+ }
30
+ ), /* @__PURE__ */ React.createElement(
31
+ l,
32
+ {
33
+ className: "my-0",
34
+ buttonStyle: "subtle",
35
+ iconPosition: "left",
36
+ icon: /* @__PURE__ */ React.createElement(d, { className: "size-5" }),
37
+ SubMenuPopupContent: ({ close: t }) => /* @__PURE__ */ React.createElement("div", { className: "flex flex-col gap-2" }, s.map((e) => /* @__PURE__ */ React.createElement(
38
+ l,
39
+ {
40
+ key: e,
41
+ buttonStyle: "subtle",
42
+ size: "small",
43
+ onClick: () => {
44
+ n(e), a.current?.click(), t();
45
+ }
46
+ },
47
+ e,
48
+ ".json"
49
+ )))
50
+ },
51
+ "Import"
52
+ ));
53
+ }
54
+ export {
55
+ h as JsonImport
56
+ };
57
+ //# sourceMappingURL=JsonImport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JsonImport.js","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 \"@/context/messages-form\";\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 ref={inputRef}\n accept=\".json\"\n hidden\n onChange={handleImportJSON}\n type=\"file\"\n />\n <Button\n className=\"my-0\"\n buttonStyle=\"subtle\"\n iconPosition=\"left\"\n icon={<IconBraces className=\"size-5\" />}\n SubMenuPopupContent={({ close }) => (\n <div className=\"flex flex-col gap-2\">\n {locales.map((locale) => (\n <Button\n key={locale}\n buttonStyle=\"subtle\"\n size=\"small\"\n onClick={() => {\n setSelectedLocale(locale);\n inputRef.current?.click();\n close();\n }}\n >\n {locale}.json\n </Button>\n ))}\n </div>\n )}\n >\n Import\n </Button>\n </>\n );\n}\n"],"names":["JsonImport","locales","setValue","useMessagesForm","inputRef","useRef","selectedLocale","setSelectedLocale","useState","handleImportJSON","event","file","reader","readerEvent","text","data","Button","IconBraces","close","locale"],"mappings":";;;;AAMO,SAASA,IAAa;AAC3B,QAAM,EAAE,SAAAC,GAAS,UAAAC,EAAA,IAAaC,EAAA,GACxBC,IAAWC,EAAyB,IAAI,GACxC,CAACC,GAAgBC,CAAiB,IAAIC,EAAA,GAEtCC,IAAmB,CAACC,MAA+C;AACvE,UAAMC,IAAOD,EAAM,OAAO,QAAQ,CAAC;AACnC,QAAI,CAACJ,KAAkB,CAACK,GAAM;AAC5B,MAAAD,EAAM,OAAO,QAAQ;AACrB;AAAA,IACF;AAEA,UAAME,IAAS,IAAI,WAAA;AACnB,IAAAA,EAAO,SAAS,CAACC,MAAgB;AAC/B,YAAMC,IAAOD,EAAY,QAAQ,QAC3BE,IAAO,KAAK,MAAMD,CAAI;AAE5B,MAAAZ,EAASI,GAAgBS,GAAM;AAAA,QAC7B,aAAa;AAAA,QACb,gBAAgB;AAAA,MAAA,CACjB,GACDR,EAAkB,MAAS,GAE3BG,EAAM,OAAO,QAAQ;AAAA,IACvB,GACAE,EAAO,WAAWD,CAAI;AAAA,EACxB;AAEA,SACE,sBAAA,cAAA,MAAA,UAAA,MACE,sBAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKP;AAAA,MACL,QAAO;AAAA,MACP,QAAM;AAAA,MACN,UAAUK;AAAA,MACV,MAAK;AAAA,IAAA;AAAA,EAAA,GAEP,sBAAA;AAAA,IAACO;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,aAAY;AAAA,MACZ,cAAa;AAAA,MACb,MAAM,sBAAA,cAACC,GAAA,EAAW,WAAU,UAAS;AAAA,MACrC,qBAAqB,CAAC,EAAE,OAAAC,EAAA,MACtB,sBAAA,cAAC,OAAA,EAAI,WAAU,sBAAA,GACZjB,EAAQ,IAAI,CAACkB,MACZ,sBAAA;AAAA,QAACH;AAAA,QAAA;AAAA,UACC,KAAKG;AAAA,UACL,aAAY;AAAA,UACZ,MAAK;AAAA,UACL,SAAS,MAAM;AACb,YAAAZ,EAAkBY,CAAM,GACxBf,EAAS,SAAS,MAAA,GAClBc,EAAA;AAAA,UACF;AAAA,QAAA;AAAA,QAECC;AAAA,QAAO;AAAA,MAAA,CAEX,CACH;AAAA,IAAA;AAAA,IAEH;AAAA,EAAA,CAGH;AAEJ;"}
@@ -1,52 +1,37 @@
1
- import { useEditor as m, EditorContent as c } from "@tiptap/react";
2
- import d from "@tiptap/starter-kit";
3
- import { parseIcuToProseMirrorJSON as p } from "../../utils/icu-tranform.js";
4
- import { InputWrapper as u } from "./InputWrapper.js";
5
- import { VariableMention as b } from "./variables/extension.js";
6
- function h({
1
+ import c from "@tiptap/extension-document";
2
+ import f from "@tiptap/extension-paragraph";
3
+ import d from "@tiptap/extension-text";
4
+ import { useEditor as u, EditorContent as l } from "@tiptap/react";
5
+ import { parseIcuToProseMirrorJSON as x } from "../../utils/icu-tranform.js";
6
+ import { InputWrapper as E } from "./InputWrapper.js";
7
+ import { VariableMention as g } from "./variables/extension.js";
8
+ function b({
7
9
  label: e,
8
10
  value: t,
9
11
  lang: r,
10
12
  error: o,
11
- variables: a,
12
- onChange: i,
13
- onBlur: l,
14
- className: s
13
+ variables: i,
14
+ onChange: m,
15
+ onBlur: n,
16
+ className: a
15
17
  }) {
16
- const n = m({
18
+ const p = u({
17
19
  immediatelyRender: !1,
18
- content: p(t),
19
- extensions: [
20
- d.configure({
21
- blockquote: !1,
22
- bulletList: !1,
23
- codeBlock: !1,
24
- heading: !1,
25
- horizontalRule: !1,
26
- listItem: !1,
27
- orderedList: !1,
28
- bold: !1,
29
- italic: !1,
30
- link: !1,
31
- underline: !1,
32
- strike: !1,
33
- code: !1
34
- }),
35
- b(a)
36
- ],
37
- onUpdate: ({ editor: f }) => i(f.getText())
20
+ content: x(t),
21
+ extensions: [c, f, d, g(i)],
22
+ onUpdate: ({ editor: s }) => m(s.getText())
38
23
  });
39
- return /* @__PURE__ */ React.createElement(u, { label: e, error: o, className: s }, /* @__PURE__ */ React.createElement(
40
- c,
24
+ return /* @__PURE__ */ React.createElement(E, { label: e, error: o, className: a }, /* @__PURE__ */ React.createElement(
25
+ l,
41
26
  {
42
27
  className: "tiptap-editor min-h-8",
43
- editor: n,
28
+ editor: p,
44
29
  lang: r,
45
- onBlur: l
30
+ onBlur: n
46
31
  }
47
32
  ));
48
33
  }
49
34
  export {
50
- h as MessageInput
35
+ b as MessageInput
51
36
  };
52
37
  //# sourceMappingURL=MessageInput.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MessageInput.js","sources":["../../../src/components/inputs/MessageInput.tsx"],"sourcesContent":["import type { TemplateVariable } from \"@/types\";\nimport { EditorContent, useEditor } from \"@tiptap/react\";\nimport StarterKit from \"@tiptap/starter-kit\";\n\nimport { parseIcuToProseMirrorJSON } from \"@/utils/icu-tranform\";\n\nimport type { InputWrapperProps } from \"./InputWrapper\";\nimport { InputWrapper } from \"./InputWrapper\";\nimport { VariableMention } from \"./variables/extension\";\n\nexport interface MessageInputProps extends InputWrapperProps {\n value: string;\n lang: string;\n variables: TemplateVariable[];\n onChange: (value: string) => void;\n onBlur: () => void;\n}\n\n// TODO add variable editor (style, options, etc)\n// TODO add tooltip to show all variables\n\nexport function MessageInput({\n label,\n value,\n lang,\n error,\n variables,\n onChange,\n onBlur,\n className,\n}: MessageInputProps) {\n const editor = useEditor({\n immediatelyRender: false,\n content: parseIcuToProseMirrorJSON(value),\n extensions: [\n StarterKit.configure({\n blockquote: false,\n bulletList: false,\n codeBlock: false,\n heading: false,\n horizontalRule: false,\n listItem: false,\n orderedList: false,\n bold: false,\n italic: false,\n link: false,\n underline: false,\n strike: false,\n code: false,\n }),\n VariableMention(variables),\n ],\n onUpdate: ({ editor }) => onChange(editor.getText()),\n });\n\n return (\n <InputWrapper label={label} error={error} className={className}>\n <EditorContent\n className=\"tiptap-editor min-h-8\"\n editor={editor}\n lang={lang}\n onBlur={onBlur}\n />\n </InputWrapper>\n );\n}\n"],"names":["MessageInput","label","value","lang","error","variables","onChange","onBlur","className","editor","useEditor","parseIcuToProseMirrorJSON","StarterKit","VariableMention","InputWrapper","EditorContent"],"mappings":";;;;;AAqBO,SAASA,EAAa;AAAA,EAC3B,OAAAC;AAAA,EACA,OAAAC;AAAA,EACA,MAAAC;AAAA,EACA,OAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,QAAAC;AAAA,EACA,WAAAC;AACF,GAAsB;AACpB,QAAMC,IAASC,EAAU;AAAA,IACvB,mBAAmB;AAAA,IACnB,SAASC,EAA0BT,CAAK;AAAA,IACxC,YAAY;AAAA,MACVU,EAAW,UAAU;AAAA,QACnB,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,SAAS;AAAA,QACT,gBAAgB;AAAA,QAChB,UAAU;AAAA,QACV,aAAa;AAAA,QACb,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,MAAM;AAAA,MAAA,CACP;AAAA,MACDC,EAAgBR,CAAS;AAAA,IAAA;AAAA,IAE3B,UAAU,CAAC,EAAE,QAAAI,QAAaH,EAASG,EAAO,QAAA,CAAS;AAAA,EAAA,CACpD;AAED,SACE,sBAAA,cAACK,GAAA,EAAa,OAAAb,GAAc,OAAAG,GAAc,WAAAI,KACxC,sBAAA;AAAA,IAACO;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,QAAAN;AAAA,MACA,MAAAN;AAAA,MACA,QAAAI;AAAA,IAAA;AAAA,EAAA,CAEJ;AAEJ;"}
1
+ {"version":3,"file":"MessageInput.js","sources":["../../../src/components/inputs/MessageInput.tsx"],"sourcesContent":["import type { TemplateVariable } from \"@/types\";\nimport Document from \"@tiptap/extension-document\";\nimport Paragraph from \"@tiptap/extension-paragraph\";\nimport Text from \"@tiptap/extension-text\";\nimport { EditorContent, useEditor } from \"@tiptap/react\";\n\nimport { parseIcuToProseMirrorJSON } from \"@/utils/icu-tranform\";\n\nimport type { InputWrapperProps } from \"./InputWrapper\";\nimport { InputWrapper } from \"./InputWrapper\";\nimport { VariableMention } from \"./variables/extension\";\n\nexport interface MessageInputProps extends InputWrapperProps {\n value: string;\n lang: string;\n variables: TemplateVariable[];\n onChange: (value: string) => void;\n onBlur: () => void;\n}\n\n// TODO add variable editor (style, options, etc)\n// TODO add tooltip to show all variables\n\nexport function MessageInput({\n label,\n value,\n lang,\n error,\n variables,\n onChange,\n onBlur,\n className,\n}: MessageInputProps) {\n const editor = useEditor({\n immediatelyRender: false,\n content: parseIcuToProseMirrorJSON(value),\n extensions: [Document, Paragraph, Text, VariableMention(variables)],\n onUpdate: ({ editor }) => onChange(editor.getText()),\n });\n\n return (\n <InputWrapper label={label} error={error} className={className}>\n <EditorContent\n className=\"tiptap-editor min-h-8\"\n editor={editor}\n lang={lang}\n onBlur={onBlur}\n />\n </InputWrapper>\n );\n}\n"],"names":["MessageInput","label","value","lang","error","variables","onChange","onBlur","className","editor","useEditor","parseIcuToProseMirrorJSON","Document","Paragraph","Text","VariableMention","InputWrapper","EditorContent"],"mappings":";;;;;;;AAuBO,SAASA,EAAa;AAAA,EAC3B,OAAAC;AAAA,EACA,OAAAC;AAAA,EACA,MAAAC;AAAA,EACA,OAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,QAAAC;AAAA,EACA,WAAAC;AACF,GAAsB;AACpB,QAAMC,IAASC,EAAU;AAAA,IACvB,mBAAmB;AAAA,IACnB,SAASC,EAA0BT,CAAK;AAAA,IACxC,YAAY,CAACU,GAAUC,GAAWC,GAAMC,EAAgBV,CAAS,CAAC;AAAA,IAClE,UAAU,CAAC,EAAE,QAAAI,QAAaH,EAASG,EAAO,QAAA,CAAS;AAAA,EAAA,CACpD;AAED,SACE,sBAAA,cAACO,GAAA,EAAa,OAAAf,GAAc,OAAAG,GAAc,WAAAI,KACxC,sBAAA;AAAA,IAACS;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,QAAAR;AAAA,MACA,MAAAN;AAAA,MACA,QAAAI;AAAA,IAAA;AAAA,EAAA,CAEJ;AAEJ;"}
package/dist/types.d.ts CHANGED
@@ -3,9 +3,7 @@ import { HeadingOptions } from '@tiptap/extension-heading';
3
3
  import { CollectionConfig, PayloadRequest } from 'payload';
4
4
  import { DeepPartial } from 'react-hook-form';
5
5
  export interface MessagesPluginConfig {
6
- hooks?: MessagesHooks;
7
6
  schema: MessagesSchema;
8
- tabs?: boolean;
9
7
  /**
10
8
  * The slug of the collection to use for the messages.
11
9
  *
@@ -18,6 +16,8 @@ export interface MessagesPluginConfig {
18
16
  * @default `(req) => req.user !== null // Authenticated users only`
19
17
  */
20
18
  editorAccess?: MessagesGuard;
19
+ hooks?: MessagesHooks;
20
+ tabs?: boolean;
21
21
  /**
22
22
  * The options for the rich text editor.
23
23
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "payload-intl",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "description": "Payload Plugin for I18N using ICU Messages",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -103,7 +103,6 @@
103
103
  "@tiptap/extension-underline": "^3.0.9",
104
104
  "@tiptap/extensions": "^3.0.9",
105
105
  "@tiptap/react": "^3.0.9",
106
- "@tiptap/starter-kit": "^3.0.9",
107
106
  "clsx": "^2.1.1",
108
107
  "lodash-es": "^4.17.21",
109
108
  "radix-ui": "^1.4.2",