@firecms/core 3.3.0-canary.040c21c → 3.3.0-canary.1e1cce9

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.
Files changed (37) hide show
  1. package/dist/components/EntityCollectionTable/column_utils.d.ts +4 -3
  2. package/dist/components/EntityCollectionView/FiltersDialog.d.ts +2 -1
  3. package/dist/components/EntityPreview.d.ts +3 -1
  4. package/dist/index.es.js +408 -297
  5. package/dist/index.es.js.map +1 -1
  6. package/dist/index.umd.js +408 -297
  7. package/dist/index.umd.js.map +1 -1
  8. package/dist/types/collections.d.ts +17 -0
  9. package/dist/types/translations.d.ts +11 -3
  10. package/dist/util/entities.d.ts +1 -0
  11. package/package.json +5 -5
  12. package/src/app/Scaffold.tsx +13 -1
  13. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +2 -1
  14. package/src/components/EntityCollectionTable/column_utils.tsx +11 -19
  15. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +1 -1
  16. package/src/components/EntityCollectionView/EntityCollectionView.tsx +5 -2
  17. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +4 -1
  18. package/src/components/EntityCollectionView/FiltersDialog.tsx +39 -28
  19. package/src/components/EntityPreview.tsx +41 -40
  20. package/src/components/HomePage/NavigationCardBinding.tsx +6 -3
  21. package/src/components/ReferenceWidget.tsx +1 -1
  22. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +2 -2
  23. package/src/components/common/useDataSourceTableController.tsx +41 -4
  24. package/src/core/DefaultDrawer.tsx +1 -1
  25. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +1 -1
  26. package/src/hooks/useBuildNavigationController.tsx +5 -1
  27. package/src/locales/de.ts +13 -5
  28. package/src/locales/en.ts +13 -5
  29. package/src/locales/es.ts +13 -5
  30. package/src/locales/fr.ts +13 -5
  31. package/src/locales/hi.ts +13 -5
  32. package/src/locales/it.ts +13 -5
  33. package/src/locales/pt.ts +13 -5
  34. package/src/types/collections.ts +18 -0
  35. package/src/types/translations.ts +11 -3
  36. package/src/util/entities.ts +11 -0
  37. package/src/util/resolutions.ts +3 -0
package/dist/index.es.js CHANGED
@@ -714,6 +714,9 @@ function sanitizeData(values, properties) {
714
714
  return result;
715
715
  }
716
716
  function getReferenceFrom(entity) {
717
+ if (!entity) {
718
+ throw new Error("getReferenceFrom: entity is null or undefined");
719
+ }
717
720
  return new EntityReference(entity.id, entity.path, entity.databaseId);
718
721
  }
719
722
  function traverseValuesProperties(inputValues, properties, operation) {
@@ -763,6 +766,12 @@ function traverseValueProperty(inputValue, property, operation) {
763
766
  }
764
767
  return value;
765
768
  }
769
+ function isDataTypeFilterable(dataType, isPartOfArray = false) {
770
+ if (isPartOfArray) {
771
+ return ["string", "number", "date", "reference"].includes(dataType);
772
+ }
773
+ return ["string", "number", "boolean", "date", "reference", "array"].includes(dataType);
774
+ }
766
775
  function enumToObjectEntries(enumValues) {
767
776
  if (Array.isArray(enumValues)) {
768
777
  return enumValues;
@@ -849,8 +858,13 @@ const resolveCollection = ({
849
858
  ...a,
850
859
  ...b
851
860
  }), {});
861
+ const {
862
+ properties: overrideProps,
863
+ ...restOverrides
864
+ } = collectionOverride ?? {};
852
865
  return {
853
866
  ...collection,
867
+ ...restOverrides,
854
868
  properties: cleanedProperties,
855
869
  originalCollection: collection
856
870
  };
@@ -4536,7 +4550,7 @@ function useCollectionFetch(t0) {
4536
4550
  }
4537
4551
  setDataLoading(false);
4538
4552
  setDataLoadingError(void 0);
4539
- setData(entities.map(_temp$C));
4553
+ setData(entities.map(_temp$D));
4540
4554
  setNoMoreToLoad(!itemCount || entities.length < itemCount);
4541
4555
  };
4542
4556
  const onError = (error) => {
@@ -4619,7 +4633,7 @@ function useCollectionFetch(t0) {
4619
4633
  }
4620
4634
  function _temp2$f() {
4621
4635
  }
4622
- function _temp$C(e_0) {
4636
+ function _temp$D(e_0) {
4623
4637
  return {
4624
4638
  ...e_0
4625
4639
  };
@@ -4684,7 +4698,7 @@ function useEntityFetch(t0) {
4684
4698
  setEntity(CACHE[`${path}/${entityId}`]);
4685
4699
  setDataLoading(false);
4686
4700
  setDataLoadingError(void 0);
4687
- return _temp$B;
4701
+ return _temp$C;
4688
4702
  } else {
4689
4703
  if (entityId && path && collection) {
4690
4704
  if (dataSource.listenEntity) {
@@ -4752,7 +4766,7 @@ function _temp3$5() {
4752
4766
  }
4753
4767
  function _temp2$e() {
4754
4768
  }
4755
- function _temp$B() {
4769
+ function _temp$C() {
4756
4770
  }
4757
4771
  async function saveEntityWithCallbacks({
4758
4772
  collection,
@@ -5396,7 +5410,7 @@ function ImagePreview(t0) {
5396
5410
  }
5397
5411
  let t9;
5398
5412
  if ($[19] !== url) {
5399
- t9 = /* @__PURE__ */ jsx(Tooltip, { title: "Open image in new tab", side: "bottom", children: /* @__PURE__ */ jsx(IconButton, { className: "invisible group-hover:visible", variant: "filled", component: "a", href: url, rel: "noopener noreferrer", target: "_blank", size: "smallest", onClick: _temp$A, children: t8 }) });
5413
+ t9 = /* @__PURE__ */ jsx(Tooltip, { title: "Open image in new tab", side: "bottom", children: /* @__PURE__ */ jsx(IconButton, { className: "invisible group-hover:visible", variant: "filled", component: "a", href: url, rel: "noopener noreferrer", target: "_blank", size: "smallest", onClick: _temp$B, children: t8 }) });
5400
5414
  $[19] = url;
5401
5415
  $[20] = t9;
5402
5416
  } else {
@@ -5430,7 +5444,7 @@ function ImagePreview(t0) {
5430
5444
  }
5431
5445
  return t11;
5432
5446
  }
5433
- function _temp$A(e_0) {
5447
+ function _temp$B(e_0) {
5434
5448
  return e_0.stopPropagation();
5435
5449
  }
5436
5450
  const FIRECMS_NS$1 = "firecms_core";
@@ -5497,7 +5511,7 @@ function UrlComponentPreview(t0) {
5497
5511
  }
5498
5512
  let t3;
5499
5513
  if ($[2] !== url) {
5500
- t3 = /* @__PURE__ */ jsxs("a", { className: "flex gap-4 break-words items-center font-medium text-primary visited:text-primary dark:visited:text-primary dark:text-primary", href: url, rel: "noopener noreferrer", onMouseDown: _temp$z, target: "_blank", children: [
5514
+ t3 = /* @__PURE__ */ jsxs("a", { className: "flex gap-4 break-words items-center font-medium text-primary visited:text-primary dark:visited:text-primary dark:text-primary", href: url, rel: "noopener noreferrer", onMouseDown: _temp$A, target: "_blank", children: [
5501
5515
  t2,
5502
5516
  url
5503
5517
  ] });
@@ -5627,7 +5641,7 @@ function UrlComponentPreview(t0) {
5627
5641
  function _temp2$d(e_0) {
5628
5642
  return e_0.stopPropagation();
5629
5643
  }
5630
- function _temp$z(e) {
5644
+ function _temp$A(e) {
5631
5645
  e.preventDefault();
5632
5646
  }
5633
5647
  function VideoPreview(t0) {
@@ -5761,7 +5775,7 @@ function SkeletonPropertyComponent(t0) {
5761
5775
  if (Array.isArray(arrayProperty.of)) {
5762
5776
  let t1;
5763
5777
  if ($[6] !== arrayProperty.of) {
5764
- t1 = arrayProperty.of.map(_temp$y);
5778
+ t1 = arrayProperty.of.map(_temp$z);
5765
5779
  $[6] = arrayProperty.of;
5766
5780
  $[7] = t1;
5767
5781
  } else {
@@ -5899,7 +5913,7 @@ function SkeletonPropertyComponent(t0) {
5899
5913
  }
5900
5914
  return content || null;
5901
5915
  }
5902
- function _temp$y(p, i) {
5916
+ function _temp$z(p, i) {
5903
5917
  return renderGenericArrayCell(p, i);
5904
5918
  }
5905
5919
  function renderMap(property, size) {
@@ -6343,104 +6357,77 @@ function EntityPreview({
6343
6357
  actions
6344
6358
  ] });
6345
6359
  }
6346
- const EntityPreviewContainer = React.forwardRef((t0, ref) => {
6347
- const $ = c(26);
6348
- let children;
6349
- let className;
6350
- let hover;
6351
- let onClick;
6352
- let props;
6353
- let style;
6354
- let t1;
6355
- let t2;
6356
- if ($[0] !== t0) {
6357
- ({
6358
- children,
6359
- hover,
6360
- onClick,
6361
- size: t1,
6362
- style,
6363
- className,
6364
- fullwidth: t2,
6365
- ...props
6366
- } = t0);
6367
- $[0] = t0;
6368
- $[1] = children;
6369
- $[2] = className;
6370
- $[3] = hover;
6371
- $[4] = onClick;
6372
- $[5] = props;
6373
- $[6] = style;
6374
- $[7] = t1;
6375
- $[8] = t2;
6376
- } else {
6377
- children = $[1];
6378
- className = $[2];
6379
- hover = $[3];
6380
- onClick = $[4];
6381
- props = $[5];
6382
- style = $[6];
6383
- t1 = $[7];
6384
- t2 = $[8];
6385
- }
6360
+ function EntityPreviewContainer(t0) {
6361
+ const $ = c(15);
6362
+ const {
6363
+ children,
6364
+ hover,
6365
+ onClick,
6366
+ size: t1,
6367
+ style,
6368
+ className,
6369
+ fullwidth: t2,
6370
+ ref
6371
+ } = t0;
6386
6372
  const size = t1 === void 0 ? "medium" : t1;
6387
6373
  const fullwidth = t2 === void 0 ? true : t2;
6388
- let t3;
6389
- if ($[9] !== style) {
6390
- t3 = {
6391
- ...style,
6392
- tabindex: 0
6393
- };
6394
- $[9] = style;
6395
- $[10] = t3;
6374
+ const t3 = fullwidth ? "w-full" : "";
6375
+ const t4 = hover ? "hover:bg-surface-accent-50 dark:hover:bg-surface-800 group-hover:bg-surface-accent-50 dark:group-hover:bg-surface-800" : "";
6376
+ const t5 = size === "small" ? "p-1" : "px-2 py-1";
6377
+ const t6 = onClick ? "cursor-pointer" : "";
6378
+ let t7;
6379
+ if ($[0] !== className || $[1] !== t3 || $[2] !== t4 || $[3] !== t5 || $[4] !== t6) {
6380
+ t7 = cls("bg-white dark:bg-surface-900", "min-h-[44px]", t3, "items-center", t4, t5, "flex border rounded-lg", t6, defaultBorderMixin, className);
6381
+ $[0] = className;
6382
+ $[1] = t3;
6383
+ $[2] = t4;
6384
+ $[3] = t5;
6385
+ $[4] = t6;
6386
+ $[5] = t7;
6396
6387
  } else {
6397
- t3 = $[10];
6388
+ t7 = $[5];
6398
6389
  }
6399
- const t4 = fullwidth ? "w-full" : "";
6400
- const t5 = hover ? "hover:bg-surface-accent-50 dark:hover:bg-surface-800 group-hover:bg-surface-accent-50 dark:group-hover:bg-surface-800" : "";
6401
- const t6 = size === "small" ? "p-1" : "px-2 py-1";
6402
- const t7 = onClick ? "cursor-pointer" : "";
6390
+ const divClassName = t7;
6403
6391
  let t8;
6404
- if ($[11] !== className || $[12] !== t4 || $[13] !== t5 || $[14] !== t6 || $[15] !== t7) {
6405
- t8 = cls("bg-white dark:bg-surface-900", "min-h-[44px]", t4, "items-center", t5, t6, "flex border rounded-lg", t7, defaultBorderMixin, className);
6406
- $[11] = className;
6407
- $[12] = t4;
6408
- $[13] = t5;
6409
- $[14] = t6;
6410
- $[15] = t7;
6411
- $[16] = t8;
6392
+ if ($[6] !== onClick) {
6393
+ t8 = onClick ? (event) => {
6394
+ event.preventDefault();
6395
+ onClick(event);
6396
+ } : void 0;
6397
+ $[6] = onClick;
6398
+ $[7] = t8;
6412
6399
  } else {
6413
- t8 = $[16];
6400
+ t8 = $[7];
6414
6401
  }
6402
+ const handleClick = t8;
6415
6403
  let t9;
6416
- if ($[17] !== onClick) {
6417
- t9 = (event) => {
6418
- if (onClick) {
6419
- event.preventDefault();
6420
- onClick(event);
6421
- }
6404
+ if ($[8] !== divClassName || $[9] !== handleClick || $[10] !== style) {
6405
+ t9 = {
6406
+ ref,
6407
+ tabIndex: 0,
6408
+ style,
6409
+ className: divClassName,
6410
+ onClick: handleClick
6422
6411
  };
6423
- $[17] = onClick;
6424
- $[18] = t9;
6412
+ $[8] = divClassName;
6413
+ $[9] = handleClick;
6414
+ $[10] = style;
6415
+ $[11] = t9;
6425
6416
  } else {
6426
- t9 = $[18];
6417
+ t9 = $[11];
6427
6418
  }
6419
+ const divProps = t9;
6428
6420
  let t10;
6429
- if ($[19] !== children || $[20] !== props || $[21] !== ref || $[22] !== t3 || $[23] !== t8 || $[24] !== t9) {
6430
- t10 = /* @__PURE__ */ jsx("div", { ref, style: t3, className: t8, onClick: t9, ...props, children });
6431
- $[19] = children;
6432
- $[20] = props;
6433
- $[21] = ref;
6434
- $[22] = t3;
6435
- $[23] = t8;
6436
- $[24] = t9;
6437
- $[25] = t10;
6421
+ if ($[12] !== children || $[13] !== divProps) {
6422
+ t10 = /* @__PURE__ */ jsx("div", { ...divProps, children });
6423
+ $[12] = children;
6424
+ $[13] = divProps;
6425
+ $[14] = t10;
6438
6426
  } else {
6439
- t10 = $[25];
6427
+ t10 = $[14];
6440
6428
  }
6441
6429
  return t10;
6442
- });
6443
- EntityPreviewContainer.displayName = "EntityPreviewContainer";
6430
+ }
6444
6431
  const ReferencePreview = function ReferencePreview2(props) {
6445
6432
  const $ = c(10);
6446
6433
  const reference = props.reference;
@@ -7074,7 +7061,7 @@ function DatePreview(t0) {
7074
7061
  timeZoneName: "short"
7075
7062
  });
7076
7063
  const parts = tzFormatter.formatToParts(date);
7077
- t32 = parts.find(_temp$x)?.value ?? "";
7064
+ t32 = parts.find(_temp$y)?.value ?? "";
7078
7065
  $[6] = date;
7079
7066
  $[7] = timezone;
7080
7067
  $[8] = t32;
@@ -7145,7 +7132,7 @@ function DatePreview(t0) {
7145
7132
  }
7146
7133
  return t3;
7147
7134
  }
7148
- function _temp$x(p) {
7135
+ function _temp$y(p) {
7149
7136
  return p.type === "timeZoneName";
7150
7137
  }
7151
7138
  function MapPropertyPreview(t0) {
@@ -7240,7 +7227,7 @@ function KeyValuePreview(t0) {
7240
7227
  }
7241
7228
  let t1;
7242
7229
  if ($[1] !== value) {
7243
- t1 = Object.entries(value).map(_temp$w);
7230
+ t1 = Object.entries(value).map(_temp$x);
7244
7231
  $[1] = value;
7245
7232
  $[2] = t1;
7246
7233
  } else {
@@ -7256,7 +7243,7 @@ function KeyValuePreview(t0) {
7256
7243
  }
7257
7244
  return t2;
7258
7245
  }
7259
- function _temp$w(t0) {
7246
+ function _temp$x(t0) {
7260
7247
  const [key, childValue] = t0;
7261
7248
  const isTimestampObj = childValue && typeof childValue === "object" && (childValue instanceof Date || "_seconds" in childValue && "_nanoseconds" in childValue && typeof childValue._seconds === "number" && typeof childValue._nanoseconds === "number" || "seconds" in childValue && "nanoseconds" in childValue && typeof childValue.seconds === "number" && typeof childValue.nanoseconds === "number");
7262
7249
  const isScalar = childValue && (typeof childValue !== "object" || isTimestampObj);
@@ -8517,7 +8504,7 @@ function VirtualTableSelect(props) {
8517
8504
  console.trace("onChange");
8518
8505
  if (valueType === "number") {
8519
8506
  if (multiple) {
8520
- const newValue = updatedValue.map(_temp$v);
8507
+ const newValue = updatedValue.map(_temp$w);
8521
8508
  updateValue(newValue);
8522
8509
  } else {
8523
8510
  updateValue(parseFloat(updatedValue));
@@ -8588,7 +8575,7 @@ function VirtualTableSelect(props) {
8588
8575
  function _temp2$c(v_0) {
8589
8576
  return v_0.toString();
8590
8577
  }
8591
- function _temp$v(v) {
8578
+ function _temp$w(v) {
8592
8579
  return parseFloat(v);
8593
8580
  }
8594
8581
  function VirtualTableNumberInput(props) {
@@ -8784,7 +8771,7 @@ function VirtualTableUserSelect(props) {
8784
8771
  const renderValue = t3;
8785
8772
  let t4;
8786
8773
  if ($[7] !== disabled || $[8] !== internalValue || $[9] !== multiple || $[10] !== onChange || $[11] !== renderValue || $[12] !== users || $[13] !== validValue) {
8787
- t4 = multiple ? /* @__PURE__ */ jsx(MultiSelect, { inputRef: ref, className: "w-full h-full p-0 bg-transparent", position: "item-aligned", disabled, includeClear: false, useChips: false, value: validValue ? internalValue : [], onValueChange: onChange, children: users?.map(_temp$u) }) : /* @__PURE__ */ jsx(Select, { inputRef: ref, size: "large", fullWidth: true, className: "w-full h-full p-0 bg-transparent", position: "item-aligned", disabled, padding: false, value: validValue ? internalValue : "", onValueChange: onChange, renderValue, children: users?.map(_temp2$b) });
8774
+ t4 = multiple ? /* @__PURE__ */ jsx(MultiSelect, { inputRef: ref, className: "w-full h-full p-0 bg-transparent", position: "item-aligned", disabled, includeClear: false, useChips: false, value: validValue ? internalValue : [], onValueChange: onChange, children: users?.map(_temp$v) }) : /* @__PURE__ */ jsx(Select, { inputRef: ref, size: "large", fullWidth: true, className: "w-full h-full p-0 bg-transparent", position: "item-aligned", disabled, padding: false, value: validValue ? internalValue : "", onValueChange: onChange, renderValue, children: users?.map(_temp2$b) });
8788
8775
  $[7] = disabled;
8789
8776
  $[8] = internalValue;
8790
8777
  $[9] = multiple;
@@ -8801,7 +8788,7 @@ function VirtualTableUserSelect(props) {
8801
8788
  function _temp2$b(user_1) {
8802
8789
  return /* @__PURE__ */ jsx(SelectItem, { value: user_1.uid, children: /* @__PURE__ */ jsx(UserDisplay, { user: user_1 }) }, user_1.uid);
8803
8790
  }
8804
- function _temp$u(user_0) {
8791
+ function _temp$v(user_0) {
8805
8792
  return /* @__PURE__ */ jsx(MultiSelectItem, { value: user_0.uid, children: /* @__PURE__ */ jsx(UserDisplay, { user: user_0 }) }, user_0.uid);
8806
8793
  }
8807
8794
  class ErrorBoundary extends React__default.Component {
@@ -9046,7 +9033,7 @@ function useStorageUploadController(t0) {
9046
9033
  newValue = [...internalValue];
9047
9034
  newValue = removeDuplicates(newValue);
9048
9035
  setInternalValue(newValue);
9049
- const fieldValue = newValue.filter(_temp$t).map(_temp2$a);
9036
+ const fieldValue = newValue.filter(_temp$u).map(_temp2$a);
9050
9037
  if (multipleFilesSupported) {
9051
9038
  onChange(fieldValue);
9052
9039
  } else {
@@ -9167,7 +9154,7 @@ function useStorageUploadController(t0) {
9167
9154
  function _temp2$a(e_0) {
9168
9155
  return e_0.storagePathOrDownloadUrl;
9169
9156
  }
9170
- function _temp$t(e) {
9157
+ function _temp$u(e) {
9171
9158
  return !!e.storagePathOrDownloadUrl;
9172
9159
  }
9173
9160
  function getInternalInitialValue(multipleFilesSupported, value, metadata, size) {
@@ -9457,7 +9444,7 @@ function StorageUpload$1(t0) {
9457
9444
  const snackbarContext = useSnackbarController();
9458
9445
  let t1;
9459
9446
  if ($[0] !== storage.acceptedFiles) {
9460
- t1 = storage.acceptedFiles ? storage.acceptedFiles.map(_temp$s).reduce(_temp2$9, {}) : void 0;
9447
+ t1 = storage.acceptedFiles ? storage.acceptedFiles.map(_temp$t).reduce(_temp2$9, {}) : void 0;
9461
9448
  $[0] = storage.acceptedFiles;
9462
9449
  $[1] = t1;
9463
9450
  } else {
@@ -9686,7 +9673,7 @@ function _temp2$9(a, b) {
9686
9673
  ...b
9687
9674
  };
9688
9675
  }
9689
- function _temp$s(e) {
9676
+ function _temp$t(e) {
9690
9677
  return {
9691
9678
  [e]: []
9692
9679
  };
@@ -9796,7 +9783,7 @@ const TableReferenceFieldInternal = React__default.memo(function TableReferenceF
9796
9783
  let t1;
9797
9784
  if ($[2] !== updateValue) {
9798
9785
  t1 = (entities) => {
9799
- updateValue(entities.map(_temp$r));
9786
+ updateValue(entities.filter(Boolean).map(_temp$s));
9800
9787
  };
9801
9788
  $[2] = updateValue;
9802
9789
  $[3] = t1;
@@ -9968,7 +9955,7 @@ const TableReferenceFieldInternal = React__default.memo(function TableReferenceF
9968
9955
  }
9969
9956
  return t10;
9970
9957
  }, equal);
9971
- function _temp$r(e) {
9958
+ function _temp$s(e) {
9972
9959
  return getReferenceFrom(e);
9973
9960
  }
9974
9961
  function _temp2$8(ref) {
@@ -11636,7 +11623,7 @@ function ArrayOfReferencesFieldBinding({
11636
11623
  throw Error(`Couldn't find the corresponding collection for the path: ${ofProperty.path}`);
11637
11624
  }
11638
11625
  const onMultipleEntitiesSelected = useCallback((entities) => {
11639
- setValue(entities.map((e) => getReferenceFrom(e)));
11626
+ setValue(entities.filter(Boolean).map((e) => getReferenceFrom(e)));
11640
11627
  }, [setValue]);
11641
11628
  const referenceDialogController = useReferenceDialog({
11642
11629
  multiselect: true,
@@ -11746,7 +11733,7 @@ function StorageItemPreview(t0) {
11746
11733
  }
11747
11734
  let t5;
11748
11735
  if ($[15] !== placeholder) {
11749
- t5 = placeholder && /* @__PURE__ */ jsx("div", { onClick: _temp$q, className: "flex flex-col items-center justify-center w-full h-full", children: /* @__PURE__ */ jsx(DescriptionIcon, { className: "text-surface-700 dark:text-surface-300" }) });
11736
+ t5 = placeholder && /* @__PURE__ */ jsx("div", { onClick: _temp$r, className: "flex flex-col items-center justify-center w-full h-full", children: /* @__PURE__ */ jsx(DescriptionIcon, { className: "text-surface-700 dark:text-surface-300" }) });
11750
11737
  $[15] = placeholder;
11751
11738
  $[16] = t5;
11752
11739
  } else {
@@ -11769,7 +11756,7 @@ function StorageItemPreview(t0) {
11769
11756
  }
11770
11757
  return t6;
11771
11758
  }
11772
- function _temp$q(e) {
11759
+ function _temp$r(e) {
11773
11760
  return e.stopPropagation();
11774
11761
  }
11775
11762
  const dropZoneClasses = "box-border relative pt-[2px] items-center border border-transparent min-h-[254px] outline-none rounded-md duration-200 ease-[cubic-bezier(0.4,0,0.2,1)] focus:border-primary-solid";
@@ -11997,7 +11984,7 @@ function SortableStorageItem(t0) {
11997
11984
  t4 = $[7];
11998
11985
  }
11999
11986
  const style = t4;
12000
- const getImageSizeNumber = _temp$p;
11987
+ const getImageSizeNumber = _temp$q;
12001
11988
  let child;
12002
11989
  if (entry.storagePathOrDownloadUrl) {
12003
11990
  const t52 = `storage_preview_${entry.storagePathOrDownloadUrl}`;
@@ -12072,7 +12059,7 @@ function SortableStorageItem(t0) {
12072
12059
  }
12073
12060
  return t6;
12074
12061
  }
12075
- function _temp$p(previewSize) {
12062
+ function _temp$q(previewSize) {
12076
12063
  switch (previewSize) {
12077
12064
  case "small": {
12078
12065
  return 40;
@@ -12353,7 +12340,7 @@ function StorageUpload(t0) {
12353
12340
  newValue.splice(fromIndex, 1);
12354
12341
  newValue.splice(toIndex, 0, item);
12355
12342
  setInternalValue(newValue);
12356
- const fieldValue = newValue.filter(_temp3$4).map(_temp4$3);
12343
+ const fieldValue = newValue.filter(_temp3$4).map(_temp4$4);
12357
12344
  onChange(fieldValue);
12358
12345
  };
12359
12346
  $[0] = multipleFilesSupported;
@@ -12547,7 +12534,7 @@ function _temp6$2(v_1) {
12547
12534
  function _temp5$2(v_0) {
12548
12535
  return !!v_0.storagePathOrDownloadUrl;
12549
12536
  }
12550
- function _temp4$3(e_0) {
12537
+ function _temp4$4(e_0) {
12551
12538
  return e_0.storagePathOrDownloadUrl;
12552
12539
  }
12553
12540
  function _temp3$4(e) {
@@ -13591,7 +13578,7 @@ function MapFieldBinding(t0) {
13591
13578
  } else {
13592
13579
  t42 = $[20];
13593
13580
  }
13594
- t3 = Object.entries(mapProperties).filter(_temp$o).map(t42);
13581
+ t3 = Object.entries(mapProperties).filter(_temp$p).map(t42);
13595
13582
  $[6] = autoFocus;
13596
13583
  $[7] = context;
13597
13584
  $[8] = disabled;
@@ -13670,7 +13657,7 @@ function MapFieldBinding(t0) {
13670
13657
  }
13671
13658
  return t10;
13672
13659
  }
13673
- function _temp$o(t0) {
13660
+ function _temp$p(t0) {
13674
13661
  const [, property_0] = t0;
13675
13662
  return !isHidden(property_0);
13676
13663
  }
@@ -15044,7 +15031,7 @@ function BlockEntry(t0) {
15044
15031
  const property = t4;
15045
15032
  let t5;
15046
15033
  if ($[9] !== properties) {
15047
- t5 = Object.entries(properties).map(_temp$n);
15034
+ t5 = Object.entries(properties).map(_temp$o);
15048
15035
  $[9] = properties;
15049
15036
  $[10] = t5;
15050
15037
  } else {
@@ -15137,7 +15124,7 @@ function BlockEntry(t0) {
15137
15124
  }
15138
15125
  return t11;
15139
15126
  }
15140
- function _temp$n(t0) {
15127
+ function _temp$o(t0) {
15141
15128
  const [key, property_0] = t0;
15142
15129
  return {
15143
15130
  id: key,
@@ -17258,24 +17245,27 @@ function buildIdColumn(largeLayout) {
17258
17245
  function propertiesToColumns({
17259
17246
  properties,
17260
17247
  sortable,
17261
- forceFilter,
17262
- AdditionalHeaderWidget
17248
+ forcedFilters,
17249
+ AdditionalHeaderWidget,
17250
+ allowedFilters
17263
17251
  }) {
17264
- const disabledFilter = Boolean(forceFilter);
17265
17252
  return Object.entries(properties).flatMap(([key, property]) => getColumnKeysForProperty(property, key)).map(({
17266
17253
  key,
17267
17254
  disabled
17268
17255
  }) => {
17269
17256
  const property = getResolvedPropertyInPath(properties, key);
17270
17257
  if (!property) throw Error("Internal error: no property found in path " + key);
17271
- const filterable = filterableProperty(property);
17258
+ const filterable = property.dataType === "array" ? isDataTypeFilterable(property.of?.dataType, true) : isDataTypeFilterable(property.dataType);
17259
+ const isFilterForced = forcedFilters?.includes(key) ?? false;
17260
+ const isFilterAllowed = allowedFilters ? allowedFilters.includes(key) : filterable;
17261
+ const filterEnabled = filterable && isFilterAllowed && !isFilterForced;
17272
17262
  return {
17273
17263
  key,
17274
17264
  align: getTableCellAlignment(property),
17275
17265
  icon: getIconForProperty(property, "small"),
17276
17266
  title: property.name ?? key,
17277
17267
  sortable,
17278
- filter: !disabledFilter && filterable,
17268
+ filter: filterEnabled,
17279
17269
  width: getTablePropertyColumnWidth(property),
17280
17270
  resizable: true,
17281
17271
  custom: {
@@ -17288,16 +17278,6 @@ function propertiesToColumns({
17288
17278
  };
17289
17279
  });
17290
17280
  }
17291
- function filterableProperty(property, partOfArray = false) {
17292
- if (partOfArray) {
17293
- return ["string", "number", "date", "reference"].includes(property.dataType);
17294
- }
17295
- if (property.dataType === "array") {
17296
- if (property.of) return filterableProperty(property.of, true);
17297
- else return false;
17298
- }
17299
- return ["string", "number", "boolean", "date", "reference", "array"].includes(property.dataType);
17300
- }
17301
17281
  const VirtualTableHeader = React__default.memo(function VirtualTableHeader2(t0) {
17302
17282
  const $ = c(61);
17303
17283
  const {
@@ -18457,7 +18437,7 @@ const SafeLinkRenderer = (t0) => {
18457
18437
  let t1;
18458
18438
  if ($[0] !== text) {
18459
18439
  const urlRegex = /https?:\/\/[^\s]+/g;
18460
- t1 = text.replace(urlRegex, _temp$m);
18440
+ t1 = text.replace(urlRegex, _temp$n);
18461
18441
  $[0] = text;
18462
18442
  $[1] = t1;
18463
18443
  } else {
@@ -18476,7 +18456,7 @@ const SafeLinkRenderer = (t0) => {
18476
18456
  }
18477
18457
  return t2;
18478
18458
  };
18479
- function _temp$m(url) {
18459
+ function _temp$n(url) {
18480
18460
  return `<a href="${url}" class="underline" target="_blank">Link</a><br/>`;
18481
18461
  }
18482
18462
  const operationLabels$2 = {
@@ -18550,10 +18530,10 @@ function ReferenceFilterField({
18550
18530
  return path ? navigationController.getCollection(path) : void 0;
18551
18531
  }, [path]);
18552
18532
  const onSingleEntitySelected = (entity) => {
18553
- updateFilter(operation, getReferenceFrom(entity));
18533
+ if (entity) updateFilter(operation, getReferenceFrom(entity));
18554
18534
  };
18555
18535
  const onMultipleEntitiesSelected = (entities) => {
18556
- updateFilter(operation, entities.map((e) => getReferenceFrom(e)));
18536
+ updateFilter(operation, entities.filter(Boolean).map((e) => getReferenceFrom(e)));
18557
18537
  };
18558
18538
  const multiple = multipleSelectOperations$2.includes(operation);
18559
18539
  const referenceDialogController = useReferenceDialog({
@@ -18728,7 +18708,7 @@ function StringNumberFilterField(t0) {
18728
18708
  }
18729
18709
  let t8;
18730
18710
  if ($[20] !== operation || $[21] !== t6 || $[22] !== t7) {
18731
- t8 = /* @__PURE__ */ jsx("div", { className: "w-[100px]", children: /* @__PURE__ */ jsx(Select, { value: operation, size: "medium", fullWidth: true, position: "item-aligned", onValueChange: t6, renderValue: _temp$l, children: t7 }) });
18711
+ t8 = /* @__PURE__ */ jsx("div", { className: "w-[100px]", children: /* @__PURE__ */ jsx(Select, { value: operation, size: "medium", fullWidth: true, position: "item-aligned", onValueChange: t6, renderValue: _temp$m, children: t7 }) });
18732
18712
  $[20] = operation;
18733
18713
  $[21] = t6;
18734
18714
  $[22] = t7;
@@ -18782,7 +18762,7 @@ function StringNumberFilterField(t0) {
18782
18762
  let t11;
18783
18763
  if ($[40] !== dataType || $[41] !== enumValues || $[42] !== internalValue || $[43] !== isNullOperation || $[44] !== multiple || $[45] !== name || $[46] !== operation || $[47] !== updateFilter) {
18784
18764
  t11 = enumValues && multiple && /* @__PURE__ */ jsx(MultiSelect, { size: "medium", position: "item-aligned", value: Array.isArray(internalValue) ? internalValue.map(_temp3$3) : [], disabled: isNullOperation, onValueChange: (value_2) => {
18785
- updateFilter(operation, dataType === "number" ? value_2.map(_temp4$2) : value_2);
18765
+ updateFilter(operation, dataType === "number" ? value_2.map(_temp4$3) : value_2);
18786
18766
  }, multiple, endAdornment: internalValue && /* @__PURE__ */ jsx(IconButton, { className: "absolute right-2 top-3", onClick: (e_2) => updateFilter(operation, void 0), children: /* @__PURE__ */ jsx(CloseIcon, {}) }), children: enumValues.map((enumConfig_0) => /* @__PURE__ */ jsx(MultiSelectItem, { value: String(enumConfig_0.id), children: /* @__PURE__ */ jsx(EnumValuesChip, { enumKey: String(enumConfig_0.id), enumValues, size: "small" }) }, `select_value_${name}_${enumConfig_0.id}`)) });
18787
18767
  $[40] = dataType;
18788
18768
  $[41] = enumValues;
@@ -18824,7 +18804,7 @@ function StringNumberFilterField(t0) {
18824
18804
  }
18825
18805
  return t13;
18826
18806
  }
18827
- function _temp4$2(v) {
18807
+ function _temp4$3(v) {
18828
18808
  return parseInt(v);
18829
18809
  }
18830
18810
  function _temp3$3(e_1) {
@@ -18833,7 +18813,7 @@ function _temp3$3(e_1) {
18833
18813
  function _temp2$6(op_2) {
18834
18814
  return /* @__PURE__ */ jsx(SelectItem, { value: op_2, children: operationLabels$1[op_2] }, op_2);
18835
18815
  }
18836
- function _temp$l(op_1) {
18816
+ function _temp$m(op_1) {
18837
18817
  return operationLabels$1[op_1];
18838
18818
  }
18839
18819
  function BooleanFilterField(t0) {
@@ -19004,7 +18984,7 @@ function DateTimeFilterField(t0) {
19004
18984
  }
19005
18985
  let t8;
19006
18986
  if ($[17] !== operation || $[18] !== t6 || $[19] !== t7) {
19007
- t8 = /* @__PURE__ */ jsx("div", { className: "w-[100px]", children: /* @__PURE__ */ jsx(Select, { value: operation, size: "medium", fullWidth: true, onValueChange: t6, renderValue: _temp$k, children: t7 }) });
18987
+ t8 = /* @__PURE__ */ jsx("div", { className: "w-[100px]", children: /* @__PURE__ */ jsx(Select, { value: operation, size: "medium", fullWidth: true, onValueChange: t6, renderValue: _temp$l, children: t7 }) });
19008
18988
  $[17] = operation;
19009
18989
  $[18] = t6;
19010
18990
  $[19] = t7;
@@ -19054,7 +19034,7 @@ function DateTimeFilterField(t0) {
19054
19034
  function _temp2$5(op_2) {
19055
19035
  return /* @__PURE__ */ jsx(SelectItem, { value: op_2, children: operationLabels[op_2] }, op_2);
19056
19036
  }
19057
- function _temp$k(op_1) {
19037
+ function _temp$l(op_1) {
19058
19038
  return operationLabels[op_1];
19059
19039
  }
19060
19040
  const SelectableTable = function SelectableTable2({
@@ -19304,7 +19284,8 @@ const EntityCollectionTable = function EntityCollectionTable2({
19304
19284
  const columnsResult = propertiesToColumns({
19305
19285
  properties,
19306
19286
  sortable,
19307
- forceFilter,
19287
+ forcedFilters: tableController.forcedFilters,
19288
+ allowedFilters: tableController.allowedFilters,
19308
19289
  AdditionalHeaderWidget
19309
19290
  });
19310
19291
  const propertyColumnKeys = new Set(columnsResult.map((col) => col.key));
@@ -19451,7 +19432,26 @@ function useDataSourceTableController({
19451
19432
  filterValues: initialFilterUrl,
19452
19433
  sortBy: initialSortUrl
19453
19434
  } = parseFilterAndSort(location.search);
19454
- const [filterValues_0, setFilterValues] = React__default.useState(forceFilter ?? (updateUrl ? initialFilterUrl : void 0) ?? initialFilter ?? void 0);
19435
+ const availableFilterKeys = collection.allowedFilters ?? Object.keys(collection.properties);
19436
+ const forcedFilterKeys = collection.forceFilter ? Object.keys(collection.forceFilter) : [];
19437
+ const allowedFilterKeys = useMemo(() => {
19438
+ const availableKeys = availableFilterKeys.filter((key) => {
19439
+ const property = collection.properties[key];
19440
+ if (!property) return false;
19441
+ if (typeof property === "function") return false;
19442
+ const dataType = property.dataType;
19443
+ const filterable = dataType === "array" ? isDataTypeFilterable(property.of?.dataType, true) : isDataTypeFilterable(dataType);
19444
+ return filterable;
19445
+ });
19446
+ const forcedKeys = forcedFilterKeys.filter((key_0) => !availableKeys.includes(key_0));
19447
+ return [...availableKeys, ...forcedKeys];
19448
+ }, [collection.properties, availableFilterKeys, forcedFilterKeys]);
19449
+ const removeUnallowedFilters = useCallback((filters) => {
19450
+ if (!filters) return;
19451
+ return Object.fromEntries(Object.entries(filters).filter(([key_1]) => allowedFilterKeys.includes(key_1)));
19452
+ }, [allowedFilterKeys]);
19453
+ const initFilters = forceFilter ?? (updateUrl ? initialFilterUrl : void 0) ?? initialFilter ?? void 0;
19454
+ const [filterValues_0, setFilterValues] = React__default.useState(removeUnallowedFilters(initFilters));
19455
19455
  const [sortBy_0, setSortBy] = React__default.useState((updateUrl ? initialSortUrl : void 0) ?? initialSortInternal);
19456
19456
  useUpdateUrl(filterValues_0, sortBy_0, searchString, updateUrl);
19457
19457
  const collectionScroll = scrollRestoration?.getCollectionScroll(fullPath, filterValues_0);
@@ -19474,7 +19474,7 @@ function useDataSourceTableController({
19474
19474
  const [dataLoading, setDataLoading] = useState(false);
19475
19475
  const [dataLoadingError, setDataLoadingError] = useState();
19476
19476
  const [noMoreToLoad, setNoMoreToLoad] = useState(false);
19477
- const clearFilter = useCallback(() => setFilterValues(forceFilter ?? void 0), [forceFilter]);
19477
+ const clearFilter = useCallback(() => setFilterValues(removeUnallowedFilters(forceFilter)), [forceFilter, removeUnallowedFilters]);
19478
19478
  const updateFilterValues = useCallback((updatedFilter) => {
19479
19479
  if (forceFilter) {
19480
19480
  console.warn("Filter is not compatible with the force filter. Ignoring filter");
@@ -19483,9 +19483,9 @@ function useDataSourceTableController({
19483
19483
  if (updatedFilter && Object.keys(updatedFilter).length === 0) {
19484
19484
  setFilterValues(void 0);
19485
19485
  } else {
19486
- setFilterValues(updatedFilter);
19486
+ setFilterValues(removeUnallowedFilters(updatedFilter));
19487
19487
  }
19488
- }, [forceFilter]);
19488
+ }, [forceFilter, removeUnallowedFilters]);
19489
19489
  useEffect(() => {
19490
19490
  setDataLoading(true);
19491
19491
  const onEntitiesUpdate = async (entities) => {
@@ -19560,6 +19560,8 @@ function useDataSourceTableController({
19560
19560
  dataLoadingError,
19561
19561
  filterValues: filterValues_0,
19562
19562
  setFilterValues: updateFilterValues,
19563
+ allowedFilters: allowedFilterKeys,
19564
+ forcedFilters: forcedFilterKeys,
19563
19565
  sortBy: sortBy_0,
19564
19566
  setSortBy,
19565
19567
  searchString,
@@ -19783,7 +19785,7 @@ function useTableSearchHelper(t0) {
19783
19785
  const searchBlocked = t12;
19784
19786
  let t2;
19785
19787
  if ($[15] !== customizationController.plugins || $[16] !== dataSource?.initTextSearch) {
19786
- t2 = Boolean(dataSource?.initTextSearch) || customizationController.plugins?.find(_temp$j);
19788
+ t2 = Boolean(dataSource?.initTextSearch) || customizationController.plugins?.find(_temp$k);
19787
19789
  $[15] = customizationController.plugins;
19788
19790
  $[16] = dataSource?.initTextSearch;
19789
19791
  $[17] = t2;
@@ -19875,7 +19877,7 @@ function useTableSearchHelper(t0) {
19875
19877
  }
19876
19878
  return t1;
19877
19879
  }
19878
- function _temp$j(p_0) {
19880
+ function _temp$k(p_0) {
19879
19881
  return Boolean(p_0.collectionView?.onTextSearchClick);
19880
19882
  }
19881
19883
  function DeleteEntityDialog({
@@ -20497,7 +20499,7 @@ function FavouritesView(t0) {
20497
20499
  T0 = Collapse;
20498
20500
  t4 = favouriteCollections.length > 0;
20499
20501
  t2 = "flex flex-row flex-wrap gap-2 pb-2 min-h-[32px]";
20500
- t3 = favouriteCollections.map(_temp$i);
20502
+ t3 = favouriteCollections.map(_temp$j);
20501
20503
  $[2] = navigationController;
20502
20504
  $[3] = t1;
20503
20505
  $[4] = T0;
@@ -20531,7 +20533,7 @@ function FavouritesView(t0) {
20531
20533
  }
20532
20534
  return t6;
20533
20535
  }
20534
- function _temp$i(entry_0) {
20536
+ function _temp$j(entry_0) {
20535
20537
  return /* @__PURE__ */ jsx(NavigationChip, { entry: entry_0 }, entry_0.path);
20536
20538
  }
20537
20539
  const scrollsMap = {};
@@ -20768,7 +20770,7 @@ const NavigationCard = React__default.memo(function NavigationCard2(t0) {
20768
20770
  }
20769
20771
  let t4;
20770
20772
  if ($[4] !== actions) {
20771
- t4 = /* @__PURE__ */ jsx("div", { className: "flex items-center gap-0.5", onClick: _temp$h, children: actions });
20773
+ t4 = /* @__PURE__ */ jsx("div", { className: "flex items-center gap-0.5", onClick: _temp$i, children: actions });
20772
20774
  $[4] = actions;
20773
20775
  $[5] = t4;
20774
20776
  } else {
@@ -20855,7 +20857,7 @@ const NavigationCard = React__default.memo(function NavigationCard2(t0) {
20855
20857
  }
20856
20858
  return t12;
20857
20859
  });
20858
- function _temp$h(event) {
20860
+ function _temp$i(event) {
20859
20861
  event.preventDefault();
20860
20862
  event.stopPropagation();
20861
20863
  }
@@ -20915,7 +20917,7 @@ function SmallNavigationCard(t0) {
20915
20917
  return t5;
20916
20918
  }
20917
20919
  function NavigationCardBinding(t0) {
20918
- const $ = c(35);
20920
+ const $ = c(38);
20919
20921
  const {
20920
20922
  path,
20921
20923
  collection,
@@ -20928,6 +20930,9 @@ function NavigationCardBinding(t0) {
20928
20930
  shrink
20929
20931
  } = t0;
20930
20932
  const userConfigurationPersistence = useUserConfigurationPersistence();
20933
+ const {
20934
+ t
20935
+ } = useTranslation();
20931
20936
  const t1 = collection ?? view;
20932
20937
  let t2;
20933
20938
  if ($[0] !== t1) {
@@ -21000,51 +21005,61 @@ function NavigationCardBinding(t0) {
21000
21005
  t5 = $[13];
21001
21006
  }
21002
21007
  const actions = t5;
21008
+ let t6;
21009
+ if ($[18] !== name || $[19] !== t) {
21010
+ t6 = t(name);
21011
+ $[18] = name;
21012
+ $[19] = t;
21013
+ $[20] = t6;
21014
+ } else {
21015
+ t6 = $[20];
21016
+ }
21017
+ const translatedName = t6;
21003
21018
  if (type === "admin") {
21004
- let t62;
21005
- if ($[18] !== collectionIcon || $[19] !== name || $[20] !== url) {
21006
- t62 = /* @__PURE__ */ jsx(SmallNavigationCard, { icon: collectionIcon, name, url });
21007
- $[18] = collectionIcon;
21008
- $[19] = name;
21009
- $[20] = url;
21010
- $[21] = t62;
21019
+ let t72;
21020
+ if ($[21] !== collectionIcon || $[22] !== translatedName || $[23] !== url) {
21021
+ t72 = /* @__PURE__ */ jsx(SmallNavigationCard, { icon: collectionIcon, name: translatedName, url });
21022
+ $[21] = collectionIcon;
21023
+ $[22] = translatedName;
21024
+ $[23] = url;
21025
+ $[24] = t72;
21011
21026
  } else {
21012
- t62 = $[21];
21027
+ t72 = $[24];
21013
21028
  }
21014
- return t62;
21029
+ return t72;
21015
21030
  }
21016
- let t6;
21017
- if ($[22] !== navigate || $[23] !== onClick || $[24] !== path || $[25] !== url || $[26] !== userConfigurationPersistence) {
21018
- t6 = () => {
21031
+ let t7;
21032
+ if ($[25] !== navigate || $[26] !== onClick || $[27] !== path || $[28] !== url || $[29] !== userConfigurationPersistence) {
21033
+ t7 = () => {
21019
21034
  onClick?.();
21020
21035
  navigate(url);
21021
21036
  if (userConfigurationPersistence) {
21022
21037
  userConfigurationPersistence.setRecentlyVisitedPaths([path, ...(userConfigurationPersistence.recentlyVisitedPaths ?? []).filter((p_0) => p_0 !== path)]);
21023
21038
  }
21024
21039
  };
21025
- $[22] = navigate;
21026
- $[23] = onClick;
21027
- $[24] = path;
21028
- $[25] = url;
21029
- $[26] = userConfigurationPersistence;
21030
- $[27] = t6;
21040
+ $[25] = navigate;
21041
+ $[26] = onClick;
21042
+ $[27] = path;
21043
+ $[28] = url;
21044
+ $[29] = userConfigurationPersistence;
21045
+ $[30] = t7;
21031
21046
  } else {
21032
- t6 = $[27];
21047
+ t7 = $[30];
21033
21048
  }
21034
- let t7;
21035
- if ($[28] !== actions || $[29] !== collectionIcon || $[30] !== description || $[31] !== name || $[32] !== shrink || $[33] !== t6) {
21036
- t7 = /* @__PURE__ */ jsx(NavigationCard, { icon: collectionIcon, name, description, actions, onClick: t6, shrink });
21037
- $[28] = actions;
21038
- $[29] = collectionIcon;
21039
- $[30] = description;
21040
- $[31] = name;
21041
- $[32] = shrink;
21042
- $[33] = t6;
21043
- $[34] = t7;
21049
+ let t8;
21050
+ if ($[31] !== actions || $[32] !== collectionIcon || $[33] !== description || $[34] !== shrink || $[35] !== t7 || $[36] !== translatedName) {
21051
+ t8 = /* @__PURE__ */ jsx(NavigationCard, { icon: collectionIcon, name: translatedName, description, actions, onClick: t7, shrink });
21052
+ $[31] = actions;
21053
+ $[32] = collectionIcon;
21054
+ $[33] = description;
21055
+ $[34] = shrink;
21056
+ $[35] = t7;
21057
+ $[36] = translatedName;
21058
+ $[37] = t8;
21044
21059
  } else {
21045
- t7 = $[34];
21060
+ t8 = $[37];
21046
21061
  }
21047
- return t7;
21062
+ return t8;
21048
21063
  }
21049
21064
  const animateLayoutChanges = (args) => defaultAnimateLayoutChanges({
21050
21065
  ...args,
@@ -23198,7 +23213,7 @@ const BoardColumn = memo(function BoardColumn2(t0) {
23198
23213
  let t19;
23199
23214
  let t20;
23200
23215
  if ($[19] !== items2) {
23201
- t20 = items2.map(_temp$g);
23216
+ t20 = items2.map(_temp$h);
23202
23217
  $[19] = items2;
23203
23218
  $[20] = t20;
23204
23219
  } else {
@@ -23304,7 +23319,7 @@ const BoardColumn = memo(function BoardColumn2(t0) {
23304
23319
  }
23305
23320
  return t29;
23306
23321
  });
23307
- function _temp$g(i) {
23322
+ function _temp$h(i) {
23308
23323
  return i.id;
23309
23324
  }
23310
23325
  function Board(t0) {
@@ -25240,7 +25255,8 @@ function FiltersDialog({
25240
25255
  properties,
25241
25256
  filterValues,
25242
25257
  setFilterValues,
25243
- forceFilter
25258
+ forceFilter,
25259
+ allowedFilters
25244
25260
  }) {
25245
25261
  const {
25246
25262
  t
@@ -25252,15 +25268,14 @@ function FiltersDialog({
25252
25268
  setLocalFilters(filterValues ?? {});
25253
25269
  }
25254
25270
  }, [open, filterValues]);
25255
- const filterableProperties = useMemo(() => {
25256
- return Object.entries(properties).filter(([key, property]) => {
25257
- if (!property) return false;
25258
- if (forceFilter && key in forceFilter) return false;
25259
- const baseProperty = property.dataType === "array" ? property.of : property;
25260
- if (!baseProperty) return false;
25261
- return ["string", "number", "boolean", "date", "reference"].includes(baseProperty.dataType);
25271
+ const editableFilterProperties = useMemo(() => {
25272
+ return Object.entries(properties).filter(([key]) => {
25273
+ const isFilterAllowed = !allowedFilters || allowedFilters.includes(key);
25274
+ const isFilterForced = Boolean(forceFilter && Object.keys(forceFilter).includes(key));
25275
+ return isFilterAllowed && !isFilterForced;
25262
25276
  });
25263
- }, [properties, forceFilter]);
25277
+ }, [properties, allowedFilters, forceFilter]);
25278
+ const hasEditableFilterProperties = editableFilterProperties.length > 0;
25264
25279
  const handleFilterChange = useCallback((propertyKey, value) => {
25265
25280
  setLocalFilters((prev) => {
25266
25281
  const newFilters = {
@@ -25292,22 +25307,26 @@ function FiltersDialog({
25292
25307
  }));
25293
25308
  }, []);
25294
25309
  const isAnyFieldHidden = Object.values(hiddenFields).some((hidden_0) => hidden_0);
25295
- const activeFilterCount = Object.keys(localFilters).length;
25296
- const renderFilterField = useCallback((propertyKey_1, property_0) => {
25297
- const isArray = property_0.dataType === "array";
25298
- const baseProperty_0 = isArray ? property_0.of : property_0;
25299
- if (!baseProperty_0) return null;
25310
+ const getActiveFilterCount = () => {
25311
+ const editableLocalFilters = Object.keys(localFilters).filter((key_0) => !forceFilter || !(key_0 in forceFilter));
25312
+ return editableLocalFilters.length;
25313
+ };
25314
+ const activeFilterCount = getActiveFilterCount();
25315
+ const renderFilterField = useCallback((propertyKey_1, property) => {
25316
+ const isArray = property.dataType === "array";
25317
+ const baseProperty = isArray ? property.of : property;
25318
+ if (!baseProperty) return null;
25300
25319
  const filterValue = localFilters[propertyKey_1];
25301
25320
  const setValue = (value_0) => handleFilterChange(propertyKey_1, value_0);
25302
- if (baseProperty_0.dataType === "reference") {
25303
- return /* @__PURE__ */ jsx(ReferenceFilterField, { value: filterValue, setValue, name: propertyKey_1, isArray, path: baseProperty_0.path, title: property_0.name, includeId: baseProperty_0.includeId, previewProperties: baseProperty_0.previewProperties, hidden: hiddenFields[propertyKey_1] ?? false, setHidden: (hidden_1) => setHiddenForField(propertyKey_1, hidden_1) });
25304
- } else if (baseProperty_0.dataType === "number" || baseProperty_0.dataType === "string") {
25305
- const enumValues = baseProperty_0.enumValues ? enumToObjectEntries(baseProperty_0.enumValues) : void 0;
25306
- return /* @__PURE__ */ jsx(StringNumberFilterField, { value: filterValue, setValue, name: propertyKey_1, dataType: baseProperty_0.dataType, isArray, enumValues, title: property_0.name });
25307
- } else if (baseProperty_0.dataType === "boolean") {
25308
- return /* @__PURE__ */ jsx(BooleanFilterField, { value: filterValue, setValue, name: propertyKey_1, title: property_0.name });
25309
- } else if (baseProperty_0.dataType === "date") {
25310
- return /* @__PURE__ */ jsx(DateTimeFilterField, { value: filterValue, setValue, name: propertyKey_1, mode: baseProperty_0.mode, isArray, title: property_0.name });
25321
+ if (baseProperty.dataType === "reference") {
25322
+ return /* @__PURE__ */ jsx(ReferenceFilterField, { value: filterValue, setValue, name: propertyKey_1, isArray, path: baseProperty.path, title: property.name, includeId: baseProperty.includeId, previewProperties: baseProperty.previewProperties, hidden: hiddenFields[propertyKey_1] ?? false, setHidden: (hidden_1) => setHiddenForField(propertyKey_1, hidden_1) });
25323
+ } else if (baseProperty.dataType === "number" || baseProperty.dataType === "string") {
25324
+ const enumValues = baseProperty.enumValues ? enumToObjectEntries(baseProperty.enumValues) : void 0;
25325
+ return /* @__PURE__ */ jsx(StringNumberFilterField, { value: filterValue, setValue, name: propertyKey_1, dataType: baseProperty.dataType, isArray, enumValues, title: property.name });
25326
+ } else if (baseProperty.dataType === "boolean") {
25327
+ return /* @__PURE__ */ jsx(BooleanFilterField, { value: filterValue, setValue, name: propertyKey_1, title: property.name });
25328
+ } else if (baseProperty.dataType === "date") {
25329
+ return /* @__PURE__ */ jsx(DateTimeFilterField, { value: filterValue, setValue, name: propertyKey_1, mode: baseProperty.mode, isArray, title: property.name });
25311
25330
  }
25312
25331
  return null;
25313
25332
  }, [localFilters, handleFilterChange, hiddenFields, setHiddenForField]);
@@ -25316,23 +25335,25 @@ function FiltersDialog({
25316
25335
  /* @__PURE__ */ jsx(Typography, { variant: "h6", children: t("filters") }),
25317
25336
  activeFilterCount > 0 && /* @__PURE__ */ jsx("span", { className: "ml-2 px-2 py-0.5 text-xs rounded-full bg-primary text-white", children: activeFilterCount })
25318
25337
  ] }),
25319
- /* @__PURE__ */ jsx(DialogContent, { children: filterableProperties.length === 0 ? /* @__PURE__ */ jsx(Typography, { color: "secondary", className: "py-8 text-center", children: t("no_filterable_properties") }) : /* @__PURE__ */ jsx("table", { className: "w-full border-collapse", children: /* @__PURE__ */ jsx("tbody", { children: filterableProperties.map(([propertyKey_2, property_1], index) => {
25338
+ /* @__PURE__ */ jsx(DialogContent, { children: !hasEditableFilterProperties ? /* @__PURE__ */ jsx(Typography, { color: "secondary", className: "py-8 text-center", children: t("no_filterable_properties") }) : /* @__PURE__ */ jsx("table", { className: "w-full border-collapse", children: /* @__PURE__ */ jsx("tbody", { children: editableFilterProperties.map(([propertyKey_2, property_0], index) => {
25320
25339
  const hasFilter = propertyKey_2 in localFilters;
25321
25340
  return /* @__PURE__ */ jsxs("tr", { className: cls(index > 0 && "border-t", defaultBorderMixin), children: [
25322
- /* @__PURE__ */ jsx("td", { className: "py-3 pr-4 align-middle w-[160px]", children: /* @__PURE__ */ jsx(Typography, { variant: "body2", className: cls("font-medium", hasFilter && "text-primary"), children: property_1.name || propertyKey_2 }) }),
25323
- /* @__PURE__ */ jsx("td", { className: "py-3", children: renderFilterField(propertyKey_2, property_1) })
25341
+ /* @__PURE__ */ jsx("td", { className: "py-3 pr-4 align-middle w-[160px]", children: /* @__PURE__ */ jsx(Typography, { variant: "body2", className: cls("font-medium", hasFilter && "text-primary"), children: property_0.name || propertyKey_2 }) }),
25342
+ /* @__PURE__ */ jsx("td", { className: "py-3", children: renderFilterField(propertyKey_2, property_0) })
25324
25343
  ] }, propertyKey_2);
25325
25344
  }) }) }) }),
25326
25345
  /* @__PURE__ */ jsxs(DialogActions, { children: [
25327
25346
  /* @__PURE__ */ jsx(Button, { variant: "text", onClick: handleClearAll, disabled: activeFilterCount === 0, children: t("clear") }),
25328
25347
  /* @__PURE__ */ jsx("div", { className: "flex-grow" }),
25329
- /* @__PURE__ */ jsx(Button, { variant: "text", onClick: () => onOpenChange(false), children: t("cancel") }),
25330
- /* @__PURE__ */ jsx(Button, { variant: "filled", onClick: handleApply, children: t("apply_filters") })
25348
+ hasEditableFilterProperties && /* @__PURE__ */ jsxs(Fragment, { children: [
25349
+ /* @__PURE__ */ jsx(Button, { variant: "text", onClick: () => onOpenChange(false), children: t("cancel") }),
25350
+ /* @__PURE__ */ jsx(Button, { variant: "filled", onClick: handleApply, children: t("apply_filters") })
25351
+ ] })
25331
25352
  ] })
25332
25353
  ] });
25333
25354
  }
25334
25355
  function EntityCollectionViewStartActions(t0) {
25335
- const $ = c(36);
25356
+ const $ = c(37);
25336
25357
  const {
25337
25358
  collection,
25338
25359
  relativePath,
@@ -25396,34 +25417,36 @@ function EntityCollectionViewStartActions(t0) {
25396
25417
  t3 = $[13];
25397
25418
  }
25398
25419
  const actionProps = t3;
25420
+ const hasAnyAllowedFilters = !tableController.allowedFilters || tableController.allowedFilters.length > 0;
25399
25421
  let t4;
25400
- if ($[14] !== activeFilterCount || $[15] !== largeLayout || $[16] !== resolvedProperties || $[17] !== t || $[18] !== tableController.setFilterValues) {
25401
- t4 = resolvedProperties && tableController.setFilterValues && /* @__PURE__ */ jsx(Tooltip, { title: t("filters"), children: /* @__PURE__ */ jsx(Badge, { color: "primary", invisible: activeFilterCount === 0, children: largeLayout ? /* @__PURE__ */ jsxs(Button, { variant: "text", size: "small", onClick: () => setFiltersDialogOpen(true), startIcon: /* @__PURE__ */ jsx(FilterListIcon, { size: "small" }), className: cls(activeFilterCount > 0 && "text-primary"), children: [
25422
+ if ($[14] !== activeFilterCount || $[15] !== hasAnyAllowedFilters || $[16] !== largeLayout || $[17] !== resolvedProperties || $[18] !== t || $[19] !== tableController.setFilterValues) {
25423
+ t4 = resolvedProperties && tableController.setFilterValues && hasAnyAllowedFilters && /* @__PURE__ */ jsx(Tooltip, { title: t("filters"), children: /* @__PURE__ */ jsx(Badge, { color: "primary", invisible: activeFilterCount === 0, children: largeLayout ? /* @__PURE__ */ jsxs(Button, { variant: "text", size: "small", onClick: () => setFiltersDialogOpen(true), startIcon: /* @__PURE__ */ jsx(FilterListIcon, { size: "small" }), className: cls(activeFilterCount > 0 && "text-primary"), children: [
25402
25424
  t("filters"),
25403
25425
  activeFilterCount > 0 ? ` (${activeFilterCount})` : ""
25404
25426
  ] }) : /* @__PURE__ */ jsx(IconButton, { size: "small", onClick: () => setFiltersDialogOpen(true), className: cls(activeFilterCount > 0 && "text-primary"), children: /* @__PURE__ */ jsx(FilterListIcon, { size: "small" }) }) }) }, "filters_tooltip");
25405
25427
  $[14] = activeFilterCount;
25406
- $[15] = largeLayout;
25407
- $[16] = resolvedProperties;
25408
- $[17] = t;
25409
- $[18] = tableController.setFilterValues;
25410
- $[19] = t4;
25428
+ $[15] = hasAnyAllowedFilters;
25429
+ $[16] = largeLayout;
25430
+ $[17] = resolvedProperties;
25431
+ $[18] = t;
25432
+ $[19] = tableController.setFilterValues;
25433
+ $[20] = t4;
25411
25434
  } else {
25412
- t4 = $[19];
25435
+ t4 = $[20];
25413
25436
  }
25414
25437
  const filtersButton = t4;
25415
25438
  const t5 = !collection.forceFilter;
25416
25439
  let t6;
25417
- if ($[20] !== t5 || $[21] !== tableController) {
25440
+ if ($[21] !== t5 || $[22] !== tableController) {
25418
25441
  t6 = /* @__PURE__ */ jsx(ClearFilterSortButton, { tableController, enabled: t5 }, "clear_filter");
25419
- $[20] = t5;
25420
- $[21] = tableController;
25421
- $[22] = t6;
25442
+ $[21] = t5;
25443
+ $[22] = tableController;
25444
+ $[23] = t6;
25422
25445
  } else {
25423
- t6 = $[22];
25446
+ t6 = $[23];
25424
25447
  }
25425
25448
  let actions;
25426
- if ($[23] !== actionProps || $[24] !== filtersButton || $[25] !== plugins || $[26] !== t6) {
25449
+ if ($[24] !== actionProps || $[25] !== filtersButton || $[26] !== plugins || $[27] !== t6) {
25427
25450
  actions = [filtersButton, t6];
25428
25451
  if (plugins) {
25429
25452
  plugins.forEach((plugin, i) => {
@@ -25432,39 +25455,42 @@ function EntityCollectionViewStartActions(t0) {
25432
25455
  }
25433
25456
  });
25434
25457
  }
25435
- $[23] = actionProps;
25436
- $[24] = filtersButton;
25437
- $[25] = plugins;
25438
- $[26] = t6;
25439
- $[27] = actions;
25458
+ $[24] = actionProps;
25459
+ $[25] = filtersButton;
25460
+ $[26] = plugins;
25461
+ $[27] = t6;
25462
+ $[28] = actions;
25440
25463
  } else {
25441
- actions = $[27];
25464
+ actions = $[28];
25442
25465
  }
25443
25466
  let t7;
25444
- if ($[28] !== collection.forceFilter || $[29] !== filtersDialogOpen || $[30] !== resolvedProperties || $[31] !== tableController) {
25445
- t7 = resolvedProperties && tableController.setFilterValues && /* @__PURE__ */ jsx(FiltersDialog, { open: filtersDialogOpen, onOpenChange: setFiltersDialogOpen, properties: resolvedProperties, filterValues: tableController.filterValues, setFilterValues: (filterValues_0) => tableController.setFilterValues?.(filterValues_0 ?? {}), forceFilter: collection.forceFilter });
25446
- $[28] = collection.forceFilter;
25447
- $[29] = filtersDialogOpen;
25448
- $[30] = resolvedProperties;
25449
- $[31] = tableController;
25450
- $[32] = t7;
25467
+ if ($[29] !== collection.forceFilter || $[30] !== filtersDialogOpen || $[31] !== resolvedProperties || $[32] !== tableController) {
25468
+ t7 = resolvedProperties && tableController.setFilterValues && /* @__PURE__ */ jsx(FiltersDialog, { open: filtersDialogOpen, onOpenChange: setFiltersDialogOpen, properties: resolvedProperties, filterValues: tableController.filterValues, setFilterValues: (filterValues_0) => tableController.setFilterValues?.(filterValues_0 ?? {}), forceFilter: collection.forceFilter, allowedFilters: tableController.allowedFilters?.map(_temp$g) });
25469
+ $[29] = collection.forceFilter;
25470
+ $[30] = filtersDialogOpen;
25471
+ $[31] = resolvedProperties;
25472
+ $[32] = tableController;
25473
+ $[33] = t7;
25451
25474
  } else {
25452
- t7 = $[32];
25475
+ t7 = $[33];
25453
25476
  }
25454
25477
  let t8;
25455
- if ($[33] !== actions || $[34] !== t7) {
25478
+ if ($[34] !== actions || $[35] !== t7) {
25456
25479
  t8 = /* @__PURE__ */ jsxs(Fragment, { children: [
25457
25480
  actions,
25458
25481
  t7
25459
25482
  ] });
25460
- $[33] = actions;
25461
- $[34] = t7;
25462
- $[35] = t8;
25483
+ $[34] = actions;
25484
+ $[35] = t7;
25485
+ $[36] = t8;
25463
25486
  } else {
25464
- t8 = $[35];
25487
+ t8 = $[36];
25465
25488
  }
25466
25489
  return t8;
25467
25490
  }
25491
+ function _temp$g(key_0) {
25492
+ return key_0.toString();
25493
+ }
25468
25494
  const collectionScrollCache = /* @__PURE__ */ new Map();
25469
25495
  function useScrollRestoration() {
25470
25496
  const updateCollectionScroll = ({
@@ -25523,7 +25549,12 @@ const EntityCollectionView$1 = React__default.memo(function EntityCollectionView
25523
25549
  const scrollRestoration = useScrollRestoration();
25524
25550
  const collection = useMemo(() => {
25525
25551
  const userOverride = userConfigPersistence?.getCollectionConfig(fullPath);
25526
- return userOverride ? mergeDeep(collectionProp, userOverride) : collectionProp;
25552
+ if (!userOverride) return collectionProp;
25553
+ const {
25554
+ properties,
25555
+ ...rest
25556
+ } = userOverride;
25557
+ return mergeDeep(collectionProp, rest);
25527
25558
  }, [collectionProp, fullPath, userConfigPersistence?.getCollectionConfig]);
25528
25559
  const openEntityMode = collection?.openEntityMode ?? DEFAULT_ENTITY_OPEN_MODE;
25529
25560
  const collectionRef = React__default.useRef(collection);
@@ -25777,11 +25808,12 @@ const EntityCollectionView$1 = React__default.memo(function EntityCollectionView
25777
25808
  collection,
25778
25809
  path: fullPath,
25779
25810
  propertyConfigs: customizationController.propertyConfigs,
25780
- authController
25781
- }), [collection, fullPath]);
25811
+ authController,
25812
+ userConfigPersistence
25813
+ }), [collection, fullPath, userConfigPersistence]);
25782
25814
  const hasEnumProperty = useMemo(() => {
25783
- const properties = resolvedCollection.properties;
25784
- return Object.values(properties).some((prop) => prop && prop.dataType === "string" && prop.enumValues);
25815
+ const properties_0 = resolvedCollection.properties;
25816
+ return Object.values(properties_0).some((prop) => prop && prop.dataType === "string" && prop.enumValues);
25785
25817
  }, [resolvedCollection.properties]);
25786
25818
  const enabledViews = useMemo(() => {
25787
25819
  const configured = collection.enabledViews ?? ["table", "cards", "kanban"];
@@ -25792,8 +25824,8 @@ const EntityCollectionView$1 = React__default.memo(function EntityCollectionView
25792
25824
  }, [collection.enabledViews, hasEnumProperty]);
25793
25825
  const kanbanPropertyOptions = useMemo(() => {
25794
25826
  const options = [];
25795
- const properties_0 = resolvedCollection.properties;
25796
- for (const [key_0, property_0] of Object.entries(properties_0)) {
25827
+ const properties_1 = resolvedCollection.properties;
25828
+ for (const [key_0, property_0] of Object.entries(properties_1)) {
25797
25829
  const prop_0 = property_0;
25798
25830
  if (prop_0 && prop_0.dataType === "string" && prop_0.enumValues) {
25799
25831
  options.push({
@@ -27156,7 +27188,7 @@ function ReferenceWidget({
27156
27188
  const onMultipleEntitiesSelected = useCallback((entities) => {
27157
27189
  if (disabled) return;
27158
27190
  if (onMultipleReferenceSelected) {
27159
- const references = entities ? entities.map((e) => getReferenceFrom(e)) : null;
27191
+ const references = entities ? entities.filter(Boolean).map((e) => getReferenceFrom(e)) : null;
27160
27192
  onMultipleReferenceSelected({
27161
27193
  references,
27162
27194
  entities
@@ -28096,7 +28128,14 @@ function useBuildNavigationController(props) {
28096
28128
  if (!collections_0) return void 0;
28097
28129
  const baseCollection = getCollectionByPathOrId(removeInitialAndTrailingSlashes(idOrPath), collections_0);
28098
28130
  const userOverride = includeUserOverride ? userConfigPersistence?.getCollectionConfig(idOrPath) : void 0;
28099
- const overriddenCollection = baseCollection ? mergeDeep(baseCollection, userOverride ?? {}) : void 0;
28131
+ let overriddenCollection = baseCollection;
28132
+ if (baseCollection && userOverride) {
28133
+ const {
28134
+ properties,
28135
+ ...rest
28136
+ } = userOverride;
28137
+ overriddenCollection = mergeDeep(baseCollection, rest);
28138
+ }
28100
28139
  let result = overriddenCollection;
28101
28140
  if (overriddenCollection) {
28102
28141
  const subcollections = overriddenCollection.subcollections;
@@ -30037,7 +30076,7 @@ function useBuildSideDialogsController() {
30037
30076
  replace: true,
30038
30077
  state: {
30039
30078
  base_location: baseLocation,
30040
- panels: updatedPanels.map(_temp4$1)
30079
+ panels: updatedPanels.map(_temp4$2)
30041
30080
  }
30042
30081
  });
30043
30082
  }
@@ -30135,7 +30174,7 @@ function _temp6$1(p_4) {
30135
30174
  function _temp5$1(p_3) {
30136
30175
  return p_3.key;
30137
30176
  }
30138
- function _temp4$1(p_2) {
30177
+ function _temp4$2(p_2) {
30139
30178
  return p_2.key;
30140
30179
  }
30141
30180
  function _temp3$2(p_1) {
@@ -32281,7 +32320,7 @@ const Scaffold = React__default.memo(function Scaffold2(props) {
32281
32320
  const otherChildren = t3;
32282
32321
  const includeDrawer = drawerChildren.length > 0;
32283
32322
  const largeLayout = useLargeLayout();
32284
- const [drawerOpen, setDrawerOpen] = React__default.useState(false);
32323
+ const [drawerOpen, setDrawerOpen] = React__default.useState(_temp4$1);
32285
32324
  const [onHover, setOnHover] = React__default.useState(false);
32286
32325
  let t4;
32287
32326
  if ($[6] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
@@ -32303,6 +32342,10 @@ const Scaffold = React__default.memo(function Scaffold2(props) {
32303
32342
  if ($[8] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
32304
32343
  t6 = () => {
32305
32344
  setDrawerOpen(true);
32345
+ try {
32346
+ localStorage.setItem("firecms_drawer_open", "true");
32347
+ } catch {
32348
+ }
32306
32349
  };
32307
32350
  $[8] = t6;
32308
32351
  } else {
@@ -32313,6 +32356,10 @@ const Scaffold = React__default.memo(function Scaffold2(props) {
32313
32356
  if ($[9] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
32314
32357
  t7 = () => {
32315
32358
  setDrawerOpen(false);
32359
+ try {
32360
+ localStorage.setItem("firecms_drawer_open", "false");
32361
+ } catch {
32362
+ }
32316
32363
  };
32317
32364
  $[9] = t7;
32318
32365
  } else {
@@ -32665,6 +32712,13 @@ function _temp2$1(child_0) {
32665
32712
  function _temp3$1(child_1) {
32666
32713
  return child_1.type.componentType !== "Drawer" && child_1.type.componentType !== "AppBar";
32667
32714
  }
32715
+ function _temp4$1() {
32716
+ try {
32717
+ return localStorage.getItem("firecms_drawer_open") === "true";
32718
+ } catch {
32719
+ return false;
32720
+ }
32721
+ }
32668
32722
  const en = {
32669
32723
  // ─── Form actions ────────────────────────────────────────────
32670
32724
  save: "Save",
@@ -32802,8 +32856,8 @@ const en = {
32802
32856
  // ─── Error states ─────────────────────────────────────────────
32803
32857
  error: "Error",
32804
32858
  error_uploading_file: "Error uploading file",
32805
- error_deleting: "Error deleting",
32806
- error_before_delete: "Error before delete",
32859
+ error_deleting: "Error deleting: {{message}}",
32860
+ error_before_delete: "Error before delete: {{message}}",
32807
32861
  error_updating_asset: "Error updating asset",
32808
32862
  error_deleting_asset: "Error deleting asset",
32809
32863
  error_firestore_index: "A Firestore index is required for this query.",
@@ -33068,8 +33122,8 @@ const en = {
33068
33122
  cms_users: "CMS Users",
33069
33123
  roles_menu: "Roles",
33070
33124
  project_settings: "Project settings",
33071
- firestore_explorer: "Firestore Explorer",
33072
- explore_your_firestore_data: "Explore your Firestore data",
33125
+ firestore_manager: "Firestore Manager",
33126
+ manage_your_firestore_data: "Manage your Firestore data",
33073
33127
  // ─── FireCMS Cloud Login ──────────────────────────────────────
33074
33128
  build_admin_panel_in_minutes: "Build Your Firebase Admin Panel in Minutes",
33075
33129
  go_live_instantly: "Go live instantly:",
@@ -33140,10 +33194,18 @@ const en = {
33140
33194
  auto_setup_collections_button: "Automatically set up collections",
33141
33195
  auto_setup_collections_title: "Automatically set up collections?",
33142
33196
  auto_setup_collections_desc: "This will automatically create collection configs for collections that are <b>NOT</b> already mapped",
33143
- this_can_take_a_minute: "This can take a minute or two",
33197
+ setting_up_collections: "Setting up collections",
33198
+ setting_up_collection: "Setting up {{name}}",
33144
33199
  no_collections_found_to_setup: "No collections found to setup.",
33145
33200
  collections_have_been_setup: "Collections have been automatically setup.",
33146
33201
  error_setting_up_collections: "Error automatically setting up collections",
33202
+ setup_collections_title: "Set up collections",
33203
+ setup_collections_select_desc: "Select which collections to automatically set up:",
33204
+ select_all: "Select all",
33205
+ deselect_all: "Deselect all",
33206
+ setup_collections_confirm: "Set up ({{count}})",
33207
+ collection_setup_success: "{{name}} has been set up",
33208
+ go_to_collection: "Go to collection",
33147
33209
  // --- Home Suggestions ---
33148
33210
  add_your: "Add your",
33149
33211
  database_collections: "database collections",
@@ -33471,8 +33533,8 @@ const es = {
33471
33533
  // ─── Error states ─────────────────────────────────────────────
33472
33534
  error: "Error",
33473
33535
  error_uploading_file: "Error al subir archivo",
33474
- error_deleting: "Error al eliminar",
33475
- error_before_delete: "Error antes de eliminar",
33536
+ error_deleting: "Error al eliminar: {{message}}",
33537
+ error_before_delete: "Error antes de eliminar: {{message}}",
33476
33538
  error_updating_asset: "Error al actualizar recurso",
33477
33539
  error_deleting_asset: "Error al eliminar recurso",
33478
33540
  error_firestore_index: "Se requiere un índice de Firestore para esta consulta.",
@@ -33739,8 +33801,8 @@ const es = {
33739
33801
  cms_users: "Usuarios del CMS",
33740
33802
  roles_menu: "Roles",
33741
33803
  project_settings: "Ajustes del proyecto",
33742
- firestore_explorer: "Explorador de Firestore",
33743
- explore_your_firestore_data: "Explora tus datos de Firestore",
33804
+ firestore_manager: "Gestor de Firestore",
33805
+ manage_your_firestore_data: "Gestiona tus datos de Firestore",
33744
33806
  // ─── FireCMS Cloud Login ──────────────────────────────────────
33745
33807
  build_admin_panel_in_minutes: "Crea tu panel de administración de Firebase en minutos",
33746
33808
  go_live_instantly: "En vivo al instante:",
@@ -33811,10 +33873,18 @@ const es = {
33811
33873
  auto_setup_collections_button: "Configurar colecciones automáticamente",
33812
33874
  auto_setup_collections_title: "¿Configurar colecciones automáticamente?",
33813
33875
  auto_setup_collections_desc: "Esto creará automáticamente la configuración de las colecciones que <b>NO</b> estén mapeadas",
33814
- this_can_take_a_minute: "Esto puede tardar un minuto o dos",
33876
+ setting_up_collections: "Configurando colecciones",
33877
+ setting_up_collection: "Configurando {{name}}",
33815
33878
  no_collections_found_to_setup: "No se encontraron colecciones para configurar",
33816
33879
  collections_have_been_setup: "¡Tus colecciones han sido configuradas!",
33817
33880
  error_setting_up_collections: "Error al configurar colecciones",
33881
+ setup_collections_title: "Set up collections",
33882
+ setup_collections_select_desc: "Select which collections to automatically set up:",
33883
+ select_all: "Select all",
33884
+ deselect_all: "Deselect all",
33885
+ setup_collections_confirm: "Set up ({{count}})",
33886
+ collection_setup_success: "{{name}} has been set up",
33887
+ go_to_collection: "Go to collection",
33818
33888
  // --- Home Suggestions ---
33819
33889
  add_your: "Añade tus",
33820
33890
  database_collections: "colecciones de base de datos",
@@ -34144,8 +34214,8 @@ const de = {
34144
34214
  // ─── Error states ─────────────────────────────────────────────
34145
34215
  error: "Fehler",
34146
34216
  error_uploading_file: "Fehler beim Hochladen der Datei",
34147
- error_deleting: "Fehler beim Löschen",
34148
- error_before_delete: "Fehler vor dem Löschen",
34217
+ error_deleting: "Fehler beim Löschen: {{message}}",
34218
+ error_before_delete: "Fehler vor dem Löschen: {{message}}",
34149
34219
  error_updating_asset: "Fehler beim Aktualisieren des Assets",
34150
34220
  error_deleting_asset: "Fehler beim Löschen des Assets",
34151
34221
  error_firestore_index: "Für diese Abfrage ist ein Firestore-Index erforderlich.",
@@ -34410,8 +34480,8 @@ const de = {
34410
34480
  cms_users: "CMS-Benutzer",
34411
34481
  roles_menu: "Rollen",
34412
34482
  project_settings: "Projekteinstellungen",
34413
- firestore_explorer: "Firestore-Explorer",
34414
- explore_your_firestore_data: "Deine Firestore-Daten durchsuchen",
34483
+ firestore_manager: "Firestore-Manager",
34484
+ manage_your_firestore_data: "Deine Firestore-Daten verwalten",
34415
34485
  // ─── FireCMS Cloud Login ──────────────────────────────────────
34416
34486
  build_admin_panel_in_minutes: "Erstellen Sie Ihr Firebase Admin Panel in wenigen Minuten",
34417
34487
  go_live_instantly: "Sofort live gehen:",
@@ -34482,10 +34552,18 @@ const de = {
34482
34552
  auto_setup_collections_button: "Sammlungen automatisch einrichten",
34483
34553
  auto_setup_collections_title: "Sammlungen automatisch einrichten?",
34484
34554
  auto_setup_collections_desc: "Dadurch werden automatisch Sammlungskonfigurationen für Sammlungen erstellt, die noch <b>NICHT</b> zugeordnet sind.",
34485
- this_can_take_a_minute: "Dies kann ein bis zwei Minuten dauern",
34555
+ setting_up_collections: "Sammlungen werden eingerichtet",
34556
+ setting_up_collection: "{{name}} wird eingerichtet",
34486
34557
  no_collections_found_to_setup: "Keine einzurichtenden Sammlungen gefunden",
34487
34558
  collections_have_been_setup: "Sammlungen wurden automatisch eingerichtet",
34488
34559
  error_setting_up_collections: "Fehler beim automatischen Einrichten der Sammlungen",
34560
+ setup_collections_title: "Set up collections",
34561
+ setup_collections_select_desc: "Select which collections to automatically set up:",
34562
+ select_all: "Select all",
34563
+ deselect_all: "Deselect all",
34564
+ setup_collections_confirm: "Set up ({{count}})",
34565
+ collection_setup_success: "{{name}} has been set up",
34566
+ go_to_collection: "Go to collection",
34489
34567
  add_your: "Fügen Sie Ihre",
34490
34568
  database_collections: "Datenbanksammlungen",
34491
34569
  to_firecms: "zu FireCMS hinzu",
@@ -34813,8 +34891,8 @@ const fr = {
34813
34891
  // ─── Error states ─────────────────────────────────────────────
34814
34892
  error: "Erreur",
34815
34893
  error_uploading_file: "Erreur lors du téléchargement du fichier",
34816
- error_deleting: "Erreur lors de la suppression",
34817
- error_before_delete: "Erreur avant la suppression",
34894
+ error_deleting: "Erreur lors de la suppression: {{message}}",
34895
+ error_before_delete: "Erreur avant la suppression: {{message}}",
34818
34896
  error_updating_asset: "Erreur lors de la mise à jour de l'actif",
34819
34897
  error_deleting_asset: "Erreur lors de la suppression de l'actif",
34820
34898
  error_firestore_index: "Un index Firestore est requis pour cette requête.",
@@ -35079,8 +35157,8 @@ const fr = {
35079
35157
  cms_users: "Utilisateurs du CMS",
35080
35158
  roles_menu: "Rôles",
35081
35159
  project_settings: "Paramètres du projet",
35082
- firestore_explorer: "Explorateur Firestore",
35083
- explore_your_firestore_data: "Explorez vos données Firestore",
35160
+ firestore_manager: "Gestionnaire Firestore",
35161
+ manage_your_firestore_data: "Gérez vos données Firestore",
35084
35162
  // ─── FireCMS Cloud Login ──────────────────────────────────────
35085
35163
  build_admin_panel_in_minutes: "Créez votre panneau d'administration Firebase en quelques minutes",
35086
35164
  go_live_instantly: "Mise en ligne immédiate :",
@@ -35151,10 +35229,18 @@ const fr = {
35151
35229
  auto_setup_collections_button: "Configurer les collections automatiquement",
35152
35230
  auto_setup_collections_title: "Configurer les collections automatiquement ?",
35153
35231
  auto_setup_collections_desc: "Cela créera automatiquement des configurations de collection pour les collections qui ne sont <b>PAS</b> déjà mappées",
35154
- this_can_take_a_minute: "Cela peut prendre une minute",
35232
+ setting_up_collections: "Configuration des collections",
35233
+ setting_up_collection: "Configuration de {{name}}",
35155
35234
  no_collections_found_to_setup: "Aucune collection à configurer trouvée",
35156
35235
  collections_have_been_setup: "Les collections ont été configurées",
35157
35236
  error_setting_up_collections: "Erreur lors de la configuration des collections",
35237
+ setup_collections_title: "Set up collections",
35238
+ setup_collections_select_desc: "Select which collections to automatically set up:",
35239
+ select_all: "Select all",
35240
+ deselect_all: "Deselect all",
35241
+ setup_collections_confirm: "Set up ({{count}})",
35242
+ collection_setup_success: "{{name}} has been set up",
35243
+ go_to_collection: "Go to collection",
35158
35244
  add_your: "Ajoutez vos",
35159
35245
  database_collections: "collections de base de données",
35160
35246
  to_firecms: "à FireCMS",
@@ -35482,8 +35568,8 @@ const it = {
35482
35568
  // ─── Error states ─────────────────────────────────────────────
35483
35569
  error: "Errore",
35484
35570
  error_uploading_file: "Errore durante il caricamento del file",
35485
- error_deleting: "Errore durante l'eliminazione",
35486
- error_before_delete: "Errore prima dell'eliminazione",
35571
+ error_deleting: "Errore durante l'eliminazione: {{message}}",
35572
+ error_before_delete: "Errore prima dell'eliminazione: {{message}}",
35487
35573
  error_updating_asset: "Errore durante l'aggiornamento dell'asset",
35488
35574
  error_deleting_asset: "Errore durante l'eliminazione dell'asset",
35489
35575
  error_firestore_index: "Per questa query è richiesto un indice Firestore.",
@@ -35748,8 +35834,8 @@ const it = {
35748
35834
  cms_users: "Utenti CMS",
35749
35835
  roles_menu: "Ruoli",
35750
35836
  project_settings: "Impostazioni del progetto",
35751
- firestore_explorer: "Esplora Firestore",
35752
- explore_your_firestore_data: "Esplora i tuoi dati Firestore",
35837
+ firestore_manager: "Gestore Firestore",
35838
+ manage_your_firestore_data: "Gestisci i tuoi dati Firestore",
35753
35839
  // ─── FireCMS Cloud Login ──────────────────────────────────────
35754
35840
  build_admin_panel_in_minutes: "Crea il tuo pannello di amministrazione Firebase in pochi minuti",
35755
35841
  go_live_instantly: "Online in un istante:",
@@ -35820,10 +35906,18 @@ const it = {
35820
35906
  auto_setup_collections_button: "Configura le collezioni automaticamente",
35821
35907
  auto_setup_collections_title: "Configurazione automatica delle collezioni",
35822
35908
  auto_setup_collections_desc: "Configura le collezioni automaticamente in base ai dati Firestore esistenti. Lascia che FireCMS configuri il CMS perfetto per te.",
35823
- this_can_take_a_minute: "Potrebbe richiedere qualche minuto",
35909
+ setting_up_collections: "Configurazione delle collezioni",
35910
+ setting_up_collection: "Configurazione di {{name}}",
35824
35911
  no_collections_found_to_setup: "Nessuna collezione trovata da configurare",
35825
35912
  collections_have_been_setup: "Le collezioni sono state configurate",
35826
35913
  error_setting_up_collections: "Errore durante la configurazione delle collezioni",
35914
+ setup_collections_title: "Set up collections",
35915
+ setup_collections_select_desc: "Select which collections to automatically set up:",
35916
+ select_all: "Select all",
35917
+ deselect_all: "Deselect all",
35918
+ setup_collections_confirm: "Set up ({{count}})",
35919
+ collection_setup_success: "{{name}} has been set up",
35920
+ go_to_collection: "Go to collection",
35827
35921
  add_your: "Aggiungi le tue",
35828
35922
  database_collections: "collezioni del database",
35829
35923
  to_firecms: "a FireCMS",
@@ -36151,8 +36245,8 @@ const hi = {
36151
36245
  // ─── Error states ─────────────────────────────────────────────
36152
36246
  error: "त्रुटि",
36153
36247
  error_uploading_file: "फ़ाइल अपलोड करने में त्रुटि",
36154
- error_deleting: "हटाने में त्रुटि",
36155
- error_before_delete: "हटाने से पहले त्रुटि",
36248
+ error_deleting: "हटाने में त्रुटि: {{message}}",
36249
+ error_before_delete: "हटाने से पहले त्रुटि: {{message}}",
36156
36250
  error_updating_asset: "एसेट अपडेट करने में त्रुटि",
36157
36251
  error_deleting_asset: "एसेट हटाने में त्रुटि",
36158
36252
  error_firestore_index: "इस क्वेरी के लिए Firestore इंडेक्स आवश्यक है।",
@@ -36417,8 +36511,8 @@ const hi = {
36417
36511
  cms_users: "CMS उपयोगकर्ता",
36418
36512
  roles_menu: "भूमिकाएँ",
36419
36513
  project_settings: "परियोजना सेटिंग",
36420
- firestore_explorer: "Firestore एक्सप्लोरर",
36421
- explore_your_firestore_data: "अपने Firestore डेटा का अन्वेषण करें",
36514
+ firestore_manager: "Firestore मैनेजर",
36515
+ manage_your_firestore_data: "अपने Firestore डेटा का प्रबंधन करें",
36422
36516
  // ─── FireCMS Cloud Login ──────────────────────────────────────
36423
36517
  build_admin_panel_in_minutes: "मिनटों में अपना Firebase एडमिन पैनल बनाएं",
36424
36518
  go_live_instantly: "तुरंत लाइव जाएं:",
@@ -36489,10 +36583,18 @@ const hi = {
36489
36583
  auto_setup_collections_button: "संग्रहों को स्वचालित रूप से सेट करें",
36490
36584
  auto_setup_collections_title: "संग्रहों की स्वचालित सेटअप",
36491
36585
  auto_setup_collections_desc: "अपने मौजूदा Firestore डेटा के आधार पर संग्रहों को स्वचालित रूप से सेट करें। FireCMS को आपके लिए परफेक्ट CMS कॉन्फ़िगर करने दें।",
36492
- this_can_take_a_minute: "इसमें एक मिनट लग सकता है",
36586
+ setting_up_collections: "संग्रह सेट किए जा रहे हैं",
36587
+ setting_up_collection: "{{name}} सेट किया जा रहा है",
36493
36588
  no_collections_found_to_setup: "सेट करने के लिए कोई संग्रह नहीं मिला",
36494
36589
  collections_have_been_setup: "संग्रहों को सेट कर दिया गया है",
36495
36590
  error_setting_up_collections: "संग्रह सेट करने में त्रुटि",
36591
+ setup_collections_title: "Set up collections",
36592
+ setup_collections_select_desc: "Select which collections to automatically set up:",
36593
+ select_all: "Select all",
36594
+ deselect_all: "Deselect all",
36595
+ setup_collections_confirm: "Set up ({{count}})",
36596
+ collection_setup_success: "{{name}} has been set up",
36597
+ go_to_collection: "Go to collection",
36496
36598
  add_your: "अपने",
36497
36599
  database_collections: "डेटाबेस संग्रह",
36498
36600
  to_firecms: "को FireCMS में जोड़ें",
@@ -36820,8 +36922,8 @@ const pt = {
36820
36922
  // ─── Error states ─────────────────────────────────────────────
36821
36923
  error: "Erro",
36822
36924
  error_uploading_file: "Erro ao carregar ficheiro",
36823
- error_deleting: "Erro ao eliminar",
36824
- error_before_delete: "Erro antes de eliminar",
36925
+ error_deleting: "Erro ao eliminar: {{message}}",
36926
+ error_before_delete: "Erro antes de eliminar: {{message}}",
36825
36927
  error_updating_asset: "Erro ao atualizar recurso",
36826
36928
  error_deleting_asset: "Erro ao eliminar recurso",
36827
36929
  error_firestore_index: "É necessário um índice Firestore para esta consulta.",
@@ -37086,8 +37188,8 @@ const pt = {
37086
37188
  cms_users: "Utilizadores do CMS",
37087
37189
  roles_menu: "Funções",
37088
37190
  project_settings: "Definições do projeto",
37089
- firestore_explorer: "Explorador do Firestore",
37090
- explore_your_firestore_data: "Explore os seus dados do Firestore",
37191
+ firestore_manager: "Gerenciador do Firestore",
37192
+ manage_your_firestore_data: "Gerencie os seus dados do Firestore",
37091
37193
  // ─── FireCMS Cloud Login ──────────────────────────────────────
37092
37194
  build_admin_panel_in_minutes: "Construa o Seu Painel de Administração Firebase em Minutos",
37093
37195
  go_live_instantly: "Entre em produção instantaneamente:",
@@ -37158,10 +37260,18 @@ const pt = {
37158
37260
  auto_setup_collections_button: "Configurar coleções automaticamente",
37159
37261
  auto_setup_collections_title: "Configurar coleções automaticamente?",
37160
37262
  auto_setup_collections_desc: "Isto criará automaticamente configurações de coleção para coleções que <b>NÃO</b> estão já mapeadas",
37161
- this_can_take_a_minute: "Isto pode demorar um ou dois minutos",
37263
+ setting_up_collections: "Configurando coleções",
37264
+ setting_up_collection: "Configurando {{name}}",
37162
37265
  no_collections_found_to_setup: "Nenhuma coleção encontrada para configurar.",
37163
37266
  collections_have_been_setup: "As coleções foram configuradas automaticamente.",
37164
37267
  error_setting_up_collections: "Erro ao configurar coleções automaticamente",
37268
+ setup_collections_title: "Set up collections",
37269
+ setup_collections_select_desc: "Select which collections to automatically set up:",
37270
+ select_all: "Select all",
37271
+ deselect_all: "Deselect all",
37272
+ setup_collections_confirm: "Set up ({{count}})",
37273
+ collection_setup_success: "{{name}} has been set up",
37274
+ go_to_collection: "Go to collection",
37165
37275
  // --- Home Suggestions ---
37166
37276
  add_your: "Adicione as suas",
37167
37277
  database_collections: "coleções da base de dados",
@@ -42199,6 +42309,7 @@ export {
42199
42309
  hydrateRegExp,
42200
42310
  iconSynonyms,
42201
42311
  iconsSearch,
42312
+ isDataTypeFilterable,
42202
42313
  isDefaultFieldConfigId,
42203
42314
  isEmptyObject,
42204
42315
  isEnumValueDisabled,