@firecms/core 3.3.0-canary.102f274 → 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 (35) 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 +349 -251
  5. package/dist/index.es.js.map +1 -1
  6. package/dist/index.umd.js +349 -251
  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 +9 -1
  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/ReferenceWidget.tsx +1 -1
  21. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +2 -2
  22. package/src/components/common/useDataSourceTableController.tsx +41 -4
  23. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +1 -1
  24. package/src/hooks/useBuildNavigationController.tsx +5 -1
  25. package/src/locales/de.ts +11 -3
  26. package/src/locales/en.ts +11 -3
  27. package/src/locales/es.ts +11 -3
  28. package/src/locales/fr.ts +11 -3
  29. package/src/locales/hi.ts +11 -3
  30. package/src/locales/it.ts +11 -3
  31. package/src/locales/pt.ts +11 -3
  32. package/src/types/collections.ts +18 -0
  33. package/src/types/translations.ts +9 -1
  34. package/src/util/entities.ts +11 -0
  35. 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
  }
@@ -23211,7 +23213,7 @@ const BoardColumn = memo(function BoardColumn2(t0) {
23211
23213
  let t19;
23212
23214
  let t20;
23213
23215
  if ($[19] !== items2) {
23214
- t20 = items2.map(_temp$g);
23216
+ t20 = items2.map(_temp$h);
23215
23217
  $[19] = items2;
23216
23218
  $[20] = t20;
23217
23219
  } else {
@@ -23317,7 +23319,7 @@ const BoardColumn = memo(function BoardColumn2(t0) {
23317
23319
  }
23318
23320
  return t29;
23319
23321
  });
23320
- function _temp$g(i) {
23322
+ function _temp$h(i) {
23321
23323
  return i.id;
23322
23324
  }
23323
23325
  function Board(t0) {
@@ -25253,7 +25255,8 @@ function FiltersDialog({
25253
25255
  properties,
25254
25256
  filterValues,
25255
25257
  setFilterValues,
25256
- forceFilter
25258
+ forceFilter,
25259
+ allowedFilters
25257
25260
  }) {
25258
25261
  const {
25259
25262
  t
@@ -25265,15 +25268,14 @@ function FiltersDialog({
25265
25268
  setLocalFilters(filterValues ?? {});
25266
25269
  }
25267
25270
  }, [open, filterValues]);
25268
- const filterableProperties = useMemo(() => {
25269
- return Object.entries(properties).filter(([key, property]) => {
25270
- if (!property) return false;
25271
- if (forceFilter && key in forceFilter) return false;
25272
- const baseProperty = property.dataType === "array" ? property.of : property;
25273
- if (!baseProperty) return false;
25274
- 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;
25275
25276
  });
25276
- }, [properties, forceFilter]);
25277
+ }, [properties, allowedFilters, forceFilter]);
25278
+ const hasEditableFilterProperties = editableFilterProperties.length > 0;
25277
25279
  const handleFilterChange = useCallback((propertyKey, value) => {
25278
25280
  setLocalFilters((prev) => {
25279
25281
  const newFilters = {
@@ -25305,22 +25307,26 @@ function FiltersDialog({
25305
25307
  }));
25306
25308
  }, []);
25307
25309
  const isAnyFieldHidden = Object.values(hiddenFields).some((hidden_0) => hidden_0);
25308
- const activeFilterCount = Object.keys(localFilters).length;
25309
- const renderFilterField = useCallback((propertyKey_1, property_0) => {
25310
- const isArray = property_0.dataType === "array";
25311
- const baseProperty_0 = isArray ? property_0.of : property_0;
25312
- 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;
25313
25319
  const filterValue = localFilters[propertyKey_1];
25314
25320
  const setValue = (value_0) => handleFilterChange(propertyKey_1, value_0);
25315
- if (baseProperty_0.dataType === "reference") {
25316
- 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) });
25317
- } else if (baseProperty_0.dataType === "number" || baseProperty_0.dataType === "string") {
25318
- const enumValues = baseProperty_0.enumValues ? enumToObjectEntries(baseProperty_0.enumValues) : void 0;
25319
- return /* @__PURE__ */ jsx(StringNumberFilterField, { value: filterValue, setValue, name: propertyKey_1, dataType: baseProperty_0.dataType, isArray, enumValues, title: property_0.name });
25320
- } else if (baseProperty_0.dataType === "boolean") {
25321
- return /* @__PURE__ */ jsx(BooleanFilterField, { value: filterValue, setValue, name: propertyKey_1, title: property_0.name });
25322
- } else if (baseProperty_0.dataType === "date") {
25323
- 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 });
25324
25330
  }
25325
25331
  return null;
25326
25332
  }, [localFilters, handleFilterChange, hiddenFields, setHiddenForField]);
@@ -25329,23 +25335,25 @@ function FiltersDialog({
25329
25335
  /* @__PURE__ */ jsx(Typography, { variant: "h6", children: t("filters") }),
25330
25336
  activeFilterCount > 0 && /* @__PURE__ */ jsx("span", { className: "ml-2 px-2 py-0.5 text-xs rounded-full bg-primary text-white", children: activeFilterCount })
25331
25337
  ] }),
25332
- /* @__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) => {
25333
25339
  const hasFilter = propertyKey_2 in localFilters;
25334
25340
  return /* @__PURE__ */ jsxs("tr", { className: cls(index > 0 && "border-t", defaultBorderMixin), children: [
25335
- /* @__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 }) }),
25336
- /* @__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) })
25337
25343
  ] }, propertyKey_2);
25338
25344
  }) }) }) }),
25339
25345
  /* @__PURE__ */ jsxs(DialogActions, { children: [
25340
25346
  /* @__PURE__ */ jsx(Button, { variant: "text", onClick: handleClearAll, disabled: activeFilterCount === 0, children: t("clear") }),
25341
25347
  /* @__PURE__ */ jsx("div", { className: "flex-grow" }),
25342
- /* @__PURE__ */ jsx(Button, { variant: "text", onClick: () => onOpenChange(false), children: t("cancel") }),
25343
- /* @__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
+ ] })
25344
25352
  ] })
25345
25353
  ] });
25346
25354
  }
25347
25355
  function EntityCollectionViewStartActions(t0) {
25348
- const $ = c(36);
25356
+ const $ = c(37);
25349
25357
  const {
25350
25358
  collection,
25351
25359
  relativePath,
@@ -25409,34 +25417,36 @@ function EntityCollectionViewStartActions(t0) {
25409
25417
  t3 = $[13];
25410
25418
  }
25411
25419
  const actionProps = t3;
25420
+ const hasAnyAllowedFilters = !tableController.allowedFilters || tableController.allowedFilters.length > 0;
25412
25421
  let t4;
25413
- if ($[14] !== activeFilterCount || $[15] !== largeLayout || $[16] !== resolvedProperties || $[17] !== t || $[18] !== tableController.setFilterValues) {
25414
- 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: [
25415
25424
  t("filters"),
25416
25425
  activeFilterCount > 0 ? ` (${activeFilterCount})` : ""
25417
25426
  ] }) : /* @__PURE__ */ jsx(IconButton, { size: "small", onClick: () => setFiltersDialogOpen(true), className: cls(activeFilterCount > 0 && "text-primary"), children: /* @__PURE__ */ jsx(FilterListIcon, { size: "small" }) }) }) }, "filters_tooltip");
25418
25427
  $[14] = activeFilterCount;
25419
- $[15] = largeLayout;
25420
- $[16] = resolvedProperties;
25421
- $[17] = t;
25422
- $[18] = tableController.setFilterValues;
25423
- $[19] = t4;
25428
+ $[15] = hasAnyAllowedFilters;
25429
+ $[16] = largeLayout;
25430
+ $[17] = resolvedProperties;
25431
+ $[18] = t;
25432
+ $[19] = tableController.setFilterValues;
25433
+ $[20] = t4;
25424
25434
  } else {
25425
- t4 = $[19];
25435
+ t4 = $[20];
25426
25436
  }
25427
25437
  const filtersButton = t4;
25428
25438
  const t5 = !collection.forceFilter;
25429
25439
  let t6;
25430
- if ($[20] !== t5 || $[21] !== tableController) {
25440
+ if ($[21] !== t5 || $[22] !== tableController) {
25431
25441
  t6 = /* @__PURE__ */ jsx(ClearFilterSortButton, { tableController, enabled: t5 }, "clear_filter");
25432
- $[20] = t5;
25433
- $[21] = tableController;
25434
- $[22] = t6;
25442
+ $[21] = t5;
25443
+ $[22] = tableController;
25444
+ $[23] = t6;
25435
25445
  } else {
25436
- t6 = $[22];
25446
+ t6 = $[23];
25437
25447
  }
25438
25448
  let actions;
25439
- if ($[23] !== actionProps || $[24] !== filtersButton || $[25] !== plugins || $[26] !== t6) {
25449
+ if ($[24] !== actionProps || $[25] !== filtersButton || $[26] !== plugins || $[27] !== t6) {
25440
25450
  actions = [filtersButton, t6];
25441
25451
  if (plugins) {
25442
25452
  plugins.forEach((plugin, i) => {
@@ -25445,39 +25455,42 @@ function EntityCollectionViewStartActions(t0) {
25445
25455
  }
25446
25456
  });
25447
25457
  }
25448
- $[23] = actionProps;
25449
- $[24] = filtersButton;
25450
- $[25] = plugins;
25451
- $[26] = t6;
25452
- $[27] = actions;
25458
+ $[24] = actionProps;
25459
+ $[25] = filtersButton;
25460
+ $[26] = plugins;
25461
+ $[27] = t6;
25462
+ $[28] = actions;
25453
25463
  } else {
25454
- actions = $[27];
25464
+ actions = $[28];
25455
25465
  }
25456
25466
  let t7;
25457
- if ($[28] !== collection.forceFilter || $[29] !== filtersDialogOpen || $[30] !== resolvedProperties || $[31] !== tableController) {
25458
- 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 });
25459
- $[28] = collection.forceFilter;
25460
- $[29] = filtersDialogOpen;
25461
- $[30] = resolvedProperties;
25462
- $[31] = tableController;
25463
- $[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;
25464
25474
  } else {
25465
- t7 = $[32];
25475
+ t7 = $[33];
25466
25476
  }
25467
25477
  let t8;
25468
- if ($[33] !== actions || $[34] !== t7) {
25478
+ if ($[34] !== actions || $[35] !== t7) {
25469
25479
  t8 = /* @__PURE__ */ jsxs(Fragment, { children: [
25470
25480
  actions,
25471
25481
  t7
25472
25482
  ] });
25473
- $[33] = actions;
25474
- $[34] = t7;
25475
- $[35] = t8;
25483
+ $[34] = actions;
25484
+ $[35] = t7;
25485
+ $[36] = t8;
25476
25486
  } else {
25477
- t8 = $[35];
25487
+ t8 = $[36];
25478
25488
  }
25479
25489
  return t8;
25480
25490
  }
25491
+ function _temp$g(key_0) {
25492
+ return key_0.toString();
25493
+ }
25481
25494
  const collectionScrollCache = /* @__PURE__ */ new Map();
25482
25495
  function useScrollRestoration() {
25483
25496
  const updateCollectionScroll = ({
@@ -25536,7 +25549,12 @@ const EntityCollectionView$1 = React__default.memo(function EntityCollectionView
25536
25549
  const scrollRestoration = useScrollRestoration();
25537
25550
  const collection = useMemo(() => {
25538
25551
  const userOverride = userConfigPersistence?.getCollectionConfig(fullPath);
25539
- return userOverride ? mergeDeep(collectionProp, userOverride) : collectionProp;
25552
+ if (!userOverride) return collectionProp;
25553
+ const {
25554
+ properties,
25555
+ ...rest
25556
+ } = userOverride;
25557
+ return mergeDeep(collectionProp, rest);
25540
25558
  }, [collectionProp, fullPath, userConfigPersistence?.getCollectionConfig]);
25541
25559
  const openEntityMode = collection?.openEntityMode ?? DEFAULT_ENTITY_OPEN_MODE;
25542
25560
  const collectionRef = React__default.useRef(collection);
@@ -25790,11 +25808,12 @@ const EntityCollectionView$1 = React__default.memo(function EntityCollectionView
25790
25808
  collection,
25791
25809
  path: fullPath,
25792
25810
  propertyConfigs: customizationController.propertyConfigs,
25793
- authController
25794
- }), [collection, fullPath]);
25811
+ authController,
25812
+ userConfigPersistence
25813
+ }), [collection, fullPath, userConfigPersistence]);
25795
25814
  const hasEnumProperty = useMemo(() => {
25796
- const properties = resolvedCollection.properties;
25797
- 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);
25798
25817
  }, [resolvedCollection.properties]);
25799
25818
  const enabledViews = useMemo(() => {
25800
25819
  const configured = collection.enabledViews ?? ["table", "cards", "kanban"];
@@ -25805,8 +25824,8 @@ const EntityCollectionView$1 = React__default.memo(function EntityCollectionView
25805
25824
  }, [collection.enabledViews, hasEnumProperty]);
25806
25825
  const kanbanPropertyOptions = useMemo(() => {
25807
25826
  const options = [];
25808
- const properties_0 = resolvedCollection.properties;
25809
- 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)) {
25810
25829
  const prop_0 = property_0;
25811
25830
  if (prop_0 && prop_0.dataType === "string" && prop_0.enumValues) {
25812
25831
  options.push({
@@ -27169,7 +27188,7 @@ function ReferenceWidget({
27169
27188
  const onMultipleEntitiesSelected = useCallback((entities) => {
27170
27189
  if (disabled) return;
27171
27190
  if (onMultipleReferenceSelected) {
27172
- const references = entities ? entities.map((e) => getReferenceFrom(e)) : null;
27191
+ const references = entities ? entities.filter(Boolean).map((e) => getReferenceFrom(e)) : null;
27173
27192
  onMultipleReferenceSelected({
27174
27193
  references,
27175
27194
  entities
@@ -28109,7 +28128,14 @@ function useBuildNavigationController(props) {
28109
28128
  if (!collections_0) return void 0;
28110
28129
  const baseCollection = getCollectionByPathOrId(removeInitialAndTrailingSlashes(idOrPath), collections_0);
28111
28130
  const userOverride = includeUserOverride ? userConfigPersistence?.getCollectionConfig(idOrPath) : void 0;
28112
- 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
+ }
28113
28139
  let result = overriddenCollection;
28114
28140
  if (overriddenCollection) {
28115
28141
  const subcollections = overriddenCollection.subcollections;
@@ -30050,7 +30076,7 @@ function useBuildSideDialogsController() {
30050
30076
  replace: true,
30051
30077
  state: {
30052
30078
  base_location: baseLocation,
30053
- panels: updatedPanels.map(_temp4$1)
30079
+ panels: updatedPanels.map(_temp4$2)
30054
30080
  }
30055
30081
  });
30056
30082
  }
@@ -30148,7 +30174,7 @@ function _temp6$1(p_4) {
30148
30174
  function _temp5$1(p_3) {
30149
30175
  return p_3.key;
30150
30176
  }
30151
- function _temp4$1(p_2) {
30177
+ function _temp4$2(p_2) {
30152
30178
  return p_2.key;
30153
30179
  }
30154
30180
  function _temp3$2(p_1) {
@@ -32294,7 +32320,7 @@ const Scaffold = React__default.memo(function Scaffold2(props) {
32294
32320
  const otherChildren = t3;
32295
32321
  const includeDrawer = drawerChildren.length > 0;
32296
32322
  const largeLayout = useLargeLayout();
32297
- const [drawerOpen, setDrawerOpen] = React__default.useState(false);
32323
+ const [drawerOpen, setDrawerOpen] = React__default.useState(_temp4$1);
32298
32324
  const [onHover, setOnHover] = React__default.useState(false);
32299
32325
  let t4;
32300
32326
  if ($[6] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
@@ -32316,6 +32342,10 @@ const Scaffold = React__default.memo(function Scaffold2(props) {
32316
32342
  if ($[8] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
32317
32343
  t6 = () => {
32318
32344
  setDrawerOpen(true);
32345
+ try {
32346
+ localStorage.setItem("firecms_drawer_open", "true");
32347
+ } catch {
32348
+ }
32319
32349
  };
32320
32350
  $[8] = t6;
32321
32351
  } else {
@@ -32326,6 +32356,10 @@ const Scaffold = React__default.memo(function Scaffold2(props) {
32326
32356
  if ($[9] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
32327
32357
  t7 = () => {
32328
32358
  setDrawerOpen(false);
32359
+ try {
32360
+ localStorage.setItem("firecms_drawer_open", "false");
32361
+ } catch {
32362
+ }
32329
32363
  };
32330
32364
  $[9] = t7;
32331
32365
  } else {
@@ -32678,6 +32712,13 @@ function _temp2$1(child_0) {
32678
32712
  function _temp3$1(child_1) {
32679
32713
  return child_1.type.componentType !== "Drawer" && child_1.type.componentType !== "AppBar";
32680
32714
  }
32715
+ function _temp4$1() {
32716
+ try {
32717
+ return localStorage.getItem("firecms_drawer_open") === "true";
32718
+ } catch {
32719
+ return false;
32720
+ }
32721
+ }
32681
32722
  const en = {
32682
32723
  // ─── Form actions ────────────────────────────────────────────
32683
32724
  save: "Save",
@@ -32815,8 +32856,8 @@ const en = {
32815
32856
  // ─── Error states ─────────────────────────────────────────────
32816
32857
  error: "Error",
32817
32858
  error_uploading_file: "Error uploading file",
32818
- error_deleting: "Error deleting",
32819
- error_before_delete: "Error before delete",
32859
+ error_deleting: "Error deleting: {{message}}",
32860
+ error_before_delete: "Error before delete: {{message}}",
32820
32861
  error_updating_asset: "Error updating asset",
32821
32862
  error_deleting_asset: "Error deleting asset",
32822
32863
  error_firestore_index: "A Firestore index is required for this query.",
@@ -33153,10 +33194,18 @@ const en = {
33153
33194
  auto_setup_collections_button: "Automatically set up collections",
33154
33195
  auto_setup_collections_title: "Automatically set up collections?",
33155
33196
  auto_setup_collections_desc: "This will automatically create collection configs for collections that are <b>NOT</b> already mapped",
33156
- 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}}",
33157
33199
  no_collections_found_to_setup: "No collections found to setup.",
33158
33200
  collections_have_been_setup: "Collections have been automatically setup.",
33159
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",
33160
33209
  // --- Home Suggestions ---
33161
33210
  add_your: "Add your",
33162
33211
  database_collections: "database collections",
@@ -33484,8 +33533,8 @@ const es = {
33484
33533
  // ─── Error states ─────────────────────────────────────────────
33485
33534
  error: "Error",
33486
33535
  error_uploading_file: "Error al subir archivo",
33487
- error_deleting: "Error al eliminar",
33488
- error_before_delete: "Error antes de eliminar",
33536
+ error_deleting: "Error al eliminar: {{message}}",
33537
+ error_before_delete: "Error antes de eliminar: {{message}}",
33489
33538
  error_updating_asset: "Error al actualizar recurso",
33490
33539
  error_deleting_asset: "Error al eliminar recurso",
33491
33540
  error_firestore_index: "Se requiere un índice de Firestore para esta consulta.",
@@ -33824,10 +33873,18 @@ const es = {
33824
33873
  auto_setup_collections_button: "Configurar colecciones automáticamente",
33825
33874
  auto_setup_collections_title: "¿Configurar colecciones automáticamente?",
33826
33875
  auto_setup_collections_desc: "Esto creará automáticamente la configuración de las colecciones que <b>NO</b> estén mapeadas",
33827
- this_can_take_a_minute: "Esto puede tardar un minuto o dos",
33876
+ setting_up_collections: "Configurando colecciones",
33877
+ setting_up_collection: "Configurando {{name}}",
33828
33878
  no_collections_found_to_setup: "No se encontraron colecciones para configurar",
33829
33879
  collections_have_been_setup: "¡Tus colecciones han sido configuradas!",
33830
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",
33831
33888
  // --- Home Suggestions ---
33832
33889
  add_your: "Añade tus",
33833
33890
  database_collections: "colecciones de base de datos",
@@ -34157,8 +34214,8 @@ const de = {
34157
34214
  // ─── Error states ─────────────────────────────────────────────
34158
34215
  error: "Fehler",
34159
34216
  error_uploading_file: "Fehler beim Hochladen der Datei",
34160
- error_deleting: "Fehler beim Löschen",
34161
- 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}}",
34162
34219
  error_updating_asset: "Fehler beim Aktualisieren des Assets",
34163
34220
  error_deleting_asset: "Fehler beim Löschen des Assets",
34164
34221
  error_firestore_index: "Für diese Abfrage ist ein Firestore-Index erforderlich.",
@@ -34495,10 +34552,18 @@ const de = {
34495
34552
  auto_setup_collections_button: "Sammlungen automatisch einrichten",
34496
34553
  auto_setup_collections_title: "Sammlungen automatisch einrichten?",
34497
34554
  auto_setup_collections_desc: "Dadurch werden automatisch Sammlungskonfigurationen für Sammlungen erstellt, die noch <b>NICHT</b> zugeordnet sind.",
34498
- 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",
34499
34557
  no_collections_found_to_setup: "Keine einzurichtenden Sammlungen gefunden",
34500
34558
  collections_have_been_setup: "Sammlungen wurden automatisch eingerichtet",
34501
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",
34502
34567
  add_your: "Fügen Sie Ihre",
34503
34568
  database_collections: "Datenbanksammlungen",
34504
34569
  to_firecms: "zu FireCMS hinzu",
@@ -34826,8 +34891,8 @@ const fr = {
34826
34891
  // ─── Error states ─────────────────────────────────────────────
34827
34892
  error: "Erreur",
34828
34893
  error_uploading_file: "Erreur lors du téléchargement du fichier",
34829
- error_deleting: "Erreur lors de la suppression",
34830
- 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}}",
34831
34896
  error_updating_asset: "Erreur lors de la mise à jour de l'actif",
34832
34897
  error_deleting_asset: "Erreur lors de la suppression de l'actif",
34833
34898
  error_firestore_index: "Un index Firestore est requis pour cette requête.",
@@ -35164,10 +35229,18 @@ const fr = {
35164
35229
  auto_setup_collections_button: "Configurer les collections automatiquement",
35165
35230
  auto_setup_collections_title: "Configurer les collections automatiquement ?",
35166
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",
35167
- this_can_take_a_minute: "Cela peut prendre une minute",
35232
+ setting_up_collections: "Configuration des collections",
35233
+ setting_up_collection: "Configuration de {{name}}",
35168
35234
  no_collections_found_to_setup: "Aucune collection à configurer trouvée",
35169
35235
  collections_have_been_setup: "Les collections ont été configurées",
35170
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",
35171
35244
  add_your: "Ajoutez vos",
35172
35245
  database_collections: "collections de base de données",
35173
35246
  to_firecms: "à FireCMS",
@@ -35495,8 +35568,8 @@ const it = {
35495
35568
  // ─── Error states ─────────────────────────────────────────────
35496
35569
  error: "Errore",
35497
35570
  error_uploading_file: "Errore durante il caricamento del file",
35498
- error_deleting: "Errore durante l'eliminazione",
35499
- error_before_delete: "Errore prima dell'eliminazione",
35571
+ error_deleting: "Errore durante l'eliminazione: {{message}}",
35572
+ error_before_delete: "Errore prima dell'eliminazione: {{message}}",
35500
35573
  error_updating_asset: "Errore durante l'aggiornamento dell'asset",
35501
35574
  error_deleting_asset: "Errore durante l'eliminazione dell'asset",
35502
35575
  error_firestore_index: "Per questa query è richiesto un indice Firestore.",
@@ -35833,10 +35906,18 @@ const it = {
35833
35906
  auto_setup_collections_button: "Configura le collezioni automaticamente",
35834
35907
  auto_setup_collections_title: "Configurazione automatica delle collezioni",
35835
35908
  auto_setup_collections_desc: "Configura le collezioni automaticamente in base ai dati Firestore esistenti. Lascia che FireCMS configuri il CMS perfetto per te.",
35836
- this_can_take_a_minute: "Potrebbe richiedere qualche minuto",
35909
+ setting_up_collections: "Configurazione delle collezioni",
35910
+ setting_up_collection: "Configurazione di {{name}}",
35837
35911
  no_collections_found_to_setup: "Nessuna collezione trovata da configurare",
35838
35912
  collections_have_been_setup: "Le collezioni sono state configurate",
35839
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",
35840
35921
  add_your: "Aggiungi le tue",
35841
35922
  database_collections: "collezioni del database",
35842
35923
  to_firecms: "a FireCMS",
@@ -36164,8 +36245,8 @@ const hi = {
36164
36245
  // ─── Error states ─────────────────────────────────────────────
36165
36246
  error: "त्रुटि",
36166
36247
  error_uploading_file: "फ़ाइल अपलोड करने में त्रुटि",
36167
- error_deleting: "हटाने में त्रुटि",
36168
- error_before_delete: "हटाने से पहले त्रुटि",
36248
+ error_deleting: "हटाने में त्रुटि: {{message}}",
36249
+ error_before_delete: "हटाने से पहले त्रुटि: {{message}}",
36169
36250
  error_updating_asset: "एसेट अपडेट करने में त्रुटि",
36170
36251
  error_deleting_asset: "एसेट हटाने में त्रुटि",
36171
36252
  error_firestore_index: "इस क्वेरी के लिए Firestore इंडेक्स आवश्यक है।",
@@ -36502,10 +36583,18 @@ const hi = {
36502
36583
  auto_setup_collections_button: "संग्रहों को स्वचालित रूप से सेट करें",
36503
36584
  auto_setup_collections_title: "संग्रहों की स्वचालित सेटअप",
36504
36585
  auto_setup_collections_desc: "अपने मौजूदा Firestore डेटा के आधार पर संग्रहों को स्वचालित रूप से सेट करें। FireCMS को आपके लिए परफेक्ट CMS कॉन्फ़िगर करने दें।",
36505
- this_can_take_a_minute: "इसमें एक मिनट लग सकता है",
36586
+ setting_up_collections: "संग्रह सेट किए जा रहे हैं",
36587
+ setting_up_collection: "{{name}} सेट किया जा रहा है",
36506
36588
  no_collections_found_to_setup: "सेट करने के लिए कोई संग्रह नहीं मिला",
36507
36589
  collections_have_been_setup: "संग्रहों को सेट कर दिया गया है",
36508
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",
36509
36598
  add_your: "अपने",
36510
36599
  database_collections: "डेटाबेस संग्रह",
36511
36600
  to_firecms: "को FireCMS में जोड़ें",
@@ -36833,8 +36922,8 @@ const pt = {
36833
36922
  // ─── Error states ─────────────────────────────────────────────
36834
36923
  error: "Erro",
36835
36924
  error_uploading_file: "Erro ao carregar ficheiro",
36836
- error_deleting: "Erro ao eliminar",
36837
- error_before_delete: "Erro antes de eliminar",
36925
+ error_deleting: "Erro ao eliminar: {{message}}",
36926
+ error_before_delete: "Erro antes de eliminar: {{message}}",
36838
36927
  error_updating_asset: "Erro ao atualizar recurso",
36839
36928
  error_deleting_asset: "Erro ao eliminar recurso",
36840
36929
  error_firestore_index: "É necessário um índice Firestore para esta consulta.",
@@ -37171,10 +37260,18 @@ const pt = {
37171
37260
  auto_setup_collections_button: "Configurar coleções automaticamente",
37172
37261
  auto_setup_collections_title: "Configurar coleções automaticamente?",
37173
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",
37174
- 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}}",
37175
37265
  no_collections_found_to_setup: "Nenhuma coleção encontrada para configurar.",
37176
37266
  collections_have_been_setup: "As coleções foram configuradas automaticamente.",
37177
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",
37178
37275
  // --- Home Suggestions ---
37179
37276
  add_your: "Adicione as suas",
37180
37277
  database_collections: "coleções da base de dados",
@@ -42212,6 +42309,7 @@ export {
42212
42309
  hydrateRegExp,
42213
42310
  iconSynonyms,
42214
42311
  iconsSearch,
42312
+ isDataTypeFilterable,
42215
42313
  isDefaultFieldConfigId,
42216
42314
  isEmptyObject,
42217
42315
  isEnumValueDisabled,