@firecms/collection_editor 3.1.0 → 3.2.0-canary.44dc65b
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/dist/index.es.js +6887 -3709
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +6885 -3707
- package/dist/index.umd.js.map +1 -1
- package/dist/locales/de.d.ts +118 -0
- package/dist/locales/en.d.ts +118 -0
- package/dist/locales/es.d.ts +118 -0
- package/dist/locales/fr.d.ts +118 -0
- package/dist/locales/hi.d.ts +118 -0
- package/dist/locales/it.d.ts +118 -0
- package/dist/locales/pt.d.ts +118 -0
- package/package.json +8 -8
- package/src/locales/de.ts +123 -0
- package/src/locales/en.ts +143 -0
- package/src/locales/es.ts +123 -0
- package/src/locales/fr.ts +123 -0
- package/src/locales/hi.ts +123 -0
- package/src/locales/it.ts +123 -0
- package/src/locales/pt.ts +123 -0
- package/src/ui/EditorCollectionAction.tsx +3 -3
- package/src/ui/EditorEntityAction.tsx +3 -2
- package/src/ui/NewCollectionButton.tsx +3 -1
- package/src/ui/NewCollectionCard.tsx +7 -4
- package/src/ui/PropertyAddColumnComponent.tsx +3 -2
- package/src/ui/collection_editor/AICollectionGeneratorPopover.tsx +11 -10
- package/src/ui/collection_editor/CollectionDetailsForm.tsx +26 -24
- package/src/ui/collection_editor/CollectionEditorDialog.tsx +42 -38
- package/src/ui/collection_editor/CollectionEditorWelcomeView.tsx +19 -18
- package/src/ui/collection_editor/CollectionPropertiesEditorForm.tsx +12 -10
- package/src/ui/collection_editor/DisplaySettingsForm.tsx +19 -17
- package/src/ui/collection_editor/EntityActionsEditTab.tsx +11 -12
- package/src/ui/collection_editor/EntityActionsSelectDialog.tsx +5 -6
- package/src/ui/collection_editor/EntityCustomViewsSelectDialog.tsx +5 -5
- package/src/ui/collection_editor/EnumForm.tsx +6 -2
- package/src/ui/collection_editor/ExtendSettingsForm.tsx +8 -7
- package/src/ui/collection_editor/GeneralSettingsForm.tsx +36 -38
- package/src/ui/collection_editor/GetCodeDialog.tsx +13 -12
- package/src/ui/collection_editor/KanbanConfigSection.tsx +11 -9
- package/src/ui/collection_editor/LayoutModeSwitch.tsx +7 -4
- package/src/ui/collection_editor/PropertyEditView.tsx +74 -65
- package/src/ui/collection_editor/SubcollectionsEditTab.tsx +16 -19
- package/src/ui/collection_editor/ViewModeSwitch.tsx +8 -6
- package/src/ui/collection_editor/import/CollectionEditorImportDataPreview.tsx +6 -3
- package/src/ui/collection_editor/import/CollectionEditorImportMapping.tsx +5 -2
- package/src/ui/collection_editor/properties/BooleanPropertyField.tsx +3 -1
- package/src/ui/collection_editor/properties/CommonPropertyFields.tsx +6 -4
- package/src/ui/collection_editor/properties/DateTimePropertyField.tsx +20 -18
- package/src/ui/collection_editor/properties/EnumPropertyField.tsx +5 -4
- package/src/ui/collection_editor/properties/MapPropertyField.tsx +8 -7
- package/src/ui/collection_editor/properties/MarkdownPropertyField.tsx +22 -23
- package/src/ui/collection_editor/properties/NumberPropertyField.tsx +3 -1
- package/src/ui/collection_editor/properties/ReferencePropertyField.tsx +5 -4
- package/src/ui/collection_editor/properties/StoragePropertyField.tsx +46 -51
- package/src/ui/collection_editor/properties/StringPropertyField.tsx +3 -1
- package/src/ui/collection_editor/properties/UrlPropertyField.tsx +12 -10
- package/src/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.tsx +7 -4
- package/src/ui/collection_editor/properties/conditions/ConditionsEditor.tsx +8 -3
- package/src/ui/collection_editor/properties/validation/ArrayPropertyValidation.tsx +5 -2
- package/src/ui/collection_editor/properties/validation/GeneralPropertyValidation.tsx +7 -5
- package/src/ui/collection_editor/properties/validation/NumberPropertyValidation.tsx +10 -7
- package/src/ui/collection_editor/properties/validation/StringPropertyValidation.tsx +11 -9
- package/src/ui/collection_editor/properties/validation/ValidationPanel.tsx +4 -1
- package/src/useCollectionEditorPlugin.tsx +22 -6
|
@@ -7,7 +7,8 @@ import {
|
|
|
7
7
|
singular,
|
|
8
8
|
toSnakeCase,
|
|
9
9
|
useAuthController,
|
|
10
|
-
useCustomizationController
|
|
10
|
+
useCustomizationController,
|
|
11
|
+
useTranslation
|
|
11
12
|
} from "@firecms/core";
|
|
12
13
|
import {
|
|
13
14
|
BooleanSwitchWithLabel,
|
|
@@ -55,6 +56,7 @@ export function GeneralSettingsForm({
|
|
|
55
56
|
|
|
56
57
|
const authController = useAuthController();
|
|
57
58
|
const customizationController = useCustomizationController();
|
|
59
|
+
const { t } = useTranslation();
|
|
58
60
|
|
|
59
61
|
const updateDatabaseId = (databaseId: string) => {
|
|
60
62
|
setFieldValue("databaseId", databaseId ?? undefined);
|
|
@@ -90,12 +92,12 @@ export function GeneralSettingsForm({
|
|
|
90
92
|
<div>
|
|
91
93
|
<div className="flex flex-row gap-2 py-2 pt-3 items-center">
|
|
92
94
|
<Typography variant={!isNewCollection ? "h5" : "h4"} className={"flex-grow"}>
|
|
93
|
-
{isNewCollection ? "
|
|
95
|
+
{isNewCollection ? t("new_collection") : t("collection_with_name", { name: values?.name })}
|
|
94
96
|
</Typography>
|
|
95
97
|
<DefaultDatabaseField databaseId={values.databaseId}
|
|
96
98
|
onDatabaseIdUpdate={updateDatabaseId} />
|
|
97
99
|
|
|
98
|
-
<Tooltip title={"
|
|
100
|
+
<Tooltip title={t("change_icon")}
|
|
99
101
|
asChild={true}>
|
|
100
102
|
<IconButton
|
|
101
103
|
shape={"square"}
|
|
@@ -107,7 +109,7 @@ export function GeneralSettingsForm({
|
|
|
107
109
|
|
|
108
110
|
{parentCollection && <Chip colorScheme={"tealDarker"}>
|
|
109
111
|
<Typography variant={"caption"}>
|
|
110
|
-
|
|
112
|
+
{t("is_subcollection_of")} <b>{parentCollection.name}</b>
|
|
111
113
|
</Typography>
|
|
112
114
|
</Chip>}
|
|
113
115
|
|
|
@@ -120,12 +122,12 @@ export function GeneralSettingsForm({
|
|
|
120
122
|
<TextField
|
|
121
123
|
value={values.name ?? ""}
|
|
122
124
|
onChange={(e: any) => updateName(e.target.value)}
|
|
123
|
-
label={"
|
|
125
|
+
label={t("name")}
|
|
124
126
|
autoFocus={true}
|
|
125
127
|
required
|
|
126
128
|
error={showErrors && Boolean(errors.name)} />
|
|
127
129
|
<FieldCaption error={touched.name && Boolean(errors.name)}>
|
|
128
|
-
{touched.name && Boolean(errors.name) ? errors.name : "
|
|
130
|
+
{touched.name && Boolean(errors.name) ? errors.name : t("collection_name_description")}
|
|
129
131
|
</FieldCaption>
|
|
130
132
|
</div>
|
|
131
133
|
|
|
@@ -133,14 +135,14 @@ export function GeneralSettingsForm({
|
|
|
133
135
|
<div className={cls("col-span-12")}>
|
|
134
136
|
<Field name={"path"}
|
|
135
137
|
as={DebouncedTextField}
|
|
136
|
-
label={"
|
|
138
|
+
label={t("path")}
|
|
137
139
|
required
|
|
138
140
|
error={showErrors && Boolean(errors.path)} />
|
|
139
141
|
|
|
140
142
|
<FieldCaption error={touched.path && Boolean(errors.path)}>
|
|
141
143
|
{touched.path && Boolean(errors.path)
|
|
142
144
|
? errors.path
|
|
143
|
-
: isSubcollection ? "
|
|
145
|
+
: isSubcollection ? t("relative_path_to_parent") : t("path_in_database")}
|
|
144
146
|
</FieldCaption>
|
|
145
147
|
</div>
|
|
146
148
|
|
|
@@ -155,9 +157,9 @@ export function GeneralSettingsForm({
|
|
|
155
157
|
return handleChange(e);
|
|
156
158
|
}}
|
|
157
159
|
value={values.singularName ?? ""}
|
|
158
|
-
label={"
|
|
160
|
+
label={t("singular_name")} />
|
|
159
161
|
<FieldCaption error={showErrors && Boolean(errors.singularName)}>
|
|
160
|
-
{showErrors && Boolean(errors.singularName) ? errors.singularName : "
|
|
162
|
+
{showErrors && Boolean(errors.singularName) ? errors.singularName : t("singular_name_description")}
|
|
161
163
|
</FieldCaption>
|
|
162
164
|
</div>
|
|
163
165
|
|
|
@@ -171,10 +173,10 @@ export function GeneralSettingsForm({
|
|
|
171
173
|
multiline
|
|
172
174
|
minRows={2}
|
|
173
175
|
aria-describedby="description-helper-text"
|
|
174
|
-
label="
|
|
176
|
+
label={t("description")}
|
|
175
177
|
/>
|
|
176
178
|
<FieldCaption error={showErrors && Boolean(errors.description)}>
|
|
177
|
-
{showErrors && Boolean(errors.description) ? errors.description : "
|
|
179
|
+
{showErrors && Boolean(errors.description) ? errors.description : t("description_of_collection")}
|
|
178
180
|
</FieldCaption>
|
|
179
181
|
</div>
|
|
180
182
|
|
|
@@ -183,10 +185,10 @@ export function GeneralSettingsForm({
|
|
|
183
185
|
<Field name={"id"}
|
|
184
186
|
as={DebouncedTextField}
|
|
185
187
|
disabled={!isNewCollection}
|
|
186
|
-
label={"
|
|
188
|
+
label={t("collection_id")}
|
|
187
189
|
error={showErrors && Boolean(errors.id)} />
|
|
188
190
|
<FieldCaption error={touched.id && Boolean(errors.id)}>
|
|
189
|
-
{touched.id && Boolean(errors.id) ? errors.id : "
|
|
191
|
+
{touched.id && Boolean(errors.id) ? errors.id : t("collection_id_description")}
|
|
190
192
|
</FieldCaption>
|
|
191
193
|
</div>
|
|
192
194
|
|
|
@@ -195,13 +197,12 @@ export function GeneralSettingsForm({
|
|
|
195
197
|
<BooleanSwitchWithLabel
|
|
196
198
|
position={"start"}
|
|
197
199
|
size={"large"}
|
|
198
|
-
label="
|
|
200
|
+
label={t("collection_group")}
|
|
199
201
|
onValueChange={(v) => setFieldValue("collectionGroup", v)}
|
|
200
202
|
value={values.collectionGroup ?? false}
|
|
201
203
|
/>
|
|
202
204
|
<FieldCaption>
|
|
203
|
-
|
|
204
|
-
you to query over multiple collections at once.
|
|
205
|
+
{t("collection_group_description")}
|
|
205
206
|
</FieldCaption>
|
|
206
207
|
</div>
|
|
207
208
|
|
|
@@ -209,7 +210,7 @@ export function GeneralSettingsForm({
|
|
|
209
210
|
|
|
210
211
|
{/* Advanced Settings */}
|
|
211
212
|
<ExpandablePanel
|
|
212
|
-
title={<Typography variant="subtitle2">
|
|
213
|
+
title={<Typography variant="subtitle2">{t("advanced_settings")}</Typography>}
|
|
213
214
|
initiallyExpanded={false}
|
|
214
215
|
className="mt-4"
|
|
215
216
|
innerClassName="p-4 flex flex-col gap-4"
|
|
@@ -220,16 +221,14 @@ export function GeneralSettingsForm({
|
|
|
220
221
|
position={"start"}
|
|
221
222
|
size={"large"}
|
|
222
223
|
allowIndeterminate={true}
|
|
223
|
-
label={<span className="flex items-center gap-2"><HistoryIcon size={"smallest"} />{values.history === null || values.history === undefined ? "
|
|
224
|
-
values.history ? "
|
|
224
|
+
label={<span className="flex items-center gap-2"><HistoryIcon size={"smallest"} />{values.history === null || values.history === undefined ? t("doc_history_global") : (
|
|
225
|
+
values.history ? t("doc_history_enabled") : t("doc_history_not_enabled")
|
|
225
226
|
)}</span>}
|
|
226
227
|
onValueChange={(v) => setFieldValue("history", v)}
|
|
227
228
|
value={values.history === undefined ? null : values.history}
|
|
228
229
|
/>
|
|
229
230
|
<FieldCaption>
|
|
230
|
-
|
|
231
|
-
This is useful for auditing purposes. The data is stored in a subcollection of the document
|
|
232
|
-
in your database, called <b>__history</b>.
|
|
231
|
+
{t("doc_history_description")}
|
|
233
232
|
</FieldCaption>
|
|
234
233
|
</div>
|
|
235
234
|
|
|
@@ -237,7 +236,7 @@ export function GeneralSettingsForm({
|
|
|
237
236
|
<div>
|
|
238
237
|
<Select
|
|
239
238
|
name="customId"
|
|
240
|
-
label="
|
|
239
|
+
label={t("document_id_generation")}
|
|
241
240
|
position={"item-aligned"}
|
|
242
241
|
size={"large"}
|
|
243
242
|
fullWidth={true}
|
|
@@ -256,27 +255,27 @@ export function GeneralSettingsForm({
|
|
|
256
255
|
}
|
|
257
256
|
renderValue={(value: any) => {
|
|
258
257
|
if (value === "code_defined")
|
|
259
|
-
return "
|
|
258
|
+
return t("code_defined");
|
|
260
259
|
else if (value === "true")
|
|
261
|
-
return "
|
|
260
|
+
return t("users_must_define_id");
|
|
262
261
|
else if (value === "optional")
|
|
263
|
-
return "
|
|
262
|
+
return t("users_can_define_id");
|
|
264
263
|
else
|
|
265
|
-
return "
|
|
264
|
+
return t("doc_id_auto_generated");
|
|
266
265
|
}}
|
|
267
266
|
>
|
|
268
267
|
<SelectItem value={"false"}>
|
|
269
|
-
|
|
268
|
+
{t("doc_id_auto_generated")}
|
|
270
269
|
</SelectItem>
|
|
271
270
|
<SelectItem value={"true"}>
|
|
272
|
-
|
|
271
|
+
{t("users_must_define_id")}
|
|
273
272
|
</SelectItem>
|
|
274
273
|
<SelectItem value={"optional"}>
|
|
275
|
-
|
|
274
|
+
{t("users_can_define_id")}
|
|
276
275
|
</SelectItem>
|
|
277
276
|
</Select>
|
|
278
277
|
<FieldCaption>
|
|
279
|
-
|
|
278
|
+
{t("config_doc_id_generation")}
|
|
280
279
|
</FieldCaption>
|
|
281
280
|
</div>
|
|
282
281
|
|
|
@@ -285,14 +284,12 @@ export function GeneralSettingsForm({
|
|
|
285
284
|
<BooleanSwitchWithLabel
|
|
286
285
|
position={"start"}
|
|
287
286
|
size={"large"}
|
|
288
|
-
label={<span className="flex items-center gap-2"><SearchIcon size={"smallest"} />
|
|
287
|
+
label={<span className="flex items-center gap-2"><SearchIcon size={"smallest"} />{t("enable_text_search")}</span>}
|
|
289
288
|
onValueChange={(v) => setFieldValue("textSearchEnabled", v)}
|
|
290
289
|
value={values.textSearchEnabled ?? false}
|
|
291
290
|
/>
|
|
292
291
|
<FieldCaption>
|
|
293
|
-
|
|
294
|
-
delegate, this will use the built-in local text search. This is not recommended
|
|
295
|
-
for large collections, as it may incur in performance and cost issues.
|
|
292
|
+
{t("text_search_description")}
|
|
296
293
|
</FieldCaption>
|
|
297
294
|
</div>
|
|
298
295
|
</ExpandablePanel>
|
|
@@ -323,8 +320,9 @@ function DefaultDatabaseField({
|
|
|
323
320
|
databaseId,
|
|
324
321
|
onDatabaseIdUpdate
|
|
325
322
|
}: { databaseId?: string, onDatabaseIdUpdate: (databaseId: string) => void }) {
|
|
323
|
+
const { t } = useTranslation();
|
|
326
324
|
|
|
327
|
-
return <Tooltip title={"
|
|
325
|
+
return <Tooltip title={t("database_id")}
|
|
328
326
|
side={"top"}
|
|
329
327
|
align={"start"}>
|
|
330
328
|
<TextField size={"small"}
|
|
@@ -332,6 +330,6 @@ function DefaultDatabaseField({
|
|
|
332
330
|
inputClassName={"text-end"}
|
|
333
331
|
value={databaseId ?? ""}
|
|
334
332
|
onChange={(e: any) => onDatabaseIdUpdate(e.target.value)}
|
|
335
|
-
placeholder={"
|
|
333
|
+
placeholder={t("default_text")}></TextField>
|
|
336
334
|
</Tooltip>
|
|
337
335
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EntityCollection, isEmptyObject, useSnackbarController } from "@firecms/core";
|
|
1
|
+
import { EntityCollection, isEmptyObject, useSnackbarController, useTranslation } from "@firecms/core";
|
|
2
2
|
import { Button, ContentCopyIcon, Dialog, DialogActions, DialogContent, DialogTitle, Tab, Tabs, Typography } from "@firecms/ui";
|
|
3
3
|
import React, { useState } from "react";
|
|
4
4
|
import JSON5 from "json5";
|
|
@@ -13,17 +13,18 @@ export function GetCodeDialog({
|
|
|
13
13
|
}: { onOpenChange: (open: boolean) => void, collection: any, open: any }) {
|
|
14
14
|
|
|
15
15
|
const snackbarController = useSnackbarController();
|
|
16
|
+
const { t } = useTranslation();
|
|
16
17
|
const [format, setFormat] = useState<"ts" | "json">("json");
|
|
17
18
|
|
|
18
19
|
const collectionData = collectionToCode({ ...collection });
|
|
19
20
|
|
|
20
21
|
const tsCode = collection
|
|
21
22
|
? "import { EntityCollection } from \"@firecms/core\";\n\nconst " + (collection?.name ? camelCase(collection.name) : "my") + "Collection:EntityCollection = " + JSON5.stringify(collectionData, null, "\t")
|
|
22
|
-
: "
|
|
23
|
+
: t("no_collection_selected");
|
|
23
24
|
|
|
24
25
|
const jsonCode = collection
|
|
25
26
|
? JSON.stringify(collectionData, null, 2)
|
|
26
|
-
: "
|
|
27
|
+
: t("no_collection_selected");
|
|
27
28
|
|
|
28
29
|
const code = format === "ts" ? tsCode : jsonCode;
|
|
29
30
|
|
|
@@ -31,7 +32,7 @@ export function GetCodeDialog({
|
|
|
31
32
|
onOpenChange={onOpenChange}
|
|
32
33
|
maxWidth={"4xl"}>
|
|
33
34
|
<div className="flex items-center justify-between pr-6">
|
|
34
|
-
<DialogTitle variant={"h6"}>
|
|
35
|
+
<DialogTitle variant={"h6"}>{t("code_for_collection")} {collection.name}</DialogTitle>
|
|
35
36
|
<Tabs value={format} onValueChange={(v) => setFormat(v as "ts" | "json")}>
|
|
36
37
|
<Tab value="ts">TypeScript</Tab>
|
|
37
38
|
<Tab value="json">JSON</Tab>
|
|
@@ -41,13 +42,13 @@ export function GetCodeDialog({
|
|
|
41
42
|
|
|
42
43
|
<Typography variant={"body2"} className={"mb-4"}>
|
|
43
44
|
{format === "json"
|
|
44
|
-
? "
|
|
45
|
+
? t("use_config_define_json")
|
|
45
46
|
: <>
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
{t("customise_collection_code")}
|
|
48
|
+
<br/>
|
|
49
|
+
<a
|
|
49
50
|
rel="noopener noreferrer"
|
|
50
|
-
href={"https://firecms.co/docs/cloud/quickstart"}>
|
|
51
|
+
href={"https://firecms.co/docs/cloud/quickstart"}>{t("more_info")}</a>
|
|
51
52
|
</>}
|
|
52
53
|
</Typography>
|
|
53
54
|
<Highlight
|
|
@@ -84,14 +85,14 @@ export function GetCodeDialog({
|
|
|
84
85
|
e.preventDefault();
|
|
85
86
|
snackbarController.open({
|
|
86
87
|
type: "success",
|
|
87
|
-
message: "
|
|
88
|
+
message: t("copied")
|
|
88
89
|
})
|
|
89
90
|
return navigator.clipboard.writeText(code);
|
|
90
91
|
}}>
|
|
91
92
|
<ContentCopyIcon size={"small"} />
|
|
92
|
-
|
|
93
|
+
{t("copy")}
|
|
93
94
|
</Button>
|
|
94
|
-
<Button onClick={() => onOpenChange(false)}>
|
|
95
|
+
<Button onClick={() => onOpenChange(false)}>{t("cancel")}</Button>
|
|
95
96
|
</DialogActions>
|
|
96
97
|
</Dialog>;
|
|
97
98
|
}
|
|
@@ -8,7 +8,8 @@ import {
|
|
|
8
8
|
resolveCollection,
|
|
9
9
|
unslugify,
|
|
10
10
|
useAuthController,
|
|
11
|
-
useCustomizationController
|
|
11
|
+
useCustomizationController,
|
|
12
|
+
useTranslation
|
|
12
13
|
} from "@firecms/core";
|
|
13
14
|
import {
|
|
14
15
|
CloseIcon,
|
|
@@ -30,6 +31,7 @@ export function KanbanConfigSection({
|
|
|
30
31
|
const authController = useAuthController();
|
|
31
32
|
const customizationController = useCustomizationController();
|
|
32
33
|
const { values, setFieldValue } = useFormex<EntityCollection>();
|
|
34
|
+
const { t } = useTranslation();
|
|
33
35
|
const panelRef = useRef<HTMLDivElement>(null);
|
|
34
36
|
const [columnPropertyDialogOpen, setColumnPropertyDialogOpen] = useState(false);
|
|
35
37
|
|
|
@@ -83,10 +85,10 @@ export function KanbanConfigSection({
|
|
|
83
85
|
|
|
84
86
|
return (
|
|
85
87
|
<div className={className} ref={panelRef}>
|
|
88
|
+
<Typography variant={"label"} color={"secondary"} className={"ml-3.5"}>{t("kanban_column_property")}</Typography>
|
|
86
89
|
<Select
|
|
87
90
|
key={`column-select-${enumStringProperties.length}`}
|
|
88
91
|
name="kanban.columnProperty"
|
|
89
|
-
label="Kanban Column Property"
|
|
90
92
|
size={"large"}
|
|
91
93
|
fullWidth={true}
|
|
92
94
|
position={"item-aligned"}
|
|
@@ -105,10 +107,10 @@ export function KanbanConfigSection({
|
|
|
105
107
|
}}
|
|
106
108
|
renderValue={(value) => {
|
|
107
109
|
if (columnPropertyMissing) {
|
|
108
|
-
return <span className="text-red-500">{value} (
|
|
110
|
+
return <span className="text-red-500">{value} ({t("not_found_suffix")})</span>;
|
|
109
111
|
}
|
|
110
112
|
const prop = enumStringProperties.find(p => p.key === value);
|
|
111
|
-
if (!prop) return "
|
|
113
|
+
if (!prop) return t("select_a_property");
|
|
112
114
|
const fieldConfig = getFieldConfig(prop.property, customizationController.propertyConfigs);
|
|
113
115
|
return (
|
|
114
116
|
<div className="flex items-center gap-2">
|
|
@@ -138,7 +140,7 @@ export function KanbanConfigSection({
|
|
|
138
140
|
<div>
|
|
139
141
|
<div>{prop.label}</div>
|
|
140
142
|
<Typography variant="caption" color="secondary">
|
|
141
|
-
{fieldConfig?.name || "
|
|
143
|
+
{fieldConfig?.name || "enum"}
|
|
142
144
|
</Typography>
|
|
143
145
|
</div>
|
|
144
146
|
</div>
|
|
@@ -148,10 +150,10 @@ export function KanbanConfigSection({
|
|
|
148
150
|
</Select>
|
|
149
151
|
<FieldCaption error={columnPropertyMissing}>
|
|
150
152
|
{columnPropertyMissing
|
|
151
|
-
?
|
|
153
|
+
? t("kanban_property_not_found", { property: kanbanConfig?.columnProperty ?? "" })
|
|
152
154
|
: enumStringProperties.length === 0
|
|
153
|
-
? "
|
|
154
|
-
: "
|
|
155
|
+
? t("no_enum_string_properties")
|
|
156
|
+
: t("kanban_column_description")
|
|
155
157
|
}
|
|
156
158
|
</FieldCaption>
|
|
157
159
|
|
|
@@ -162,7 +164,7 @@ export function KanbanConfigSection({
|
|
|
162
164
|
className="ml-3.5 text-sm text-primary hover:text-primary-dark mt-2"
|
|
163
165
|
onClick={() => setColumnPropertyDialogOpen(true)}
|
|
164
166
|
>
|
|
165
|
-
|
|
167
|
+
{t("create_property", { property: dialogPropertyKey })}
|
|
166
168
|
</button>
|
|
167
169
|
<PropertyFormDialog
|
|
168
170
|
open={columnPropertyDialogOpen}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { cls, SquareIcon, ToggleButtonGroup, Typography, VerticalSplitIcon } from "@firecms/ui";
|
|
2
|
+
import { useTranslation } from "@firecms/core";
|
|
2
3
|
|
|
3
4
|
export function LayoutModeSwitch({
|
|
4
5
|
value,
|
|
@@ -10,8 +11,10 @@ export function LayoutModeSwitch({
|
|
|
10
11
|
className?: string;
|
|
11
12
|
}) {
|
|
12
13
|
|
|
14
|
+
const { t } = useTranslation();
|
|
15
|
+
|
|
13
16
|
return <div className={cls(className)}>
|
|
14
|
-
<Typography variant={"label"} color={"secondary"} className={"ml-3.5"}>
|
|
17
|
+
<Typography variant={"label"} color={"secondary"} className={"ml-3.5"}>{t("document_view")}</Typography>
|
|
15
18
|
<div className={"my-2"}>
|
|
16
19
|
<ToggleButtonGroup
|
|
17
20
|
value={value}
|
|
@@ -19,17 +22,17 @@ export function LayoutModeSwitch({
|
|
|
19
22
|
options={[
|
|
20
23
|
{
|
|
21
24
|
value: "side_panel",
|
|
22
|
-
label: "
|
|
25
|
+
label: t("side_panel"),
|
|
23
26
|
icon: <VerticalSplitIcon />
|
|
24
27
|
},
|
|
25
28
|
{
|
|
26
29
|
value: "full_screen",
|
|
27
|
-
label: "
|
|
30
|
+
label: t("full_screen"),
|
|
28
31
|
icon: <SquareIcon />
|
|
29
32
|
}
|
|
30
33
|
]}
|
|
31
34
|
/>
|
|
32
35
|
</div>
|
|
33
|
-
<Typography variant={"caption"} color={"secondary"} className={"ml-3.5"}>
|
|
36
|
+
<Typography variant={"caption"} color={"secondary"} className={"ml-3.5"}>{t("should_documents_opened_full_screen")}</Typography>
|
|
34
37
|
</div>
|
|
35
38
|
}
|