@firecms/core 3.0.0-rc.2 → 3.0.0-rc.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/HomePage/HomePageDnD.d.ts +2 -1
- package/dist/components/PropertyCollectionView.d.ts +23 -0
- package/dist/core/EntityEditView.d.ts +10 -4
- package/dist/form/EntityForm.d.ts +5 -2
- package/dist/form/components/LocalChangesMenu.d.ts +11 -0
- package/dist/form/index.d.ts +2 -1
- package/dist/index.es.js +1288 -364
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +1287 -363
- package/dist/index.umd.js.map +1 -1
- package/dist/types/collections.d.ts +11 -0
- package/dist/types/properties.d.ts +32 -6
- package/dist/util/collections.d.ts +1 -0
- package/dist/util/entity_cache.d.ts +6 -1
- package/dist/util/make_properties_editable.d.ts +1 -2
- package/dist/util/objects.d.ts +1 -0
- package/dist/util/useStorageUploadController.d.ts +1 -0
- package/package.json +6 -6
- package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +47 -47
- package/src/components/EntityCollectionView/EntityCollectionView.tsx +6 -1
- package/src/components/EntityView.tsx +29 -40
- package/src/components/HomePage/DefaultHomePage.tsx +13 -9
- package/src/components/HomePage/HomePageDnD.tsx +140 -38
- package/src/components/PropertyCollectionView.tsx +329 -0
- package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +2 -1
- package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +0 -1
- package/src/core/EntityEditView.tsx +27 -14
- package/src/core/EntityEditViewFormActions.tsx +33 -18
- package/src/core/EntitySidePanel.tsx +9 -3
- package/src/form/EntityForm.tsx +173 -42
- package/src/form/EntityFormActions.tsx +30 -15
- package/src/form/components/ErrorFocus.tsx +22 -29
- package/src/form/components/LocalChangesMenu.tsx +144 -0
- package/src/form/index.tsx +5 -1
- package/src/hooks/useBuildNavigationController.tsx +104 -31
- package/src/preview/property_previews/MapPropertyPreview.tsx +2 -2
- package/src/preview/property_previews/NumberPropertyPreview.tsx +2 -2
- package/src/types/collections.ts +12 -0
- package/src/types/properties.ts +35 -6
- package/src/util/collections.ts +8 -0
- package/src/util/createFormexStub.tsx +4 -0
- package/src/util/entity_cache.ts +71 -52
- package/src/util/join_collections.ts +3 -3
- package/src/util/make_properties_editable.ts +0 -22
- package/src/util/objects.ts +40 -2
- package/src/util/useStorageUploadController.tsx +71 -34
package/dist/index.es.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { jsx, Fragment, jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { c } from "react-compiler-runtime";
|
|
3
3
|
import * as React from "react";
|
|
4
|
-
import React__default, { useRef, useEffect, useContext, useCallback, useMemo, useState, createElement, createRef, createContext, forwardRef, useLayoutEffect
|
|
5
|
-
import { getColorSchemeForSeed, CHIP_COLORS, FunctionsIcon, CircleIcon, iconKeys, coolIconKeys, Icon, Tooltip, ErrorIcon, Typography, IconButton, ContentCopyIcon, OpenInNewIcon, DescriptionIcon, cls, Skeleton, Chip, defaultBorderMixin, KeyboardTabIcon, Checkbox, AccountCircleIcon, Markdown, TextareaAutosize, focusedDisabled, MultiSelect, MultiSelectItem, Select, SelectItem, BooleanSwitch, DateTimeField, paperMixin, EditIcon, DoNotDisturbOnIcon, Menu, MenuItem, MoreVertIcon, CircularProgress, SearchBar,
|
|
4
|
+
import React__default, { useRef, useEffect, useContext, useCallback, useMemo, useState, createElement, createRef, createContext, forwardRef, useLayoutEffect } from "react";
|
|
5
|
+
import { getColorSchemeForSeed, CHIP_COLORS, FunctionsIcon, CircleIcon, iconKeys, coolIconKeys, Icon, Tooltip, ErrorIcon, Typography, IconButton, ContentCopyIcon, OpenInNewIcon, DescriptionIcon, cls, Skeleton, Chip, defaultBorderMixin, KeyboardTabIcon, Checkbox, AccountCircleIcon, Markdown, TextareaAutosize, focusedDisabled, MultiSelect, MultiSelectItem, Select, SelectItem, BooleanSwitch, DateTimeField, paperMixin, EditIcon, DoNotDisturbOnIcon, Menu, MenuItem, MoreVertIcon, Badge, CircularProgress, SearchBar, ArrowUpwardIcon, Popover, FilterListIcon, Button, CenteredView, AssignmentIcon, Label, CloseIcon, TextField, BooleanSwitchWithLabel, useOutsideAlerter, Dialog, DialogTitle, DialogContent, DialogActions, FileCopyIcon, DeleteIcon, AddIcon, StarIcon, Collapse, ExpandablePanel, ArrowForwardIcon, Card, cardMixin, cardClickableMixin, Container, LoadingButton, WarningIcon, KeyboardArrowDownIcon, VisibilityIcon, CheckIcon, CancelIcon, Alert, NotesIcon, InfoIcon, fieldBackgroundMixin, RemoveIcon, fieldBackgroundDisabledMixin, fieldBackgroundHoverMixin, ArrowDropDownIcon, FilterListOffIcon, SearchIcon, Avatar, DarkModeIcon, LightModeIcon, BrightnessMediumIcon, LogoutIcon, HandleIcon, KeyboardArrowUpIcon, debounce, Sheet, Tab, Tabs, CodeIcon, OpenInFullIcon, ViewStreamIcon, RepeatIcon, BallotIcon, ScheduleIcon, AddLinkIcon, LinkIcon, DriveFolderUploadIcon, UploadFileIcon, FormatListNumberedIcon, NumbersIcon, PersonIcon, ListAltIcon, ListIcon, FlagIcon, MailIcon, HttpIcon, FormatQuoteIcon, SubjectIcon, ShortTextIcon, MenuIcon, ChevronLeftIcon } from "@firecms/ui";
|
|
6
6
|
import { SnackbarProvider as SnackbarProvider$1, useSnackbar } from "notistack";
|
|
7
7
|
import hash from "object-hash";
|
|
8
8
|
import { getIn, useFormex, setIn, useCreateFormex, Formex, Field } from "@firecms/formex";
|
|
@@ -19,7 +19,7 @@ import { useSortable, defaultAnimateLayoutChanges, arrayMove as arrayMove$1, Sor
|
|
|
19
19
|
import { CSS } from "@dnd-kit/utilities";
|
|
20
20
|
import { restrictToVerticalAxis, restrictToWindowEdges } from "@dnd-kit/modifiers";
|
|
21
21
|
import { useDropzone } from "react-dropzone";
|
|
22
|
-
import
|
|
22
|
+
import Compressor from "compressorjs";
|
|
23
23
|
import { FireCMSEditor } from "@firecms/editor";
|
|
24
24
|
import { themes, Highlight } from "prism-react-renderer";
|
|
25
25
|
import { useLocation as useLocation$1, useBlocker } from "react-router";
|
|
@@ -255,6 +255,13 @@ const pick = (obj, ...args) => ({
|
|
|
255
255
|
function isObject(item) {
|
|
256
256
|
return item && typeof item === "object" && !Array.isArray(item);
|
|
257
257
|
}
|
|
258
|
+
function isPlainObject(obj) {
|
|
259
|
+
if (typeof obj !== "object" || obj === null || Array.isArray(obj)) {
|
|
260
|
+
return false;
|
|
261
|
+
}
|
|
262
|
+
const proto = Object.getPrototypeOf(obj);
|
|
263
|
+
return proto === Object.prototype;
|
|
264
|
+
}
|
|
258
265
|
function mergeDeep(target, source, ignoreUndefined = false) {
|
|
259
266
|
if (!isObject(target)) {
|
|
260
267
|
return target;
|
|
@@ -275,7 +282,28 @@ function mergeDeep(target, source, ignoreUndefined = false) {
|
|
|
275
282
|
if (sourceValue instanceof Date) {
|
|
276
283
|
output[key] = new Date(sourceValue.getTime());
|
|
277
284
|
} else if (Array.isArray(sourceValue)) {
|
|
278
|
-
|
|
285
|
+
if (Array.isArray(outputValue)) {
|
|
286
|
+
const newArray = [];
|
|
287
|
+
const maxLength = Math.max(outputValue.length, sourceValue.length);
|
|
288
|
+
for (let i = 0; i < maxLength; i++) {
|
|
289
|
+
const sourceItem = sourceValue[i];
|
|
290
|
+
const targetItem = outputValue[i];
|
|
291
|
+
if (i >= sourceValue.length) {
|
|
292
|
+
newArray[i] = targetItem;
|
|
293
|
+
} else if (i >= outputValue.length) {
|
|
294
|
+
newArray[i] = sourceItem;
|
|
295
|
+
} else if (sourceItem === null) {
|
|
296
|
+
newArray[i] = targetItem;
|
|
297
|
+
} else if (isObject(sourceItem) && isObject(targetItem)) {
|
|
298
|
+
newArray[i] = mergeDeep(targetItem, sourceItem, ignoreUndefined);
|
|
299
|
+
} else {
|
|
300
|
+
newArray[i] = sourceItem;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
output[key] = newArray;
|
|
304
|
+
} else {
|
|
305
|
+
output[key] = [...sourceValue];
|
|
306
|
+
}
|
|
279
307
|
} else if (isObject(sourceValue)) {
|
|
280
308
|
if (isObject(outputValue)) {
|
|
281
309
|
output[key] = mergeDeep(outputValue, sourceValue, ignoreUndefined);
|
|
@@ -1054,6 +1082,12 @@ const applyPermissionsFunctionIfEmpty = (collections, permissionsBuilder) => {
|
|
|
1054
1082
|
};
|
|
1055
1083
|
});
|
|
1056
1084
|
};
|
|
1085
|
+
function getLocalChangesBackup(collection) {
|
|
1086
|
+
if (!collection.localChangesBackup) {
|
|
1087
|
+
return "manual_apply";
|
|
1088
|
+
}
|
|
1089
|
+
return collection.localChangesBackup;
|
|
1090
|
+
}
|
|
1057
1091
|
const kebabCaseRegex = /[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g;
|
|
1058
1092
|
const toKebabCase = (str) => {
|
|
1059
1093
|
const regExpMatchArray = str.match(kebabCaseRegex);
|
|
@@ -3510,26 +3544,6 @@ function makePropertiesEditable(properties) {
|
|
|
3510
3544
|
});
|
|
3511
3545
|
return properties;
|
|
3512
3546
|
}
|
|
3513
|
-
function makePropertiesNonEditable(properties) {
|
|
3514
|
-
return Object.entries(properties).reduce((acc, [key, property]) => {
|
|
3515
|
-
if (!isPropertyBuilder(property) && property.dataType === "map" && property.properties) {
|
|
3516
|
-
const updated = {
|
|
3517
|
-
...property,
|
|
3518
|
-
properties: makePropertiesNonEditable(property.properties)
|
|
3519
|
-
};
|
|
3520
|
-
acc[key] = updated;
|
|
3521
|
-
}
|
|
3522
|
-
if (isPropertyBuilder(property)) {
|
|
3523
|
-
acc[key] = property;
|
|
3524
|
-
} else {
|
|
3525
|
-
acc[key] = {
|
|
3526
|
-
...property,
|
|
3527
|
-
editable: false
|
|
3528
|
-
};
|
|
3529
|
-
}
|
|
3530
|
-
return acc;
|
|
3531
|
-
}, {});
|
|
3532
|
-
}
|
|
3533
3547
|
function applyModifyFunction(modifyCollection, collection, parentPaths) {
|
|
3534
3548
|
if (modifyCollection) {
|
|
3535
3549
|
const modified = modifyCollection({
|
|
@@ -3611,8 +3625,8 @@ function mergePropertyOrBuilder(target, source) {
|
|
|
3611
3625
|
return target;
|
|
3612
3626
|
} else {
|
|
3613
3627
|
const mergedProperty = mergeDeep(target, source);
|
|
3614
|
-
const targetEditable = Boolean(target.editable);
|
|
3615
|
-
const sourceEditable = Boolean(source.editable);
|
|
3628
|
+
const targetEditable = target.editable === void 0 ? true : Boolean(target.editable);
|
|
3629
|
+
const sourceEditable = source.editable === void 0 ? true : Boolean(source.editable);
|
|
3616
3630
|
if (source.dataType === "map" && source.properties) {
|
|
3617
3631
|
const targetProperties = "properties" in target ? target.properties : {};
|
|
3618
3632
|
const sourceProperties = "properties" in source ? source.properties : {};
|
|
@@ -6638,7 +6652,7 @@ function MapPropertyPreview(t0) {
|
|
|
6638
6652
|
const isArrayOrMap = childProperty.dataType === "map" || childProperty === "array";
|
|
6639
6653
|
return /* @__PURE__ */ jsxs("div", { className: cls(defaultBorderMixin, "last:border-b-0 border-b"), children: [
|
|
6640
6654
|
/* @__PURE__ */ jsxs("div", { className: "flex flex-row pt-0.5 pb-0.5 gap-2", children: [
|
|
6641
|
-
/* @__PURE__ */ jsx("div", { className: "min-w-[140px] w-[25%] py-1", children: /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "
|
|
6655
|
+
/* @__PURE__ */ jsx("div", { className: "min-w-[140px] w-[25%] py-1", children: /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "break-words font-semibold", color: "secondary", children: childProperty.name }) }),
|
|
6642
6656
|
/* @__PURE__ */ jsx("div", { className: "flex-grow max-w-[75%]", children: /* @__PURE__ */ jsx(ErrorBoundary, { children: !isArrayOrMap && /* @__PURE__ */ jsx(PropertyPreview, { propertyKey: key_0, value: value[key_0], property: childProperty, size }) }) })
|
|
6643
6657
|
] }),
|
|
6644
6658
|
isArrayOrMap && /* @__PURE__ */ jsx("div", { className: cls(defaultBorderMixin, "border-l pl-4 ml-2 my-2"), children: /* @__PURE__ */ jsx(PropertyPreview, { propertyKey: key_0, value: value[key_0], property: childProperty, size }) })
|
|
@@ -6694,7 +6708,7 @@ function _temp$o(t0) {
|
|
|
6694
6708
|
const [key, childValue] = t0;
|
|
6695
6709
|
return /* @__PURE__ */ jsxs("div", { className: cls(defaultBorderMixin, "last:border-b-0 border-b"), children: [
|
|
6696
6710
|
/* @__PURE__ */ jsxs("div", { className: "flex flex-row pt-0.5 pb-0.5 gap-2", children: [
|
|
6697
|
-
/* @__PURE__ */ jsx("div", { className: "min-w-[140px] w-[25%] py-1", children: /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "font-
|
|
6711
|
+
/* @__PURE__ */ jsx("div", { className: "min-w-[140px] w-[25%] py-1", children: /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "font-semibold break-words", color: "secondary", children: key }) }, `table-cell-title-${key}-${key}`),
|
|
6698
6712
|
/* @__PURE__ */ jsx("div", { className: "flex-grow max-w-[75%]", children: childValue && typeof childValue !== "object" && /* @__PURE__ */ jsx(Typography, { children: /* @__PURE__ */ jsx(ErrorBoundary, { children: childValue.toString() }) }) })
|
|
6699
6713
|
] }),
|
|
6700
6714
|
typeof childValue === "object" && /* @__PURE__ */ jsx("div", { className: cls(defaultBorderMixin, "border-l pl-4"), children: /* @__PURE__ */ jsx(KeyValuePreview, { value: childValue }) })
|
|
@@ -6771,7 +6785,7 @@ function BooleanPreview(t0) {
|
|
|
6771
6785
|
return t3;
|
|
6772
6786
|
}
|
|
6773
6787
|
function NumberPropertyPreview(t0) {
|
|
6774
|
-
const $ = c(
|
|
6788
|
+
const $ = c(12);
|
|
6775
6789
|
const {
|
|
6776
6790
|
value,
|
|
6777
6791
|
property,
|
|
@@ -6789,38 +6803,42 @@ function NumberPropertyPreview(t0) {
|
|
|
6789
6803
|
}
|
|
6790
6804
|
const enumValues = t1;
|
|
6791
6805
|
if (!enumValues) {
|
|
6792
|
-
|
|
6793
|
-
|
|
6794
|
-
|
|
6795
|
-
|
|
6796
|
-
$[
|
|
6806
|
+
const t22 = size === "small" ? "text-sm" : "";
|
|
6807
|
+
let t32;
|
|
6808
|
+
if ($[2] !== t22 || $[3] !== value) {
|
|
6809
|
+
t32 = /* @__PURE__ */ jsx("span", { className: t22, children: value });
|
|
6810
|
+
$[2] = t22;
|
|
6811
|
+
$[3] = value;
|
|
6812
|
+
$[4] = t32;
|
|
6797
6813
|
} else {
|
|
6798
|
-
|
|
6814
|
+
t32 = $[4];
|
|
6799
6815
|
}
|
|
6800
|
-
return
|
|
6816
|
+
return t32;
|
|
6801
6817
|
}
|
|
6802
6818
|
const t2 = size !== "medium" ? "small" : "medium";
|
|
6803
6819
|
let t3;
|
|
6804
|
-
if ($[
|
|
6820
|
+
if ($[5] !== enumKey || $[6] !== enumValues || $[7] !== t2) {
|
|
6805
6821
|
t3 = /* @__PURE__ */ jsx(EnumValuesChip, { enumKey, enumValues, size: t2 });
|
|
6806
|
-
$[
|
|
6807
|
-
$[
|
|
6808
|
-
$[
|
|
6809
|
-
$[
|
|
6822
|
+
$[5] = enumKey;
|
|
6823
|
+
$[6] = enumValues;
|
|
6824
|
+
$[7] = t2;
|
|
6825
|
+
$[8] = t3;
|
|
6810
6826
|
} else {
|
|
6811
|
-
t3 = $[
|
|
6827
|
+
t3 = $[8];
|
|
6812
6828
|
}
|
|
6813
6829
|
return t3;
|
|
6814
6830
|
} else {
|
|
6815
|
-
|
|
6816
|
-
|
|
6817
|
-
|
|
6818
|
-
|
|
6831
|
+
const t1 = size === "small" ? "text-sm" : "";
|
|
6832
|
+
let t2;
|
|
6833
|
+
if ($[9] !== t1 || $[10] !== value) {
|
|
6834
|
+
t2 = /* @__PURE__ */ jsx("span", { className: t1, children: value });
|
|
6819
6835
|
$[9] = t1;
|
|
6836
|
+
$[10] = value;
|
|
6837
|
+
$[11] = t2;
|
|
6820
6838
|
} else {
|
|
6821
|
-
|
|
6839
|
+
t2 = $[11];
|
|
6822
6840
|
}
|
|
6823
|
-
return
|
|
6841
|
+
return t2;
|
|
6824
6842
|
}
|
|
6825
6843
|
}
|
|
6826
6844
|
function UserDisplay(t0) {
|
|
@@ -7369,6 +7387,389 @@ const AsyncPreviewComponent = React.memo(function AsyncPreviewComponentInternal(
|
|
|
7369
7387
|
}
|
|
7370
7388
|
return t3;
|
|
7371
7389
|
});
|
|
7390
|
+
function buildPropertyLabelAndGetProperty(properties, key) {
|
|
7391
|
+
if (!key) return {
|
|
7392
|
+
label: "",
|
|
7393
|
+
property: void 0
|
|
7394
|
+
};
|
|
7395
|
+
const segments = [];
|
|
7396
|
+
const re = /([^[.\]]+)|\[(\d+)\]/g;
|
|
7397
|
+
let m;
|
|
7398
|
+
while ((m = re.exec(key)) !== null) {
|
|
7399
|
+
if (m[1] !== void 0) segments.push(m[1]);
|
|
7400
|
+
else if (m[2] !== void 0) segments.push(Number(m[2]));
|
|
7401
|
+
}
|
|
7402
|
+
let currentProps = properties;
|
|
7403
|
+
let currentProp;
|
|
7404
|
+
let lastLabel = "";
|
|
7405
|
+
const getArrayOfProp = (p) => {
|
|
7406
|
+
if (!p || p.dataType !== "array") return void 0;
|
|
7407
|
+
return Array.isArray(p.of) ? p.of[0] : p.of;
|
|
7408
|
+
};
|
|
7409
|
+
for (const seg of segments) {
|
|
7410
|
+
if (typeof seg === "number") {
|
|
7411
|
+
lastLabel = `[${seg}]`;
|
|
7412
|
+
if (currentProp?.dataType === "array") {
|
|
7413
|
+
currentProp = getArrayOfProp(currentProp);
|
|
7414
|
+
if (currentProp?.dataType === "map" && currentProp.properties) {
|
|
7415
|
+
currentProps = currentProp.properties;
|
|
7416
|
+
} else {
|
|
7417
|
+
currentProps = void 0;
|
|
7418
|
+
}
|
|
7419
|
+
} else {
|
|
7420
|
+
currentProp = void 0;
|
|
7421
|
+
currentProps = void 0;
|
|
7422
|
+
}
|
|
7423
|
+
continue;
|
|
7424
|
+
}
|
|
7425
|
+
if (currentProps && currentProps[seg]) {
|
|
7426
|
+
const nextProp = currentProps[seg];
|
|
7427
|
+
currentProp = nextProp;
|
|
7428
|
+
lastLabel = nextProp.name || String(seg);
|
|
7429
|
+
if (nextProp.dataType === "map" && nextProp.properties) {
|
|
7430
|
+
currentProps = nextProp.properties;
|
|
7431
|
+
} else if (nextProp.dataType === "array") {
|
|
7432
|
+
currentProps = void 0;
|
|
7433
|
+
} else {
|
|
7434
|
+
currentProps = void 0;
|
|
7435
|
+
}
|
|
7436
|
+
} else {
|
|
7437
|
+
currentProp = void 0;
|
|
7438
|
+
currentProps = void 0;
|
|
7439
|
+
lastLabel = String(seg);
|
|
7440
|
+
}
|
|
7441
|
+
}
|
|
7442
|
+
return {
|
|
7443
|
+
label: lastLabel,
|
|
7444
|
+
property: currentProp
|
|
7445
|
+
};
|
|
7446
|
+
}
|
|
7447
|
+
const pathEndsWithIndex = (p) => /\[\d+\]$/.test(p);
|
|
7448
|
+
const PropertyCollectionView = (t0) => {
|
|
7449
|
+
const $ = c(89);
|
|
7450
|
+
const {
|
|
7451
|
+
data,
|
|
7452
|
+
properties,
|
|
7453
|
+
baseKey: t1,
|
|
7454
|
+
suppressHeader: t2,
|
|
7455
|
+
size: t3
|
|
7456
|
+
} = t0;
|
|
7457
|
+
const baseKey = t1 === void 0 ? "" : t1;
|
|
7458
|
+
const suppressHeader = t2 === void 0 ? false : t2;
|
|
7459
|
+
const size = t3 === void 0 ? "small" : t3;
|
|
7460
|
+
const isTopLevel = !!baseKey && !baseKey.includes(".") && !baseKey.includes("[");
|
|
7461
|
+
if (Array.isArray(data)) {
|
|
7462
|
+
let t4;
|
|
7463
|
+
if ($[0] !== baseKey || $[1] !== properties) {
|
|
7464
|
+
t4 = baseKey ? buildPropertyLabelAndGetProperty(properties, baseKey) : {
|
|
7465
|
+
label: "",
|
|
7466
|
+
property: void 0
|
|
7467
|
+
};
|
|
7468
|
+
$[0] = baseKey;
|
|
7469
|
+
$[1] = properties;
|
|
7470
|
+
$[2] = t4;
|
|
7471
|
+
} else {
|
|
7472
|
+
t4 = $[2];
|
|
7473
|
+
}
|
|
7474
|
+
const {
|
|
7475
|
+
label: arrayLabel,
|
|
7476
|
+
property
|
|
7477
|
+
} = t4;
|
|
7478
|
+
const ofProp = property?.dataType === "array" ? Array.isArray(property.of) ? property.of[0] : property.of : void 0;
|
|
7479
|
+
const isArrayOfMaps = ofProp?.dataType === "map";
|
|
7480
|
+
const isArrayOfPrimitives = property?.dataType === "array" && ofProp && ofProp.dataType !== "map";
|
|
7481
|
+
if (baseKey && property && isArrayOfPrimitives) {
|
|
7482
|
+
const t52 = `grid grid-cols-12 gap-x-4 ${isTopLevel ? "py-4" : "py-2"} items-start ${isTopLevel ? `border-b ${defaultBorderMixin} last:border-b-0` : ""}`;
|
|
7483
|
+
let t62;
|
|
7484
|
+
if ($[3] !== arrayLabel) {
|
|
7485
|
+
t62 = /* @__PURE__ */ jsx("div", { className: "col-span-4 pr-2", children: /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", component: "span", className: "break-words", children: arrayLabel }) });
|
|
7486
|
+
$[3] = arrayLabel;
|
|
7487
|
+
$[4] = t62;
|
|
7488
|
+
} else {
|
|
7489
|
+
t62 = $[4];
|
|
7490
|
+
}
|
|
7491
|
+
let t72;
|
|
7492
|
+
if ($[5] !== baseKey || $[6] !== data || $[7] !== property || $[8] !== size) {
|
|
7493
|
+
t72 = /* @__PURE__ */ jsx("div", { className: "col-span-8", children: /* @__PURE__ */ jsx(PropertyPreview, { propertyKey: baseKey, value: data, property, size }) });
|
|
7494
|
+
$[5] = baseKey;
|
|
7495
|
+
$[6] = data;
|
|
7496
|
+
$[7] = property;
|
|
7497
|
+
$[8] = size;
|
|
7498
|
+
$[9] = t72;
|
|
7499
|
+
} else {
|
|
7500
|
+
t72 = $[9];
|
|
7501
|
+
}
|
|
7502
|
+
let t82;
|
|
7503
|
+
if ($[10] !== t52 || $[11] !== t62 || $[12] !== t72) {
|
|
7504
|
+
t82 = /* @__PURE__ */ jsxs("div", { className: t52, children: [
|
|
7505
|
+
t62,
|
|
7506
|
+
t72
|
|
7507
|
+
] });
|
|
7508
|
+
$[10] = t52;
|
|
7509
|
+
$[11] = t62;
|
|
7510
|
+
$[12] = t72;
|
|
7511
|
+
$[13] = t82;
|
|
7512
|
+
} else {
|
|
7513
|
+
t82 = $[13];
|
|
7514
|
+
}
|
|
7515
|
+
return t82;
|
|
7516
|
+
}
|
|
7517
|
+
const t5 = `${isTopLevel ? "py-4" : "py-1"} ${isTopLevel ? `border-b ${defaultBorderMixin} last:border-b-0` : ""}`;
|
|
7518
|
+
let t6;
|
|
7519
|
+
if ($[14] !== arrayLabel || $[15] !== baseKey || $[16] !== suppressHeader) {
|
|
7520
|
+
t6 = baseKey && arrayLabel && !suppressHeader && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", component: "span", children: arrayLabel });
|
|
7521
|
+
$[14] = arrayLabel;
|
|
7522
|
+
$[15] = baseKey;
|
|
7523
|
+
$[16] = suppressHeader;
|
|
7524
|
+
$[17] = t6;
|
|
7525
|
+
} else {
|
|
7526
|
+
t6 = $[17];
|
|
7527
|
+
}
|
|
7528
|
+
const t7 = baseKey ? `pl-4 mt-1 border-l ${defaultBorderMixin}` : "";
|
|
7529
|
+
let t8;
|
|
7530
|
+
if ($[18] !== baseKey || $[19] !== data || $[20] !== isArrayOfMaps || $[21] !== ofProp || $[22] !== properties || $[23] !== size) {
|
|
7531
|
+
let t92;
|
|
7532
|
+
if ($[25] !== baseKey || $[26] !== isArrayOfMaps || $[27] !== ofProp || $[28] !== properties || $[29] !== size) {
|
|
7533
|
+
t92 = (item, index) => {
|
|
7534
|
+
if (item === null || item === void 0) {
|
|
7535
|
+
return null;
|
|
7536
|
+
}
|
|
7537
|
+
const currentKey = baseKey ? `${baseKey}[${index}]` : `[${index}]`;
|
|
7538
|
+
const itemHeader = isArrayOfMaps && ofProp?.name ? `${ofProp.name} [${index}]` : `[${index}]`;
|
|
7539
|
+
return /* @__PURE__ */ jsxs("div", { className: "py-1", children: [
|
|
7540
|
+
/* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", component: "span", children: itemHeader }),
|
|
7541
|
+
/* @__PURE__ */ jsx("div", { className: `pl-4 mt-1 border-l ${defaultBorderMixin}`, children: /* @__PURE__ */ jsx(PropertyCollectionView, { data: item, properties, baseKey: currentKey, suppressHeader: true, size }) })
|
|
7542
|
+
] }, currentKey);
|
|
7543
|
+
};
|
|
7544
|
+
$[25] = baseKey;
|
|
7545
|
+
$[26] = isArrayOfMaps;
|
|
7546
|
+
$[27] = ofProp;
|
|
7547
|
+
$[28] = properties;
|
|
7548
|
+
$[29] = size;
|
|
7549
|
+
$[30] = t92;
|
|
7550
|
+
} else {
|
|
7551
|
+
t92 = $[30];
|
|
7552
|
+
}
|
|
7553
|
+
t8 = data.map(t92);
|
|
7554
|
+
$[18] = baseKey;
|
|
7555
|
+
$[19] = data;
|
|
7556
|
+
$[20] = isArrayOfMaps;
|
|
7557
|
+
$[21] = ofProp;
|
|
7558
|
+
$[22] = properties;
|
|
7559
|
+
$[23] = size;
|
|
7560
|
+
$[24] = t8;
|
|
7561
|
+
} else {
|
|
7562
|
+
t8 = $[24];
|
|
7563
|
+
}
|
|
7564
|
+
let t9;
|
|
7565
|
+
if ($[31] !== t7 || $[32] !== t8) {
|
|
7566
|
+
t9 = /* @__PURE__ */ jsx("div", { className: t7, children: t8 });
|
|
7567
|
+
$[31] = t7;
|
|
7568
|
+
$[32] = t8;
|
|
7569
|
+
$[33] = t9;
|
|
7570
|
+
} else {
|
|
7571
|
+
t9 = $[33];
|
|
7572
|
+
}
|
|
7573
|
+
let t10;
|
|
7574
|
+
if ($[34] !== t5 || $[35] !== t6 || $[36] !== t9) {
|
|
7575
|
+
t10 = /* @__PURE__ */ jsxs("div", { className: t5, children: [
|
|
7576
|
+
t6,
|
|
7577
|
+
t9
|
|
7578
|
+
] });
|
|
7579
|
+
$[34] = t5;
|
|
7580
|
+
$[35] = t6;
|
|
7581
|
+
$[36] = t9;
|
|
7582
|
+
$[37] = t10;
|
|
7583
|
+
} else {
|
|
7584
|
+
t10 = $[37];
|
|
7585
|
+
}
|
|
7586
|
+
return t10;
|
|
7587
|
+
}
|
|
7588
|
+
if (typeof data === "object" && data !== null) {
|
|
7589
|
+
let t4;
|
|
7590
|
+
if ($[38] !== baseKey || $[39] !== properties) {
|
|
7591
|
+
t4 = baseKey ? buildPropertyLabelAndGetProperty(properties, baseKey) : {
|
|
7592
|
+
label: "",
|
|
7593
|
+
property: void 0
|
|
7594
|
+
};
|
|
7595
|
+
$[38] = baseKey;
|
|
7596
|
+
$[39] = properties;
|
|
7597
|
+
$[40] = t4;
|
|
7598
|
+
} else {
|
|
7599
|
+
t4 = $[40];
|
|
7600
|
+
}
|
|
7601
|
+
const {
|
|
7602
|
+
label,
|
|
7603
|
+
property: property_0
|
|
7604
|
+
} = t4;
|
|
7605
|
+
if (baseKey && (!property_0 || property_0.dataType !== "map" || !property_0.properties)) {
|
|
7606
|
+
if (!property_0) {
|
|
7607
|
+
return null;
|
|
7608
|
+
}
|
|
7609
|
+
const t52 = `grid grid-cols-12 gap-x-4 ${isTopLevel ? "py-4" : "py-2"} items-start ${isTopLevel ? `border-b ${defaultBorderMixin} last:border-b-0` : ""}`;
|
|
7610
|
+
let t62;
|
|
7611
|
+
if ($[41] !== label) {
|
|
7612
|
+
t62 = /* @__PURE__ */ jsx("div", { className: "col-span-4 pr-2", children: /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", component: "span", className: "break-words", children: label }) });
|
|
7613
|
+
$[41] = label;
|
|
7614
|
+
$[42] = t62;
|
|
7615
|
+
} else {
|
|
7616
|
+
t62 = $[42];
|
|
7617
|
+
}
|
|
7618
|
+
let t72;
|
|
7619
|
+
if ($[43] !== baseKey || $[44] !== data || $[45] !== property_0 || $[46] !== size) {
|
|
7620
|
+
t72 = /* @__PURE__ */ jsx("div", { className: "col-span-8", children: /* @__PURE__ */ jsx(PropertyPreview, { propertyKey: baseKey, value: data, property: property_0, size }) });
|
|
7621
|
+
$[43] = baseKey;
|
|
7622
|
+
$[44] = data;
|
|
7623
|
+
$[45] = property_0;
|
|
7624
|
+
$[46] = size;
|
|
7625
|
+
$[47] = t72;
|
|
7626
|
+
} else {
|
|
7627
|
+
t72 = $[47];
|
|
7628
|
+
}
|
|
7629
|
+
let t82;
|
|
7630
|
+
if ($[48] !== t52 || $[49] !== t62 || $[50] !== t72) {
|
|
7631
|
+
t82 = /* @__PURE__ */ jsxs("div", { className: t52, children: [
|
|
7632
|
+
t62,
|
|
7633
|
+
t72
|
|
7634
|
+
] });
|
|
7635
|
+
$[48] = t52;
|
|
7636
|
+
$[49] = t62;
|
|
7637
|
+
$[50] = t72;
|
|
7638
|
+
$[51] = t82;
|
|
7639
|
+
} else {
|
|
7640
|
+
t82 = $[51];
|
|
7641
|
+
}
|
|
7642
|
+
return t82;
|
|
7643
|
+
}
|
|
7644
|
+
let t5;
|
|
7645
|
+
if ($[52] !== baseKey || $[53] !== property_0 || $[54] !== suppressHeader) {
|
|
7646
|
+
t5 = baseKey && !suppressHeader && property_0?.dataType === "map" && (property_0.name || !pathEndsWithIndex(baseKey));
|
|
7647
|
+
$[52] = baseKey;
|
|
7648
|
+
$[53] = property_0;
|
|
7649
|
+
$[54] = suppressHeader;
|
|
7650
|
+
$[55] = t5;
|
|
7651
|
+
} else {
|
|
7652
|
+
t5 = $[55];
|
|
7653
|
+
}
|
|
7654
|
+
const showMapHeader = t5;
|
|
7655
|
+
const headerText = property_0?.name || label;
|
|
7656
|
+
const t6 = `${isTopLevel ? "py-4" : "py-1"} ${isTopLevel ? `border-b ${defaultBorderMixin} last:border-b-0` : ""}`;
|
|
7657
|
+
let t7;
|
|
7658
|
+
if ($[56] !== headerText || $[57] !== showMapHeader) {
|
|
7659
|
+
t7 = showMapHeader && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", component: "span", children: headerText });
|
|
7660
|
+
$[56] = headerText;
|
|
7661
|
+
$[57] = showMapHeader;
|
|
7662
|
+
$[58] = t7;
|
|
7663
|
+
} else {
|
|
7664
|
+
t7 = $[58];
|
|
7665
|
+
}
|
|
7666
|
+
const t8 = baseKey ? `pl-4 mt-1 border-l ${defaultBorderMixin}` : "";
|
|
7667
|
+
let t9;
|
|
7668
|
+
if ($[59] !== baseKey || $[60] !== data || $[61] !== properties || $[62] !== size) {
|
|
7669
|
+
let t102;
|
|
7670
|
+
if ($[64] !== baseKey || $[65] !== properties || $[66] !== size) {
|
|
7671
|
+
t102 = (t112) => {
|
|
7672
|
+
const [key, value] = t112;
|
|
7673
|
+
if (value === null || value === void 0) {
|
|
7674
|
+
return null;
|
|
7675
|
+
}
|
|
7676
|
+
const currentKey_0 = baseKey ? `${baseKey}.${key}` : key;
|
|
7677
|
+
return /* @__PURE__ */ jsx(PropertyCollectionView, { data: value, properties, baseKey: currentKey_0, size }, currentKey_0);
|
|
7678
|
+
};
|
|
7679
|
+
$[64] = baseKey;
|
|
7680
|
+
$[65] = properties;
|
|
7681
|
+
$[66] = size;
|
|
7682
|
+
$[67] = t102;
|
|
7683
|
+
} else {
|
|
7684
|
+
t102 = $[67];
|
|
7685
|
+
}
|
|
7686
|
+
t9 = Object.entries(data).map(t102);
|
|
7687
|
+
$[59] = baseKey;
|
|
7688
|
+
$[60] = data;
|
|
7689
|
+
$[61] = properties;
|
|
7690
|
+
$[62] = size;
|
|
7691
|
+
$[63] = t9;
|
|
7692
|
+
} else {
|
|
7693
|
+
t9 = $[63];
|
|
7694
|
+
}
|
|
7695
|
+
let t10;
|
|
7696
|
+
if ($[68] !== t8 || $[69] !== t9) {
|
|
7697
|
+
t10 = /* @__PURE__ */ jsx("div", { className: t8, children: t9 });
|
|
7698
|
+
$[68] = t8;
|
|
7699
|
+
$[69] = t9;
|
|
7700
|
+
$[70] = t10;
|
|
7701
|
+
} else {
|
|
7702
|
+
t10 = $[70];
|
|
7703
|
+
}
|
|
7704
|
+
let t11;
|
|
7705
|
+
if ($[71] !== t10 || $[72] !== t6 || $[73] !== t7) {
|
|
7706
|
+
t11 = /* @__PURE__ */ jsxs("div", { className: t6, children: [
|
|
7707
|
+
t7,
|
|
7708
|
+
t10
|
|
7709
|
+
] });
|
|
7710
|
+
$[71] = t10;
|
|
7711
|
+
$[72] = t6;
|
|
7712
|
+
$[73] = t7;
|
|
7713
|
+
$[74] = t11;
|
|
7714
|
+
} else {
|
|
7715
|
+
t11 = $[74];
|
|
7716
|
+
}
|
|
7717
|
+
return t11;
|
|
7718
|
+
}
|
|
7719
|
+
if (baseKey) {
|
|
7720
|
+
let t4;
|
|
7721
|
+
if ($[75] !== baseKey || $[76] !== properties) {
|
|
7722
|
+
t4 = buildPropertyLabelAndGetProperty(properties, baseKey);
|
|
7723
|
+
$[75] = baseKey;
|
|
7724
|
+
$[76] = properties;
|
|
7725
|
+
$[77] = t4;
|
|
7726
|
+
} else {
|
|
7727
|
+
t4 = $[77];
|
|
7728
|
+
}
|
|
7729
|
+
const {
|
|
7730
|
+
label: label_0,
|
|
7731
|
+
property: property_1
|
|
7732
|
+
} = t4;
|
|
7733
|
+
if (!property_1) {
|
|
7734
|
+
return null;
|
|
7735
|
+
}
|
|
7736
|
+
const t5 = `grid grid-cols-12 gap-x-4 ${isTopLevel ? "py-4" : "py-2"} items-start ${isTopLevel ? `border-b ${defaultBorderMixin} last:border-b-0` : ""}`;
|
|
7737
|
+
let t6;
|
|
7738
|
+
if ($[78] !== label_0) {
|
|
7739
|
+
t6 = /* @__PURE__ */ jsx("div", { className: "col-span-4 pr-2", children: /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", component: "span", className: "break-words", children: label_0 }) });
|
|
7740
|
+
$[78] = label_0;
|
|
7741
|
+
$[79] = t6;
|
|
7742
|
+
} else {
|
|
7743
|
+
t6 = $[79];
|
|
7744
|
+
}
|
|
7745
|
+
let t7;
|
|
7746
|
+
if ($[80] !== baseKey || $[81] !== data || $[82] !== property_1 || $[83] !== size) {
|
|
7747
|
+
t7 = /* @__PURE__ */ jsx("div", { className: "col-span-8", children: /* @__PURE__ */ jsx(PropertyPreview, { propertyKey: baseKey, value: data, property: property_1, size }) });
|
|
7748
|
+
$[80] = baseKey;
|
|
7749
|
+
$[81] = data;
|
|
7750
|
+
$[82] = property_1;
|
|
7751
|
+
$[83] = size;
|
|
7752
|
+
$[84] = t7;
|
|
7753
|
+
} else {
|
|
7754
|
+
t7 = $[84];
|
|
7755
|
+
}
|
|
7756
|
+
let t8;
|
|
7757
|
+
if ($[85] !== t5 || $[86] !== t6 || $[87] !== t7) {
|
|
7758
|
+
t8 = /* @__PURE__ */ jsxs("div", { className: t5, children: [
|
|
7759
|
+
t6,
|
|
7760
|
+
t7
|
|
7761
|
+
] });
|
|
7762
|
+
$[85] = t5;
|
|
7763
|
+
$[86] = t6;
|
|
7764
|
+
$[87] = t7;
|
|
7765
|
+
$[88] = t8;
|
|
7766
|
+
} else {
|
|
7767
|
+
t8 = $[88];
|
|
7768
|
+
}
|
|
7769
|
+
return t8;
|
|
7770
|
+
}
|
|
7771
|
+
return null;
|
|
7772
|
+
};
|
|
7372
7773
|
function EntityView({
|
|
7373
7774
|
entity,
|
|
7374
7775
|
collection,
|
|
@@ -7386,31 +7787,17 @@ function EntityView({
|
|
|
7386
7787
|
authController
|
|
7387
7788
|
}), [collection, path, entity, customizationController.propertyConfigs]);
|
|
7388
7789
|
const properties = resolvedCollection.properties;
|
|
7389
|
-
return /* @__PURE__ */ jsx("div", { className: "w-full " + className, children: /* @__PURE__ */ jsxs("div", { className: "w-full mb-4", children: [
|
|
7390
|
-
/* @__PURE__ */ jsxs("div", { className:
|
|
7391
|
-
/* @__PURE__ */ jsx("div", { className: "
|
|
7392
|
-
/* @__PURE__ */
|
|
7790
|
+
return /* @__PURE__ */ jsx("div", { className: "w-full " + className, children: /* @__PURE__ */ jsxs("div", { className: "w-full mb-4 p-4", children: [
|
|
7791
|
+
/* @__PURE__ */ jsxs("div", { className: `grid grid-cols-12 gap-x-4 py-4 items-start border-b ${defaultBorderMixin}`, children: [
|
|
7792
|
+
/* @__PURE__ */ jsx("div", { className: "col-span-4 pr-2", children: /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", component: "span", className: "break-words", children: "Id" }) }),
|
|
7793
|
+
/* @__PURE__ */ jsx("div", { className: "col-span-8", children: /* @__PURE__ */ jsxs("div", { className: "flex-grow text-surface-900 dark:text-white flex items-center", children: [
|
|
7393
7794
|
/* @__PURE__ */ jsx("span", { className: "flex-grow mr-2", children: entity.id }),
|
|
7394
7795
|
customizationController?.entityLinkBuilder && /* @__PURE__ */ jsx("a", { href: customizationController.entityLinkBuilder({
|
|
7395
7796
|
entity
|
|
7396
7797
|
}), rel: "noopener noreferrer", target: "_blank", children: /* @__PURE__ */ jsx(IconButton, { children: /* @__PURE__ */ jsx(OpenInNewIcon, { size: "small" }) }) })
|
|
7397
|
-
] })
|
|
7798
|
+
] }) })
|
|
7398
7799
|
] }),
|
|
7399
|
-
|
|
7400
|
-
const value = entity.values?.[key];
|
|
7401
|
-
return /* @__PURE__ */ jsxs("div", { className: cls(defaultBorderMixin, "flex justify-between py-2 border-b last:border-b-0"), children: [
|
|
7402
|
-
/* @__PURE__ */ jsx("div", { className: "flex items-center w-1/4", children: /* @__PURE__ */ jsx("span", { className: "pl-2 text-sm text-surface-600", children: property.name }) }),
|
|
7403
|
-
/* @__PURE__ */ jsx("div", { className: "flex-grow p-2 ml-2 w-3/4 text-surface-900 dark:text-white min-h-[56px] flex items-center", children: /* @__PURE__ */ jsx(
|
|
7404
|
-
PropertyPreview,
|
|
7405
|
-
{
|
|
7406
|
-
propertyKey: key,
|
|
7407
|
-
value,
|
|
7408
|
-
property,
|
|
7409
|
-
size: "medium"
|
|
7410
|
-
}
|
|
7411
|
-
) })
|
|
7412
|
-
] }, `reference_previews_${key}`);
|
|
7413
|
-
})
|
|
7800
|
+
/* @__PURE__ */ jsx(PropertyCollectionView, { data: entity.values, properties, size: "medium" })
|
|
7414
7801
|
] }) });
|
|
7415
7802
|
}
|
|
7416
7803
|
function VirtualTableInput(props) {
|
|
@@ -7913,7 +8300,8 @@ function useStorageUploadController({
|
|
|
7913
8300
|
const processFile = storage?.processFile;
|
|
7914
8301
|
const metadata = storage?.metadata;
|
|
7915
8302
|
const size = multipleFilesSupported ? "medium" : "large";
|
|
7916
|
-
const
|
|
8303
|
+
const imageResize = storage?.imageResize;
|
|
8304
|
+
const legacyCompression = storage?.imageCompression;
|
|
7917
8305
|
const internalInitialValue = getInternalInitialValue(multipleFilesSupported, value, metadata, size);
|
|
7918
8306
|
const [initialValue, setInitialValue] = useState(value);
|
|
7919
8307
|
const [internalValue, setInternalValue] = useState(internalInitialValue);
|
|
@@ -7985,6 +8373,11 @@ function useStorageUploadController({
|
|
|
7985
8373
|
onChange(fieldValue ? fieldValue[0] : null);
|
|
7986
8374
|
}
|
|
7987
8375
|
}, [internalValue, multipleFilesSupported, onChange, storage, storageSource]);
|
|
8376
|
+
const onFileUploadError = useCallback((entry_0) => {
|
|
8377
|
+
console.debug("onFileUploadError", entry_0);
|
|
8378
|
+
const newValue_0 = internalValue.filter((item) => item.id !== entry_0.id);
|
|
8379
|
+
setInternalValue(newValue_0);
|
|
8380
|
+
}, [internalValue]);
|
|
7988
8381
|
const onFilesAdded = useCallback(async (acceptedFiles) => {
|
|
7989
8382
|
if (!acceptedFiles.length || disabled) return;
|
|
7990
8383
|
if (processFile) {
|
|
@@ -8003,8 +8396,8 @@ function useStorageUploadController({
|
|
|
8003
8396
|
let newInternalValue;
|
|
8004
8397
|
if (multipleFilesSupported) {
|
|
8005
8398
|
newInternalValue = [...internalValue, ...await Promise.all(acceptedFiles.map(async (file_2) => {
|
|
8006
|
-
if (
|
|
8007
|
-
file_2 = await
|
|
8399
|
+
if ((imageResize || legacyCompression) && isImageFile(file_2)) {
|
|
8400
|
+
file_2 = await resizeImage(file_2, imageResize, legacyCompression);
|
|
8008
8401
|
}
|
|
8009
8402
|
return {
|
|
8010
8403
|
id: getRandomId$2(),
|
|
@@ -8016,8 +8409,8 @@ function useStorageUploadController({
|
|
|
8016
8409
|
}))];
|
|
8017
8410
|
} else {
|
|
8018
8411
|
let file_3 = acceptedFiles[0];
|
|
8019
|
-
if (
|
|
8020
|
-
file_3 = await
|
|
8412
|
+
if ((imageResize || legacyCompression) && isImageFile(file_3)) {
|
|
8413
|
+
file_3 = await resizeImage(file_3, imageResize, legacyCompression);
|
|
8021
8414
|
}
|
|
8022
8415
|
newInternalValue = [{
|
|
8023
8416
|
id: getRandomId$2(),
|
|
@@ -8029,7 +8422,7 @@ function useStorageUploadController({
|
|
|
8029
8422
|
}
|
|
8030
8423
|
newInternalValue = removeDuplicates(newInternalValue);
|
|
8031
8424
|
setInternalValue(newInternalValue);
|
|
8032
|
-
}, [disabled, fileNameBuilder, internalValue, metadata, multipleFilesSupported, size]);
|
|
8425
|
+
}, [disabled, fileNameBuilder, internalValue, metadata, multipleFilesSupported, size, imageResize, legacyCompression]);
|
|
8033
8426
|
return {
|
|
8034
8427
|
internalValue,
|
|
8035
8428
|
setInternalValue,
|
|
@@ -8037,6 +8430,7 @@ function useStorageUploadController({
|
|
|
8037
8430
|
fileNameBuilder,
|
|
8038
8431
|
storagePathBuilder,
|
|
8039
8432
|
onFileUploadComplete,
|
|
8433
|
+
onFileUploadError,
|
|
8040
8434
|
onFilesAdded,
|
|
8041
8435
|
multipleFilesSupported
|
|
8042
8436
|
};
|
|
@@ -8067,22 +8461,42 @@ function removeDuplicates(items) {
|
|
|
8067
8461
|
function getRandomId$2() {
|
|
8068
8462
|
return Math.floor(Math.random() * Math.floor(Number.MAX_SAFE_INTEGER));
|
|
8069
8463
|
}
|
|
8070
|
-
|
|
8071
|
-
"image/jpeg"
|
|
8072
|
-
|
|
8073
|
-
|
|
8074
|
-
|
|
8075
|
-
const
|
|
8076
|
-
const
|
|
8077
|
-
const
|
|
8078
|
-
|
|
8079
|
-
|
|
8080
|
-
|
|
8081
|
-
|
|
8082
|
-
|
|
8083
|
-
|
|
8084
|
-
|
|
8085
|
-
|
|
8464
|
+
function isImageFile(file) {
|
|
8465
|
+
return file.type === "image/jpeg" || file.type === "image/png" || file.type === "image/webp";
|
|
8466
|
+
}
|
|
8467
|
+
async function resizeImage(file, imageResize, legacyCompression) {
|
|
8468
|
+
const maxWidth = imageResize?.maxWidth ?? legacyCompression?.maxWidth;
|
|
8469
|
+
const maxHeight = imageResize?.maxHeight ?? legacyCompression?.maxHeight;
|
|
8470
|
+
const quality = (imageResize?.quality ?? legacyCompression?.quality ?? 80) / 100;
|
|
8471
|
+
const mode = imageResize?.mode ?? "contain";
|
|
8472
|
+
let mimeType = file.type;
|
|
8473
|
+
if (imageResize?.format && imageResize.format !== "original") {
|
|
8474
|
+
mimeType = `image/${imageResize.format}`;
|
|
8475
|
+
}
|
|
8476
|
+
return new Promise((resolve, reject) => {
|
|
8477
|
+
new Compressor(file, {
|
|
8478
|
+
quality,
|
|
8479
|
+
maxWidth,
|
|
8480
|
+
maxHeight,
|
|
8481
|
+
mimeType,
|
|
8482
|
+
// Use cover mode if specified (crops to fit)
|
|
8483
|
+
// Otherwise use contain mode (scales to fit)
|
|
8484
|
+
...mode === "cover" || mode === void 0 ? {
|
|
8485
|
+
width: maxWidth,
|
|
8486
|
+
height: maxHeight,
|
|
8487
|
+
resize: "cover"
|
|
8488
|
+
} : {},
|
|
8489
|
+
success: (result) => {
|
|
8490
|
+
const compressedFile = new File([result], file.name, {
|
|
8491
|
+
type: result.type,
|
|
8492
|
+
lastModified: Date.now()
|
|
8493
|
+
});
|
|
8494
|
+
resolve(compressedFile);
|
|
8495
|
+
},
|
|
8496
|
+
error: reject
|
|
8497
|
+
});
|
|
8498
|
+
});
|
|
8499
|
+
}
|
|
8086
8500
|
function StorageUploadProgress({
|
|
8087
8501
|
storagePath,
|
|
8088
8502
|
entry,
|
|
@@ -9756,50 +10170,41 @@ function customReviver(key, value) {
|
|
|
9756
10170
|
}
|
|
9757
10171
|
return value;
|
|
9758
10172
|
}
|
|
9759
|
-
if (isLocalStorageAvailable) {
|
|
9760
|
-
try {
|
|
9761
|
-
for (let i = 0; i < localStorage.length; i++) {
|
|
9762
|
-
const fullKey = localStorage.key(i);
|
|
9763
|
-
if (fullKey && fullKey.startsWith(LOCAL_STORAGE_PREFIX)) {
|
|
9764
|
-
const path = fullKey.substring(LOCAL_STORAGE_PREFIX.length);
|
|
9765
|
-
const entityString = localStorage.getItem(fullKey);
|
|
9766
|
-
if (entityString) {
|
|
9767
|
-
try {
|
|
9768
|
-
const entity = JSON.parse(entityString, customReviver);
|
|
9769
|
-
entityCache.set(path, entity);
|
|
9770
|
-
} catch (parseError) {
|
|
9771
|
-
console.error(`Failed to parse entity for path "${path}" from localStorage:`, parseError);
|
|
9772
|
-
}
|
|
9773
|
-
}
|
|
9774
|
-
}
|
|
9775
|
-
}
|
|
9776
|
-
} catch (error) {
|
|
9777
|
-
console.error("Error accessing localStorage during initialization:", error);
|
|
9778
|
-
}
|
|
9779
|
-
}
|
|
9780
10173
|
function saveEntityToCache(path, data) {
|
|
9781
|
-
entityCache.set(path, data);
|
|
9782
10174
|
if (isLocalStorageAvailable) {
|
|
9783
10175
|
try {
|
|
9784
10176
|
const key = LOCAL_STORAGE_PREFIX + path;
|
|
9785
10177
|
const entityString = JSON.stringify(data, customReplacer);
|
|
10178
|
+
console.log("Saving entity to localStorage:", {
|
|
10179
|
+
key,
|
|
10180
|
+
entityString
|
|
10181
|
+
});
|
|
9786
10182
|
localStorage.setItem(key, entityString);
|
|
9787
10183
|
} catch (error) {
|
|
9788
10184
|
console.error(`Failed to save entity for path "${path}" to localStorage:`, error);
|
|
9789
10185
|
}
|
|
9790
10186
|
}
|
|
9791
10187
|
}
|
|
10188
|
+
function removeEntityFromMemoryCache(path) {
|
|
10189
|
+
entityCache.delete(path);
|
|
10190
|
+
}
|
|
10191
|
+
function saveEntityToMemoryCache(path, data) {
|
|
10192
|
+
entityCache.set(path, data);
|
|
10193
|
+
}
|
|
10194
|
+
function getEntityFromMemoryCache(path) {
|
|
10195
|
+
return entityCache.get(path);
|
|
10196
|
+
}
|
|
9792
10197
|
function getEntityFromCache(path) {
|
|
9793
|
-
if (entityCache.has(path)) {
|
|
9794
|
-
return entityCache.get(path);
|
|
9795
|
-
}
|
|
9796
10198
|
if (isLocalStorageAvailable) {
|
|
9797
10199
|
try {
|
|
9798
10200
|
const key = LOCAL_STORAGE_PREFIX + path;
|
|
9799
10201
|
const entityString = localStorage.getItem(key);
|
|
9800
10202
|
if (entityString) {
|
|
9801
10203
|
const entity = JSON.parse(entityString, customReviver);
|
|
9802
|
-
|
|
10204
|
+
console.log("Loaded entity from localStorage:", {
|
|
10205
|
+
key,
|
|
10206
|
+
entity
|
|
10207
|
+
});
|
|
9803
10208
|
return entity;
|
|
9804
10209
|
}
|
|
9805
10210
|
} catch (error) {
|
|
@@ -9808,12 +10213,7 @@ function getEntityFromCache(path) {
|
|
|
9808
10213
|
}
|
|
9809
10214
|
return void 0;
|
|
9810
10215
|
}
|
|
9811
|
-
function hasEntityInCache(path) {
|
|
9812
|
-
return entityCache.has(path);
|
|
9813
|
-
}
|
|
9814
10216
|
function removeEntityFromCache(path) {
|
|
9815
|
-
console.debug("Removing entity from cache", path);
|
|
9816
|
-
entityCache.delete(path);
|
|
9817
10217
|
if (isLocalStorageAvailable) {
|
|
9818
10218
|
try {
|
|
9819
10219
|
const key = LOCAL_STORAGE_PREFIX + path;
|
|
@@ -9823,6 +10223,26 @@ function removeEntityFromCache(path) {
|
|
|
9823
10223
|
}
|
|
9824
10224
|
}
|
|
9825
10225
|
}
|
|
10226
|
+
function flattenKeys(obj, prefix = "", result = []) {
|
|
10227
|
+
if (isObject(obj) || Array.isArray(obj)) {
|
|
10228
|
+
const plainObject = isPlainObject(obj);
|
|
10229
|
+
if (!plainObject && prefix) {
|
|
10230
|
+
result.push(prefix);
|
|
10231
|
+
} else {
|
|
10232
|
+
for (const key in obj) {
|
|
10233
|
+
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
10234
|
+
const newKey = prefix ? Array.isArray(obj) ? `${prefix}[${key}]` : `${prefix}.${key}` : key;
|
|
10235
|
+
if (isObject(obj[key]) || Array.isArray(obj[key])) {
|
|
10236
|
+
flattenKeys(obj[key], newKey, result);
|
|
10237
|
+
} else {
|
|
10238
|
+
result.push(newKey);
|
|
10239
|
+
}
|
|
10240
|
+
}
|
|
10241
|
+
}
|
|
10242
|
+
}
|
|
10243
|
+
}
|
|
10244
|
+
return result;
|
|
10245
|
+
}
|
|
9826
10246
|
const EntityCollectionRowActions = function EntityCollectionRowActions2({
|
|
9827
10247
|
entity,
|
|
9828
10248
|
collection,
|
|
@@ -9850,7 +10270,9 @@ const EntityCollectionRowActions = function EntityCollectionRowActions2({
|
|
|
9850
10270
|
const hasCollapsedActions = actions.some((a) => a.collapsed || a.collapsed === void 0);
|
|
9851
10271
|
const collapsedActions = actions.filter((a_0) => a_0.collapsed || a_0.collapsed === void 0);
|
|
9852
10272
|
const uncollapsedActions = actions.filter((a_1) => a_1.collapsed === false);
|
|
9853
|
-
const
|
|
10273
|
+
const enableLocalChangesBackup = collection ? getLocalChangesBackup(collection) : false;
|
|
10274
|
+
const hasDraft = enableLocalChangesBackup ? getEntityFromCache(fullPath + "/" + entity.id) : false;
|
|
10275
|
+
const iconSize = largeLayout && (size === "m" || size === "l" || size == "xl") ? "medium" : "small";
|
|
9854
10276
|
return /* @__PURE__ */ jsxs("div", { className: cls("h-full flex items-center justify-center flex-col bg-surface-50 dark:bg-surface-900 bg-opacity-90 dark:bg-opacity-90 z-10", frozen ? "sticky left-0" : ""), onClick: useCallback((event) => {
|
|
9855
10277
|
event.stopPropagation();
|
|
9856
10278
|
}, []), style: {
|
|
@@ -9860,23 +10282,31 @@ const EntityCollectionRowActions = function EntityCollectionRowActions2({
|
|
|
9860
10282
|
contain: "strict"
|
|
9861
10283
|
}, children: [
|
|
9862
10284
|
(hasActions || selectionEnabled) && /* @__PURE__ */ jsxs("div", { className: "w-34 flex justify-center", children: [
|
|
9863
|
-
uncollapsedActions.map((action, index) =>
|
|
9864
|
-
|
|
9865
|
-
action.
|
|
9866
|
-
|
|
9867
|
-
|
|
9868
|
-
|
|
9869
|
-
|
|
9870
|
-
|
|
9871
|
-
|
|
9872
|
-
|
|
9873
|
-
|
|
9874
|
-
|
|
9875
|
-
|
|
9876
|
-
|
|
9877
|
-
|
|
9878
|
-
|
|
9879
|
-
|
|
10285
|
+
uncollapsedActions.map((action, index) => {
|
|
10286
|
+
const isEditAction = action.key === "edit";
|
|
10287
|
+
const tooltip = isEditAction && hasDraft ? "Local unsaved changes" : action.name;
|
|
10288
|
+
let iconButton = /* @__PURE__ */ jsx(IconButton, { onClick: (event_0) => {
|
|
10289
|
+
event_0.stopPropagation();
|
|
10290
|
+
action.onClick({
|
|
10291
|
+
view: "collection",
|
|
10292
|
+
entity,
|
|
10293
|
+
fullPath,
|
|
10294
|
+
fullIdPath,
|
|
10295
|
+
collection,
|
|
10296
|
+
context,
|
|
10297
|
+
selectionController,
|
|
10298
|
+
highlightEntity,
|
|
10299
|
+
unhighlightEntity,
|
|
10300
|
+
onCollectionChange,
|
|
10301
|
+
openEntityMode: openEntityMode ?? collection?.openEntityMode
|
|
10302
|
+
});
|
|
10303
|
+
}, size: iconSize, children: action.icon });
|
|
10304
|
+
if (isEditAction && hasDraft) {
|
|
10305
|
+
iconButton = /* @__PURE__ */ jsx(Badge, { color: "warning", children: iconButton });
|
|
10306
|
+
}
|
|
10307
|
+
return /* @__PURE__ */ jsx(Tooltip, { title: tooltip, asChild: true, children: iconButton }, index);
|
|
10308
|
+
}),
|
|
10309
|
+
hasCollapsedActions && /* @__PURE__ */ jsx(Menu, { trigger: /* @__PURE__ */ jsx(IconButton, { size: iconSize, children: /* @__PURE__ */ jsx(MoreVertIcon, {}) }), children: collapsedActions.map((action_0, index_0) => /* @__PURE__ */ jsxs(MenuItem, { onClick: (e) => {
|
|
9880
10310
|
e.stopPropagation();
|
|
9881
10311
|
action_0.onClick({
|
|
9882
10312
|
view: "collection",
|
|
@@ -9895,14 +10325,11 @@ const EntityCollectionRowActions = function EntityCollectionRowActions2({
|
|
|
9895
10325
|
action_0.icon,
|
|
9896
10326
|
action_0.name
|
|
9897
10327
|
] }, index_0)) }),
|
|
9898
|
-
selectionEnabled && /* @__PURE__ */ jsx(Tooltip, { title: `Select ${entity.id}`, children: /* @__PURE__ */ jsx(Checkbox, { size:
|
|
10328
|
+
selectionEnabled && /* @__PURE__ */ jsx(Tooltip, { title: `Select ${entity.id}`, children: /* @__PURE__ */ jsx(Checkbox, { size: iconSize, checked: Boolean(isSelected), onCheckedChange }) })
|
|
9899
10329
|
] }),
|
|
9900
|
-
!hideId && size !== "xs" && /* @__PURE__ */
|
|
10330
|
+
!hideId && size !== "xs" && /* @__PURE__ */ jsx("div", { className: "w-[138px] overflow-hidden truncate font-mono text-xs text-text-secondary dark:text-text-secondary-dark max-w-full text-ellipsis px-2 align-center justify-center flex items-center gap-1", onClick: (event_1) => {
|
|
9901
10331
|
event_1.stopPropagation();
|
|
9902
|
-
}, children:
|
|
9903
|
-
hasDraft && /* @__PURE__ */ jsx(Tooltip, { title: "Local unsaved changes", className: "inline", children: /* @__PURE__ */ jsx(Chip, { colorScheme: "orangeDarker", className: "p-0.5", children: /* @__PURE__ */ jsx(EditIcon, { size: 12 }) }) }),
|
|
9904
|
-
/* @__PURE__ */ jsx("span", { className: "min-w-0 truncate text-center", children: entity ? entity.id : /* @__PURE__ */ jsx(Skeleton, {}) })
|
|
9905
|
-
] })
|
|
10332
|
+
}, children: /* @__PURE__ */ jsx("span", { className: "min-w-0 truncate text-center", children: entity ? entity.id : /* @__PURE__ */ jsx(Skeleton, {}) }) })
|
|
9906
10333
|
] });
|
|
9907
10334
|
};
|
|
9908
10335
|
function CollectionTableToolbar(t0) {
|
|
@@ -11414,7 +11841,7 @@ function StringNumberFilterField(t0) {
|
|
|
11414
11841
|
if (value_1 !== "") {
|
|
11415
11842
|
updateFilter(operation, dataType === "number" ? parseInt(value_1) : value_1);
|
|
11416
11843
|
}
|
|
11417
|
-
}, endAdornment: internalValue && /* @__PURE__ */ jsx(IconButton, {
|
|
11844
|
+
}, endAdornment: internalValue && /* @__PURE__ */ jsx(IconButton, { onClick: (e_0) => updateFilter(operation, void 0), children: /* @__PURE__ */ jsx(CloseIcon, {}) }), renderValue: (enumKey) => {
|
|
11418
11845
|
if (enumKey === null) {
|
|
11419
11846
|
return "Filter for null values";
|
|
11420
11847
|
}
|
|
@@ -11571,7 +11998,7 @@ const operationLabels = {
|
|
|
11571
11998
|
};
|
|
11572
11999
|
const multipleSelectOperations = ["array-contains-any", "in"];
|
|
11573
12000
|
function DateTimeFilterField(t0) {
|
|
11574
|
-
const $ = c(
|
|
12001
|
+
const $ = c(39);
|
|
11575
12002
|
const {
|
|
11576
12003
|
isArray,
|
|
11577
12004
|
mode,
|
|
@@ -11612,7 +12039,7 @@ function DateTimeFilterField(t0) {
|
|
|
11612
12039
|
newValue = newOpIsArray ? val ? [val] : [] : "";
|
|
11613
12040
|
}
|
|
11614
12041
|
setOperation(op);
|
|
11615
|
-
setInternalValue(newValue
|
|
12042
|
+
setInternalValue(newValue);
|
|
11616
12043
|
const hasNewValue = newValue !== null && Array.isArray(newValue) ? newValue.length > 0 : newValue !== void 0;
|
|
11617
12044
|
if (op && hasNewValue) {
|
|
11618
12045
|
setValue([op, newValue]);
|
|
@@ -11656,83 +12083,85 @@ function DateTimeFilterField(t0) {
|
|
|
11656
12083
|
} else {
|
|
11657
12084
|
t6 = $[16];
|
|
11658
12085
|
}
|
|
11659
|
-
const t7 = internalValue
|
|
11660
|
-
|
|
12086
|
+
const t7 = internalValue === null;
|
|
12087
|
+
const t8 = internalValue ?? void 0;
|
|
12088
|
+
let t9;
|
|
11661
12089
|
if ($[17] !== operation || $[18] !== updateFilter) {
|
|
11662
|
-
|
|
12090
|
+
t9 = (dateValue) => {
|
|
11663
12091
|
updateFilter(operation, dateValue === null ? void 0 : dateValue);
|
|
11664
12092
|
};
|
|
11665
12093
|
$[17] = operation;
|
|
11666
12094
|
$[18] = updateFilter;
|
|
11667
|
-
$[19] =
|
|
12095
|
+
$[19] = t9;
|
|
11668
12096
|
} else {
|
|
11669
|
-
|
|
12097
|
+
t9 = $[19];
|
|
11670
12098
|
}
|
|
11671
|
-
let
|
|
11672
|
-
if ($[20] !== locale || $[21] !== mode || $[22] !== t7 || $[23] !== t8) {
|
|
11673
|
-
|
|
12099
|
+
let t10;
|
|
12100
|
+
if ($[20] !== locale || $[21] !== mode || $[22] !== t7 || $[23] !== t8 || $[24] !== t9) {
|
|
12101
|
+
t10 = /* @__PURE__ */ jsx(DateTimeField, { mode, size: "large", locale, disabled: t7, value: t8, onChange: t9, clearable: true });
|
|
11674
12102
|
$[20] = locale;
|
|
11675
12103
|
$[21] = mode;
|
|
11676
12104
|
$[22] = t7;
|
|
11677
12105
|
$[23] = t8;
|
|
11678
12106
|
$[24] = t9;
|
|
12107
|
+
$[25] = t10;
|
|
11679
12108
|
} else {
|
|
11680
|
-
|
|
12109
|
+
t10 = $[25];
|
|
11681
12110
|
}
|
|
11682
|
-
const
|
|
11683
|
-
let
|
|
11684
|
-
if ($[
|
|
11685
|
-
|
|
12111
|
+
const t11 = internalValue === null;
|
|
12112
|
+
let t12;
|
|
12113
|
+
if ($[26] !== internalValue || $[27] !== operation || $[28] !== updateFilter) {
|
|
12114
|
+
t12 = (checked) => {
|
|
11686
12115
|
if (internalValue !== null) {
|
|
11687
12116
|
updateFilter(operation, null);
|
|
11688
12117
|
} else {
|
|
11689
12118
|
updateFilter(operation, void 0);
|
|
11690
12119
|
}
|
|
11691
12120
|
};
|
|
11692
|
-
$[
|
|
11693
|
-
$[
|
|
11694
|
-
$[
|
|
11695
|
-
$[
|
|
12121
|
+
$[26] = internalValue;
|
|
12122
|
+
$[27] = operation;
|
|
12123
|
+
$[28] = updateFilter;
|
|
12124
|
+
$[29] = t12;
|
|
11696
12125
|
} else {
|
|
11697
|
-
|
|
12126
|
+
t12 = $[29];
|
|
11698
12127
|
}
|
|
11699
|
-
let
|
|
11700
|
-
if ($[
|
|
11701
|
-
|
|
11702
|
-
/* @__PURE__ */ jsx(Checkbox, { id: "null-filter", checked:
|
|
12128
|
+
let t13;
|
|
12129
|
+
if ($[30] !== t11 || $[31] !== t12) {
|
|
12130
|
+
t13 = /* @__PURE__ */ jsxs(Label, { className: "border cursor-pointer rounded-md p-2 flex items-center gap-2 [&:has(:checked)]:bg-surface-100 dark:[&:has(:checked)]:bg-surface-800", htmlFor: "null-filter", children: [
|
|
12131
|
+
/* @__PURE__ */ jsx(Checkbox, { id: "null-filter", checked: t11, size: "small", onCheckedChange: t12 }),
|
|
11703
12132
|
"Filter for null values"
|
|
11704
12133
|
] });
|
|
11705
|
-
$[29] = t10;
|
|
11706
12134
|
$[30] = t11;
|
|
11707
12135
|
$[31] = t12;
|
|
12136
|
+
$[32] = t13;
|
|
11708
12137
|
} else {
|
|
11709
|
-
|
|
12138
|
+
t13 = $[32];
|
|
11710
12139
|
}
|
|
11711
|
-
let
|
|
11712
|
-
if ($[
|
|
11713
|
-
|
|
11714
|
-
|
|
11715
|
-
|
|
12140
|
+
let t14;
|
|
12141
|
+
if ($[33] !== t10 || $[34] !== t13) {
|
|
12142
|
+
t14 = /* @__PURE__ */ jsxs("div", { className: "flex-grow ml-2 flex flex-col gap-2", children: [
|
|
12143
|
+
t10,
|
|
12144
|
+
t13
|
|
11716
12145
|
] });
|
|
11717
|
-
$[
|
|
11718
|
-
$[33] = t9;
|
|
12146
|
+
$[33] = t10;
|
|
11719
12147
|
$[34] = t13;
|
|
12148
|
+
$[35] = t14;
|
|
11720
12149
|
} else {
|
|
11721
|
-
|
|
12150
|
+
t14 = $[35];
|
|
11722
12151
|
}
|
|
11723
|
-
let
|
|
11724
|
-
if ($[
|
|
11725
|
-
|
|
12152
|
+
let t15;
|
|
12153
|
+
if ($[36] !== t14 || $[37] !== t6) {
|
|
12154
|
+
t15 = /* @__PURE__ */ jsxs("div", { className: "flex w-[440px]", children: [
|
|
11726
12155
|
t6,
|
|
11727
|
-
|
|
12156
|
+
t14
|
|
11728
12157
|
] });
|
|
11729
|
-
$[
|
|
11730
|
-
$[
|
|
11731
|
-
$[
|
|
12158
|
+
$[36] = t14;
|
|
12159
|
+
$[37] = t6;
|
|
12160
|
+
$[38] = t15;
|
|
11732
12161
|
} else {
|
|
11733
|
-
|
|
12162
|
+
t15 = $[38];
|
|
11734
12163
|
}
|
|
11735
|
-
return
|
|
12164
|
+
return t15;
|
|
11736
12165
|
}
|
|
11737
12166
|
function _temp2$5(op_1) {
|
|
11738
12167
|
return /* @__PURE__ */ jsx(SelectItem, { value: op_1, children: operationLabels[op_1] }, op_1);
|
|
@@ -13877,14 +14306,16 @@ function SortableNavigationGroup(t0) {
|
|
|
13877
14306
|
return t5;
|
|
13878
14307
|
}
|
|
13879
14308
|
function useHomePageDnd({
|
|
13880
|
-
items
|
|
13881
|
-
setItems
|
|
14309
|
+
items,
|
|
14310
|
+
setItems,
|
|
13882
14311
|
disabled,
|
|
13883
14312
|
onCardMovedBetweenGroups,
|
|
13884
14313
|
onGroupMoved,
|
|
13885
14314
|
onNewGroupDrop,
|
|
13886
14315
|
onPersist
|
|
13887
14316
|
}) {
|
|
14317
|
+
const dndItems = items;
|
|
14318
|
+
const setDndItems = setItems;
|
|
13888
14319
|
const [activeId, setActiveId] = useState(null);
|
|
13889
14320
|
const [activeIsGroup, setActiveIsGroup] = useState(false);
|
|
13890
14321
|
const [currentDraggingGroupId, setCurrentDraggingGroupId] = useState(null);
|
|
@@ -13892,6 +14323,9 @@ function useHomePageDnd({
|
|
|
13892
14323
|
const [isDraggingCardOnly, setIsDraggingCardOnly] = useState(false);
|
|
13893
14324
|
const [dialogOpenForGroup, setDialogOpenForGroup] = useState(null);
|
|
13894
14325
|
const [isHoveringNewGroupDropZone, setIsHoveringNewGroupDropZone] = useState(false);
|
|
14326
|
+
const [pendingNewGroupName, setPendingNewGroupName] = useState(null);
|
|
14327
|
+
const [stateBeforeNewGroup, setStateBeforeNewGroup] = useState(null);
|
|
14328
|
+
const preDragItemsRef = useRef(null);
|
|
13895
14329
|
const interimItemsRef = useRef(null);
|
|
13896
14330
|
useEffect(() => {
|
|
13897
14331
|
interimItemsRef.current = dndItems;
|
|
@@ -13983,6 +14417,7 @@ function useHomePageDnd({
|
|
|
13983
14417
|
}) => {
|
|
13984
14418
|
setDndKitActiveNode(active);
|
|
13985
14419
|
if (disabled) return;
|
|
14420
|
+
preDragItemsRef.current = cloneItemsForDnd(dndItems);
|
|
13986
14421
|
const isGroup = dndItems.some((g_7) => g_7.name === active.id);
|
|
13987
14422
|
if (!active.data.current) active.data.current = {};
|
|
13988
14423
|
active.data.current.type = isGroup ? "group" : "item";
|
|
@@ -14006,18 +14441,30 @@ function useHomePageDnd({
|
|
|
14006
14441
|
if (!activeCont) return;
|
|
14007
14442
|
if (overCont && activeCont !== overCont) {
|
|
14008
14443
|
recentlyMovedToNewContainer.current = true;
|
|
14009
|
-
|
|
14010
|
-
|
|
14011
|
-
|
|
14012
|
-
|
|
14013
|
-
|
|
14014
|
-
|
|
14015
|
-
|
|
14016
|
-
|
|
14017
|
-
|
|
14018
|
-
|
|
14019
|
-
|
|
14020
|
-
|
|
14444
|
+
lastOverId.current = overIdNow;
|
|
14445
|
+
setDndItems((current) => {
|
|
14446
|
+
const newState = cloneItemsForDnd(current);
|
|
14447
|
+
const srcIdx = newState.findIndex((g_8) => g_8.name === activeCont);
|
|
14448
|
+
const tgtIdx = newState.findIndex((g_9) => g_9.name === overCont);
|
|
14449
|
+
if (srcIdx === -1 || tgtIdx === -1) return current;
|
|
14450
|
+
const src = newState[srcIdx];
|
|
14451
|
+
const tgt = newState[tgtIdx];
|
|
14452
|
+
const idxInSrc = src.entries.findIndex((e_2) => e_2.url === activeIdNow);
|
|
14453
|
+
if (idxInSrc === -1) return current;
|
|
14454
|
+
const [moved] = src.entries.splice(idxInSrc, 1);
|
|
14455
|
+
const overIsContainer_0 = overIdNow === overCont;
|
|
14456
|
+
if (overIsContainer_0) {
|
|
14457
|
+
tgt.entries.push(moved);
|
|
14458
|
+
} else {
|
|
14459
|
+
const overIdx = tgt.entries.findIndex((e_3) => e_3.url === overIdNow);
|
|
14460
|
+
if (overIdx !== -1) {
|
|
14461
|
+
tgt.entries.splice(overIdx, 0, moved);
|
|
14462
|
+
} else {
|
|
14463
|
+
tgt.entries.push(moved);
|
|
14464
|
+
}
|
|
14465
|
+
}
|
|
14466
|
+
return newState;
|
|
14467
|
+
});
|
|
14021
14468
|
} else if (activeCont === overCont) {
|
|
14022
14469
|
recentlyMovedToNewContainer.current = false;
|
|
14023
14470
|
}
|
|
@@ -14044,55 +14491,101 @@ function useHomePageDnd({
|
|
|
14044
14491
|
}
|
|
14045
14492
|
}
|
|
14046
14493
|
} else {
|
|
14047
|
-
const
|
|
14494
|
+
const findContainerInState = (id_0, state) => {
|
|
14495
|
+
const group_0 = state.find((g_13) => g_13.name === id_0);
|
|
14496
|
+
if (group_0) return group_0.name;
|
|
14497
|
+
for (const g_14 of state) {
|
|
14498
|
+
if (g_14.entries.some((e_4) => e_4.url === id_0)) return g_14.name;
|
|
14499
|
+
}
|
|
14500
|
+
return void 0;
|
|
14501
|
+
};
|
|
14502
|
+
const sourceState = preDragItemsRef.current || dndItems;
|
|
14503
|
+
const activeCont_0 = findContainerInState(activeIdNow_0, sourceState);
|
|
14504
|
+
findDndContainer(overIdNow_0);
|
|
14048
14505
|
if (overIdNow_0 === "new-group-drop-zone") {
|
|
14049
14506
|
if (activeCont_0) {
|
|
14507
|
+
setStateBeforeNewGroup(cloneItemsForDnd(dndItems));
|
|
14050
14508
|
const newState_1 = cloneItemsForDnd(dndItems);
|
|
14051
|
-
const srcIdx_0 = newState_1.findIndex((
|
|
14509
|
+
const srcIdx_0 = newState_1.findIndex((g_15) => g_15.name === activeCont_0);
|
|
14052
14510
|
if (srcIdx_0 !== -1) {
|
|
14053
14511
|
const src_0 = newState_1[srcIdx_0];
|
|
14054
|
-
const idxInSrc_0 = src_0.entries.findIndex((
|
|
14512
|
+
const idxInSrc_0 = src_0.entries.findIndex((e_5) => e_5.url === activeIdNow_0);
|
|
14055
14513
|
if (idxInSrc_0 !== -1) {
|
|
14056
14514
|
const [dragged] = src_0.entries.splice(idxInSrc_0, 1);
|
|
14057
14515
|
if (src_0.entries.length === 0) newState_1.splice(srcIdx_0, 1);
|
|
14058
14516
|
let tentative = "New Group";
|
|
14059
14517
|
let counter = 1;
|
|
14060
|
-
while (newState_1.some((
|
|
14518
|
+
while (newState_1.some((g_16) => g_16.name === tentative)) tentative = `New Group ${counter++}`;
|
|
14061
14519
|
newState_1.push({
|
|
14062
14520
|
name: tentative,
|
|
14063
14521
|
entries: [dragged]
|
|
14064
14522
|
});
|
|
14065
14523
|
setDndItems(newState_1);
|
|
14066
|
-
|
|
14524
|
+
setPendingNewGroupName(tentative);
|
|
14067
14525
|
setDialogOpenForGroup(tentative);
|
|
14068
14526
|
onNewGroupDrop?.();
|
|
14069
14527
|
}
|
|
14070
14528
|
}
|
|
14071
14529
|
}
|
|
14072
14530
|
} else {
|
|
14073
|
-
const
|
|
14074
|
-
if (activeCont_0 ===
|
|
14075
|
-
const grpIdx = dndItems.findIndex((
|
|
14531
|
+
const overCont_1 = findDndContainer(overIdNow_0);
|
|
14532
|
+
if (activeCont_0 === overCont_1) {
|
|
14533
|
+
const grpIdx = dndItems.findIndex((g_17) => g_17.name === activeCont_0);
|
|
14076
14534
|
if (grpIdx !== -1) {
|
|
14077
|
-
const
|
|
14078
|
-
const oldIdx =
|
|
14079
|
-
let newIdx =
|
|
14080
|
-
if (newIdx === -1 && overIdNow_0 === activeCont_0) newIdx =
|
|
14535
|
+
const group_1 = dndItems[grpIdx];
|
|
14536
|
+
const oldIdx = group_1.entries.findIndex((e_6) => e_6.url === activeIdNow_0);
|
|
14537
|
+
let newIdx = group_1.entries.findIndex((e_7) => e_7.url === overIdNow_0);
|
|
14538
|
+
if (newIdx === -1 && overIdNow_0 === activeCont_0) newIdx = group_1.entries.length - 1;
|
|
14081
14539
|
if (oldIdx !== -1 && newIdx !== -1 && oldIdx !== newIdx) {
|
|
14082
|
-
const reordered = arrayMove$1(
|
|
14540
|
+
const reordered = arrayMove$1(group_1.entries, oldIdx, newIdx);
|
|
14083
14541
|
const newState_2 = [...dndItems];
|
|
14084
14542
|
newState_2[grpIdx] = {
|
|
14085
|
-
...
|
|
14543
|
+
...group_1,
|
|
14086
14544
|
entries: reordered
|
|
14087
14545
|
};
|
|
14088
14546
|
setDndItems(newState_2);
|
|
14089
14547
|
onPersist?.(newState_2);
|
|
14090
14548
|
}
|
|
14091
14549
|
}
|
|
14092
|
-
} else if (
|
|
14093
|
-
|
|
14550
|
+
} else if (overCont_1 && activeCont_0 !== overCont_1) {
|
|
14551
|
+
const finalState = cloneItemsForDnd(sourceState);
|
|
14552
|
+
const finalOverId = lastOverId.current || overIdNow_0;
|
|
14553
|
+
const cleanOverCont = findContainerInState(finalOverId, sourceState) || overCont_1;
|
|
14554
|
+
const srcIdx_1 = finalState.findIndex((g_18) => g_18.name === activeCont_0);
|
|
14555
|
+
const tgtIdx_0 = finalState.findIndex((g_19) => g_19.name === cleanOverCont);
|
|
14556
|
+
if (srcIdx_1 !== -1 && tgtIdx_0 !== -1) {
|
|
14557
|
+
const src_1 = finalState[srcIdx_1];
|
|
14558
|
+
const tgt_0 = finalState[tgtIdx_0];
|
|
14559
|
+
const idxInSrc_1 = src_1.entries.findIndex((e_8) => e_8.url === activeIdNow_0);
|
|
14560
|
+
if (idxInSrc_1 !== -1) {
|
|
14561
|
+
const [moved_0] = src_1.entries.splice(idxInSrc_1, 1);
|
|
14562
|
+
const overIsContainer_1 = finalOverId === cleanOverCont;
|
|
14563
|
+
if (overIsContainer_1) {
|
|
14564
|
+
tgt_0.entries.push(moved_0);
|
|
14565
|
+
} else {
|
|
14566
|
+
const overIdx_0 = tgt_0.entries.findIndex((e_9) => e_9.url === finalOverId);
|
|
14567
|
+
if (overIdx_0 !== -1) {
|
|
14568
|
+
tgt_0.entries.splice(overIdx_0, 0, moved_0);
|
|
14569
|
+
} else {
|
|
14570
|
+
tgt_0.entries.push(moved_0);
|
|
14571
|
+
}
|
|
14572
|
+
}
|
|
14573
|
+
if (src_1.entries.length === 0) {
|
|
14574
|
+
finalState.splice(srcIdx_1, 1);
|
|
14575
|
+
}
|
|
14576
|
+
setDndItems(finalState);
|
|
14577
|
+
onPersist?.(finalState);
|
|
14578
|
+
onCardMovedBetweenGroups?.(moved_0);
|
|
14579
|
+
}
|
|
14580
|
+
}
|
|
14581
|
+
} else if (recentlyMovedToNewContainer.current) {
|
|
14582
|
+
console.error("Move between containers detected but conditions not met", {
|
|
14583
|
+
activeCont: activeCont_0,
|
|
14584
|
+
overCont: overCont_1,
|
|
14585
|
+
activeIdNow: activeIdNow_0,
|
|
14586
|
+
overIdNow: overIdNow_0
|
|
14587
|
+
});
|
|
14094
14588
|
}
|
|
14095
|
-
onCardMovedBetweenGroups?.(dndItems.flatMap((g_16) => g_16.entries).find((e_6) => e_6.url === activeIdNow_0));
|
|
14096
14589
|
}
|
|
14097
14590
|
}
|
|
14098
14591
|
resetDragState();
|
|
@@ -14107,11 +14600,11 @@ function useHomePageDnd({
|
|
|
14107
14600
|
};
|
|
14108
14601
|
const handleDragCancel = () => resetDragState();
|
|
14109
14602
|
const handleRenameGroup = (oldName, newName) => {
|
|
14110
|
-
setDndItems((
|
|
14111
|
-
const idx =
|
|
14112
|
-
if (idx === -1) return
|
|
14113
|
-
if (
|
|
14114
|
-
const updated = [...
|
|
14603
|
+
setDndItems((current_0) => {
|
|
14604
|
+
const idx = current_0.findIndex((g_20) => g_20.name === oldName);
|
|
14605
|
+
if (idx === -1) return current_0;
|
|
14606
|
+
if (current_0.some((g_21) => g_21.name === newName && g_21.name !== oldName)) return current_0;
|
|
14607
|
+
const updated = [...current_0];
|
|
14115
14608
|
updated[idx] = {
|
|
14116
14609
|
...updated[idx],
|
|
14117
14610
|
name: newName
|
|
@@ -14119,10 +14612,20 @@ function useHomePageDnd({
|
|
|
14119
14612
|
onPersist?.(updated);
|
|
14120
14613
|
return updated;
|
|
14121
14614
|
});
|
|
14615
|
+
setPendingNewGroupName(null);
|
|
14616
|
+
setStateBeforeNewGroup(null);
|
|
14617
|
+
setDialogOpenForGroup(null);
|
|
14618
|
+
};
|
|
14619
|
+
const handleDialogClose = () => {
|
|
14620
|
+
if (pendingNewGroupName && dialogOpenForGroup === pendingNewGroupName && stateBeforeNewGroup) {
|
|
14621
|
+
setDndItems(stateBeforeNewGroup);
|
|
14622
|
+
}
|
|
14623
|
+
setPendingNewGroupName(null);
|
|
14624
|
+
setStateBeforeNewGroup(null);
|
|
14122
14625
|
setDialogOpenForGroup(null);
|
|
14123
14626
|
};
|
|
14124
|
-
const activeItemForOverlay = disabled || !activeId || activeIsGroup ? null : dndItems.flatMap((
|
|
14125
|
-
const activeGroupData = disabled || !activeId || !activeIsGroup ? null : dndItems.find((
|
|
14627
|
+
const activeItemForOverlay = disabled || !activeId || activeIsGroup ? null : dndItems.flatMap((g_22) => g_22.entries).find((e_10) => e_10.url === activeId) || null;
|
|
14628
|
+
const activeGroupData = disabled || !activeId || !activeIsGroup ? null : dndItems.find((g_23) => g_23.name === activeId) || null;
|
|
14126
14629
|
return {
|
|
14127
14630
|
sensors,
|
|
14128
14631
|
collisionDetection,
|
|
@@ -14140,6 +14643,7 @@ function useHomePageDnd({
|
|
|
14140
14643
|
dialogOpenForGroup,
|
|
14141
14644
|
setDialogOpenForGroup,
|
|
14142
14645
|
handleRenameGroup,
|
|
14646
|
+
handleDialogClose,
|
|
14143
14647
|
isHoveringNewGroupDropZone,
|
|
14144
14648
|
setIsHoveringNewGroupDropZone
|
|
14145
14649
|
};
|
|
@@ -14517,7 +15021,7 @@ function DefaultHomePage({
|
|
|
14517
15021
|
entries: []
|
|
14518
15022
|
});
|
|
14519
15023
|
}
|
|
14520
|
-
allProcessed = allProcessed.filter((g_4) => g_4.entries.length ||
|
|
15024
|
+
allProcessed = allProcessed.filter((g_4) => g_4.entries.length || g_4.name === DEFAULT_GROUP_NAME && hasPluginAdditionalCards);
|
|
14521
15025
|
}
|
|
14522
15026
|
const admin = allProcessed.find((g_5) => g_5.name === ADMIN_GROUP_NAME);
|
|
14523
15027
|
return {
|
|
@@ -14565,6 +15069,7 @@ function DefaultHomePage({
|
|
|
14565
15069
|
dialogOpenForGroup,
|
|
14566
15070
|
setDialogOpenForGroup,
|
|
14567
15071
|
handleRenameGroup,
|
|
15072
|
+
handleDialogClose,
|
|
14568
15073
|
isHoveringNewGroupDropZone,
|
|
14569
15074
|
setIsHoveringNewGroupDropZone
|
|
14570
15075
|
} = useHomePageDnd({
|
|
@@ -14572,7 +15077,6 @@ function DefaultHomePage({
|
|
|
14572
15077
|
setItems: updateItems,
|
|
14573
15078
|
disabled: !allowDragAndDrop || performingSearch,
|
|
14574
15079
|
onPersist: persistNavigationGroups,
|
|
14575
|
-
// ——► persistence here
|
|
14576
15080
|
onGroupMoved: (g_8) => context.analyticsController?.onAnalyticsEvent?.("home_move_group", {
|
|
14577
15081
|
name: g_8
|
|
14578
15082
|
}),
|
|
@@ -14618,7 +15122,7 @@ function DefaultHomePage({
|
|
|
14618
15122
|
frequency: 500
|
|
14619
15123
|
}
|
|
14620
15124
|
}, onDragStart, onDragOver, onDragEnd, onDragCancel, modifiers: dndModifiers, children: [
|
|
14621
|
-
/* @__PURE__ */ jsx(SortableContext, { items: containers, strategy: verticalListSortingStrategy, children: items.map((groupData) => {
|
|
15125
|
+
/* @__PURE__ */ jsx(SortableContext, { items: containers, strategy: verticalListSortingStrategy, children: items.map((groupData, groupIndex) => {
|
|
14622
15126
|
const groupKey = groupData.name;
|
|
14623
15127
|
const entriesInGroup = groupData.entries;
|
|
14624
15128
|
const AdditionalCards = [];
|
|
@@ -14629,7 +15133,7 @@ function DefaultHomePage({
|
|
|
14629
15133
|
group: groupKey === DEFAULT_GROUP_NAME ? void 0 : groupKey,
|
|
14630
15134
|
context
|
|
14631
15135
|
};
|
|
14632
|
-
if (entriesInGroup.length === 0 && (AdditionalCards.length === 0 || performingSearch)
|
|
15136
|
+
if (entriesInGroup.length === 0 && (AdditionalCards.length === 0 || performingSearch)) return null;
|
|
14633
15137
|
return /* @__PURE__ */ jsx(SortableNavigationGroup, { groupName: groupKey, disabled: dndDisabled, children: /* @__PURE__ */ jsx(NavigationGroup, { group: groupKey === DEFAULT_GROUP_NAME ? void 0 : groupKey, minimised: draggingGroupId === groupKey && !isDraggingCardOnly, isPotentialCardDropTarget: isDraggingCardOnly, dndDisabled, onEditGroup: () => {
|
|
14634
15138
|
if (dndDisabled) return;
|
|
14635
15139
|
setDialogOpenForGroup(groupKey);
|
|
@@ -14644,7 +15148,7 @@ function DefaultHomePage({
|
|
|
14644
15148
|
});
|
|
14645
15149
|
} }, entry.url)),
|
|
14646
15150
|
!performingSearch && groupKey.toLowerCase() !== ADMIN_GROUP_NAME.toLowerCase() && AdditionalCards.map((C, i_1) => /* @__PURE__ */ jsx(C, { ...actionProps }, `extra_${groupKey}_${i_1}`))
|
|
14647
|
-
] }) }) }) },
|
|
15151
|
+
] }) }) }) }, `group-${groupIndex}`);
|
|
14648
15152
|
}) }, JSON.stringify(containers)),
|
|
14649
15153
|
/* @__PURE__ */ jsx(NewGroupDropZone, { disabled: dndDisabled, setIsHovering: setIsHoveringNewGroupDropZone }),
|
|
14650
15154
|
/* @__PURE__ */ jsx(DragOverlay, { adjustScale: false, dropAnimation, children: activeGroupData && draggingGroupId === activeGroupData.name ? /* @__PURE__ */ jsx("div", { className: "rounded-lg bg-transparent", style: {
|
|
@@ -14665,7 +15169,7 @@ function DefaultHomePage({
|
|
|
14665
15169
|
additionalPluginChildrenEnd,
|
|
14666
15170
|
additionalChildrenEnd
|
|
14667
15171
|
] }),
|
|
14668
|
-
dialogOpenForGroup && /* @__PURE__ */ jsx(RenameGroupDialog, { open: true, initialName: dialogOpenForGroup, existingGroupNames: items.map((g_9) => g_9.name).filter((n) => n !== dialogOpenForGroup), onClose:
|
|
15172
|
+
dialogOpenForGroup && /* @__PURE__ */ jsx(RenameGroupDialog, { open: true, initialName: dialogOpenForGroup, existingGroupNames: items.map((g_9) => g_9.name).filter((n) => n !== dialogOpenForGroup), onClose: handleDialogClose, onRename: (newName) => {
|
|
14669
15173
|
handleRenameGroup(dialogOpenForGroup, newName);
|
|
14670
15174
|
} })
|
|
14671
15175
|
] });
|
|
@@ -14989,61 +15493,60 @@ function CustomIdField({
|
|
|
14989
15493
|
] });
|
|
14990
15494
|
}
|
|
14991
15495
|
const ErrorFocus = (t0) => {
|
|
14992
|
-
const $ = c(
|
|
15496
|
+
const $ = c(10);
|
|
14993
15497
|
const {
|
|
14994
15498
|
containerRef
|
|
14995
15499
|
} = t0;
|
|
14996
15500
|
const {
|
|
14997
|
-
isSubmitting,
|
|
14998
15501
|
isValidating,
|
|
14999
|
-
errors
|
|
15502
|
+
errors,
|
|
15503
|
+
version
|
|
15000
15504
|
} = useFormex();
|
|
15505
|
+
const prevVersion = useRef(version);
|
|
15001
15506
|
let t1;
|
|
15002
|
-
|
|
15003
|
-
if ($[0] !== containerRef || $[1] !== errors || $[2] !== isSubmitting || $[3] !== isValidating) {
|
|
15507
|
+
if ($[0] !== containerRef?.current || $[1] !== errors || $[2] !== isValidating || $[3] !== version) {
|
|
15004
15508
|
t1 = () => {
|
|
15509
|
+
if (version === prevVersion.current) {
|
|
15510
|
+
return;
|
|
15511
|
+
}
|
|
15005
15512
|
const keys = Object.keys(errors);
|
|
15006
|
-
if (keys.length > 0
|
|
15513
|
+
if (!isValidating && keys.length > 0) {
|
|
15007
15514
|
const errorElement = containerRef?.current?.querySelector(`#form_field_${keys[0]}`);
|
|
15008
|
-
if (errorElement
|
|
15009
|
-
|
|
15010
|
-
|
|
15011
|
-
|
|
15012
|
-
|
|
15013
|
-
top: scrollableParent.scrollTop + top - 196,
|
|
15014
|
-
behavior: "smooth"
|
|
15015
|
-
});
|
|
15016
|
-
}
|
|
15515
|
+
if (errorElement) {
|
|
15516
|
+
errorElement.scrollIntoView({
|
|
15517
|
+
behavior: "smooth",
|
|
15518
|
+
block: "center"
|
|
15519
|
+
});
|
|
15017
15520
|
const input = errorElement.querySelector("input");
|
|
15018
15521
|
if (input) {
|
|
15019
15522
|
input.focus();
|
|
15020
15523
|
}
|
|
15021
15524
|
}
|
|
15525
|
+
prevVersion.current = version;
|
|
15022
15526
|
}
|
|
15023
15527
|
};
|
|
15024
|
-
|
|
15025
|
-
$[0] = containerRef;
|
|
15528
|
+
$[0] = containerRef?.current;
|
|
15026
15529
|
$[1] = errors;
|
|
15027
|
-
$[2] =
|
|
15028
|
-
$[3] =
|
|
15530
|
+
$[2] = isValidating;
|
|
15531
|
+
$[3] = version;
|
|
15029
15532
|
$[4] = t1;
|
|
15030
|
-
$[5] = t2;
|
|
15031
15533
|
} else {
|
|
15032
15534
|
t1 = $[4];
|
|
15033
|
-
|
|
15535
|
+
}
|
|
15536
|
+
let t2;
|
|
15537
|
+
if ($[5] !== containerRef || $[6] !== errors || $[7] !== isValidating || $[8] !== version) {
|
|
15538
|
+
t2 = [isValidating, errors, containerRef, version];
|
|
15539
|
+
$[5] = containerRef;
|
|
15540
|
+
$[6] = errors;
|
|
15541
|
+
$[7] = isValidating;
|
|
15542
|
+
$[8] = version;
|
|
15543
|
+
$[9] = t2;
|
|
15544
|
+
} else {
|
|
15545
|
+
t2 = $[9];
|
|
15034
15546
|
}
|
|
15035
15547
|
useEffect(t1, t2);
|
|
15036
15548
|
return null;
|
|
15037
15549
|
};
|
|
15038
|
-
const isScrollable = (ele) => {
|
|
15039
|
-
const hasScrollableContent = ele && ele.scrollHeight > ele.clientHeight;
|
|
15040
|
-
const overflowYStyle = ele ? window.getComputedStyle(ele).overflowY : null;
|
|
15041
|
-
const isOverflowHidden = overflowYStyle && overflowYStyle.indexOf("hidden") !== -1;
|
|
15042
|
-
return hasScrollableContent && !isOverflowHidden;
|
|
15043
|
-
};
|
|
15044
|
-
const getScrollableParent = (ele) => {
|
|
15045
|
-
return !ele || ele === document.body ? document.body : isScrollable(ele) ? ele : getScrollableParent(ele.parentNode);
|
|
15046
|
-
};
|
|
15047
15550
|
function EntityFormActions(t0) {
|
|
15048
15551
|
const $ = c(16);
|
|
15049
15552
|
const {
|
|
@@ -15064,7 +15567,7 @@ function EntityFormActions(t0) {
|
|
|
15064
15567
|
const context = useFireCMSContext();
|
|
15065
15568
|
const sideEntityController = useSideEntityController();
|
|
15066
15569
|
let t1;
|
|
15067
|
-
if ($[0] !== collection || $[1] !== context || $[2] !== disabled || $[3] !== entity || $[4] !== formContext || $[5] !== formex
|
|
15570
|
+
if ($[0] !== collection || $[1] !== context || $[2] !== disabled || $[3] !== entity || $[4] !== formContext || $[5] !== formex || $[6] !== fullIdPath || $[7] !== fullPath || $[8] !== layout || $[9] !== navigateBack || $[10] !== openEntityMode || $[11] !== pluginActions || $[12] !== savingError || $[13] !== sideEntityController || $[14] !== status) {
|
|
15068
15571
|
t1 = layout === "bottom" ? buildBottomActions$1({
|
|
15069
15572
|
fullPath,
|
|
15070
15573
|
fullIdPath,
|
|
@@ -15073,13 +15576,13 @@ function EntityFormActions(t0) {
|
|
|
15073
15576
|
collection,
|
|
15074
15577
|
context,
|
|
15075
15578
|
sideEntityController,
|
|
15076
|
-
isSubmitting: formex.isSubmitting,
|
|
15077
15579
|
disabled,
|
|
15078
15580
|
status,
|
|
15079
15581
|
pluginActions,
|
|
15080
15582
|
openEntityMode,
|
|
15081
15583
|
navigateBack,
|
|
15082
|
-
formContext
|
|
15584
|
+
formContext,
|
|
15585
|
+
formex
|
|
15083
15586
|
}) : buildSideActions$1({
|
|
15084
15587
|
fullPath,
|
|
15085
15588
|
fullIdPath,
|
|
@@ -15088,18 +15591,18 @@ function EntityFormActions(t0) {
|
|
|
15088
15591
|
collection,
|
|
15089
15592
|
context,
|
|
15090
15593
|
sideEntityController,
|
|
15091
|
-
isSubmitting: formex.isSubmitting,
|
|
15092
15594
|
disabled,
|
|
15093
15595
|
status,
|
|
15094
15596
|
pluginActions,
|
|
15095
|
-
openEntityMode
|
|
15597
|
+
openEntityMode,
|
|
15598
|
+
formex
|
|
15096
15599
|
});
|
|
15097
15600
|
$[0] = collection;
|
|
15098
15601
|
$[1] = context;
|
|
15099
15602
|
$[2] = disabled;
|
|
15100
15603
|
$[3] = entity;
|
|
15101
15604
|
$[4] = formContext;
|
|
15102
|
-
$[5] = formex
|
|
15605
|
+
$[5] = formex;
|
|
15103
15606
|
$[6] = fullIdPath;
|
|
15104
15607
|
$[7] = fullPath;
|
|
15105
15608
|
$[8] = layout;
|
|
@@ -15124,14 +15627,15 @@ function buildBottomActions$1({
|
|
|
15124
15627
|
collection,
|
|
15125
15628
|
context,
|
|
15126
15629
|
sideEntityController,
|
|
15127
|
-
isSubmitting,
|
|
15128
15630
|
disabled,
|
|
15129
15631
|
status,
|
|
15130
15632
|
pluginActions,
|
|
15131
15633
|
openEntityMode,
|
|
15132
15634
|
navigateBack,
|
|
15133
|
-
formContext
|
|
15635
|
+
formContext,
|
|
15636
|
+
formex
|
|
15134
15637
|
}) {
|
|
15638
|
+
const hasErrors = Object.keys(formex.errors).length > 0 && formex.submitCount > 0;
|
|
15135
15639
|
return /* @__PURE__ */ jsxs(DialogActions, { position: "absolute", children: [
|
|
15136
15640
|
savingError && /* @__PURE__ */ jsx("div", { className: "text-right", children: /* @__PURE__ */ jsx(Typography, { color: "error", children: savingError.message }) }),
|
|
15137
15641
|
entity && (formActions ?? []).length > 0 && /* @__PURE__ */ jsx("div", { className: "flex-grow flex overflow-auto no-scrollbar", children: (formActions ?? []).map((action) => /* @__PURE__ */ jsx(IconButton, { color: "primary", onClick: (event) => {
|
|
@@ -15150,8 +15654,8 @@ function buildBottomActions$1({
|
|
|
15150
15654
|
});
|
|
15151
15655
|
}, children: action.icon }, action.name)) }),
|
|
15152
15656
|
pluginActions,
|
|
15153
|
-
/* @__PURE__ */ jsx(Button, { variant: "text", disabled: disabled || isSubmitting, color: "primary", type: "reset", children: status === "existing" ? "Discard" : "Clear" }),
|
|
15154
|
-
/* @__PURE__ */ jsxs(Button, { variant: "filled", color: "primary", type: "submit", disabled: disabled || isSubmitting, children: [
|
|
15657
|
+
/* @__PURE__ */ jsx(Button, { variant: "text", disabled: disabled || formex.isSubmitting, color: "primary", type: "reset", children: status === "existing" ? "Discard" : "Clear" }),
|
|
15658
|
+
/* @__PURE__ */ jsxs(Button, { variant: "filled", color: "primary", type: "submit", disabled: disabled || formex.isSubmitting, startIcon: hasErrors ? /* @__PURE__ */ jsx(ErrorIcon, {}) : void 0, children: [
|
|
15155
15659
|
status === "existing" && "Save",
|
|
15156
15660
|
status === "copy" && "Create copy",
|
|
15157
15661
|
status === "new" && "Create"
|
|
@@ -15168,22 +15672,344 @@ function buildSideActions$1({
|
|
|
15168
15672
|
collection,
|
|
15169
15673
|
context,
|
|
15170
15674
|
sideEntityController,
|
|
15171
|
-
isSubmitting,
|
|
15172
15675
|
disabled,
|
|
15173
15676
|
status,
|
|
15174
|
-
pluginActions
|
|
15677
|
+
pluginActions,
|
|
15678
|
+
formex
|
|
15175
15679
|
}) {
|
|
15680
|
+
const hasErrors = Object.keys(formex.errors).length > 0 && formex.submitCount > 0;
|
|
15176
15681
|
return /* @__PURE__ */ jsxs("div", { className: cls("overflow-auto h-full flex flex-col gap-2 w-80 2xl:w-96 px-4 py-16 sticky top-0 border-l", defaultBorderMixin), children: [
|
|
15177
|
-
/* @__PURE__ */ jsxs(LoadingButton, { fullWidth: true, variant: "filled", color: "primary", type: "submit", size: "large", disabled: disabled || isSubmitting, children: [
|
|
15682
|
+
/* @__PURE__ */ jsxs(LoadingButton, { fullWidth: true, variant: "filled", color: "primary", type: "submit", size: "large", startIcon: hasErrors ? /* @__PURE__ */ jsx(ErrorIcon, {}) : void 0, disabled: disabled || formex.isSubmitting, children: [
|
|
15178
15683
|
status === "existing" && "Save",
|
|
15179
15684
|
status === "copy" && "Create copy",
|
|
15180
15685
|
status === "new" && "Create"
|
|
15181
15686
|
] }),
|
|
15182
|
-
/* @__PURE__ */ jsx(Button, { fullWidth: true, variant: "text", disabled: disabled || isSubmitting, type: "reset", children: status === "existing" ? "Discard" : "Clear" }),
|
|
15687
|
+
/* @__PURE__ */ jsx(Button, { fullWidth: true, variant: "text", disabled: disabled || formex.isSubmitting, type: "reset", children: status === "existing" ? "Discard" : "Clear" }),
|
|
15183
15688
|
pluginActions,
|
|
15184
15689
|
savingError && /* @__PURE__ */ jsx("div", { className: "text-right", children: /* @__PURE__ */ jsx(Typography, { color: "error", children: savingError.message }) })
|
|
15185
15690
|
] });
|
|
15186
15691
|
}
|
|
15692
|
+
function LocalChangesMenu(t0) {
|
|
15693
|
+
const $ = c(42);
|
|
15694
|
+
const {
|
|
15695
|
+
localChangesData,
|
|
15696
|
+
formex,
|
|
15697
|
+
onClearLocalChanges,
|
|
15698
|
+
cacheKey,
|
|
15699
|
+
properties
|
|
15700
|
+
} = t0;
|
|
15701
|
+
const snackbarController = useSnackbarController();
|
|
15702
|
+
const [previewDialogOpen, setPreviewDialogOpen] = useState(false);
|
|
15703
|
+
const [open, setOpen] = useState(false);
|
|
15704
|
+
let t1;
|
|
15705
|
+
if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
|
|
15706
|
+
t1 = () => setOpen(true);
|
|
15707
|
+
$[0] = t1;
|
|
15708
|
+
} else {
|
|
15709
|
+
t1 = $[0];
|
|
15710
|
+
}
|
|
15711
|
+
const handleOpenMenu = t1;
|
|
15712
|
+
let t2;
|
|
15713
|
+
if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
|
|
15714
|
+
t2 = () => setOpen(false);
|
|
15715
|
+
$[1] = t2;
|
|
15716
|
+
} else {
|
|
15717
|
+
t2 = $[1];
|
|
15718
|
+
}
|
|
15719
|
+
const handleCloseMenu = t2;
|
|
15720
|
+
let t3;
|
|
15721
|
+
if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
|
|
15722
|
+
t3 = () => {
|
|
15723
|
+
setPreviewDialogOpen(true);
|
|
15724
|
+
handleCloseMenu();
|
|
15725
|
+
};
|
|
15726
|
+
$[2] = t3;
|
|
15727
|
+
} else {
|
|
15728
|
+
t3 = $[2];
|
|
15729
|
+
}
|
|
15730
|
+
const handlePreview = t3;
|
|
15731
|
+
let t4;
|
|
15732
|
+
if ($[3] !== formex || $[4] !== localChangesData || $[5] !== onClearLocalChanges || $[6] !== snackbarController) {
|
|
15733
|
+
t4 = () => {
|
|
15734
|
+
const mergedValues = mergeDeep(formex.values, localChangesData);
|
|
15735
|
+
const touched = {
|
|
15736
|
+
...formex.touched
|
|
15737
|
+
};
|
|
15738
|
+
const previewKeys = flattenKeys(localChangesData);
|
|
15739
|
+
previewKeys.forEach((key) => {
|
|
15740
|
+
touched[key] = true;
|
|
15741
|
+
});
|
|
15742
|
+
formex.setTouched(touched);
|
|
15743
|
+
formex.setValues(mergedValues);
|
|
15744
|
+
snackbarController.open({
|
|
15745
|
+
type: "info",
|
|
15746
|
+
message: "Local changes applied to the form"
|
|
15747
|
+
});
|
|
15748
|
+
handleCloseMenu();
|
|
15749
|
+
onClearLocalChanges?.();
|
|
15750
|
+
};
|
|
15751
|
+
$[3] = formex;
|
|
15752
|
+
$[4] = localChangesData;
|
|
15753
|
+
$[5] = onClearLocalChanges;
|
|
15754
|
+
$[6] = snackbarController;
|
|
15755
|
+
$[7] = t4;
|
|
15756
|
+
} else {
|
|
15757
|
+
t4 = $[7];
|
|
15758
|
+
}
|
|
15759
|
+
const handleApply = t4;
|
|
15760
|
+
let t5;
|
|
15761
|
+
if ($[8] !== cacheKey || $[9] !== onClearLocalChanges || $[10] !== snackbarController) {
|
|
15762
|
+
t5 = () => {
|
|
15763
|
+
removeEntityFromCache(cacheKey);
|
|
15764
|
+
snackbarController.open({
|
|
15765
|
+
type: "info",
|
|
15766
|
+
message: "Local changes discarded"
|
|
15767
|
+
});
|
|
15768
|
+
handleCloseMenu();
|
|
15769
|
+
onClearLocalChanges?.();
|
|
15770
|
+
};
|
|
15771
|
+
$[8] = cacheKey;
|
|
15772
|
+
$[9] = onClearLocalChanges;
|
|
15773
|
+
$[10] = snackbarController;
|
|
15774
|
+
$[11] = t5;
|
|
15775
|
+
} else {
|
|
15776
|
+
t5 = $[11];
|
|
15777
|
+
}
|
|
15778
|
+
const handleDiscard = t5;
|
|
15779
|
+
let t6;
|
|
15780
|
+
if ($[12] === Symbol.for("react.memo_cache_sentinel")) {
|
|
15781
|
+
t6 = /* @__PURE__ */ jsx(WarningIcon, { size: "smallest", className: "mr-1 text-yellow-600 dark:text-yellow-400" });
|
|
15782
|
+
$[12] = t6;
|
|
15783
|
+
} else {
|
|
15784
|
+
t6 = $[12];
|
|
15785
|
+
}
|
|
15786
|
+
let t7;
|
|
15787
|
+
if ($[13] === Symbol.for("react.memo_cache_sentinel")) {
|
|
15788
|
+
t7 = /* @__PURE__ */ jsxs(Button, { size: "small", className: "font-semibold text-xs rounded-full px-4 py-1 bg-yellow-200 dark:bg-yellow-900 hover:bg-yellow-300 dark:hover:bg-yellow-800 text-yellow-800 dark:text-yellow-200", onClick: handleOpenMenu, children: [
|
|
15789
|
+
t6,
|
|
15790
|
+
"Unsaved Local changes",
|
|
15791
|
+
/* @__PURE__ */ jsx(KeyboardArrowDownIcon, { size: "smallest" })
|
|
15792
|
+
] });
|
|
15793
|
+
$[13] = t7;
|
|
15794
|
+
} else {
|
|
15795
|
+
t7 = $[13];
|
|
15796
|
+
}
|
|
15797
|
+
let t8;
|
|
15798
|
+
if ($[14] === Symbol.for("react.memo_cache_sentinel")) {
|
|
15799
|
+
t8 = /* @__PURE__ */ jsx("div", { className: "max-w-xs px-4 py-4 text-sm text-gray-700 dark:text-gray-300", children: "This document was edited locally and has unsaved changes. These local changes will be lost if you don't apply them." });
|
|
15800
|
+
$[14] = t8;
|
|
15801
|
+
} else {
|
|
15802
|
+
t8 = $[14];
|
|
15803
|
+
}
|
|
15804
|
+
let t9;
|
|
15805
|
+
if ($[15] === Symbol.for("react.memo_cache_sentinel")) {
|
|
15806
|
+
t9 = /* @__PURE__ */ jsxs(MenuItem, { dense: true, onClick: handlePreview, children: [
|
|
15807
|
+
/* @__PURE__ */ jsx(VisibilityIcon, { size: "small" }),
|
|
15808
|
+
"Preview Changes"
|
|
15809
|
+
] });
|
|
15810
|
+
$[15] = t9;
|
|
15811
|
+
} else {
|
|
15812
|
+
t9 = $[15];
|
|
15813
|
+
}
|
|
15814
|
+
let t10;
|
|
15815
|
+
if ($[16] === Symbol.for("react.memo_cache_sentinel")) {
|
|
15816
|
+
t10 = /* @__PURE__ */ jsx(CheckIcon, { size: "small" });
|
|
15817
|
+
$[16] = t10;
|
|
15818
|
+
} else {
|
|
15819
|
+
t10 = $[16];
|
|
15820
|
+
}
|
|
15821
|
+
let t11;
|
|
15822
|
+
if ($[17] !== handleApply) {
|
|
15823
|
+
t11 = /* @__PURE__ */ jsxs(MenuItem, { dense: true, onClick: handleApply, children: [
|
|
15824
|
+
t10,
|
|
15825
|
+
"Apply Changes"
|
|
15826
|
+
] });
|
|
15827
|
+
$[17] = handleApply;
|
|
15828
|
+
$[18] = t11;
|
|
15829
|
+
} else {
|
|
15830
|
+
t11 = $[18];
|
|
15831
|
+
}
|
|
15832
|
+
let t12;
|
|
15833
|
+
if ($[19] === Symbol.for("react.memo_cache_sentinel")) {
|
|
15834
|
+
t12 = /* @__PURE__ */ jsx(CancelIcon, { size: "small" });
|
|
15835
|
+
$[19] = t12;
|
|
15836
|
+
} else {
|
|
15837
|
+
t12 = $[19];
|
|
15838
|
+
}
|
|
15839
|
+
let t13;
|
|
15840
|
+
if ($[20] !== handleDiscard) {
|
|
15841
|
+
t13 = /* @__PURE__ */ jsxs(MenuItem, { dense: true, onClick: handleDiscard, children: [
|
|
15842
|
+
t12,
|
|
15843
|
+
"Discard Local Changes"
|
|
15844
|
+
] });
|
|
15845
|
+
$[20] = handleDiscard;
|
|
15846
|
+
$[21] = t13;
|
|
15847
|
+
} else {
|
|
15848
|
+
t13 = $[21];
|
|
15849
|
+
}
|
|
15850
|
+
let t14;
|
|
15851
|
+
if ($[22] !== open || $[23] !== t11 || $[24] !== t13) {
|
|
15852
|
+
t14 = /* @__PURE__ */ jsxs(Menu, { trigger: t7, open, onOpenChange: setOpen, children: [
|
|
15853
|
+
t8,
|
|
15854
|
+
t9,
|
|
15855
|
+
t11,
|
|
15856
|
+
t13
|
|
15857
|
+
] });
|
|
15858
|
+
$[22] = open;
|
|
15859
|
+
$[23] = t11;
|
|
15860
|
+
$[24] = t13;
|
|
15861
|
+
$[25] = t14;
|
|
15862
|
+
} else {
|
|
15863
|
+
t14 = $[25];
|
|
15864
|
+
}
|
|
15865
|
+
let t15;
|
|
15866
|
+
if ($[26] === Symbol.for("react.memo_cache_sentinel")) {
|
|
15867
|
+
t15 = /* @__PURE__ */ jsx(DialogTitle, { variant: "h6", children: "Preview Local Changes" });
|
|
15868
|
+
$[26] = t15;
|
|
15869
|
+
} else {
|
|
15870
|
+
t15 = $[26];
|
|
15871
|
+
}
|
|
15872
|
+
let t16;
|
|
15873
|
+
if ($[27] === Symbol.for("react.memo_cache_sentinel")) {
|
|
15874
|
+
t16 = /* @__PURE__ */ jsx(Typography, { variant: "body2", className: "mb-4", children: "These are the local changes that will be applied to the form." });
|
|
15875
|
+
$[27] = t16;
|
|
15876
|
+
} else {
|
|
15877
|
+
t16 = $[27];
|
|
15878
|
+
}
|
|
15879
|
+
let t17;
|
|
15880
|
+
if ($[28] === Symbol.for("react.memo_cache_sentinel")) {
|
|
15881
|
+
t17 = {
|
|
15882
|
+
maxHeight: 520,
|
|
15883
|
+
overflow: "auto"
|
|
15884
|
+
};
|
|
15885
|
+
$[28] = t17;
|
|
15886
|
+
} else {
|
|
15887
|
+
t17 = $[28];
|
|
15888
|
+
}
|
|
15889
|
+
const t18 = properties;
|
|
15890
|
+
let t19;
|
|
15891
|
+
if ($[29] !== localChangesData || $[30] !== t18) {
|
|
15892
|
+
t19 = /* @__PURE__ */ jsxs(DialogContent, { className: "my-4", children: [
|
|
15893
|
+
t16,
|
|
15894
|
+
/* @__PURE__ */ jsx("div", { className: `border rounded-lg ${defaultBorderMixin}`, style: t17, children: /* @__PURE__ */ jsx("div", { className: "p-4", children: /* @__PURE__ */ jsx(PropertyCollectionView, { data: localChangesData, properties: t18 }) }) })
|
|
15895
|
+
] });
|
|
15896
|
+
$[29] = localChangesData;
|
|
15897
|
+
$[30] = t18;
|
|
15898
|
+
$[31] = t19;
|
|
15899
|
+
} else {
|
|
15900
|
+
t19 = $[31];
|
|
15901
|
+
}
|
|
15902
|
+
let t20;
|
|
15903
|
+
if ($[32] === Symbol.for("react.memo_cache_sentinel")) {
|
|
15904
|
+
t20 = /* @__PURE__ */ jsx(Button, { onClick: () => setPreviewDialogOpen(false), children: "Close" });
|
|
15905
|
+
$[32] = t20;
|
|
15906
|
+
} else {
|
|
15907
|
+
t20 = $[32];
|
|
15908
|
+
}
|
|
15909
|
+
let t21;
|
|
15910
|
+
if ($[33] !== handleApply) {
|
|
15911
|
+
t21 = /* @__PURE__ */ jsxs(DialogActions, { children: [
|
|
15912
|
+
t20,
|
|
15913
|
+
/* @__PURE__ */ jsx(Button, { variant: "filled", onClick: () => {
|
|
15914
|
+
handleApply();
|
|
15915
|
+
setPreviewDialogOpen(false);
|
|
15916
|
+
}, children: "Apply changes" })
|
|
15917
|
+
] });
|
|
15918
|
+
$[33] = handleApply;
|
|
15919
|
+
$[34] = t21;
|
|
15920
|
+
} else {
|
|
15921
|
+
t21 = $[34];
|
|
15922
|
+
}
|
|
15923
|
+
let t22;
|
|
15924
|
+
if ($[35] !== previewDialogOpen || $[36] !== t19 || $[37] !== t21) {
|
|
15925
|
+
t22 = /* @__PURE__ */ jsxs(Dialog, { open: previewDialogOpen, onOpenChange: setPreviewDialogOpen, maxWidth: "4xl", children: [
|
|
15926
|
+
t15,
|
|
15927
|
+
t19,
|
|
15928
|
+
t21
|
|
15929
|
+
] });
|
|
15930
|
+
$[35] = previewDialogOpen;
|
|
15931
|
+
$[36] = t19;
|
|
15932
|
+
$[37] = t21;
|
|
15933
|
+
$[38] = t22;
|
|
15934
|
+
} else {
|
|
15935
|
+
t22 = $[38];
|
|
15936
|
+
}
|
|
15937
|
+
let t23;
|
|
15938
|
+
if ($[39] !== t14 || $[40] !== t22) {
|
|
15939
|
+
t23 = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
15940
|
+
t14,
|
|
15941
|
+
t22
|
|
15942
|
+
] });
|
|
15943
|
+
$[39] = t14;
|
|
15944
|
+
$[40] = t22;
|
|
15945
|
+
$[41] = t23;
|
|
15946
|
+
} else {
|
|
15947
|
+
t23 = $[41];
|
|
15948
|
+
}
|
|
15949
|
+
return t23;
|
|
15950
|
+
}
|
|
15951
|
+
function extractTouchedValues(values, touched) {
|
|
15952
|
+
let acc = {};
|
|
15953
|
+
if (!touched || typeof touched !== "object") {
|
|
15954
|
+
return acc;
|
|
15955
|
+
}
|
|
15956
|
+
Object.entries(touched).forEach(([key, value]) => {
|
|
15957
|
+
if (value) {
|
|
15958
|
+
acc = setIn(acc, key, getIn(values, key));
|
|
15959
|
+
}
|
|
15960
|
+
});
|
|
15961
|
+
return acc;
|
|
15962
|
+
}
|
|
15963
|
+
function getChanges(source, comparison) {
|
|
15964
|
+
const changes = {};
|
|
15965
|
+
if (!source) {
|
|
15966
|
+
return {};
|
|
15967
|
+
}
|
|
15968
|
+
if (!comparison) {
|
|
15969
|
+
return source;
|
|
15970
|
+
}
|
|
15971
|
+
const allKeys = Array.from(/* @__PURE__ */ new Set([...Object.keys(source), ...Object.keys(comparison)]));
|
|
15972
|
+
for (const key of allKeys) {
|
|
15973
|
+
const sourceValue = source[key];
|
|
15974
|
+
const comparisonValue = comparison[key];
|
|
15975
|
+
if (equal(sourceValue, comparisonValue)) {
|
|
15976
|
+
continue;
|
|
15977
|
+
}
|
|
15978
|
+
const sourceHasKey = source && typeof source === "object" && Object.prototype.hasOwnProperty.call(source, key);
|
|
15979
|
+
const comparisonHasKey = comparison && typeof comparison === "object" && Object.prototype.hasOwnProperty.call(comparison, key);
|
|
15980
|
+
if (comparisonHasKey && !sourceHasKey) {
|
|
15981
|
+
changes[key] = void 0;
|
|
15982
|
+
} else if (Array.isArray(sourceValue)) {
|
|
15983
|
+
const comparisonArray = Array.isArray(comparisonValue) ? comparisonValue : [];
|
|
15984
|
+
if (sourceValue.length < comparisonArray.length) {
|
|
15985
|
+
changes[key] = sourceValue;
|
|
15986
|
+
continue;
|
|
15987
|
+
}
|
|
15988
|
+
const changedArray = sourceValue.map((item, index) => {
|
|
15989
|
+
const comparisonItem = comparisonArray[index];
|
|
15990
|
+
if (equal(item, comparisonItem)) {
|
|
15991
|
+
return null;
|
|
15992
|
+
}
|
|
15993
|
+
if (isObject(item) && item && isObject(comparisonItem) && comparisonItem) {
|
|
15994
|
+
const nestedChanges = getChanges(item, comparisonItem);
|
|
15995
|
+
return Object.keys(nestedChanges).length > 0 ? nestedChanges : item;
|
|
15996
|
+
}
|
|
15997
|
+
return item;
|
|
15998
|
+
});
|
|
15999
|
+
if (changedArray.some((item) => item !== null) || sourceValue.length > comparisonArray.length) {
|
|
16000
|
+
changes[key] = changedArray;
|
|
16001
|
+
}
|
|
16002
|
+
} else if (isObject(sourceValue) && sourceValue && isObject(comparisonValue) && comparisonValue) {
|
|
16003
|
+
const nestedChanges = getChanges(sourceValue, comparisonValue);
|
|
16004
|
+
if (Object.keys(nestedChanges).length > 0) {
|
|
16005
|
+
changes[key] = nestedChanges;
|
|
16006
|
+
}
|
|
16007
|
+
} else {
|
|
16008
|
+
changes[key] = sourceValue;
|
|
16009
|
+
}
|
|
16010
|
+
}
|
|
16011
|
+
return changes;
|
|
16012
|
+
}
|
|
15187
16013
|
function EntityForm({
|
|
15188
16014
|
path,
|
|
15189
16015
|
fullIdPath,
|
|
@@ -15241,7 +16067,7 @@ function EntityForm({
|
|
|
15241
16067
|
const customizationController = useCustomizationController();
|
|
15242
16068
|
const context = useFireCMSContext();
|
|
15243
16069
|
const analyticsController = useAnalyticsController();
|
|
15244
|
-
const [underlyingChanges
|
|
16070
|
+
const [underlyingChanges] = useState({});
|
|
15245
16071
|
const [customIdLoading, setCustomIdLoading] = useState(false);
|
|
15246
16072
|
const mustSetCustomId = (status === "new" || status === "copy") && Boolean(collection.customId) && collection.customId !== "optional";
|
|
15247
16073
|
const initialEntityId = useMemo(() => {
|
|
@@ -15259,6 +16085,12 @@ function EntityForm({
|
|
|
15259
16085
|
const [entityIdError, setEntityIdError] = useState(false);
|
|
15260
16086
|
const [savingError, setSavingError] = useState();
|
|
15261
16087
|
const autoSave = collection.formAutoSave && !collection.customId;
|
|
16088
|
+
const baseInitialValues = useMemo(() => getInitialEntityValues(authController, collection, path, status, entity, customizationController.propertyConfigs), [authController, collection, path, status, entity, customizationController.propertyConfigs]);
|
|
16089
|
+
const localChangesDataRaw = useMemo(() => entityId ? getEntityFromCache(path + "/" + entityId) : getEntityFromCache(path + "#new"), [entityId, path]);
|
|
16090
|
+
const [localChangesCleared, setLocalChangesCleared] = useState(false);
|
|
16091
|
+
const localChangesBackup = getLocalChangesBackup(collection);
|
|
16092
|
+
const autoApplyLocalChanges = localChangesBackup === "auto_apply";
|
|
16093
|
+
const manualApplyLocalChanges = localChangesBackup === "manual_apply";
|
|
15262
16094
|
const onSubmit = (values, formexController) => {
|
|
15263
16095
|
if (mustSetCustomId && !entityId) {
|
|
15264
16096
|
console.error("Missing custom Id");
|
|
@@ -15289,16 +16121,40 @@ function EntityForm({
|
|
|
15289
16121
|
formexController.setSubmitting(false);
|
|
15290
16122
|
});
|
|
15291
16123
|
};
|
|
16124
|
+
const [initialValues_0, initialDirty_0] = useMemo(() => {
|
|
16125
|
+
const initialValuesWithLocalChanges = autoApplyLocalChanges && localChangesDataRaw ? mergeDeep(baseInitialValues, localChangesDataRaw) : baseInitialValues;
|
|
16126
|
+
const initialValues = initialDirtyValues ? mergeDeep(initialValuesWithLocalChanges, initialDirtyValues) : initialValuesWithLocalChanges;
|
|
16127
|
+
const initialDirty = Boolean(initialDirtyValues) && initialDirtyValues && Object.keys(initialDirtyValues).length > 0;
|
|
16128
|
+
return [initialValues, initialDirty];
|
|
16129
|
+
}, [autoApplyLocalChanges, localChangesDataRaw, baseInitialValues, initialDirtyValues]);
|
|
16130
|
+
const localChangesData = useMemo(() => {
|
|
16131
|
+
if (!localChangesDataRaw) {
|
|
16132
|
+
return void 0;
|
|
16133
|
+
}
|
|
16134
|
+
return getChanges(localChangesDataRaw, initialValues_0);
|
|
16135
|
+
}, [localChangesDataRaw, initialValues_0]);
|
|
16136
|
+
const hasLocalChanges = !localChangesCleared && localChangesData && Object.keys(localChangesData).length > 0;
|
|
15292
16137
|
const formex = formexProp ?? useCreateFormex({
|
|
15293
|
-
initialValues:
|
|
15294
|
-
initialDirty:
|
|
16138
|
+
initialValues: initialValues_0,
|
|
16139
|
+
initialDirty: initialDirty_0,
|
|
16140
|
+
initialTouched: initialDirtyValues ? flattenKeys(initialDirtyValues).reduce((previousValue, currentValue) => ({
|
|
16141
|
+
...previousValue,
|
|
16142
|
+
[currentValue]: true
|
|
16143
|
+
}), {}) : {},
|
|
15295
16144
|
onSubmit,
|
|
15296
16145
|
onReset: () => {
|
|
15297
16146
|
clearDirtyCache();
|
|
15298
|
-
onValuesModified?.(false);
|
|
16147
|
+
onValuesModified?.(false, initialValues_0);
|
|
15299
16148
|
},
|
|
15300
|
-
|
|
15301
|
-
|
|
16149
|
+
onValuesChangeDeferred: (values_0, controller) => {
|
|
16150
|
+
const key = status === "new" || status === "copy" ? path + "#new" : path + "/" + entityId;
|
|
16151
|
+
if (controller.dirty) {
|
|
16152
|
+
const touchedValues = extractTouchedValues(values_0, controller.touched);
|
|
16153
|
+
saveEntityToCache(key, touchedValues);
|
|
16154
|
+
}
|
|
16155
|
+
},
|
|
16156
|
+
validation: (values_1) => {
|
|
16157
|
+
return validationSchema?.validate(values_1, {
|
|
15302
16158
|
abortEarly: false
|
|
15303
16159
|
}).then(() => {
|
|
15304
16160
|
return {};
|
|
@@ -15347,14 +16203,16 @@ function EntityForm({
|
|
|
15347
16203
|
}, [snackbarController]);
|
|
15348
16204
|
function clearDirtyCache() {
|
|
15349
16205
|
if (status === "new" || status === "copy") {
|
|
16206
|
+
removeEntityFromMemoryCache(path + "#new");
|
|
15350
16207
|
removeEntityFromCache(path + "#new");
|
|
15351
16208
|
} else {
|
|
16209
|
+
removeEntityFromMemoryCache(path + "/" + entityId);
|
|
15352
16210
|
removeEntityFromCache(path + "/" + entityId);
|
|
15353
16211
|
}
|
|
15354
16212
|
}
|
|
15355
16213
|
const onSaveSuccess = (updatedEntity) => {
|
|
15356
16214
|
clearDirtyCache();
|
|
15357
|
-
onValuesModified?.(false);
|
|
16215
|
+
onValuesModified?.(false, updatedEntity.values);
|
|
15358
16216
|
if (!autoSave) snackbarController.open({
|
|
15359
16217
|
type: "success",
|
|
15360
16218
|
message: `${collection.singularName ?? collection.name}: Saved correctly`
|
|
@@ -15381,7 +16239,7 @@ function EntityForm({
|
|
|
15381
16239
|
console.error(e_3);
|
|
15382
16240
|
}, [entityId, path, snackbarController]);
|
|
15383
16241
|
const saveEntity = ({
|
|
15384
|
-
values:
|
|
16242
|
+
values: values_2,
|
|
15385
16243
|
previousValues,
|
|
15386
16244
|
entityId: entityId_0,
|
|
15387
16245
|
collection: collection_0,
|
|
@@ -15390,7 +16248,7 @@ function EntityForm({
|
|
|
15390
16248
|
return saveEntityWithCallbacks({
|
|
15391
16249
|
path: path_0,
|
|
15392
16250
|
entityId: entityId_0,
|
|
15393
|
-
values:
|
|
16251
|
+
values: values_2,
|
|
15394
16252
|
previousValues,
|
|
15395
16253
|
collection: collection_0,
|
|
15396
16254
|
status,
|
|
@@ -15406,34 +16264,34 @@ function EntityForm({
|
|
|
15406
16264
|
collection: collection_1,
|
|
15407
16265
|
path: path_1,
|
|
15408
16266
|
entityId: entityId_1,
|
|
15409
|
-
values:
|
|
16267
|
+
values: values_3,
|
|
15410
16268
|
previousValues: previousValues_0,
|
|
15411
16269
|
autoSave: autoSave_0
|
|
15412
16270
|
}) => {
|
|
15413
16271
|
if (!status) return;
|
|
15414
16272
|
if (autoSave_0) {
|
|
15415
|
-
setValuesToBeSaved(
|
|
16273
|
+
setValuesToBeSaved(values_3);
|
|
15416
16274
|
} else {
|
|
15417
16275
|
return saveEntity({
|
|
15418
16276
|
collection: collection_1,
|
|
15419
16277
|
path: path_1,
|
|
15420
16278
|
entityId: entityId_1,
|
|
15421
|
-
values:
|
|
16279
|
+
values: values_3,
|
|
15422
16280
|
previousValues: previousValues_0
|
|
15423
16281
|
});
|
|
15424
16282
|
}
|
|
15425
16283
|
};
|
|
15426
16284
|
const lastSavedValues = useRef(entity?.values);
|
|
15427
|
-
const save = (
|
|
15428
|
-
lastSavedValues.current =
|
|
16285
|
+
const save = (values_4) => {
|
|
16286
|
+
lastSavedValues.current = values_4;
|
|
15429
16287
|
return onSaveEntityRequest({
|
|
15430
16288
|
collection: resolvedCollection,
|
|
15431
16289
|
path,
|
|
15432
16290
|
entityId,
|
|
15433
|
-
values:
|
|
16291
|
+
values: values_4,
|
|
15434
16292
|
previousValues: entity?.values,
|
|
15435
16293
|
autoSave: autoSave ?? false
|
|
15436
|
-
}).then((
|
|
16294
|
+
}).then(() => {
|
|
15437
16295
|
const eventName = status === "new" ? "new_entity_saved" : status === "copy" ? "entity_copied" : status === "existing" ? "entity_edited" : "unmapped_event";
|
|
15438
16296
|
analyticsController.onAnalyticsEvent?.(eventName, {
|
|
15439
16297
|
path
|
|
@@ -15467,7 +16325,8 @@ function EntityForm({
|
|
|
15467
16325
|
type: "error",
|
|
15468
16326
|
message: "Error updating id, check the console"
|
|
15469
16327
|
});
|
|
15470
|
-
|
|
16328
|
+
console.error(error);
|
|
16329
|
+
}, [snackbarController]);
|
|
15471
16330
|
const pluginActions = [];
|
|
15472
16331
|
const plugins = customizationController.plugins;
|
|
15473
16332
|
const actionsDisabled = disabled || formex.isSubmitting || status === "existing" && !formex.dirty || Boolean(disabledProp);
|
|
@@ -15513,23 +16372,15 @@ function EntityForm({
|
|
|
15513
16372
|
}, [doOnIdUpdate]);
|
|
15514
16373
|
useEffect(() => {
|
|
15515
16374
|
if (!autoSave) {
|
|
15516
|
-
onValuesModified?.(modified);
|
|
16375
|
+
onValuesModified?.(modified, formex.values);
|
|
15517
16376
|
}
|
|
15518
16377
|
}, [formex.dirty]);
|
|
15519
|
-
const deferredValues = useDeferredValue(formex.values);
|
|
15520
16378
|
const modified = formex.dirty;
|
|
15521
16379
|
const uniqueFieldValidator = useCallback(({
|
|
15522
16380
|
name,
|
|
15523
|
-
value
|
|
15524
|
-
property
|
|
16381
|
+
value
|
|
15525
16382
|
}) => dataSource.checkUniqueField(path, name, value, entityId, collection), [dataSource, path, entityId]);
|
|
15526
16383
|
const validationSchema = useMemo(() => entityId ? getYupEntitySchema(entityId, resolvedCollection.properties, uniqueFieldValidator) : void 0, [entityId, resolvedCollection.properties, uniqueFieldValidator]);
|
|
15527
|
-
useEffect(() => {
|
|
15528
|
-
const key = status === "new" || status === "copy" ? path + "#new" : path + "/" + entityId;
|
|
15529
|
-
if (modified) {
|
|
15530
|
-
saveEntityToCache(key, deferredValues);
|
|
15531
|
-
}
|
|
15532
|
-
}, [deferredValues, modified, path, entityId, status]);
|
|
15533
16384
|
useOnAutoSave(autoSave, formex, lastSavedValues, save);
|
|
15534
16385
|
useEffect(() => {
|
|
15535
16386
|
if (!autoSave && !formex.isSubmitting && underlyingChanges && entity) {
|
|
@@ -15548,18 +16399,18 @@ function EntityForm({
|
|
|
15548
16399
|
return /* @__PURE__ */ jsx(Builder, { collection, entity, modifiedValues: formex.values, formContext });
|
|
15549
16400
|
}
|
|
15550
16401
|
return /* @__PURE__ */ jsx(FormLayout, { children: formFieldKeys.map((key_1) => {
|
|
15551
|
-
const
|
|
15552
|
-
if (
|
|
16402
|
+
const property = resolvedCollection.properties[key_1];
|
|
16403
|
+
if (property) {
|
|
15553
16404
|
const underlyingValueHasChanged = !!underlyingChanges && Object.keys(underlyingChanges).includes(key_1) && formex.touched[key_1];
|
|
15554
|
-
const disabled_0 = disabledProp || !autoSave && formex.isSubmitting || isReadOnly(
|
|
15555
|
-
const hidden = isHidden(
|
|
16405
|
+
const disabled_0 = disabledProp || !autoSave && formex.isSubmitting || isReadOnly(property) || Boolean(property.disabled);
|
|
16406
|
+
const hidden = isHidden(property);
|
|
15556
16407
|
if (hidden) return null;
|
|
15557
|
-
const widthPercentage =
|
|
16408
|
+
const widthPercentage = property.widthPercentage ?? 100;
|
|
15558
16409
|
const cmsFormFieldProps = {
|
|
15559
16410
|
propertyKey: key_1,
|
|
15560
16411
|
disabled: disabled_0,
|
|
15561
|
-
property
|
|
15562
|
-
includeDescription:
|
|
16412
|
+
property,
|
|
16413
|
+
includeDescription: property.description || property.longDescription,
|
|
15563
16414
|
underlyingValueHasChanged: underlyingValueHasChanged && !autoSave,
|
|
15564
16415
|
context: formContext,
|
|
15565
16416
|
partOfArray: false,
|
|
@@ -15615,10 +16466,13 @@ function EntityForm({
|
|
|
15615
16466
|
}
|
|
15616
16467
|
const dialogActions = /* @__PURE__ */ jsx(EntityFormActionsComponent, { collection: resolvedCollection, path, fullPath: path, fullIdPath, entity, layout: forceActionsAtTheBottom ? "bottom" : "side", savingError, formex, disabled: actionsDisabled, status, pluginActions: pluginActions ?? [], openEntityMode, showDefaultActions, navigateBack, formContext });
|
|
15617
16468
|
return /* @__PURE__ */ jsx(Formex, { value: formex, children: /* @__PURE__ */ jsxs("form", { onSubmit: formex.handleSubmit, onReset: () => formex.resetForm({
|
|
15618
|
-
values:
|
|
16469
|
+
values: baseInitialValues
|
|
15619
16470
|
}), noValidate: true, className: cls("flex-1 flex flex-row w-full overflow-y-auto justify-center", className), children: [
|
|
15620
16471
|
/* @__PURE__ */ jsx("div", { id: `form_${path}`, className: cls("relative flex flex-row max-w-4xl lg:max-w-3xl xl:max-w-4xl 2xl:max-w-6xl w-full h-fit"), children: /* @__PURE__ */ jsxs("div", { className: cls("flex flex-col w-full pt-12 pb-16 px-4 sm:px-8 md:px-10"), children: [
|
|
15621
|
-
|
|
16472
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-row gap-4 self-end sticky top-4 z-10", children: [
|
|
16473
|
+
manualApplyLocalChanges && hasLocalChanges && /* @__PURE__ */ jsx(LocalChangesMenu, { cacheKey: status === "new" || status === "copy" ? path + "#new" : path + "/" + entityId, properties: resolvedCollection.properties, localChangesData, formex, onClearLocalChanges: () => setLocalChangesCleared(true) }),
|
|
16474
|
+
formex.dirty ? /* @__PURE__ */ jsx(Tooltip, { title: "There are local unsaved changes", children: /* @__PURE__ */ jsx(Chip, { size: "small", className: "py-1", colorScheme: "orangeDarker", children: /* @__PURE__ */ jsx(EditIcon, { size: "smallest" }) }) }) : /* @__PURE__ */ jsx(Tooltip, { title: "The current form is in sync with the database", children: /* @__PURE__ */ jsx(Chip, { size: "small", className: "py-1", children: /* @__PURE__ */ jsx(CheckIcon, { size: "smallest" }) }) })
|
|
16475
|
+
] }),
|
|
15622
16476
|
formView
|
|
15623
16477
|
] }) }),
|
|
15624
16478
|
dialogActions
|
|
@@ -20285,6 +21139,11 @@ const EntityCollectionView = React__default.memo(function EntityCollectionView2(
|
|
|
20285
21139
|
console.error("Save failure");
|
|
20286
21140
|
console.error(e_0);
|
|
20287
21141
|
setError(e_0);
|
|
21142
|
+
},
|
|
21143
|
+
onPreSaveHookError: (e_1) => {
|
|
21144
|
+
console.error("Pre-save hook error");
|
|
21145
|
+
console.error(e_1);
|
|
21146
|
+
setError(e_1);
|
|
20288
21147
|
}
|
|
20289
21148
|
});
|
|
20290
21149
|
};
|
|
@@ -20382,7 +21241,7 @@ const EntityCollectionView = React__default.memo(function EntityCollectionView2(
|
|
|
20382
21241
|
width: width_0,
|
|
20383
21242
|
frozen
|
|
20384
21243
|
}) => {
|
|
20385
|
-
const isSelected = Boolean(usedSelectionController.selectedEntities.find((
|
|
21244
|
+
const isSelected = Boolean(usedSelectionController.selectedEntities.find((e_2) => e_2.id == entity_6.id && e_2.path == entity_6.path));
|
|
20386
21245
|
const customEntityActions_0 = (collection.entityActions ?? []).map((action) => resolveEntityAction(action, customizationController.entityActions)).filter(Boolean);
|
|
20387
21246
|
const actions_0 = getActionsForEntity({
|
|
20388
21247
|
entity: entity_6,
|
|
@@ -20391,9 +21250,9 @@ const EntityCollectionView = React__default.memo(function EntityCollectionView2(
|
|
|
20391
21250
|
return /* @__PURE__ */ jsx(EntityCollectionRowActions, { entity: entity_6, width: width_0, frozen, isSelected, selectionEnabled, size: size_0, highlightEntity: setHighlightedEntity, unhighlightEntity: unselectNavigatedEntity, collection, fullPath, fullIdPath, actions: actions_0, hideId: collection?.hideIdFromCollection, onCollectionChange: updateLastDeleteTimestamp, selectionController: usedSelectionController, openEntityMode });
|
|
20392
21251
|
}, [updateLastDeleteTimestamp, usedSelectionController]);
|
|
20393
21252
|
const title = /* @__PURE__ */ jsx(Popover, { open: popOverOpen, onOpenChange: setPopOverOpen, enabled: Boolean(collection.description), trigger: /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-start", children: [
|
|
20394
|
-
/* @__PURE__ */ jsx(Typography, { variant: "subtitle1", className: `leading-none truncate max-w-[160px] lg:max-w-[240px] ${collection.description ? "cursor-pointer" : "cursor-auto"}`, onClick: collection.description ? (
|
|
21253
|
+
/* @__PURE__ */ jsx(Typography, { variant: "subtitle1", className: `leading-none truncate max-w-[160px] lg:max-w-[240px] ${collection.description ? "cursor-pointer" : "cursor-auto"}`, onClick: collection.description ? (e_3) => {
|
|
20395
21254
|
setPopOverOpen(true);
|
|
20396
|
-
|
|
21255
|
+
e_3.stopPropagation();
|
|
20397
21256
|
} : void 0, children: `${collection.name}` }),
|
|
20398
21257
|
/* @__PURE__ */ jsx(EntitiesCount, { fullPath, collection, filter: tableController.filterValues, sortBy: tableController.sortBy, onCountChange: setDocsCount })
|
|
20399
21258
|
] }), children: collection.description && /* @__PURE__ */ jsx("div", { className: "m-4 text-surface-900 dark:text-white", children: /* @__PURE__ */ jsx(Markdown, { source: collection.description }) }) });
|
|
@@ -20428,7 +21287,7 @@ const EntityCollectionView = React__default.memo(function EntityCollectionView2(
|
|
|
20428
21287
|
/* @__PURE__ */ jsx(Typography, { variant: "subtitle2", children: "So empty..." }),
|
|
20429
21288
|
/* @__PURE__ */ jsxs(Button, { color: "primary", variant: "outlined", onClick: onNewClick, className: "mt-4", children: [
|
|
20430
21289
|
/* @__PURE__ */ jsx(AddIcon, {}),
|
|
20431
|
-
"Create your first
|
|
21290
|
+
"Create your first entry"
|
|
20432
21291
|
] })
|
|
20433
21292
|
] }) : /* @__PURE__ */ jsx(Typography, { variant: "label", children: "No results with the applied filter/sort" }), hoverRow, inlineEditing: checkInlineEditing(), AdditionalHeaderWidget: buildAdditionalHeaderWidget, AddColumnComponent: addColumnComponentInternal, getIdColumnWidth, additionalIDHeaderWidget: /* @__PURE__ */ jsx(EntityIdHeaderWidget, { path: fullPath, fullIdPath: fullIdPath ?? fullPath, collection }), openEntityMode }, `collection_table_${fullPath}`),
|
|
20434
21293
|
popupCell && /* @__PURE__ */ jsx(PopupFormField, { open: Boolean(popupCell), onClose: onPopupClose, cellRect: popupCell?.cellRect, propertyKey: popupCell?.propertyKey, collection, entityId: popupCell.entityId, tableKey: tableKey.current, customFieldValidator: uniqueFieldValidator, path: resolvedFullPath, onCellValueChange: onValueChange, container: containerRef.current }, `popup_form_${popupCell?.propertyKey}_${popupCell?.entityId}`),
|
|
@@ -21807,22 +22666,9 @@ function useBuildNavigationController(props) {
|
|
|
21807
22666
|
const buildUrlCollectionPath = useCallback((path_0) => `${removeInitialAndTrailingSlashes(baseCollectionPath)}/${encodePath(path_0)}`, [baseCollectionPath]);
|
|
21808
22667
|
const allPluginGroups = plugins?.flatMap((plugin) => plugin.homePage?.navigationEntries ? plugin.homePage.navigationEntries.map((e) => e.name) : []) ?? [];
|
|
21809
22668
|
const pluginGroups = [...new Set(allPluginGroups)];
|
|
21810
|
-
const
|
|
21811
|
-
if (!plugins) {
|
|
21812
|
-
return;
|
|
21813
|
-
}
|
|
21814
|
-
const filteredEntries = entries.filter((entry) => entry.entries.length > 0);
|
|
21815
|
-
if (plugins.some((plugin_1) => plugin_1.homePage?.onNavigationEntriesUpdate)) {
|
|
21816
|
-
plugins.forEach((plugin_0) => {
|
|
21817
|
-
if (plugin_0.homePage?.onNavigationEntriesUpdate) {
|
|
21818
|
-
plugin_0.homePage.onNavigationEntriesUpdate(filteredEntries);
|
|
21819
|
-
}
|
|
21820
|
-
});
|
|
21821
|
-
}
|
|
21822
|
-
}, [plugins]);
|
|
21823
|
-
const computeTopNavigation = useCallback((collections, views, adminViews, viewsOrder_0) => {
|
|
22669
|
+
const computeTopNavigation = useCallback((collections, views, adminViews, viewsOrder_0, navigationGroupMappingsOverride, onNavigationEntriesUpdateCallback) => {
|
|
21824
22670
|
const finalNavigationGroupMappings = computeNavigationGroups({
|
|
21825
|
-
navigationGroupMappings,
|
|
22671
|
+
navigationGroupMappings: navigationGroupMappingsOverride ?? navigationGroupMappings,
|
|
21826
22672
|
collections,
|
|
21827
22673
|
views,
|
|
21828
22674
|
plugins
|
|
@@ -21854,7 +22700,7 @@ function useBuildNavigationController(props) {
|
|
|
21854
22700
|
return acc;
|
|
21855
22701
|
}, []), ...(views ?? []).reduce((acc_0, view) => {
|
|
21856
22702
|
if (view.hideFromNavigation) return acc_0;
|
|
21857
|
-
const pathKey_0 =
|
|
22703
|
+
const pathKey_0 = view.path;
|
|
21858
22704
|
let groupName_0 = getGroup(view);
|
|
21859
22705
|
if (finalNavigationGroupMappings) {
|
|
21860
22706
|
for (const pluginGroupDef_0 of finalNavigationGroupMappings) {
|
|
@@ -21877,7 +22723,7 @@ function useBuildNavigationController(props) {
|
|
|
21877
22723
|
return acc_0;
|
|
21878
22724
|
}, []), ...(adminViews ?? []).reduce((acc_1, view_0) => {
|
|
21879
22725
|
if (view_0.hideFromNavigation) return acc_1;
|
|
21880
|
-
const pathKey_1 =
|
|
22726
|
+
const pathKey_1 = view_0.path;
|
|
21881
22727
|
const groupName_1 = NAVIGATION_ADMIN_GROUP_NAME;
|
|
21882
22728
|
acc_1.push({
|
|
21883
22729
|
id: `admin:${pathKey_1}`,
|
|
@@ -21911,21 +22757,43 @@ function useBuildNavigationController(props) {
|
|
|
21911
22757
|
});
|
|
21912
22758
|
}
|
|
21913
22759
|
const collectedGroupsFromEntries = navigationEntries.map((e_0) => e_0.group).filter(Boolean);
|
|
21914
|
-
const
|
|
21915
|
-
const
|
|
22760
|
+
const groupsFromMappings = finalNavigationGroupMappings.map((g_0) => g_0.name);
|
|
22761
|
+
const additionalGroups = collectedGroupsFromEntries.filter((g_1) => !groupsFromMappings.includes(g_1));
|
|
22762
|
+
const allDefinedGroups = [...pluginGroups ?? [], ...groupsFromMappings, ...additionalGroups];
|
|
22763
|
+
const uniqueGroupsArray = [...new Set(allDefinedGroups)];
|
|
22764
|
+
const adminGroups = uniqueGroupsArray.filter((g_2) => g_2 === NAVIGATION_ADMIN_GROUP_NAME);
|
|
22765
|
+
const nonAdminGroups = uniqueGroupsArray.filter((g_3) => g_3 !== NAVIGATION_ADMIN_GROUP_NAME);
|
|
22766
|
+
const uniqueGroups = [...nonAdminGroups, ...adminGroups];
|
|
21916
22767
|
return {
|
|
21917
|
-
allowDragAndDrop: plugins?.some((
|
|
22768
|
+
allowDragAndDrop: plugins?.some((plugin_0) => plugin_0.homePage?.allowDragAndDrop) ?? false,
|
|
21918
22769
|
navigationEntries,
|
|
21919
22770
|
groups: uniqueGroups,
|
|
21920
|
-
onNavigationEntriesUpdate:
|
|
22771
|
+
onNavigationEntriesUpdate: onNavigationEntriesUpdateCallback
|
|
21921
22772
|
};
|
|
21922
|
-
}, [navigationGroupMappings, buildCMSUrlPath, buildUrlCollectionPath, pluginGroups
|
|
22773
|
+
}, [navigationGroupMappings, buildCMSUrlPath, buildUrlCollectionPath, pluginGroups]);
|
|
22774
|
+
const onNavigationEntriesOrderUpdate = useCallback((entries) => {
|
|
22775
|
+
if (!plugins) {
|
|
22776
|
+
return;
|
|
22777
|
+
}
|
|
22778
|
+
const filteredEntries = entries.filter((entry) => entry.entries.length > 0);
|
|
22779
|
+
if (collectionsRef.current && viewsRef.current) {
|
|
22780
|
+
const updatedNav = computeTopNavigation(collectionsRef.current, viewsRef.current, adminViewsRef.current ?? [], viewsOrder, filteredEntries, onNavigationEntriesOrderUpdate);
|
|
22781
|
+
setTopLevelNavigation(updatedNav);
|
|
22782
|
+
}
|
|
22783
|
+
if (plugins.some((plugin_2) => plugin_2.homePage?.onNavigationEntriesUpdate)) {
|
|
22784
|
+
plugins.forEach((plugin_1) => {
|
|
22785
|
+
if (plugin_1.homePage?.onNavigationEntriesUpdate) {
|
|
22786
|
+
plugin_1.homePage.onNavigationEntriesUpdate(filteredEntries);
|
|
22787
|
+
}
|
|
22788
|
+
});
|
|
22789
|
+
}
|
|
22790
|
+
}, [plugins, computeTopNavigation, viewsOrder]);
|
|
21923
22791
|
const refreshNavigation = useCallback(async () => {
|
|
21924
22792
|
if (disabled || authController.initialLoading) return;
|
|
21925
22793
|
console.debug("Refreshing navigation");
|
|
21926
22794
|
try {
|
|
21927
22795
|
const [resolvedCollections = [], resolvedViews, resolvedAdminViews = []] = await Promise.all([resolveCollections(collectionsProp, collectionPermissions, authController, dataSourceDelegate, plugins), resolveCMSViews(viewsProp, authController, dataSourceDelegate), resolveCMSViews(adminViewsProp, authController, dataSourceDelegate)]);
|
|
21928
|
-
const computedTopLevelNav = computeTopNavigation(resolvedCollections, resolvedViews, resolvedAdminViews, viewsOrder);
|
|
22796
|
+
const computedTopLevelNav = computeTopNavigation(resolvedCollections, resolvedViews, resolvedAdminViews, viewsOrder, void 0, onNavigationEntriesOrderUpdate);
|
|
21929
22797
|
let shouldUpdateTopLevelNav = false;
|
|
21930
22798
|
if (!areCollectionListsEqual(collectionsRef.current ?? [], resolvedCollections)) {
|
|
21931
22799
|
collectionsRef.current = resolvedCollections;
|
|
@@ -22021,7 +22889,8 @@ function useBuildNavigationController(props) {
|
|
|
22021
22889
|
}, []);
|
|
22022
22890
|
const isUrlCollectionPath = useCallback((path_1) => removeInitialAndTrailingSlashes(path_1 + "/").startsWith(removeInitialAndTrailingSlashes(fullCollectionPath) + "/"), [fullCollectionPath]);
|
|
22023
22891
|
const urlPathToDataPath = useCallback((path_2) => {
|
|
22024
|
-
|
|
22892
|
+
const decodedPath = decodeURIComponent(path_2);
|
|
22893
|
+
if (decodedPath.startsWith(fullCollectionPath)) return decodedPath.replace(fullCollectionPath, "");
|
|
22025
22894
|
throw Error("Expected path starting with " + fullCollectionPath);
|
|
22026
22895
|
}, [fullCollectionPath]);
|
|
22027
22896
|
const resolveIdsFrom = useCallback((path_3) => {
|
|
@@ -22209,6 +23078,42 @@ function computeNavigationGroups({
|
|
|
22209
23078
|
}
|
|
22210
23079
|
return acc;
|
|
22211
23080
|
}, [...result ?? []]) : result;
|
|
23081
|
+
const assignedEntries = /* @__PURE__ */ new Set();
|
|
23082
|
+
if (result) {
|
|
23083
|
+
result.forEach((group) => {
|
|
23084
|
+
group.entries.forEach((entry) => assignedEntries.add(entry));
|
|
23085
|
+
});
|
|
23086
|
+
}
|
|
23087
|
+
const unassignedGroupMap = {};
|
|
23088
|
+
(collections ?? []).forEach((collection) => {
|
|
23089
|
+
const entry = collection.id ?? collection.path;
|
|
23090
|
+
if (!assignedEntries.has(entry)) {
|
|
23091
|
+
const groupName = getGroup(collection);
|
|
23092
|
+
if (!unassignedGroupMap[groupName]) unassignedGroupMap[groupName] = [];
|
|
23093
|
+
unassignedGroupMap[groupName].push(entry);
|
|
23094
|
+
}
|
|
23095
|
+
});
|
|
23096
|
+
(views ?? []).forEach((view) => {
|
|
23097
|
+
const entry = view.path;
|
|
23098
|
+
if (!assignedEntries.has(entry)) {
|
|
23099
|
+
const groupName = getGroup(view);
|
|
23100
|
+
if (!unassignedGroupMap[groupName]) unassignedGroupMap[groupName] = [];
|
|
23101
|
+
unassignedGroupMap[groupName].push(entry);
|
|
23102
|
+
}
|
|
23103
|
+
});
|
|
23104
|
+
Object.entries(unassignedGroupMap).forEach(([groupName, entries]) => {
|
|
23105
|
+
if (result) {
|
|
23106
|
+
const existingGroup = result.find((g) => g.name === groupName);
|
|
23107
|
+
if (existingGroup) {
|
|
23108
|
+
existingGroup.entries.push(...entries);
|
|
23109
|
+
} else {
|
|
23110
|
+
result.push({
|
|
23111
|
+
name: groupName,
|
|
23112
|
+
entries
|
|
23113
|
+
});
|
|
23114
|
+
}
|
|
23115
|
+
}
|
|
23116
|
+
});
|
|
22212
23117
|
if (!result) {
|
|
22213
23118
|
result = [];
|
|
22214
23119
|
const groupMap = {};
|
|
@@ -22220,7 +23125,7 @@ function computeNavigationGroups({
|
|
|
22220
23125
|
});
|
|
22221
23126
|
(views ?? []).forEach((view) => {
|
|
22222
23127
|
const name = getGroup(view);
|
|
22223
|
-
const entry =
|
|
23128
|
+
const entry = view.path;
|
|
22224
23129
|
if (!groupMap[name]) groupMap[name] = [];
|
|
22225
23130
|
groupMap[name].push(entry);
|
|
22226
23131
|
});
|
|
@@ -22827,14 +23732,14 @@ function EntityEditViewFormActions({
|
|
|
22827
23732
|
collection,
|
|
22828
23733
|
context,
|
|
22829
23734
|
sideEntityController,
|
|
22830
|
-
isSubmitting: formex.isSubmitting,
|
|
22831
23735
|
disabled,
|
|
22832
23736
|
status,
|
|
22833
23737
|
sideDialogContext,
|
|
22834
23738
|
pluginActions,
|
|
22835
23739
|
openEntityMode,
|
|
22836
23740
|
navigateBack,
|
|
22837
|
-
formContext
|
|
23741
|
+
formContext,
|
|
23742
|
+
formex
|
|
22838
23743
|
}) : buildSideActions({
|
|
22839
23744
|
savingError,
|
|
22840
23745
|
entity,
|
|
@@ -22842,14 +23747,14 @@ function EntityEditViewFormActions({
|
|
|
22842
23747
|
collection,
|
|
22843
23748
|
context,
|
|
22844
23749
|
sideEntityController,
|
|
22845
|
-
isSubmitting: formex.isSubmitting,
|
|
22846
23750
|
sideDialogContext,
|
|
22847
23751
|
disabled,
|
|
22848
23752
|
status,
|
|
22849
23753
|
pluginActions,
|
|
22850
23754
|
openEntityMode,
|
|
22851
23755
|
navigateBack,
|
|
22852
|
-
formContext
|
|
23756
|
+
formContext,
|
|
23757
|
+
formex
|
|
22853
23758
|
});
|
|
22854
23759
|
}
|
|
22855
23760
|
function buildBottomActions({
|
|
@@ -22859,15 +23764,16 @@ function buildBottomActions({
|
|
|
22859
23764
|
collection,
|
|
22860
23765
|
context,
|
|
22861
23766
|
sideEntityController,
|
|
22862
|
-
isSubmitting,
|
|
22863
23767
|
disabled,
|
|
22864
23768
|
status,
|
|
22865
23769
|
sideDialogContext,
|
|
22866
23770
|
pluginActions,
|
|
22867
23771
|
openEntityMode,
|
|
22868
23772
|
navigateBack,
|
|
22869
|
-
formContext
|
|
23773
|
+
formContext,
|
|
23774
|
+
formex
|
|
22870
23775
|
}) {
|
|
23776
|
+
const hasErrors = Object.keys(formex.errors).length > 0 && formex.submitCount > 0;
|
|
22871
23777
|
const canClose = openEntityMode === "side_panel";
|
|
22872
23778
|
return /* @__PURE__ */ jsxs(DialogActions, { position: "absolute", children: [
|
|
22873
23779
|
savingError && /* @__PURE__ */ jsx("div", { className: "text-right", children: /* @__PURE__ */ jsx(Typography, { color: "error", children: savingError.message }) }),
|
|
@@ -22887,15 +23793,16 @@ function buildBottomActions({
|
|
|
22887
23793
|
return /* @__PURE__ */ jsx(EntityActionButton, { action, enabled: isEnabled, props }, action.key);
|
|
22888
23794
|
}) }),
|
|
22889
23795
|
pluginActions,
|
|
22890
|
-
/* @__PURE__ */ jsx(
|
|
22891
|
-
/* @__PURE__ */
|
|
23796
|
+
hasErrors ? /* @__PURE__ */ jsx(ErrorTooltip, { title: "This form has errors", children: /* @__PURE__ */ jsx(ErrorIcon, { className: "ml-4", color: "error", size: "smallest" }) }) : null,
|
|
23797
|
+
/* @__PURE__ */ jsx(Button, { variant: "text", color: "primary", disabled: disabled || formex.isSubmitting, type: "reset", children: status === "existing" ? "Discard" : "Clear" }),
|
|
23798
|
+
/* @__PURE__ */ jsxs(Button, { variant: canClose ? "text" : "filled", color: "primary", type: "submit", disabled: disabled || formex.isSubmitting, onClick: () => {
|
|
22892
23799
|
sideDialogContext.setPendingClose(false);
|
|
22893
23800
|
}, children: [
|
|
22894
23801
|
status === "existing" && "Save",
|
|
22895
23802
|
status === "copy" && "Create copy",
|
|
22896
23803
|
status === "new" && "Create"
|
|
22897
23804
|
] }),
|
|
22898
|
-
canClose && /* @__PURE__ */ jsxs(LoadingButton, { variant: "filled", color: "primary", type: "submit", loading: isSubmitting, disabled, onClick: () => {
|
|
23805
|
+
canClose && /* @__PURE__ */ jsxs(LoadingButton, { variant: "filled", color: "primary", type: "submit", loading: formex.isSubmitting, disabled, onClick: () => {
|
|
22899
23806
|
sideDialogContext.setPendingClose?.(true);
|
|
22900
23807
|
}, children: [
|
|
22901
23808
|
status === "existing" && "Save and close",
|
|
@@ -22911,24 +23818,25 @@ function buildSideActions({
|
|
|
22911
23818
|
collection,
|
|
22912
23819
|
context,
|
|
22913
23820
|
sideEntityController,
|
|
22914
|
-
isSubmitting,
|
|
22915
23821
|
disabled,
|
|
22916
23822
|
status,
|
|
22917
23823
|
sideDialogContext,
|
|
22918
23824
|
pluginActions,
|
|
22919
23825
|
openEntityMode,
|
|
22920
23826
|
navigateBack,
|
|
22921
|
-
formContext
|
|
23827
|
+
formContext,
|
|
23828
|
+
formex
|
|
22922
23829
|
}) {
|
|
23830
|
+
const hasErrors = Object.keys(formex.errors).length > 0 && formex.submitCount > 0;
|
|
22923
23831
|
return /* @__PURE__ */ jsxs("div", { className: cls("overflow-auto h-full flex flex-col gap-2 w-80 2xl:w-96 px-4 py-16 sticky top-0 border-l", defaultBorderMixin), children: [
|
|
22924
|
-
/* @__PURE__ */ jsxs(LoadingButton, { fullWidth: true, variant: "filled", color: "primary", type: "submit", size: "large", disabled: disabled || isSubmitting, onClick: () => {
|
|
23832
|
+
/* @__PURE__ */ jsxs(LoadingButton, { fullWidth: true, variant: "filled", color: "primary", type: "submit", size: "large", startIcon: hasErrors ? /* @__PURE__ */ jsx(ErrorIcon, {}) : void 0, disabled: disabled || formex.isSubmitting, onClick: () => {
|
|
22925
23833
|
sideDialogContext.setPendingClose?.(false);
|
|
22926
23834
|
}, children: [
|
|
22927
23835
|
status === "existing" && "Save",
|
|
22928
23836
|
status === "copy" && "Create copy",
|
|
22929
23837
|
status === "new" && "Create"
|
|
22930
23838
|
] }),
|
|
22931
|
-
/* @__PURE__ */ jsx(Button, { fullWidth: true, variant: "text", disabled: disabled || isSubmitting, type: "reset", children: status === "existing" ? "Discard" : "Clear" }),
|
|
23839
|
+
/* @__PURE__ */ jsx(Button, { fullWidth: true, variant: "text", disabled: disabled || formex.isSubmitting, type: "reset", children: status === "existing" ? "Discard" : "Clear" }),
|
|
22932
23840
|
pluginActions,
|
|
22933
23841
|
formActions.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-row flex-wrap mt-2", children: formActions.map((action) => {
|
|
22934
23842
|
const props = {
|
|
@@ -23083,6 +23991,7 @@ function EntityJsonPreview(t0) {
|
|
|
23083
23991
|
function createFormexStub(values) {
|
|
23084
23992
|
const errorMessage = "You are in a read-only context. You cannot modify the formex controller.";
|
|
23085
23993
|
return {
|
|
23994
|
+
debugId: "",
|
|
23086
23995
|
values,
|
|
23087
23996
|
initialValues: values,
|
|
23088
23997
|
touched: {},
|
|
@@ -23097,6 +24006,9 @@ function createFormexStub(values) {
|
|
|
23097
24006
|
setValues: () => {
|
|
23098
24007
|
throw new Error(errorMessage);
|
|
23099
24008
|
},
|
|
24009
|
+
setTouched(touched) {
|
|
24010
|
+
throw new Error(errorMessage);
|
|
24011
|
+
},
|
|
23100
24012
|
setFieldValue: () => {
|
|
23101
24013
|
throw new Error(errorMessage);
|
|
23102
24014
|
},
|
|
@@ -23156,7 +24068,7 @@ function EntityEditView({
|
|
|
23156
24068
|
databaseId: props.databaseId,
|
|
23157
24069
|
useCache: false
|
|
23158
24070
|
});
|
|
23159
|
-
const
|
|
24071
|
+
const initialDirtyValues = entityId ? getEntityFromMemoryCache(props.path + "/" + entityId) : getEntityFromMemoryCache(props.path + "#new");
|
|
23160
24072
|
const authController = useAuthController();
|
|
23161
24073
|
const initialStatus = props.copy ? "copy" : entityId ? "existing" : "new";
|
|
23162
24074
|
const [status, setStatus] = useState(initialStatus);
|
|
@@ -23167,13 +24079,13 @@ function EntityEditView({
|
|
|
23167
24079
|
return entity ? canEditEntity(props.collection, authController, props.path, entity ?? null) : void 0;
|
|
23168
24080
|
}
|
|
23169
24081
|
}, [authController, entity, status]);
|
|
23170
|
-
if (dataLoading && !
|
|
24082
|
+
if (dataLoading && !initialDirtyValues || (!entity || canEdit === void 0) && (status === "existing" || status === "copy")) {
|
|
23171
24083
|
return /* @__PURE__ */ jsx(CircularProgressCenter, {});
|
|
23172
24084
|
}
|
|
23173
|
-
if (entityId && !entity && !
|
|
24085
|
+
if (entityId && !entity && !initialDirtyValues) {
|
|
23174
24086
|
console.error(`Entity with id ${entityId} not found in collection ${props.path}`);
|
|
23175
24087
|
}
|
|
23176
|
-
return /* @__PURE__ */ jsx(EntityEditViewInner, { ...props, entityId, entity,
|
|
24088
|
+
return /* @__PURE__ */ jsx(EntityEditViewInner, { ...props, entityId, entity, initialDirtyValues, dataLoading, status, setStatus, canEdit });
|
|
23177
24089
|
}
|
|
23178
24090
|
function EntityEditViewInner({
|
|
23179
24091
|
path,
|
|
@@ -23186,7 +24098,7 @@ function EntityEditViewInner({
|
|
|
23186
24098
|
onSaved,
|
|
23187
24099
|
onTabChange,
|
|
23188
24100
|
entity,
|
|
23189
|
-
|
|
24101
|
+
initialDirtyValues,
|
|
23190
24102
|
dataLoading,
|
|
23191
24103
|
layout = "side_panel",
|
|
23192
24104
|
barActions,
|
|
@@ -23314,7 +24226,8 @@ function EntityEditViewInner({
|
|
|
23314
24226
|
/* @__PURE__ */ jsx(EntityView, { className: "px-8 h-full overflow-auto", entity, path, collection }),
|
|
23315
24227
|
/* @__PURE__ */ jsx("div", { className: "h-16" })
|
|
23316
24228
|
] }) }) : null;
|
|
23317
|
-
const entityView = /* @__PURE__ */ jsx(EntityForm, { fullIdPath, collection, path, entityId: entityId ?? usedEntity?.id, onValuesModified, entity, initialDirtyValues
|
|
24229
|
+
const entityView = /* @__PURE__ */ jsx(EntityForm, { fullIdPath, collection, path, entityId: entityId ?? usedEntity?.id, onValuesModified, entity, initialDirtyValues, openEntityMode: layout, forceActionsAtTheBottom: actionsAtTheBottom, initialStatus: status, className: cls((!mainViewVisible || !canEdit) && !selectedSecondaryForm ? "hidden" : "", formProps?.className), EntityFormActionsComponent: EntityEditViewFormActions, disabled: !canEdit, ...formProps, onEntityChange: (entity_0) => {
|
|
24230
|
+
console.log("333 EntityEditView onEntityChange:", entity_0);
|
|
23318
24231
|
setUsedEntity(entity_0);
|
|
23319
24232
|
formProps?.onEntityChange?.(entity_0);
|
|
23320
24233
|
}, onStatusChange: (status_0) => {
|
|
@@ -23337,7 +24250,12 @@ function EntityEditViewInner({
|
|
|
23337
24250
|
const shouldShowTopBar = Boolean(barActions) || hasAdditionalViews;
|
|
23338
24251
|
let result = /* @__PURE__ */ jsxs("div", { className: "relative flex flex-col h-full w-full bg-white dark:bg-surface-900", children: [
|
|
23339
24252
|
shouldShowTopBar && /* @__PURE__ */ jsxs("div", { className: cls("h-14 items-center flex overflow-visible overflow-x-scroll w-full no-scrollbar h-14 border-b pl-2 pr-2 pt-1 flex bg-surface-50 dark:bg-surface-900", defaultBorderMixin), children: [
|
|
23340
|
-
barActions
|
|
24253
|
+
barActions?.({
|
|
24254
|
+
path: fullIdPath ?? path,
|
|
24255
|
+
entityId,
|
|
24256
|
+
values: formContext?.values ?? usedEntity?.values ?? {},
|
|
24257
|
+
status
|
|
24258
|
+
}),
|
|
23341
24259
|
/* @__PURE__ */ jsx("div", { className: "flex-grow" }),
|
|
23342
24260
|
pluginActionsTop,
|
|
23343
24261
|
globalLoading && /* @__PURE__ */ jsx("div", { className: "self-center", children: /* @__PURE__ */ jsx(CircularProgress, { size: "small" }) }),
|
|
@@ -23440,9 +24358,14 @@ function EntitySidePanel(props) {
|
|
|
23440
24358
|
if (!props || !collection) {
|
|
23441
24359
|
return /* @__PURE__ */ jsx("div", { className: "w-full" });
|
|
23442
24360
|
}
|
|
23443
|
-
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(ErrorBoundary, { children: /* @__PURE__ */ jsx(EntityEditView, { ...props, fullIdPath, layout: "side_panel", collection, parentCollectionIds, onValuesModified, onSaved: onUpdate, barActions:
|
|
24361
|
+
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(ErrorBoundary, { children: /* @__PURE__ */ jsx(EntityEditView, { ...props, fullIdPath, layout: "side_panel", collection, parentCollectionIds, onValuesModified, onSaved: onUpdate, barActions: ({
|
|
24362
|
+
status,
|
|
24363
|
+
values
|
|
24364
|
+
}) => /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
23444
24365
|
/* @__PURE__ */ jsx(IconButton, { className: "self-center", onClick: onClose, children: /* @__PURE__ */ jsx(CloseIcon, { size: "small" }) }),
|
|
23445
24366
|
allowFullScreen && /* @__PURE__ */ jsx(IconButton, { className: "self-center", onClick: () => {
|
|
24367
|
+
const key = status === "new" || status === "copy" ? path + "#new" : path + "/" + entityId;
|
|
24368
|
+
saveEntityToMemoryCache(key, values);
|
|
23446
24369
|
if (entityId) navigate(location.pathname);
|
|
23447
24370
|
else navigate(location.pathname + "#new");
|
|
23448
24371
|
}, children: /* @__PURE__ */ jsx(OpenInFullIcon, { size: "small" }) })
|
|
@@ -26223,6 +27146,7 @@ export {
|
|
|
26223
27146
|
getIdIcon,
|
|
26224
27147
|
getLabelOrConfigFrom,
|
|
26225
27148
|
getLastSegment,
|
|
27149
|
+
getLocalChangesBackup,
|
|
26226
27150
|
getPropertiesWithPropertiesOrder,
|
|
26227
27151
|
getPropertyInPath,
|
|
26228
27152
|
getRandomId,
|
|
@@ -26237,13 +27161,13 @@ export {
|
|
|
26237
27161
|
isEnumValueDisabled,
|
|
26238
27162
|
isHidden,
|
|
26239
27163
|
isObject,
|
|
27164
|
+
isPlainObject,
|
|
26240
27165
|
isPropertyBuilder,
|
|
26241
27166
|
isReadOnly,
|
|
26242
27167
|
isReferenceProperty,
|
|
26243
27168
|
isValidRegExp,
|
|
26244
27169
|
joinCollectionLists,
|
|
26245
27170
|
makePropertiesEditable,
|
|
26246
|
-
makePropertiesNonEditable,
|
|
26247
27171
|
mergeCallbacks,
|
|
26248
27172
|
mergeCollection,
|
|
26249
27173
|
mergeDeep,
|