payload-intl 0.2.4 → 1.0.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 +8 -12
- package/dist/components/MessageController.d.ts +2 -1
- package/dist/components/MessageController.d.ts.map +1 -0
- package/dist/components/MessageController.js +26 -48
- package/dist/components/MessageController.js.map +1 -1
- package/dist/components/MessagesForm.d.ts +2 -1
- package/dist/components/MessagesForm.d.ts.map +1 -0
- package/dist/components/MessagesForm.js +28 -32
- package/dist/components/MessagesForm.js.map +1 -1
- package/dist/components/actions/JsonImport.d.ts +1 -0
- package/dist/components/actions/JsonImport.d.ts.map +1 -0
- package/dist/components/actions/JsonImport.js +4 -4
- package/dist/components/actions/JsonImport.js.map +1 -1
- package/dist/components/actions/Move.d.ts +2 -3
- package/dist/components/actions/Move.d.ts.map +1 -0
- package/dist/components/inputs/InputWrapper.d.ts +1 -0
- package/dist/components/inputs/InputWrapper.d.ts.map +1 -0
- package/dist/components/inputs/InputWrapper.js.map +1 -1
- package/dist/components/inputs/LexicalInput.d.ts +1 -0
- package/dist/components/inputs/LexicalInput.d.ts.map +1 -0
- package/dist/components/inputs/MessageInput.d.ts +2 -1
- package/dist/components/inputs/MessageInput.d.ts.map +1 -0
- package/dist/components/inputs/MessageInput.js +1 -1
- package/dist/components/inputs/MessageInput.js.map +1 -1
- package/dist/components/inputs/variables/VariableChip.d.ts +1 -0
- package/dist/components/inputs/variables/VariableChip.d.ts.map +1 -0
- package/dist/components/inputs/variables/VariableChip.js +3 -3
- package/dist/components/inputs/variables/VariableChip.js.map +1 -1
- package/dist/components/inputs/variables/VariableIcon.d.ts +3 -2
- package/dist/components/inputs/variables/VariableIcon.d.ts.map +1 -0
- package/dist/components/inputs/variables/VariableSuggestion.d.ts +2 -1
- package/dist/components/inputs/variables/VariableSuggestion.d.ts.map +1 -0
- package/dist/components/inputs/variables/VariableSuggestion.js +2 -2
- package/dist/components/inputs/variables/VariableSuggestion.js.map +1 -1
- package/dist/components/inputs/variables/editors/DateVariableEditor.d.ts +2 -1
- package/dist/components/inputs/variables/editors/DateVariableEditor.d.ts.map +1 -0
- package/dist/components/inputs/variables/editors/PluralVariableEditor.d.ts +2 -1
- package/dist/components/inputs/variables/editors/PluralVariableEditor.d.ts.map +1 -0
- package/dist/components/inputs/variables/editors/PluralVariableEditor.js +31 -34
- package/dist/components/inputs/variables/editors/PluralVariableEditor.js.map +1 -1
- package/dist/components/inputs/variables/editors/SelectVariableEditor.d.ts +2 -1
- package/dist/components/inputs/variables/editors/SelectVariableEditor.d.ts.map +1 -0
- package/dist/components/inputs/variables/editors/SelectVariableEditor.js +17 -10
- package/dist/components/inputs/variables/editors/SelectVariableEditor.js.map +1 -1
- package/dist/components/inputs/variables/editors/TagVariableEditor.d.ts +2 -1
- package/dist/components/inputs/variables/editors/TagVariableEditor.d.ts.map +1 -0
- package/dist/components/inputs/variables/editors/TagVariableEditor.js.map +1 -1
- package/dist/components/inputs/variables/editors/TimeVariableEditor.d.ts +2 -1
- package/dist/components/inputs/variables/editors/TimeVariableEditor.d.ts.map +1 -0
- package/dist/components/inputs/variables/extension.d.ts +2 -1
- package/dist/components/inputs/variables/extension.d.ts.map +1 -0
- package/dist/components/inputs/variables/extension.js.map +1 -1
- package/dist/components/inputs/variables/pickers/NumericVariablePicker.d.ts +2 -1
- package/dist/components/inputs/variables/pickers/NumericVariablePicker.d.ts.map +1 -0
- package/dist/components/inputs/variables/pickers/NumericVariablePicker.js +4 -4
- package/dist/components/inputs/variables/pickers/NumericVariablePicker.js.map +1 -1
- package/dist/components/inputs/variables/pickers/TemporalElementEditor.d.ts +2 -1
- package/dist/components/inputs/variables/pickers/TemporalElementEditor.d.ts.map +1 -0
- package/dist/components/layout/MessageField.d.ts +2 -1
- package/dist/components/layout/MessageField.d.ts.map +1 -0
- package/dist/components/layout/MessageField.js +12 -12
- package/dist/components/layout/MessageField.js.map +1 -1
- package/dist/components/layout/MessagesTabs.d.ts +2 -1
- package/dist/components/layout/MessagesTabs.d.ts.map +1 -0
- package/dist/components/layout/MessagesTabs.js +3 -3
- package/dist/components/layout/MessagesTabs.js.map +1 -1
- package/dist/components/layout/MessagesTree.d.ts +2 -1
- package/dist/components/layout/MessagesTree.d.ts.map +1 -0
- package/dist/components/layout/MessagesTree.js +2 -2
- package/dist/components/layout/MessagesTree.js.map +1 -1
- package/dist/context/messages-form.d.ts +2 -1
- package/dist/context/messages-form.d.ts.map +1 -0
- package/dist/context/messages-form.js.map +1 -1
- package/dist/endpoints/get-messages.d.ts +1 -0
- package/dist/endpoints/get-messages.d.ts.map +1 -0
- package/dist/endpoints/get-messages.js.map +1 -1
- package/dist/endpoints/set-messages.d.ts +1 -0
- package/dist/endpoints/set-messages.d.ts.map +1 -0
- package/dist/endpoints/set-messages.js.map +1 -1
- package/dist/exports/link.d.ts +2 -1
- package/dist/exports/link.d.ts.map +1 -0
- package/dist/exports/link.js.map +1 -1
- package/dist/exports/rsc.d.ts +1 -0
- package/dist/exports/rsc.d.ts.map +1 -0
- package/dist/exports/view.d.ts +2 -1
- package/dist/exports/view.d.ts.map +1 -0
- package/dist/exports/view.js +26 -30
- package/dist/exports/view.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -34
- package/dist/index.js.map +1 -1
- package/dist/requests/fetchMessages.d.ts +1 -0
- package/dist/requests/fetchMessages.d.ts.map +1 -0
- package/dist/requests/fetchMessages.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types.d.ts +5 -4
- package/dist/types.d.ts.map +1 -0
- package/dist/utils/cn.d.ts +1 -0
- package/dist/utils/cn.d.ts.map +1 -0
- package/dist/utils/cn.js.map +1 -1
- package/dist/utils/config.d.ts +2 -1
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/error-handling.d.ts +1 -0
- package/dist/utils/error-handling.d.ts.map +1 -0
- package/dist/utils/error-handling.js.map +1 -1
- package/dist/utils/format.d.ts +2 -1
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js.map +1 -1
- package/dist/utils/guards.d.ts +2 -0
- package/dist/utils/guards.d.ts.map +1 -0
- package/dist/utils/guards.js +14 -11
- package/dist/utils/guards.js.map +1 -1
- package/dist/utils/icu-tranform.d.ts +6 -5
- package/dist/utils/icu-tranform.d.ts.map +1 -0
- package/dist/utils/icu-tranform.js +32 -27
- package/dist/utils/icu-tranform.js.map +1 -1
- package/dist/utils/sanitize.d.ts +2 -1
- package/dist/utils/sanitize.d.ts.map +1 -0
- package/dist/utils/sanitize.js.map +1 -1
- package/dist/utils/schema.d.ts +3 -2
- package/dist/utils/schema.d.ts.map +1 -0
- package/dist/utils/schema.js +10 -9
- package/dist/utils/schema.js.map +1 -1
- package/dist/utils/validate.d.ts +2 -1
- package/dist/utils/validate.d.ts.map +1 -0
- package/dist/utils/validate.js.map +1 -1
- package/package.json +57 -72
- package/dist/components/inputs/LexicalInput.js +0 -80
- package/dist/components/inputs/LexicalInput.js.map +0 -1
package/README.md
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
- Autocomplete to quickly insert and configure valid ICU arguments
|
|
14
14
|
- Add optional descriptions to each message so editors understand the context
|
|
15
15
|
- Visual tree & tabbed editor for quick navigation
|
|
16
|
-
- Support for Rich Text messages
|
|
16
|
+
<!-- - Support for Rich Text messages -->
|
|
17
17
|
<!-- - Import/export JSON, copy messages between paths -->
|
|
18
18
|
|
|
19
19
|
## Getting Started
|
|
@@ -107,15 +107,14 @@ The `intlPlugin` accepts the following configuration:
|
|
|
107
107
|
| `editorAccess` | Authenticated users only | Access control for editing messages |
|
|
108
108
|
| `hooks` | - | Collection hooks with and additional `afterUpdate` hook |
|
|
109
109
|
| `tabs` | - | Enable tabbed interface |
|
|
110
|
-
| `richTextEditorOptions` | - | Configure rich text editor options |
|
|
111
110
|
|
|
112
|
-
## Storage Adapter Requirements
|
|
111
|
+
<!-- ## Storage Adapter Requirements
|
|
113
112
|
|
|
114
113
|
The plugin creates a "messages" upload collection that stores translations as JSON files.
|
|
115
114
|
|
|
116
|
-
You must ensure that the storage provider returns the direct URL to the uploaded files and read access is guaranteed.
|
|
115
|
+
You must ensure that the storage provider returns the direct URL to the uploaded files and read access is guaranteed. -->
|
|
117
116
|
|
|
118
|
-
## Message Schema Definition
|
|
117
|
+
<!-- ## Message Schema Definition
|
|
119
118
|
|
|
120
119
|
### Message Descriptions
|
|
121
120
|
|
|
@@ -129,9 +128,9 @@ export default {
|
|
|
129
128
|
"[Subtitle with user's name and message count] Welcome back, {firstName}! You have {count} new messages.",
|
|
130
129
|
},
|
|
131
130
|
} as const;
|
|
132
|
-
```
|
|
131
|
+
``` -->
|
|
133
132
|
|
|
134
|
-
### Rich Text Messages
|
|
133
|
+
<!-- ### Rich Text Messages
|
|
135
134
|
|
|
136
135
|
Use `"$RICH$"` as the message value to enable rich text editing. Note that rich text messages do not support ICU arguments.
|
|
137
136
|
|
|
@@ -142,7 +141,7 @@ export default {
|
|
|
142
141
|
terms: "$RICH$", // Rich text editor will be used
|
|
143
142
|
},
|
|
144
143
|
} as const;
|
|
145
|
-
```
|
|
144
|
+
``` -->
|
|
146
145
|
|
|
147
146
|
## Example Usage
|
|
148
147
|
|
|
@@ -166,16 +165,13 @@ export default buildConfig({
|
|
|
166
165
|
intlPlugin({
|
|
167
166
|
schema: messages,
|
|
168
167
|
hooks: {
|
|
169
|
-
afterUpdate: () => revalidateTag("messages"),
|
|
168
|
+
afterUpdate: () => revalidateTag("messages"), // or anything else you want
|
|
170
169
|
},
|
|
171
170
|
}),
|
|
172
171
|
s3Storage({
|
|
173
172
|
collections: {
|
|
174
173
|
messages: {
|
|
175
174
|
prefix: "messages", // or anything else you want
|
|
176
|
-
// generate a publicly available URL to the file
|
|
177
|
-
generateFileURL: async ({ filename, prefix }) =>
|
|
178
|
-
`.../${prefix}/${filename}`,
|
|
179
175
|
},
|
|
180
176
|
},
|
|
181
177
|
}),
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TemplateVariable } from '../types
|
|
1
|
+
import { TemplateVariable } from '../types';
|
|
2
2
|
import { MessageType } from '../utils/schema';
|
|
3
3
|
import { MessageValidator } from '../utils/validate';
|
|
4
4
|
interface MessageControllerProps {
|
|
@@ -12,3 +12,4 @@ interface MessageControllerProps {
|
|
|
12
12
|
}
|
|
13
13
|
export declare function MessageController({ type, name, variables, label, locale, validate, className, }: MessageControllerProps): React.ReactNode;
|
|
14
14
|
export {};
|
|
15
|
+
//# sourceMappingURL=MessageController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageController.d.ts","sourceRoot":"","sources":["../../src/components/MessageController.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAIzD,UAAU,sBAAsB;IAC9B,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,QAAQ,EAAE,gBAAgB,CAAC;CAC5B;AAED,wBAAgB,iBAAiB,CAAC,EAChC,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,KAAK,EACL,MAAM,EACN,QAAQ,EACR,SAAS,GACV,EAAE,sBAAsB,GAAG,KAAK,CAAC,SAAS,CAgD1C"}
|
|
@@ -1,65 +1,43 @@
|
|
|
1
1
|
import { jsx as o } from "react/jsx-runtime";
|
|
2
|
-
import { Controller as
|
|
3
|
-
import { useMessagesForm as
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
className: s
|
|
2
|
+
import { Controller as p } from "react-hook-form";
|
|
3
|
+
import { useMessagesForm as g } from "../context/messages-form.js";
|
|
4
|
+
import { MessageInput as i } from "./inputs/MessageInput.js";
|
|
5
|
+
function v({
|
|
6
|
+
type: C,
|
|
7
|
+
name: e,
|
|
8
|
+
variables: n,
|
|
9
|
+
label: t,
|
|
10
|
+
locale: s,
|
|
11
|
+
validate: u,
|
|
12
|
+
className: l
|
|
14
13
|
}) {
|
|
15
|
-
const { control:
|
|
16
|
-
return
|
|
17
|
-
|
|
14
|
+
const { control: m } = g();
|
|
15
|
+
return /* @__PURE__ */ o(
|
|
16
|
+
p,
|
|
18
17
|
{
|
|
19
|
-
control:
|
|
20
|
-
name:
|
|
21
|
-
render: ({ field: r, fieldState:
|
|
22
|
-
|
|
18
|
+
control: m,
|
|
19
|
+
name: e,
|
|
20
|
+
render: ({ field: r, fieldState: a }) => /* @__PURE__ */ o(
|
|
21
|
+
i,
|
|
23
22
|
{
|
|
24
|
-
className:
|
|
25
|
-
error:
|
|
26
|
-
label:
|
|
27
|
-
lang:
|
|
28
|
-
onChange: r.onChange,
|
|
23
|
+
className: l,
|
|
24
|
+
error: a.error,
|
|
25
|
+
label: t,
|
|
26
|
+
lang: s,
|
|
29
27
|
onBlur: r.onBlur,
|
|
30
|
-
value: r.value || ""
|
|
31
|
-
}
|
|
32
|
-
),
|
|
33
|
-
rules: {
|
|
34
|
-
required: !0
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
) : /* @__PURE__ */ o(
|
|
38
|
-
g,
|
|
39
|
-
{
|
|
40
|
-
control: a,
|
|
41
|
-
name: n,
|
|
42
|
-
render: ({ field: r, fieldState: e }) => /* @__PURE__ */ o(
|
|
43
|
-
h,
|
|
44
|
-
{
|
|
45
|
-
label: u,
|
|
46
|
-
lang: t,
|
|
47
|
-
className: s,
|
|
48
|
-
value: r.value || "",
|
|
49
|
-
variables: m,
|
|
50
|
-
error: e.error,
|
|
51
28
|
onChange: r.onChange,
|
|
52
|
-
|
|
29
|
+
value: r.value || "",
|
|
30
|
+
variables: n
|
|
53
31
|
}
|
|
54
32
|
),
|
|
55
33
|
rules: {
|
|
56
34
|
required: !0,
|
|
57
|
-
validate:
|
|
35
|
+
validate: u
|
|
58
36
|
}
|
|
59
37
|
}
|
|
60
38
|
);
|
|
61
39
|
}
|
|
62
40
|
export {
|
|
63
|
-
|
|
41
|
+
v as MessageController
|
|
64
42
|
};
|
|
65
43
|
//# sourceMappingURL=MessageController.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageController.js","sources":["../../src/components/MessageController.tsx"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"MessageController.js","sources":["../../src/components/MessageController.tsx"],"sourcesContent":["import { Controller } from 'react-hook-form';\nimport { useMessagesForm } from '@/context/messages-form';\nimport type { TemplateVariable } from '@/types';\nimport type { MessageType } from '@/utils/schema';\nimport type { MessageValidator } from '@/utils/validate';\n\nimport { MessageInput } from './inputs/MessageInput';\n\ninterface MessageControllerProps {\n type: MessageType;\n label?: string;\n locale: string;\n name: string;\n className?: string;\n variables: TemplateVariable[];\n validate: MessageValidator;\n}\n\nexport function MessageController({\n type,\n name,\n variables,\n label,\n locale,\n validate,\n className,\n}: MessageControllerProps): React.ReactNode {\n const { control } = useMessagesForm();\n\n // if (type === \"rich\") {\n // return (\n // <Controller\n // control={control}\n // name={name}\n // render={({ field, fieldState }) => (\n // <LexicalInput\n // className={className}\n // error={fieldState.error}\n // label={label}\n // lang={locale}\n // onChange={field.onChange}\n // onBlur={field.onBlur}\n // value={(field.value as unknown as string) || \"\"}\n // />\n // )}\n // rules={{\n // required: true,\n // }}\n // />\n // );\n // }\n\n return (\n <Controller\n control={control}\n name={name}\n render={({ field, fieldState }) => (\n <MessageInput\n className={className}\n error={fieldState.error}\n label={label}\n lang={locale}\n onBlur={field.onBlur}\n onChange={field.onChange}\n value={(field.value as unknown as string) || ''}\n variables={variables}\n />\n )}\n rules={{\n required: true,\n validate,\n }}\n />\n );\n}\n"],"names":["MessageController","type","name","variables","label","locale","validate","className","control","useMessagesForm","jsx","Controller","field","fieldState","MessageInput"],"mappings":";;;;AAkBO,SAASA,EAAkB;AAAA,EAChC,MAAAC;AAAA,EACA,MAAAC;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AACF,GAA4C;AAC1C,QAAM,EAAE,SAAAC,EAAA,IAAYC,EAAA;AAyBpB,SACE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,SAAAH;AAAA,MACA,MAAAN;AAAA,MACA,QAAQ,CAAC,EAAE,OAAAU,GAAO,YAAAC,QAChB,gBAAAH;AAAA,QAACI;AAAA,QAAA;AAAA,UACC,WAAAP;AAAA,UACA,OAAOM,EAAW;AAAA,UAClB,OAAAT;AAAA,UACA,MAAMC;AAAA,UACN,QAAQO,EAAM;AAAA,UACd,UAAUA,EAAM;AAAA,UAChB,OAAQA,EAAM,SAA+B;AAAA,UAC7C,WAAAT;AAAA,QAAA;AAAA,MAAA;AAAA,MAGJ,OAAO;AAAA,QACL,UAAU;AAAA,QACV,UAAAG;AAAA,MAAA;AAAA,IACF;AAAA,EAAA;AAGN;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DeepPartial, Locales, Messages, MessagesSchema, Translations } from '../types
|
|
1
|
+
import { DeepPartial, Locales, Messages, MessagesSchema, Translations } from '../types';
|
|
2
2
|
interface MessagesFormProps {
|
|
3
3
|
locales: Locales;
|
|
4
4
|
schema: MessagesSchema;
|
|
@@ -8,3 +8,4 @@ interface MessagesFormProps {
|
|
|
8
8
|
}
|
|
9
9
|
export declare function MessagesForm({ locales, schema, tabs, values, endpointUrl, }: MessagesFormProps): React.ReactNode;
|
|
10
10
|
export {};
|
|
11
|
+
//# sourceMappingURL=MessagesForm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessagesForm.d.ts","sourceRoot":"","sources":["../../src/components/MessagesForm.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,WAAW,EACX,OAAO,EACP,QAAQ,EACR,cAAc,EACd,YAAY,EACb,MAAM,SAAS,CAAC;AAQjB,UAAU,iBAAiB;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,YAAY,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC5C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,MAAM,EACN,IAAY,EACZ,MAAM,EACN,WAAW,GACZ,EAAE,iBAAiB,GAAG,KAAK,CAAC,SAAS,CA6GrC"}
|
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { jsx as
|
|
3
|
-
import { useStepNav as x, Button as M } from "@payloadcms/ui";
|
|
2
|
+
import { jsx as t, jsxs as o } from "react/jsx-runtime";
|
|
3
|
+
import { useStepNav as x, Button as M, toast as d } from "@payloadcms/ui";
|
|
4
4
|
import { isEqual as y } from "lodash-es";
|
|
5
5
|
import { useEffect as j, useState as w } from "react";
|
|
6
6
|
import { useForm as T } from "react-hook-form";
|
|
7
|
-
import { toast as d } from "sonner";
|
|
8
7
|
import { MessagesFormProvider as E } from "../context/messages-form.js";
|
|
9
|
-
import { cn as
|
|
8
|
+
import { cn as p } from "../utils/cn.js";
|
|
10
9
|
import { getErrorMessage as F } from "../utils/error-handling.js";
|
|
11
10
|
import { JsonImport as C } from "./actions/JsonImport.js";
|
|
12
11
|
import { MessageField as O } from "./layout/MessageField.js";
|
|
13
12
|
import { MessagesTabs as I } from "./layout/MessagesTabs.js";
|
|
14
13
|
import { MessagesTree as g } from "./layout/MessagesTree.js";
|
|
15
|
-
function
|
|
14
|
+
function H({
|
|
16
15
|
locales: u,
|
|
17
16
|
schema: a,
|
|
18
17
|
tabs: m = !1,
|
|
@@ -27,31 +26,28 @@ function Q({
|
|
|
27
26
|
defaultValues: l,
|
|
28
27
|
reValidateMode: "onChange"
|
|
29
28
|
}), [c, v] = w(Object.keys(a)[0]), N = async (e) => {
|
|
30
|
-
const r = d.loading("Saving..."), S = Object.entries(e).reduce((
|
|
31
|
-
...t,
|
|
32
|
-
[n]: p
|
|
33
|
-
}, {});
|
|
29
|
+
const r = d.loading("Saving..."), S = Object.entries(e).reduce((s, [n, h]) => (y(h, l[n]) || (s[n] = h), s), {});
|
|
34
30
|
try {
|
|
35
|
-
const
|
|
31
|
+
const s = await fetch(b, {
|
|
36
32
|
method: "PUT",
|
|
37
33
|
headers: {
|
|
38
34
|
"Content-Type": "application/json"
|
|
39
35
|
},
|
|
40
36
|
body: JSON.stringify(S)
|
|
41
37
|
});
|
|
42
|
-
if (!
|
|
43
|
-
const n = await F(
|
|
38
|
+
if (!s.ok) {
|
|
39
|
+
const n = await F(s);
|
|
44
40
|
throw new Error(n);
|
|
45
41
|
}
|
|
46
42
|
i.reset(e), d.success("Saved", { id: r });
|
|
47
|
-
} catch (
|
|
43
|
+
} catch (s) {
|
|
48
44
|
d.error(
|
|
49
|
-
`Failed to save: ${
|
|
45
|
+
`Failed to save: ${s instanceof Error ? s.message : "Unknown error"}`,
|
|
50
46
|
{ id: r }
|
|
51
47
|
);
|
|
52
48
|
}
|
|
53
49
|
};
|
|
54
|
-
return /* @__PURE__ */
|
|
50
|
+
return /* @__PURE__ */ t(E, { form: i, locales: u, children: /* @__PURE__ */ o(
|
|
55
51
|
"form",
|
|
56
52
|
{
|
|
57
53
|
className: "flex h-[calc(100vh-var(--app-header-height))] flex-col",
|
|
@@ -59,25 +55,25 @@ function Q({
|
|
|
59
55
|
children: [
|
|
60
56
|
/* @__PURE__ */ o("div", { className: "sticky top-0 z-10 bg-background", children: [
|
|
61
57
|
/* @__PURE__ */ o("header", { className: "mb-6 flex items-center justify-between gap-4", children: [
|
|
62
|
-
/* @__PURE__ */
|
|
58
|
+
/* @__PURE__ */ t("h1", { className: "text-4xl", children: "Messages" }),
|
|
63
59
|
/* @__PURE__ */ o("div", { className: "flex items-center gap-2", children: [
|
|
64
|
-
/* @__PURE__ */
|
|
65
|
-
/* @__PURE__ */
|
|
60
|
+
/* @__PURE__ */ t(C, {}),
|
|
61
|
+
/* @__PURE__ */ t(
|
|
66
62
|
M,
|
|
67
63
|
{
|
|
68
64
|
className: "my-0",
|
|
69
|
-
type: "submit",
|
|
70
65
|
disabled: !i.formState.isDirty,
|
|
66
|
+
type: "submit",
|
|
71
67
|
children: "Save"
|
|
72
68
|
}
|
|
73
69
|
)
|
|
74
70
|
] })
|
|
75
71
|
] }),
|
|
76
|
-
m && /* @__PURE__ */
|
|
72
|
+
m && /* @__PURE__ */ t(
|
|
77
73
|
I,
|
|
78
74
|
{
|
|
79
|
-
schema: a,
|
|
80
75
|
activeTab: c,
|
|
76
|
+
schema: a,
|
|
81
77
|
setActiveTab: v
|
|
82
78
|
}
|
|
83
79
|
)
|
|
@@ -85,26 +81,26 @@ function Q({
|
|
|
85
81
|
/* @__PURE__ */ o(
|
|
86
82
|
"div",
|
|
87
83
|
{
|
|
88
|
-
id: "messages-form-content",
|
|
89
84
|
className: "min-h-0 overflow-y-auto pt-8 pb-16",
|
|
85
|
+
id: "messages-form-content",
|
|
90
86
|
children: [
|
|
91
|
-
!m && /* @__PURE__ */
|
|
92
|
-
m && Object.entries(a).map(([e, r]) => typeof r == "string" ? /* @__PURE__ */
|
|
87
|
+
!m && /* @__PURE__ */ t(g, { nestingLevel: 0, path: "", schema: a }),
|
|
88
|
+
m && Object.entries(a).map(([e, r]) => typeof r == "string" ? /* @__PURE__ */ t(
|
|
93
89
|
O,
|
|
94
90
|
{
|
|
95
|
-
|
|
96
|
-
className: h({ hidden: c !== e }),
|
|
91
|
+
className: p({ hidden: c !== e }),
|
|
97
92
|
messageKey: e,
|
|
98
|
-
path: e
|
|
93
|
+
path: e,
|
|
94
|
+
schema: r
|
|
99
95
|
},
|
|
100
96
|
e
|
|
101
|
-
) : /* @__PURE__ */
|
|
97
|
+
) : /* @__PURE__ */ t(
|
|
102
98
|
g,
|
|
103
99
|
{
|
|
104
|
-
className:
|
|
100
|
+
className: p({ hidden: c !== e }),
|
|
101
|
+
nestingLevel: 0,
|
|
105
102
|
path: e,
|
|
106
|
-
schema: r
|
|
107
|
-
nestingLevel: 0
|
|
103
|
+
schema: r
|
|
108
104
|
},
|
|
109
105
|
e
|
|
110
106
|
))
|
|
@@ -116,6 +112,6 @@ function Q({
|
|
|
116
112
|
) });
|
|
117
113
|
}
|
|
118
114
|
export {
|
|
119
|
-
|
|
115
|
+
H as MessagesForm
|
|
120
116
|
};
|
|
121
117
|
//# sourceMappingURL=MessagesForm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessagesForm.js","sources":["../../src/components/MessagesForm.tsx"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"MessagesForm.js","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 '@/context/messages-form';\nimport { MessagesFormProvider } from '@/context/messages-form';\nimport type {\n DeepPartial,\n Locales,\n Messages,\n MessagesSchema,\n Translations,\n} from '@/types';\nimport { cn } from '@/utils/cn';\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';\n\ninterface MessagesFormProps {\n locales: Locales;\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\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 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\n className=\"min-h-0 overflow-y-auto pt-8 pb-16\"\n id=\"messages-form-content\"\n >\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 className={cn({ hidden: activeTab !== key })}\n key={key}\n messageKey={key}\n path={key}\n schema={value}\n />\n );\n }\n return (\n <MessagesTree\n className={cn({ 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":["MessagesForm","locales","schema","tabs","values","endpointUrl","setStepNav","useStepNav","useEffect","form","useForm","activeTab","setActiveTab","useState","handleSubmit","currentValues","toastId","toast","changes","acc","locale","value","isEqual","response","error","getErrorMessage","jsx","MessagesFormProvider","jsxs","JsonImport","Button","MessagesTabs","MessagesTree","key","MessageField","cn"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JsonImport.d.ts","sourceRoot":"","sources":["../../../src/components/actions/JsonImport.tsx"],"names":[],"mappings":"AAMA,wBAAgB,UAAU,4CAiEzB"}
|
|
@@ -9,7 +9,6 @@ function C() {
|
|
|
9
9
|
/* @__PURE__ */ o(
|
|
10
10
|
"input",
|
|
11
11
|
{
|
|
12
|
-
ref: r,
|
|
13
12
|
accept: ".json",
|
|
14
13
|
hidden: !0,
|
|
15
14
|
onChange: (t) => {
|
|
@@ -27,24 +26,25 @@ function C() {
|
|
|
27
26
|
}), n(void 0), t.target.value = "";
|
|
28
27
|
}, l.readAsText(e);
|
|
29
28
|
},
|
|
29
|
+
ref: r,
|
|
30
30
|
type: "file"
|
|
31
31
|
}
|
|
32
32
|
),
|
|
33
33
|
/* @__PURE__ */ o(
|
|
34
34
|
c,
|
|
35
35
|
{
|
|
36
|
-
className: "my-0",
|
|
37
36
|
buttonStyle: "subtle",
|
|
38
|
-
|
|
37
|
+
className: "my-0",
|
|
39
38
|
icon: /* @__PURE__ */ o(h, { className: "size-5" }),
|
|
39
|
+
iconPosition: "left",
|
|
40
40
|
SubMenuPopupContent: ({ close: t }) => /* @__PURE__ */ o("div", { className: "flex flex-col gap-2", children: i.map((e) => /* @__PURE__ */ a(
|
|
41
41
|
c,
|
|
42
42
|
{
|
|
43
43
|
buttonStyle: "subtle",
|
|
44
|
-
size: "small",
|
|
45
44
|
onClick: () => {
|
|
46
45
|
n(e), r.current?.click(), t();
|
|
47
46
|
},
|
|
47
|
+
size: "small",
|
|
48
48
|
children: [
|
|
49
49
|
e,
|
|
50
50
|
".json"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JsonImport.js","sources":["../../../src/components/actions/JsonImport.tsx"],"sourcesContent":["import { Button } from
|
|
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 accept=\".json\"\n hidden\n onChange={handleImportJSON}\n ref={inputRef}\n type=\"file\"\n />\n <Button\n buttonStyle=\"subtle\"\n className=\"my-0\"\n icon={<IconBraces className=\"size-5\" />}\n iconPosition=\"left\"\n SubMenuPopupContent={({ close }) => (\n <div className=\"flex flex-col gap-2\">\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":["JsonImport","locales","setValue","useMessagesForm","inputRef","useRef","selectedLocale","setSelectedLocale","useState","jsxs","Fragment","jsx","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;AAyB5C,SACE,gBAAAC,EAAAC,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,QAAO;AAAA,QACP,QAAM;AAAA,QACN,UA5BmB,CAACC,MAA+C;AACvE,gBAAMC,IAAOD,EAAM,OAAO,QAAQ,CAAC;AACnC,cAAI,CAACN,KAAkB,CAACO,GAAM;AAC5B,YAAAD,EAAM,OAAO,QAAQ;AACrB;AAAA,UACF;AAEA,gBAAME,IAAS,IAAI,WAAA;AACnB,UAAAA,EAAO,SAAS,CAACC,MAAgB;AAC/B,kBAAMC,IAAOD,EAAY,QAAQ,QAC3BE,IAAO,KAAK,MAAMD,CAAI;AAE5B,YAAAd,EAASI,GAAgBW,GAAM;AAAA,cAC7B,aAAa;AAAA,cACb,gBAAgB;AAAA,YAAA,CACjB,GACDV,EAAkB,MAAS,GAE3BK,EAAM,OAAO,QAAQ;AAAA,UACvB,GACAE,EAAO,WAAWD,CAAI;AAAA,QACxB;AAAA,QAQM,KAAKT;AAAA,QACL,MAAK;AAAA,MAAA;AAAA,IAAA;AAAA,IAEP,gBAAAO;AAAA,MAACO;AAAA,MAAA;AAAA,QACC,aAAY;AAAA,QACZ,WAAU;AAAA,QACV,MAAM,gBAAAP,EAACQ,GAAA,EAAW,WAAU,SAAA,CAAS;AAAA,QACrC,cAAa;AAAA,QACb,qBAAqB,CAAC,EAAE,OAAAC,QACtB,gBAAAT,EAAC,OAAA,EAAI,WAAU,uBACZ,UAAAV,EAAQ,IAAI,CAACoB,MACZ,gBAAAZ;AAAA,UAACS;AAAA,UAAA;AAAA,YACC,aAAY;AAAA,YAEZ,SAAS,MAAM;AACb,cAAAX,EAAkBc,CAAM,GACxBjB,EAAS,SAAS,MAAA,GAClBgB,EAAA;AAAA,YACF;AAAA,YACA,MAAK;AAAA,YAEJ,UAAA;AAAA,cAAAC;AAAA,cAAO;AAAA,YAAA;AAAA,UAAA;AAAA,UARHA;AAAA,QAAA,CAUR,GACH;AAAA,QAEH,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAED,GACF;AAEJ;"}
|
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
3
|
-
export declare function Move({}: MoveProps): import("react/jsx-runtime").JSX.Element;
|
|
1
|
+
export declare function Move(): import("react/jsx-runtime").JSX.Element;
|
|
2
|
+
//# sourceMappingURL=Move.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Move.d.ts","sourceRoot":"","sources":["../../../src/components/actions/Move.tsx"],"names":[],"mappings":"AAMA,wBAAgB,IAAI,4CA4BnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InputWrapper.d.ts","sourceRoot":"","sources":["../../../src/components/inputs/InputWrapper.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAIlD,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,UAAU,GAAG,SAAS,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,KAAK,EACL,SAAS,EACT,QAAQ,GACT,EAAE,KAAK,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,2CAqB5C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InputWrapper.js","sources":["../../../src/components/inputs/InputWrapper.tsx"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"InputWrapper.js","sources":["../../../src/components/inputs/InputWrapper.tsx"],"sourcesContent":["import { FieldLabel } from '@payloadcms/ui';\nimport type { FieldError } from 'react-hook-form';\n\nimport { cn } from '@/utils/cn';\n\nexport interface InputWrapperProps {\n label?: string;\n error: FieldError | undefined;\n className?: string;\n}\n\nexport function InputWrapper({\n label,\n error,\n className,\n children,\n}: React.PropsWithChildren<InputWrapperProps>) {\n return (\n <div className={cn('flex h-full min-w-5 flex-col gap-1', className)}>\n <fieldset\n className={cn(\n 'mx-0 flex-1 rounded-md focus-within:border-elevation-400',\n {\n 'border-error bg-error': error,\n },\n )}\n >\n {label && (\n <legend className=\"-ml-2 px-1.5 text-base\">\n <FieldLabel label={label} />\n </legend>\n )}\n {children}\n </fieldset>\n <p className=\"text-base text-error\">{error?.message}</p>\n </div>\n );\n}\n"],"names":["InputWrapper","label","error","className","children","cn","jsxs","jsx","FieldLabel"],"mappings":";;;AAWO,SAASA,EAAa;AAAA,EAC3B,OAAAC;AAAA,EACA,OAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AACF,GAA+C;AAC7C,2BACG,OAAA,EAAI,WAAWC,EAAG,sCAAsCF,CAAS,GAChE,UAAA;AAAA,IAAA,gBAAAG;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWD;AAAA,UACT;AAAA,UACA;AAAA,YACE,yBAAyBH;AAAA,UAAA;AAAA,QAC3B;AAAA,QAGD,UAAA;AAAA,UAAAD,uBACE,UAAA,EAAO,WAAU,0BAChB,UAAA,gBAAAM,EAACC,GAAA,EAAW,OAAAP,GAAc,EAAA,CAC5B;AAAA,UAEDG;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAEH,gBAAAG,EAAC,KAAA,EAAE,WAAU,wBAAwB,aAAO,QAAA,CAAQ;AAAA,EAAA,GACtD;AAEJ;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LexicalInput.d.ts","sourceRoot":"","sources":["../../../src/components/inputs/LexicalInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,8BAA8B,CAAC;AAWtC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AASlF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGxD,MAAM,WAAW,iBAAkB,SAAQ,iBAAiB;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,KAAK,EACL,KAAK,EACL,QAAQ,EACR,SAAS,GACV,EAAE,iBAAiB,GAAG,KAAK,CAAC,SAAS,CAoBrC;AAID,UAAU,0BAA0B;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED,wBAAgB,qBAAqB,CAAC,EACpC,IAAI,EACJ,QAAQ,GACT,EAAE,0BAA0B;WAiEF,gBAAgB,CAAC,gBAAgB,CAAC;gCAjBvC,qBAAqB;EAkB1C"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TemplateVariable } from '../../types
|
|
1
|
+
import { TemplateVariable } from '../../types';
|
|
2
2
|
import { InputWrapperProps } from './InputWrapper';
|
|
3
3
|
export interface MessageInputProps extends InputWrapperProps {
|
|
4
4
|
value: string;
|
|
@@ -8,3 +8,4 @@ export interface MessageInputProps extends InputWrapperProps {
|
|
|
8
8
|
onBlur: () => void;
|
|
9
9
|
}
|
|
10
10
|
export declare function MessageInput({ label, value, lang, error, variables, onChange, onBlur, className, }: MessageInputProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
//# sourceMappingURL=MessageInput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageInput.d.ts","sourceRoot":"","sources":["../../../src/components/inputs/MessageInput.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAIhD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAIxD,MAAM,WAAW,iBAAkB,SAAQ,iBAAiB;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAKD,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,KAAK,EACL,IAAI,EACJ,KAAK,EACL,SAAS,EACT,QAAQ,EACR,MAAM,EACN,SAAS,GACV,EAAE,iBAAiB,2CAkBnB"}
|
|
@@ -22,7 +22,7 @@ function C({
|
|
|
22
22
|
extensions: [d, c, u, I(m)],
|
|
23
23
|
onUpdate: ({ editor: f }) => n(f.getText())
|
|
24
24
|
});
|
|
25
|
-
return /* @__PURE__ */ r(h, {
|
|
25
|
+
return /* @__PURE__ */ r(h, { className: a, error: i, label: o, children: /* @__PURE__ */ r(
|
|
26
26
|
x,
|
|
27
27
|
{
|
|
28
28
|
className: "tiptap-editor min-h-8",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageInput.js","sources":["../../../src/components/inputs/MessageInput.tsx"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"MessageInput.js","sources":["../../../src/components/inputs/MessageInput.tsx"],"sourcesContent":["import Document from '@tiptap/extension-document';\nimport Paragraph from '@tiptap/extension-paragraph';\nimport Text from '@tiptap/extension-text';\nimport { EditorContent, useEditor } from '@tiptap/react';\nimport type { TemplateVariable } from '@/types';\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 className={className} error={error} label={label}>\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","jsx","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,gBAAAO,EAACC,GAAA,EAAa,WAAAT,GAAsB,OAAAJ,GAAc,OAAAH,GAChD,UAAA,gBAAAe;AAAA,IAACE;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,QAAAT;AAAA,MACA,MAAAN;AAAA,MACA,QAAAI;AAAA,IAAA;AAAA,EAAA,GAEJ;AAEJ;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VariableChip.d.ts","sourceRoot":"","sources":["../../../../src/components/inputs/variables/VariableChip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AA0BxD,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,gBAAgB,GACjB,EAAE,kBAAkB,CAAC,WAAW,CAAC,2CAiEjC"}
|
|
@@ -37,8 +37,8 @@ function S({
|
|
|
37
37
|
}
|
|
38
38
|
),
|
|
39
39
|
contentEditable: !1,
|
|
40
|
-
"data-variable": o.name,
|
|
41
40
|
"data-icu": o.icu,
|
|
41
|
+
"data-variable": o.name,
|
|
42
42
|
role: "button",
|
|
43
43
|
tabIndex: 0,
|
|
44
44
|
children: o.label
|
|
@@ -47,10 +47,10 @@ function S({
|
|
|
47
47
|
/* @__PURE__ */ r(a.Portal, { children: /* @__PURE__ */ n(
|
|
48
48
|
a.Content,
|
|
49
49
|
{
|
|
50
|
+
align: "start",
|
|
51
|
+
className: "data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 z-50 grid origin-(--radix-hover-card-content-transform-origin) overflow-clip rounded-md border border-border bg-elevation-50 shadow-md outline-hidden empty:hidden data-[state=closed]:animate-out data-[state=open]:animate-in",
|
|
50
52
|
side: "bottom",
|
|
51
53
|
sideOffset: 5,
|
|
52
|
-
align: "start",
|
|
53
|
-
className: "z-50 grid origin-(--radix-hover-card-content-transform-origin) overflow-clip rounded-md border border-border bg-elevation-50 shadow-md outline-hidden empty:hidden data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
|
|
54
54
|
children: [
|
|
55
55
|
u(e) && /* @__PURE__ */ r(E, { element: e, onUpdate: i }),
|
|
56
56
|
w(e) && /* @__PURE__ */ r(h, { element: e, onUpdate: i }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VariableChip.js","sources":["../../../../src/components/inputs/variables/VariableChip.tsx"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"VariableChip.js","sources":["../../../../src/components/inputs/variables/VariableChip.tsx"],"sourcesContent":["import type { ReactNodeViewProps } from '@tiptap/react';\nimport { NodeViewWrapper } from '@tiptap/react';\nimport { Popover } from 'radix-ui';\nimport { useMemo } from 'react';\nimport type { VariableMentionNodeAttrs } from '@/types';\n\nimport { cn } from '@/utils/cn';\nimport {\n isArgumentElement,\n isNumericElement,\n isSelectElement,\n isTagElement,\n isTemporalElement,\n} from '@/utils/guards';\nimport { parseICUMessage } from '@/utils/icu-tranform';\n\nimport { SelectVariableEditor } from './editors/SelectVariableEditor';\nimport { TagVariableEditor } from './editors/TagVariableEditor';\nimport { NumericVariablePicker } from './pickers/NumericVariablePicker';\nimport { TemporalElementEditor } from './pickers/TemporalElementEditor';\nimport { VariableIcon } from './VariableIcon';\n\nconst TEMPORAL_ELEMENTS_FLAG = false;\n\n// TODO replace popover with portal below input field\n\nexport function VariableChip({\n node,\n updateAttributes,\n}: ReactNodeViewProps<HTMLElement>) {\n const attrs = node.attrs as VariableMentionNodeAttrs;\n const handleUpdate = (value: string) =>\n updateAttributes({\n icu: value,\n });\n\n const element = useMemo(() => {\n try {\n const [part] = parseICUMessage(attrs.icu);\n if (!part) throw new Error('No part found');\n return part;\n } catch (error) {\n console.error(error);\n throw new Error(`Invalid ICU: ${attrs.icu}`, { cause: error });\n }\n }, [attrs.icu]);\n\n return (\n <Popover.Root>\n <Popover.Trigger asChild>\n <NodeViewWrapper\n as=\"span\"\n className={cn(\n 'inline-flex cursor-pointer items-center rounded-md bg-elevation-250 px-1 hover:bg-elevation-400',\n {\n 'pointer-events-none':\n isArgumentElement(element) ||\n (isTemporalElement(element) && !TEMPORAL_ELEMENTS_FLAG),\n },\n )}\n contentEditable={false}\n data-icu={attrs.icu}\n data-variable={attrs.name}\n role=\"button\"\n tabIndex={0}\n >\n {/* <VariableIcon type={element.type} className=\"size-4\" /> */}\n {attrs.label}\n </NodeViewWrapper>\n </Popover.Trigger>\n <Popover.Portal>\n <Popover.Content\n align=\"start\"\n className=\"data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 z-50 grid origin-(--radix-hover-card-content-transform-origin) overflow-clip rounded-md border border-border bg-elevation-50 shadow-md outline-hidden empty:hidden data-[state=closed]:animate-out data-[state=open]:animate-in\"\n side=\"bottom\"\n sideOffset={5}\n >\n {isNumericElement(element) && (\n <NumericVariablePicker element={element} onUpdate={handleUpdate} />\n )}\n {isSelectElement(element) && (\n <SelectVariableEditor element={element} onUpdate={handleUpdate} />\n )}\n {TEMPORAL_ELEMENTS_FLAG && isTemporalElement(element) && (\n <TemporalElementEditor element={element} onUpdate={handleUpdate} />\n )}\n\n {isTagElement(element) && (\n <TagVariableEditor element={element} onUpdate={handleUpdate} />\n )}\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n );\n}\n"],"names":["TEMPORAL_ELEMENTS_FLAG","VariableChip","node","updateAttributes","attrs","handleUpdate","value","element","useMemo","part","parseICUMessage","error","jsxs","Popover","jsx","NodeViewWrapper","cn","isArgumentElement","isTemporalElement","isNumericElement","NumericVariablePicker","isSelectElement","SelectVariableEditor","isTagElement","TagVariableEditor"],"mappings":";;;;;;;;;;;AAsBA,MAAMA,IAAyB;AAIxB,SAASC,EAAa;AAAA,EAC3B,MAAAC;AAAA,EACA,kBAAAC;AACF,GAAoC;AAClC,QAAMC,IAAQF,EAAK,OACbG,IAAe,CAACC,MACpBH,EAAiB;AAAA,IACf,KAAKG;AAAA,EAAA,CACN,GAEGC,IAAUC,EAAQ,MAAM;AAC5B,QAAI;AACF,YAAM,CAACC,CAAI,IAAIC,EAAgBN,EAAM,GAAG;AACxC,UAAI,CAACK,EAAM,OAAM,IAAI,MAAM,eAAe;AAC1C,aAAOA;AAAA,IACT,SAASE,GAAO;AACd,oBAAQ,MAAMA,CAAK,GACb,IAAI,MAAM,gBAAgBP,EAAM,GAAG,IAAI,EAAE,OAAOO,GAAO;AAAA,IAC/D;AAAA,EACF,GAAG,CAACP,EAAM,GAAG,CAAC;AAEd,SACE,gBAAAQ,EAACC,EAAQ,MAAR,EACC,UAAA;AAAA,IAAA,gBAAAC,EAACD,EAAQ,SAAR,EAAgB,SAAO,IACtB,UAAA,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,IAAG;AAAA,QACH,WAAWC;AAAA,UACT;AAAA,UACA;AAAA,YACE,uBACEC,EAAkBV,CAAO,KACxBW,EAAkBX,CAAO,KAAK,CAACP;AAAA,UAAA;AAAA,QACpC;AAAA,QAEF,iBAAiB;AAAA,QACjB,YAAUI,EAAM;AAAA,QAChB,iBAAeA,EAAM;AAAA,QACrB,MAAK;AAAA,QACL,UAAU;AAAA,QAGT,UAAAA,EAAM;AAAA,MAAA;AAAA,IAAA,GAEX;AAAA,IACA,gBAAAU,EAACD,EAAQ,QAAR,EACC,UAAA,gBAAAD;AAAA,MAACC,EAAQ;AAAA,MAAR;AAAA,QACC,OAAM;AAAA,QACN,WAAU;AAAA,QACV,MAAK;AAAA,QACL,YAAY;AAAA,QAEX,UAAA;AAAA,UAAAM,EAAiBZ,CAAO,KACvB,gBAAAO,EAACM,GAAA,EAAsB,SAAAb,GAAkB,UAAUF,GAAc;AAAA,UAElEgB,EAAgBd,CAAO,uBACrBe,GAAA,EAAqB,SAAAf,GAAkB,UAAUF,GAAc;AAAA,UAEjEL;AAAA,UAIAuB,EAAahB,CAAO,uBAClBiB,GAAA,EAAkB,SAAAjB,GAAkB,UAAUF,EAAA,CAAc;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,EAEjE,CACF;AAAA,EAAA,GACF;AAEJ;"}
|