@firecms/core 3.1.0-canary.1df3b2c → 3.1.0-canary.75005e4
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/components/EntityCollectionTable/internal/popup_field/useDraggable.d.ts +2 -2
- package/dist/components/EntityCollectionView/CollectionDataErrorBanner.d.ts +4 -0
- package/dist/components/EntityCollectionView/ViewModeToggle.d.ts +5 -10
- package/dist/components/ErrorBoundary.d.ts +4 -2
- package/dist/components/HomePage/DefaultHomePage.d.ts +0 -1
- package/dist/components/LanguageToggle.d.ts +1 -0
- package/dist/components/UnsavedChangesDialog.d.ts +1 -0
- package/dist/components/VirtualTable/VirtualTableHeader.d.ts +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/core/DrawerNavigationGroup.d.ts +2 -2
- package/dist/editor/components/SlashCommandMenu.d.ts +6 -0
- package/dist/editor/components/editor-bubble-item.d.ts +8 -0
- package/dist/editor/components/editor-bubble.d.ts +8 -0
- package/dist/editor/components/index.d.ts +14 -0
- package/dist/editor/editor.d.ts +30 -0
- package/dist/editor/extensions/HighlightDecorationExtension.d.ts +24 -0
- package/dist/editor/extensions/Image/index.d.ts +6 -0
- package/dist/editor/extensions/Image.d.ts +6 -0
- package/dist/editor/extensions/TextLoadingDecorationExtension.d.ts +16 -0
- package/dist/editor/extensions/clipboard.d.ts +7 -0
- package/dist/editor/extensions/custom-keymap.d.ts +1 -0
- package/dist/editor/extensions/drag-and-drop.d.ts +9 -0
- package/dist/editor/hooks/useProseMirror.d.ts +14 -0
- package/dist/editor/hooks/useProseMirrorContext.d.ts +9 -0
- package/dist/editor/index.d.ts +2 -0
- package/dist/editor/markdown.d.ts +5 -0
- package/dist/editor/nodeViews/ImageComponent.d.ts +3 -0
- package/dist/editor/nodeViews/ReactNodeView.d.ts +29 -0
- package/dist/editor/nodeViews/TaskItemComponent.d.ts +3 -0
- package/dist/editor/nodeViews/index.d.ts +6 -0
- package/dist/editor/plugins/index.d.ts +2 -0
- package/dist/editor/plugins/inputrules.d.ts +6 -0
- package/dist/editor/plugins/placeholderPlugin.d.ts +3 -0
- package/dist/editor/plugins/slashCommandPlugin.d.ts +11 -0
- package/dist/editor/schema.d.ts +2 -0
- package/dist/editor/selectors/ai-selector.d.ts +0 -0
- package/dist/editor/selectors/color-selector.d.ts +10 -0
- package/dist/editor/selectors/link-selector.d.ts +8 -0
- package/dist/editor/selectors/node-selector.d.ts +15 -0
- package/dist/editor/selectors/text-buttons.d.ts +1 -0
- package/dist/editor/types.d.ts +5 -0
- package/dist/editor/useProseMirror.d.ts +16 -0
- package/dist/editor/utils/prosemirror-utils.d.ts +6 -0
- package/dist/editor/utils/remove_classes.d.ts +1 -0
- package/dist/editor/utils/useDebouncedCallback.d.ts +1 -0
- package/dist/form/components/ErrorFocus.d.ts +1 -1
- package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +1 -1
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/useBuildNavigationController.d.ts +0 -1
- package/dist/hooks/useCollapsedGroups.d.ts +3 -3
- package/dist/hooks/useTranslation.d.ts +17 -0
- package/dist/i18n/FireCMSi18nProvider.d.ts +33 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.es.js +11441 -2215
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +11423 -2216
- package/dist/index.umd.js.map +1 -1
- package/dist/internal/useRestoreScroll.d.ts +1 -1
- package/dist/locales/de.d.ts +2 -0
- package/dist/locales/en.d.ts +10 -0
- package/dist/locales/es.d.ts +10 -0
- package/dist/locales/fr.d.ts +2 -0
- package/dist/locales/hi.d.ts +2 -0
- package/dist/locales/it.d.ts +2 -0
- package/dist/locales/pt.d.ts +7 -0
- package/dist/types/analytics.d.ts +1 -1
- package/dist/types/collections.d.ts +8 -0
- package/dist/types/customization_controller.d.ts +2 -1
- package/dist/types/firecms.d.ts +2 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/navigation.d.ts +2 -2
- package/dist/types/plugins.d.ts +23 -0
- package/dist/types/translations.d.ts +646 -0
- package/dist/util/entities.d.ts +1 -1
- package/dist/util/resolutions.d.ts +2 -2
- package/package.json +47 -13
- package/src/app/Scaffold.tsx +7 -5
- package/src/components/AIIcon.tsx +3 -1
- package/src/components/ArrayContainer.tsx +6 -4
- package/src/components/ClearFilterSortButton.tsx +6 -3
- package/src/components/ConfirmationDialog.tsx +4 -2
- package/src/components/DeleteEntityDialog.tsx +10 -7
- package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +6 -3
- package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +3 -1
- package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +1 -1
- package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +3 -2
- package/src/components/EntityCollectionTable/internal/popup_field/useDraggable.tsx +11 -11
- package/src/components/EntityCollectionView/BoardSortableList.tsx +3 -1
- package/src/components/EntityCollectionView/CollectionDataErrorBanner.tsx +43 -0
- package/src/components/EntityCollectionView/EntityBoardCard.tsx +1 -1
- package/src/components/EntityCollectionView/EntityCard.tsx +4 -0
- package/src/components/EntityCollectionView/EntityCollectionBoardView.tsx +39 -46
- package/src/components/EntityCollectionView/EntityCollectionCardView.tsx +17 -25
- package/src/components/EntityCollectionView/EntityCollectionView.tsx +73 -31
- package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +4 -3
- package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +4 -2
- package/src/components/EntityCollectionView/FiltersDialog.tsx +8 -5
- package/src/components/EntityCollectionView/ViewModeToggle.tsx +37 -37
- package/src/components/EntityView.tsx +3 -2
- package/src/components/ErrorBoundary.tsx +27 -15
- package/src/components/HomePage/DefaultHomePage.tsx +19 -13
- package/src/components/HomePage/HomePageDnD.tsx +3 -1
- package/src/components/HomePage/NavigationGroup.tsx +3 -1
- package/src/components/HomePage/RenameGroupDialog.tsx +15 -13
- package/src/components/LanguageToggle.tsx +66 -0
- package/src/components/NotFoundPage.tsx +5 -3
- package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +9 -7
- package/src/components/ReferenceWidget.tsx +3 -2
- package/src/components/SearchIconsView.tsx +3 -1
- package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +11 -0
- package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +15 -2
- package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +11 -0
- package/src/components/UnsavedChangesDialog.tsx +6 -4
- package/src/components/VirtualTable/VirtualTable.performance.test.tsx +1 -0
- package/src/components/VirtualTable/VirtualTable.tsx +116 -113
- package/src/components/VirtualTable/VirtualTableHeader.tsx +54 -52
- package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +1 -1
- package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +3 -3
- package/src/components/common/default_entity_actions.tsx +4 -0
- package/src/components/common/useDataSourceTableController.tsx +12 -4
- package/src/components/index.tsx +1 -0
- package/src/core/DefaultAppBar.tsx +15 -11
- package/src/core/DefaultDrawer.tsx +8 -2
- package/src/core/DrawerNavigationGroup.tsx +5 -3
- package/src/core/EntityEditView.tsx +4 -3
- package/src/core/EntityEditViewFormActions.tsx +24 -17
- package/src/core/EntitySidePanel.tsx +32 -29
- package/src/core/FireCMS.tsx +33 -6
- package/src/core/field_configs.tsx +14 -9
- package/src/editor/components/SlashCommandMenu.tsx +348 -0
- package/src/editor/components/editor-bubble-item.tsx +32 -0
- package/src/editor/components/editor-bubble.tsx +118 -0
- package/src/editor/components/index.ts +12 -0
- package/src/editor/editor.tsx +307 -0
- package/src/editor/extensions/HighlightDecorationExtension.ts +114 -0
- package/src/editor/extensions/Image/index.ts +133 -0
- package/src/editor/extensions/Image.ts +144 -0
- package/src/editor/extensions/TextLoadingDecorationExtension.tsx +107 -0
- package/src/editor/extensions/clipboard.ts +72 -0
- package/src/editor/extensions/custom-keymap.ts +24 -0
- package/src/editor/extensions/drag-and-drop.tsx +472 -0
- package/src/editor/hooks/useProseMirror.ts +115 -0
- package/src/editor/hooks/useProseMirrorContext.ts +15 -0
- package/src/editor/index.ts +2 -0
- package/src/editor/markdown.ts +110 -0
- package/src/editor/nodeViews/ImageComponent.tsx +20 -0
- package/src/editor/nodeViews/ReactNodeView.tsx +89 -0
- package/src/editor/nodeViews/TaskItemComponent.tsx +29 -0
- package/src/editor/nodeViews/index.ts +35 -0
- package/src/editor/plugins/index.ts +55 -0
- package/src/editor/plugins/inputrules.ts +82 -0
- package/src/editor/plugins/placeholderPlugin.ts +55 -0
- package/src/editor/plugins/slashCommandPlugin.ts +49 -0
- package/src/editor/schema.ts +228 -0
- package/src/editor/selectors/ai-selector.tsx +111 -0
- package/src/editor/selectors/color-selector.tsx +200 -0
- package/src/editor/selectors/link-selector.tsx +118 -0
- package/src/editor/selectors/node-selector.tsx +157 -0
- package/src/editor/selectors/text-buttons.tsx +86 -0
- package/src/editor/types.ts +6 -0
- package/src/editor/useProseMirror.ts +126 -0
- package/src/editor/utils/prosemirror-utils.ts +78 -0
- package/src/editor/utils/remove_classes.ts +17 -0
- package/src/editor/utils/useDebouncedCallback.ts +25 -0
- package/src/form/EntityForm.tsx +76 -63
- package/src/form/EntityFormActions.tsx +19 -12
- package/src/form/PropertyFieldBinding.tsx +6 -5
- package/src/form/components/ErrorFocus.tsx +3 -3
- package/src/form/components/LocalChangesMenu.tsx +13 -13
- package/src/form/components/StorageItemPreview.tsx +3 -2
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +4 -4
- package/src/form/field_bindings/BlockFieldBinding.tsx +5 -2
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +23 -18
- package/src/form/field_bindings/MapFieldBinding.tsx +4 -3
- package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +4 -4
- package/src/form/field_bindings/RepeatFieldBinding.tsx +3 -1
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +87 -85
- package/src/hooks/index.tsx +1 -0
- package/src/hooks/useBuildNavigationController.tsx +49 -22
- package/src/hooks/useCollapsedGroups.ts +7 -6
- package/src/hooks/useTranslation.ts +31 -0
- package/src/hooks/useValidateAuthenticator.tsx +1 -1
- package/src/i18n/FireCMSi18nProvider.tsx +160 -0
- package/src/index.ts +4 -0
- package/src/internal/useBuildDataSource.ts +1 -2
- package/src/internal/useBuildSideEntityController.tsx +22 -20
- package/src/locales/de.ts +691 -0
- package/src/locales/en.ts +703 -0
- package/src/locales/es.ts +703 -0
- package/src/locales/fr.ts +691 -0
- package/src/locales/hi.ts +691 -0
- package/src/locales/it.ts +691 -0
- package/src/locales/pt.ts +700 -0
- package/src/preview/PropertyPreview.tsx +1 -0
- package/src/preview/components/UrlComponentPreview.tsx +4 -2
- package/src/preview/components/UserPreview.tsx +3 -1
- package/src/types/analytics.ts +10 -0
- package/src/types/collections.ts +9 -0
- package/src/types/customization_controller.tsx +2 -1
- package/src/types/firecms.tsx +2 -1
- package/src/types/index.ts +1 -0
- package/src/types/navigation.ts +2 -2
- package/src/types/plugins.tsx +26 -0
- package/src/types/translations.ts +725 -0
- package/src/util/entities.ts +1 -1
- package/src/util/join_collections.ts +10 -8
- package/src/util/previews.ts +2 -2
- package/src/util/property_utils.tsx +1 -1
- package/src/util/resolutions.ts +5 -3
package/src/form/EntityForm.tsx
CHANGED
|
@@ -40,7 +40,10 @@ import {
|
|
|
40
40
|
useSnackbarController
|
|
41
41
|
} from "../hooks";
|
|
42
42
|
import { Alert, CheckIcon, Chip, cls, EditIcon, NotesIcon, paperMixin, Tooltip, Typography } from "@firecms/ui";
|
|
43
|
-
import { Formex, FormexController, getIn, setIn, useCreateFormex
|
|
43
|
+
import { Formex, FormexController, getIn, setIn, useCreateFormex,
|
|
44
|
+
useFormex
|
|
45
|
+
} from "@firecms/formex";
|
|
46
|
+
import { useTranslation } from "../hooks";
|
|
44
47
|
import { useAnalyticsController } from "../hooks/useAnalyticsController";
|
|
45
48
|
import { FormEntry, FormLayout, LabelWithIconAndTooltip, PropertyFieldBinding } from "../form";
|
|
46
49
|
import { ValidationError } from "yup";
|
|
@@ -181,30 +184,30 @@ export function getChanges<T extends object>(source: Partial<T>, comparison: Par
|
|
|
181
184
|
}
|
|
182
185
|
|
|
183
186
|
export function EntityForm<M extends Record<string, any>>({
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
187
|
+
path,
|
|
188
|
+
fullIdPath,
|
|
189
|
+
entityId: entityIdProp,
|
|
190
|
+
collection,
|
|
191
|
+
onValuesModified,
|
|
192
|
+
onIdChange,
|
|
193
|
+
onSaved,
|
|
194
|
+
entity,
|
|
195
|
+
initialDirtyValues,
|
|
196
|
+
onFormContextReady,
|
|
197
|
+
forceActionsAtTheBottom,
|
|
198
|
+
initialStatus,
|
|
199
|
+
className,
|
|
200
|
+
onStatusChange,
|
|
201
|
+
onEntityChange,
|
|
202
|
+
openEntityMode = "full_screen",
|
|
203
|
+
formex: formexProp,
|
|
204
|
+
disabled: disabledProp,
|
|
205
|
+
Builder,
|
|
206
|
+
EntityFormActionsComponent = EntityFormActions,
|
|
207
|
+
showDefaultActions = true,
|
|
208
|
+
showEntityPath = true,
|
|
209
|
+
children
|
|
210
|
+
}: EntityFormProps<M>) {
|
|
208
211
|
|
|
209
212
|
if (collection.customId && collection.formAutoSave) {
|
|
210
213
|
console.warn(`The collection ${collection.path} has customId and formAutoSave enabled. This is not supported and formAutoSave will be ignored`);
|
|
@@ -212,6 +215,7 @@ export function EntityForm<M extends Record<string, any>>({
|
|
|
212
215
|
|
|
213
216
|
const sideEntityController = useSideEntityController();
|
|
214
217
|
const navigationController = useNavigationController();
|
|
218
|
+
const { t } = useTranslation();
|
|
215
219
|
|
|
216
220
|
const navigateBack = useCallback(() => {
|
|
217
221
|
if (openEntityMode === "side_panel") {
|
|
@@ -455,12 +459,12 @@ export function EntityForm<M extends Record<string, any>>({
|
|
|
455
459
|
}, [entityId, path, snackbarController]);
|
|
456
460
|
|
|
457
461
|
const saveEntity = ({
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
462
|
+
values,
|
|
463
|
+
previousValues,
|
|
464
|
+
entityId,
|
|
465
|
+
collection,
|
|
466
|
+
path
|
|
467
|
+
}: {
|
|
464
468
|
collection: EntityCollection<M>,
|
|
465
469
|
path: string,
|
|
466
470
|
entityId: string | undefined,
|
|
@@ -493,13 +497,13 @@ export function EntityForm<M extends Record<string, any>>({
|
|
|
493
497
|
};
|
|
494
498
|
|
|
495
499
|
const onSaveEntityRequest = async ({
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
500
|
+
collection,
|
|
501
|
+
path,
|
|
502
|
+
entityId,
|
|
503
|
+
values,
|
|
504
|
+
previousValues,
|
|
505
|
+
autoSave
|
|
506
|
+
}: EntityFormSaveParams<M>): Promise<void> => {
|
|
503
507
|
if (!status)
|
|
504
508
|
return;
|
|
505
509
|
if (autoSave) {
|
|
@@ -567,6 +571,7 @@ export function EntityForm<M extends Record<string, any>>({
|
|
|
567
571
|
}, [snackbarController]);
|
|
568
572
|
|
|
569
573
|
const pluginActions: React.ReactNode[] = [];
|
|
574
|
+
const pluginBeforeTitle: React.ReactNode[] = [];
|
|
570
575
|
const plugins = customizationController.plugins;
|
|
571
576
|
|
|
572
577
|
const actionsDisabled = disabled || formex.isSubmitting || (status === "existing" && !formex.dirty) || Boolean(disabledProp);
|
|
@@ -590,6 +595,12 @@ export function EntityForm<M extends Record<string, any>>({
|
|
|
590
595
|
key={`actions_${plugin.key}`} {...actionProps} />
|
|
591
596
|
: null
|
|
592
597
|
)).filter(Boolean));
|
|
598
|
+
pluginBeforeTitle.push(...plugins.map((plugin) => (
|
|
599
|
+
plugin.form?.BeforeTitle
|
|
600
|
+
? <plugin.form.BeforeTitle
|
|
601
|
+
key={`before_title_${plugin.key}`} {...actionProps} />
|
|
602
|
+
: null
|
|
603
|
+
)).filter(Boolean));
|
|
593
604
|
}
|
|
594
605
|
|
|
595
606
|
const titlePropertyKey = getEntityTitlePropertyKey(resolvedCollection, customizationController.propertyConfigs);
|
|
@@ -631,17 +642,17 @@ export function EntityForm<M extends Record<string, any>>({
|
|
|
631
642
|
const modified = formex.dirty;
|
|
632
643
|
|
|
633
644
|
const uniqueFieldValidator: CustomFieldValidator = useCallback(({
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
645
|
+
name,
|
|
646
|
+
value
|
|
647
|
+
}) => dataSource.checkUniqueField(path, name, value, entityId, collection),
|
|
637
648
|
[dataSource, path, entityId]);
|
|
638
649
|
|
|
639
650
|
const validationSchema = useMemo(() => entityId
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
651
|
+
? getYupEntitySchema(
|
|
652
|
+
entityId,
|
|
653
|
+
resolvedCollection.properties,
|
|
654
|
+
uniqueFieldValidator)
|
|
655
|
+
: undefined,
|
|
645
656
|
[entityId, resolvedCollection.properties, uniqueFieldValidator]);
|
|
646
657
|
|
|
647
658
|
useOnAutoSave(autoSave, formex, lastSavedValues, save);
|
|
@@ -699,8 +710,8 @@ export function EntityForm<M extends Record<string, any>>({
|
|
|
699
710
|
|
|
700
711
|
return (
|
|
701
712
|
<FormEntry propertyKey={key}
|
|
702
|
-
|
|
703
|
-
|
|
713
|
+
widthPercentage={widthPercentage}
|
|
714
|
+
key={`field_${key}`}>
|
|
704
715
|
<PropertyFieldBinding {...cmsFormFieldProps} />
|
|
705
716
|
</FormEntry>
|
|
706
717
|
);
|
|
@@ -713,7 +724,7 @@ export function EntityForm<M extends Record<string, any>>({
|
|
|
713
724
|
throw new Error("When using additional fields you need to provide a Builder or a value");
|
|
714
725
|
}
|
|
715
726
|
const child = Builder
|
|
716
|
-
? <Builder entity={entity} context={context}/>
|
|
727
|
+
? <Builder entity={entity} context={context} />
|
|
717
728
|
: <div className={"w-full"}>
|
|
718
729
|
{additionalField.value?.({
|
|
719
730
|
entity,
|
|
@@ -725,9 +736,9 @@ export function EntityForm<M extends Record<string, any>>({
|
|
|
725
736
|
<div key={`additional_${key}`} className={"w-full"}>
|
|
726
737
|
<LabelWithIconAndTooltip
|
|
727
738
|
propertyKey={key}
|
|
728
|
-
icon={<NotesIcon size={"small"}/>}
|
|
739
|
+
icon={<NotesIcon size={"small"} />}
|
|
729
740
|
title={additionalField.name}
|
|
730
|
-
className={"text-text-secondary dark:text-text-secondary-dark ml-3.5"}/>
|
|
741
|
+
className={"text-text-secondary dark:text-text-secondary-dark ml-3.5"} />
|
|
731
742
|
<div
|
|
732
743
|
className={cls(paperMixin, "w-full min-h-14 p-4 md:p-6 overflow-x-scroll no-scrollbar")}>
|
|
733
744
|
<ErrorBoundary>
|
|
@@ -749,6 +760,8 @@ export function EntityForm<M extends Record<string, any>>({
|
|
|
749
760
|
|
|
750
761
|
const formView = <ErrorBoundary>
|
|
751
762
|
<>
|
|
763
|
+
{pluginBeforeTitle}
|
|
764
|
+
|
|
752
765
|
{!Builder && <div className={"w-full py-2 flex flex-col items-start my-4 lg:my-6"}>
|
|
753
766
|
<Typography
|
|
754
767
|
className={"my-4 flex-grow line-clamp-1 " + (collection.hideIdFromForm ? "mb-6" : "")}
|
|
@@ -758,7 +771,7 @@ export function EntityForm<M extends Record<string, any>>({
|
|
|
758
771
|
|
|
759
772
|
{!entity?.values && initialStatus === "existing" &&
|
|
760
773
|
<Alert color={"warning"} size={"small"} outerClassName={"w-full mb-4 text-xs"}>
|
|
761
|
-
|
|
774
|
+
{t("this_entity_not_exist")}
|
|
762
775
|
</Alert>}
|
|
763
776
|
|
|
764
777
|
{showEntityPath && <Alert color={"base"} outerClassName={"w-full"} size={"small"}>
|
|
@@ -772,27 +785,27 @@ export function EntityForm<M extends Record<string, any>>({
|
|
|
772
785
|
{children}
|
|
773
786
|
|
|
774
787
|
{initialEntityId && !entity && initialStatus !== "new" && <Alert color={"info"} size={"small"}>
|
|
775
|
-
|
|
788
|
+
{t("this_entity_not_exist")}
|
|
776
789
|
</Alert>}
|
|
777
790
|
|
|
778
791
|
{!Builder && !collection.hideIdFromForm &&
|
|
779
792
|
<CustomIdField customId={collection.customId}
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
793
|
+
entityId={entityId}
|
|
794
|
+
status={status}
|
|
795
|
+
onChange={setEntityId}
|
|
796
|
+
error={entityIdError}
|
|
797
|
+
loading={customIdLoading}
|
|
798
|
+
entity={entity} />
|
|
786
799
|
}
|
|
787
800
|
|
|
788
801
|
{entityId && formContext && <>
|
|
789
802
|
<div className="mt-12 flex flex-col gap-8" ref={formRef}>
|
|
790
803
|
{formFields()}
|
|
791
|
-
<ErrorFocus containerRef={formRef}/>
|
|
804
|
+
<ErrorFocus containerRef={formRef} />
|
|
792
805
|
</div>
|
|
793
806
|
</>}
|
|
794
807
|
|
|
795
|
-
{forceActionsAtTheBottom && <div className="h-16"/>}
|
|
808
|
+
{forceActionsAtTheBottom && <div className="h-16" />}
|
|
796
809
|
</>
|
|
797
810
|
</ErrorBoundary>;
|
|
798
811
|
|
|
@@ -852,12 +865,12 @@ export function EntityForm<M extends Record<string, any>>({
|
|
|
852
865
|
{formex.dirty
|
|
853
866
|
? <Tooltip title={"This form has been modified"}>
|
|
854
867
|
<Chip size={"small"} className={"py-1"} colorScheme={"orangeDarker"}>
|
|
855
|
-
<EditIcon size={"smallest"}/>
|
|
868
|
+
<EditIcon size={"smallest"} />
|
|
856
869
|
</Chip>
|
|
857
870
|
</Tooltip>
|
|
858
871
|
: <Tooltip title={"The current form is in sync with the database"}>
|
|
859
872
|
<Chip size={"small"} className={"py-1"}>
|
|
860
|
-
<CheckIcon size={"smallest"}/>
|
|
873
|
+
<CheckIcon size={"smallest"} />
|
|
861
874
|
</Chip>
|
|
862
875
|
</Tooltip>}
|
|
863
876
|
</div>
|
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
} from "@firecms/ui";
|
|
20
20
|
import { FormexController } from "@firecms/formex";
|
|
21
21
|
import { useFireCMSContext, useSideEntityController } from "../hooks";
|
|
22
|
+
import { useTranslation } from "../hooks/useTranslation";
|
|
22
23
|
|
|
23
24
|
export interface EntityFormActionsProps {
|
|
24
25
|
fullPath: string;
|
|
@@ -56,6 +57,7 @@ export function EntityFormActions({
|
|
|
56
57
|
|
|
57
58
|
const context = useFireCMSContext();
|
|
58
59
|
const sideEntityController = useSideEntityController();
|
|
60
|
+
const { t } = useTranslation();
|
|
59
61
|
|
|
60
62
|
return layout === "bottom"
|
|
61
63
|
? buildBottomActions({
|
|
@@ -72,7 +74,8 @@ export function EntityFormActions({
|
|
|
72
74
|
openEntityMode,
|
|
73
75
|
navigateBack,
|
|
74
76
|
formContext,
|
|
75
|
-
formex
|
|
77
|
+
formex,
|
|
78
|
+
t
|
|
76
79
|
})
|
|
77
80
|
: buildSideActions({
|
|
78
81
|
fullPath,
|
|
@@ -88,7 +91,8 @@ export function EntityFormActions({
|
|
|
88
91
|
openEntityMode,
|
|
89
92
|
navigateBack,
|
|
90
93
|
formContext,
|
|
91
|
-
formex
|
|
94
|
+
formex,
|
|
95
|
+
t
|
|
92
96
|
});
|
|
93
97
|
}
|
|
94
98
|
|
|
@@ -108,6 +112,7 @@ type ActionsViewProps<M extends object> = {
|
|
|
108
112
|
navigateBack: () => void;
|
|
109
113
|
formContext: FormContext,
|
|
110
114
|
formex: FormexController<any>;
|
|
115
|
+
t: (key: any, vars?: Record<string, string>) => string;
|
|
111
116
|
};
|
|
112
117
|
|
|
113
118
|
function buildBottomActions<M extends object>({
|
|
@@ -125,7 +130,8 @@ function buildBottomActions<M extends object>({
|
|
|
125
130
|
openEntityMode,
|
|
126
131
|
navigateBack,
|
|
127
132
|
formContext,
|
|
128
|
-
formex
|
|
133
|
+
formex,
|
|
134
|
+
t
|
|
129
135
|
}: ActionsViewProps<M>) {
|
|
130
136
|
|
|
131
137
|
const hasErrors = Object.keys(formex.errors).length > 0 && formex.submitCount > 0;
|
|
@@ -165,16 +171,16 @@ function buildBottomActions<M extends object>({
|
|
|
165
171
|
<Button variant="text" disabled={disabled || formex.isSubmitting}
|
|
166
172
|
color={"primary"}
|
|
167
173
|
type="reset">
|
|
168
|
-
{status === "existing" ? "
|
|
174
|
+
{status === "existing" ? t("discard") : t("clear")}
|
|
169
175
|
</Button>
|
|
170
176
|
<Button variant={"filled"}
|
|
171
177
|
color="primary"
|
|
172
178
|
type="submit"
|
|
173
179
|
disabled={disabled || formex.isSubmitting}
|
|
174
180
|
startIcon={hasErrors ? <ErrorIcon/> : undefined}>
|
|
175
|
-
{status === "existing" && "
|
|
176
|
-
{status === "copy" && "
|
|
177
|
-
{status === "new" && "
|
|
181
|
+
{status === "existing" && t("save")}
|
|
182
|
+
{status === "copy" && t("create_copy")}
|
|
183
|
+
{status === "new" && t("create")}
|
|
178
184
|
</Button>
|
|
179
185
|
|
|
180
186
|
</DialogActions>;
|
|
@@ -193,7 +199,8 @@ function buildSideActions<M extends object>({
|
|
|
193
199
|
disabled,
|
|
194
200
|
status,
|
|
195
201
|
pluginActions,
|
|
196
|
-
formex
|
|
202
|
+
formex,
|
|
203
|
+
t
|
|
197
204
|
}: ActionsViewProps<M>) {
|
|
198
205
|
|
|
199
206
|
const hasErrors = Object.keys(formex.errors).length > 0 && formex.submitCount > 0;
|
|
@@ -207,12 +214,12 @@ function buildSideActions<M extends object>({
|
|
|
207
214
|
size={"large"}
|
|
208
215
|
startIcon={hasErrors ? <ErrorIcon/> : undefined}
|
|
209
216
|
disabled={disabled || formex.isSubmitting}>
|
|
210
|
-
{status === "existing" && "
|
|
211
|
-
{status === "copy" && "
|
|
212
|
-
{status === "new" && "
|
|
217
|
+
{status === "existing" && t("save")}
|
|
218
|
+
{status === "copy" && t("create_copy")}
|
|
219
|
+
{status === "new" && t("create")}
|
|
213
220
|
</LoadingButton>
|
|
214
221
|
<Button fullWidth={true} variant="text" disabled={disabled || formex.isSubmitting} type="reset">
|
|
215
|
-
{status === "existing" ? "
|
|
222
|
+
{status === "existing" ? t("discard") : t("clear")}
|
|
216
223
|
</Button>
|
|
217
224
|
|
|
218
225
|
{pluginActions}
|
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
import { ReadOnlyFieldBinding } from "./field_bindings/ReadOnlyFieldBinding";
|
|
18
18
|
|
|
19
19
|
import { isHidden, isPropertyBuilder, isReadOnly, resolveProperty } from "../util";
|
|
20
|
-
import { useAuthController, useCustomizationController } from "../hooks";
|
|
20
|
+
import { useAuthController, useCustomizationController, useTranslation } from "../hooks";
|
|
21
21
|
import { Typography } from "@firecms/ui";
|
|
22
22
|
import { getFieldConfig, getFieldId } from "../core";
|
|
23
23
|
import { ErrorBoundary } from "../components";
|
|
@@ -137,7 +137,7 @@ function PropertyFieldBindingInternal<T extends CMSType = CMSType, M extends Rec
|
|
|
137
137
|
}
|
|
138
138
|
const configProperty = resolveProperty({
|
|
139
139
|
propertyKey,
|
|
140
|
-
propertyOrBuilder: propertyConfig.property,
|
|
140
|
+
propertyOrBuilder: propertyConfig.property as any,
|
|
141
141
|
values: fieldProps.form.values,
|
|
142
142
|
path: context.path,
|
|
143
143
|
entityId: context.entityId,
|
|
@@ -145,7 +145,7 @@ function PropertyFieldBindingInternal<T extends CMSType = CMSType, M extends Rec
|
|
|
145
145
|
index,
|
|
146
146
|
authController
|
|
147
147
|
});
|
|
148
|
-
Component = configProperty
|
|
148
|
+
Component = configProperty?.Field as ComponentType<FieldProps<T>> | undefined;
|
|
149
149
|
}
|
|
150
150
|
if (!Component) {
|
|
151
151
|
console.warn(`No field component found for property ${propertyKey}`);
|
|
@@ -213,6 +213,7 @@ function FieldInternal<T extends CMSType, CustomProps, M extends Record<string,
|
|
|
213
213
|
formexFieldProps: FormexFieldProps<T, any>
|
|
214
214
|
}) {
|
|
215
215
|
|
|
216
|
+
const { t } = useTranslation();
|
|
216
217
|
const { plugins } = useCustomizationController();
|
|
217
218
|
|
|
218
219
|
const customFieldProps: any = property.customProps;
|
|
@@ -291,7 +292,7 @@ function FieldInternal<T extends CMSType, CustomProps, M extends Record<string,
|
|
|
291
292
|
|
|
292
293
|
{underlyingValueHasChanged && !isSubmitting &&
|
|
293
294
|
<Typography variant={"caption"} className={"ml-3.5"}>
|
|
294
|
-
|
|
295
|
+
{t("value_updated_elsewhere")}
|
|
295
296
|
</Typography>}
|
|
296
297
|
|
|
297
298
|
</ErrorBoundary>);
|
|
@@ -302,7 +303,7 @@ const shouldPropertyReRender = (property: PropertyOrBuilder | ResolvedProperty,
|
|
|
302
303
|
if (plugins?.some((plugin) => plugin.form?.fieldBuilder)) {
|
|
303
304
|
return true;
|
|
304
305
|
}
|
|
305
|
-
if (isPropertyBuilder(property)) {
|
|
306
|
+
if (isPropertyBuilder(property as any)) {
|
|
306
307
|
return true;
|
|
307
308
|
}
|
|
308
309
|
const defAProperty = property as Property | ResolvedProperty;
|
|
@@ -2,9 +2,9 @@ import React, { useEffect, useRef } from "react";
|
|
|
2
2
|
import { useFormex } from "@firecms/formex";
|
|
3
3
|
|
|
4
4
|
export const ErrorFocus = ({ containerRef }:
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
{
|
|
6
|
+
containerRef?: React.RefObject<HTMLDivElement | null>
|
|
7
|
+
}) => {
|
|
8
8
|
const {
|
|
9
9
|
isValidating,
|
|
10
10
|
errors,
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
WarningIcon
|
|
17
17
|
} from "@firecms/ui";
|
|
18
18
|
import { FormexController } from "@firecms/formex";
|
|
19
|
-
import { useSnackbarController } from "../../hooks";
|
|
19
|
+
import { useSnackbarController, useTranslation } from "../../hooks";
|
|
20
20
|
import { mergeDeep } from "../../util";
|
|
21
21
|
import { flattenKeys, removeEntityFromCache } from "../../util/entity_cache";
|
|
22
22
|
import { ResolvedProperties } from "../../types";
|
|
@@ -39,6 +39,7 @@ export function LocalChangesMenu<M extends object>({
|
|
|
39
39
|
}: LocalChangesMenuProps<M>) {
|
|
40
40
|
|
|
41
41
|
const snackbarController = useSnackbarController();
|
|
42
|
+
const { t } = useTranslation();
|
|
42
43
|
const [previewDialogOpen, setPreviewDialogOpen] = useState(false);
|
|
43
44
|
const [open, setOpen] = useState(false);
|
|
44
45
|
|
|
@@ -62,7 +63,7 @@ export function LocalChangesMenu<M extends object>({
|
|
|
62
63
|
formex.setValues(mergedValues);
|
|
63
64
|
snackbarController.open({
|
|
64
65
|
type: "info",
|
|
65
|
-
message: "
|
|
66
|
+
message: t("local_changes_applied")
|
|
66
67
|
});
|
|
67
68
|
handleCloseMenu();
|
|
68
69
|
onClearLocalChanges?.();
|
|
@@ -72,7 +73,7 @@ export function LocalChangesMenu<M extends object>({
|
|
|
72
73
|
removeEntityFromCache(cacheKey);
|
|
73
74
|
snackbarController.open({
|
|
74
75
|
type: "info",
|
|
75
|
-
message: "
|
|
76
|
+
message: t("local_changes_discarded")
|
|
76
77
|
});
|
|
77
78
|
handleCloseMenu();
|
|
78
79
|
onClearLocalChanges?.();
|
|
@@ -90,7 +91,7 @@ export function LocalChangesMenu<M extends object>({
|
|
|
90
91
|
onClick={handleOpenMenu}
|
|
91
92
|
>
|
|
92
93
|
<WarningIcon size={"smallest"} className={"mr-1 text-yellow-600 dark:text-yellow-400"}/>
|
|
93
|
-
|
|
94
|
+
{t("unsaved_local_changes")}
|
|
94
95
|
<KeyboardArrowDownIcon size={"smallest"}/>
|
|
95
96
|
</Button>
|
|
96
97
|
}
|
|
@@ -98,12 +99,11 @@ export function LocalChangesMenu<M extends object>({
|
|
|
98
99
|
onOpenChange={setOpen}
|
|
99
100
|
>
|
|
100
101
|
<div className={"max-w-xs px-4 py-4 text-sm text-gray-700 dark:text-gray-300"}>
|
|
101
|
-
|
|
102
|
-
don't apply them.
|
|
102
|
+
{t("unsaved_local_changes_description")}
|
|
103
103
|
</div>
|
|
104
|
-
<MenuItem dense onClick={handlePreview}><VisibilityIcon size={"small"}/>
|
|
105
|
-
<MenuItem dense onClick={handleApply}><CheckIcon size={"small"}/>
|
|
106
|
-
<MenuItem dense onClick={handleDiscard}><CancelIcon size={"small"}/>
|
|
104
|
+
<MenuItem dense onClick={handlePreview}><VisibilityIcon size={"small"}/>{t("preview_changes")}</MenuItem>
|
|
105
|
+
<MenuItem dense onClick={handleApply}><CheckIcon size={"small"}/>{t("apply_changes")}</MenuItem>
|
|
106
|
+
<MenuItem dense onClick={handleDiscard}><CancelIcon size={"small"}/>{t("discard_local_changes")}</MenuItem>
|
|
107
107
|
</Menu>
|
|
108
108
|
|
|
109
109
|
<Dialog
|
|
@@ -111,10 +111,10 @@ export function LocalChangesMenu<M extends object>({
|
|
|
111
111
|
onOpenChange={setPreviewDialogOpen}
|
|
112
112
|
maxWidth={"4xl"}
|
|
113
113
|
>
|
|
114
|
-
<DialogTitle variant={"h6"}>
|
|
114
|
+
<DialogTitle variant={"h6"}>{t("preview_local_changes")}</DialogTitle>
|
|
115
115
|
<DialogContent className={"my-4"}>
|
|
116
116
|
<Typography variant={"body2"} className={"mb-4"}>
|
|
117
|
-
|
|
117
|
+
{t("preview_local_changes_description")}
|
|
118
118
|
</Typography>
|
|
119
119
|
<div className={`border rounded-lg ${defaultBorderMixin}`} style={{
|
|
120
120
|
maxHeight: 520,
|
|
@@ -127,7 +127,7 @@ export function LocalChangesMenu<M extends object>({
|
|
|
127
127
|
</div>
|
|
128
128
|
</DialogContent>
|
|
129
129
|
<DialogActions>
|
|
130
|
-
<Button onClick={() => setPreviewDialogOpen(false)}>
|
|
130
|
+
<Button onClick={() => setPreviewDialogOpen(false)}>{t("close")}</Button>
|
|
131
131
|
<Button
|
|
132
132
|
variant={"filled"}
|
|
133
133
|
onClick={() => {
|
|
@@ -135,7 +135,7 @@ export function LocalChangesMenu<M extends object>({
|
|
|
135
135
|
setPreviewDialogOpen(false);
|
|
136
136
|
}}
|
|
137
137
|
>
|
|
138
|
-
|
|
138
|
+
{t("apply_changes")}
|
|
139
139
|
</Button>
|
|
140
140
|
</DialogActions>
|
|
141
141
|
</Dialog>
|
|
@@ -5,6 +5,7 @@ import { PreviewSize, PropertyPreview } from "../../preview";
|
|
|
5
5
|
|
|
6
6
|
import { cls, DescriptionIcon, IconButton, paperMixin, RemoveIcon, Tooltip } from "@firecms/ui";
|
|
7
7
|
import { ErrorBoundary } from "../../components";
|
|
8
|
+
import { useTranslation } from "../../hooks/useTranslation";
|
|
8
9
|
|
|
9
10
|
interface StorageItemPreviewProps {
|
|
10
11
|
name: string;
|
|
@@ -27,7 +28,7 @@ export function StorageItemPreview({
|
|
|
27
28
|
placeholder,
|
|
28
29
|
className
|
|
29
30
|
}: StorageItemPreviewProps) {
|
|
30
|
-
|
|
31
|
+
const { t } = useTranslation();
|
|
31
32
|
return (
|
|
32
33
|
<div className={cls(
|
|
33
34
|
"relative border-box flex items-center justify-center",
|
|
@@ -41,7 +42,7 @@ export function StorageItemPreview({
|
|
|
41
42
|
|
|
42
43
|
<Tooltip
|
|
43
44
|
asChild={true}
|
|
44
|
-
title="
|
|
45
|
+
title={t("remove")}>
|
|
45
46
|
<IconButton
|
|
46
47
|
size={"small"}
|
|
47
48
|
onClick={(event) => {
|
|
@@ -4,8 +4,7 @@ import { ReferencePreview } from "../../preview";
|
|
|
4
4
|
import { FieldHelperText, LabelWithIconAndTooltip } from "../components";
|
|
5
5
|
import { ArrayContainer, ArrayEntryParams, ErrorView } from "../../components";
|
|
6
6
|
import { getIconForProperty, getReferenceFrom } from "../../util";
|
|
7
|
-
|
|
8
|
-
import { useNavigationController, useReferenceDialog } from "../../hooks";
|
|
7
|
+
import { useNavigationController, useReferenceDialog, useTranslation } from "../../hooks";
|
|
9
8
|
import { Button, cls, EditIcon, ExpandablePanel, fieldBackgroundMixin, Typography } from "@firecms/ui";
|
|
10
9
|
import { useClearRestoreValue } from "../useClearRestoreValue";
|
|
11
10
|
|
|
@@ -48,6 +47,7 @@ export function ArrayOfReferencesFieldBinding({
|
|
|
48
47
|
setValue
|
|
49
48
|
});
|
|
50
49
|
|
|
50
|
+
const { t } = useTranslation();
|
|
51
51
|
const navigationController = useNavigationController();
|
|
52
52
|
const collection: EntityCollection | undefined = useMemo(() => {
|
|
53
53
|
return ofProperty.path ? navigationController.getCollection(ofProperty.path) : undefined;
|
|
@@ -84,7 +84,7 @@ export function ArrayOfReferencesFieldBinding({
|
|
|
84
84
|
}: ArrayEntryParams) => {
|
|
85
85
|
const entryValue = value && value.length > index ? value[index] : undefined;
|
|
86
86
|
if (!entryValue)
|
|
87
|
-
return <div>
|
|
87
|
+
return <div>{t("internal_error")}</div>;
|
|
88
88
|
return (
|
|
89
89
|
<ReferencePreview
|
|
90
90
|
key={internalId}
|
|
@@ -132,7 +132,7 @@ export function ArrayOfReferencesFieldBinding({
|
|
|
132
132
|
disabled={isSubmitting}
|
|
133
133
|
onClick={onEntryClick}>
|
|
134
134
|
<EditIcon size={"small"}/>
|
|
135
|
-
|
|
135
|
+
{t("edit_name", { name: property.name ?? "" })}
|
|
136
136
|
</Button>
|
|
137
137
|
</div>}
|
|
138
138
|
</>;
|
|
@@ -11,6 +11,7 @@ import { DEFAULT_ONE_OF_TYPE, DEFAULT_ONE_OF_VALUE } from "../../util/common";
|
|
|
11
11
|
import { cls, ExpandablePanel, paperMixin, Select, SelectItem, Typography } from "@firecms/ui";
|
|
12
12
|
import { useClearRestoreValue } from "../useClearRestoreValue";
|
|
13
13
|
import { ArrayContainer, ArrayEntryParams } from "../../components";
|
|
14
|
+
import { useTranslation } from "../../hooks/useTranslation";
|
|
14
15
|
|
|
15
16
|
/**
|
|
16
17
|
* If the `oneOf` property is specified, this fields render each array entry as
|
|
@@ -37,6 +38,7 @@ export function BlockFieldBinding<T extends Array<any>>({
|
|
|
37
38
|
}: FieldProps<T>) {
|
|
38
39
|
|
|
39
40
|
const minimalistView = minimalistViewProp || property.minimalistView;
|
|
41
|
+
const { t } = useTranslation();
|
|
40
42
|
|
|
41
43
|
if (!property.oneOf)
|
|
42
44
|
throw Error("ArrayOneOfField misconfiguration. Property `oneOf` not set");
|
|
@@ -84,7 +86,7 @@ export function BlockFieldBinding<T extends Array<any>>({
|
|
|
84
86
|
const body = <ArrayContainer value={value}
|
|
85
87
|
className={"flex flex-col gap-3"}
|
|
86
88
|
droppableId={propertyKey}
|
|
87
|
-
addLabel={property.name ? "
|
|
89
|
+
addLabel={property.name ? t("add_to_field", { fieldName: property.name }) : t("add_entry")}
|
|
88
90
|
buildEntry={buildEntry}
|
|
89
91
|
onInternalIdAdded={setLastAddedId}
|
|
90
92
|
disabled={isSubmitting || Boolean(property.disabled)}
|
|
@@ -167,6 +169,7 @@ function BlockEntry({
|
|
|
167
169
|
const [typeInternal, setTypeInternal] = useState<string | undefined>(type ?? undefined);
|
|
168
170
|
|
|
169
171
|
const formex = useFormex();
|
|
172
|
+
const { t } = useTranslation();
|
|
170
173
|
|
|
171
174
|
useEffect(() => {
|
|
172
175
|
if (!type) {
|
|
@@ -227,7 +230,7 @@ function BlockEntry({
|
|
|
227
230
|
<Select
|
|
228
231
|
className="mb-2"
|
|
229
232
|
placeholder={<Typography variant={"caption"}
|
|
230
|
-
className={"px-4 py-2 font-medium"}>
|
|
233
|
+
className={"px-4 py-2 font-medium"}>{t("type")}</Typography>}
|
|
231
234
|
size={"medium"}
|
|
232
235
|
fullWidth={true}
|
|
233
236
|
position={"item-aligned"}
|