@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.umd.js CHANGED
@@ -691,6 +691,9 @@
691
691
  return result;
692
692
  }
693
693
  function getReferenceFrom(entity) {
694
+ if (!entity) {
695
+ throw new Error("getReferenceFrom: entity is null or undefined");
696
+ }
694
697
  return new EntityReference(entity.id, entity.path, entity.databaseId);
695
698
  }
696
699
  function traverseValuesProperties(inputValues, properties, operation) {
@@ -740,6 +743,12 @@
740
743
  }
741
744
  return value;
742
745
  }
746
+ function isDataTypeFilterable(dataType, isPartOfArray = false) {
747
+ if (isPartOfArray) {
748
+ return ["string", "number", "date", "reference"].includes(dataType);
749
+ }
750
+ return ["string", "number", "boolean", "date", "reference", "array"].includes(dataType);
751
+ }
743
752
  function enumToObjectEntries(enumValues) {
744
753
  if (Array.isArray(enumValues)) {
745
754
  return enumValues;
@@ -826,8 +835,13 @@
826
835
  ...a,
827
836
  ...b
828
837
  }), {});
838
+ const {
839
+ properties: overrideProps,
840
+ ...restOverrides
841
+ } = collectionOverride ?? {};
829
842
  return {
830
843
  ...collection,
844
+ ...restOverrides,
831
845
  properties: cleanedProperties,
832
846
  originalCollection: collection
833
847
  };
@@ -4513,7 +4527,7 @@
4513
4527
  }
4514
4528
  setDataLoading(false);
4515
4529
  setDataLoadingError(void 0);
4516
- setData(entities.map(_temp$C));
4530
+ setData(entities.map(_temp$D));
4517
4531
  setNoMoreToLoad(!itemCount || entities.length < itemCount);
4518
4532
  };
4519
4533
  const onError = (error) => {
@@ -4596,7 +4610,7 @@
4596
4610
  }
4597
4611
  function _temp2$f() {
4598
4612
  }
4599
- function _temp$C(e_0) {
4613
+ function _temp$D(e_0) {
4600
4614
  return {
4601
4615
  ...e_0
4602
4616
  };
@@ -4661,7 +4675,7 @@
4661
4675
  setEntity(CACHE[`${path}/${entityId}`]);
4662
4676
  setDataLoading(false);
4663
4677
  setDataLoadingError(void 0);
4664
- return _temp$B;
4678
+ return _temp$C;
4665
4679
  } else {
4666
4680
  if (entityId && path && collection) {
4667
4681
  if (dataSource.listenEntity) {
@@ -4729,7 +4743,7 @@
4729
4743
  }
4730
4744
  function _temp2$e() {
4731
4745
  }
4732
- function _temp$B() {
4746
+ function _temp$C() {
4733
4747
  }
4734
4748
  async function saveEntityWithCallbacks({
4735
4749
  collection,
@@ -5373,7 +5387,7 @@
5373
5387
  }
5374
5388
  let t9;
5375
5389
  if ($[19] !== url) {
5376
- t9 = /* @__PURE__ */ jsxRuntime.jsx(ui.Tooltip, { title: "Open image in new tab", side: "bottom", children: /* @__PURE__ */ jsxRuntime.jsx(ui.IconButton, { className: "invisible group-hover:visible", variant: "filled", component: "a", href: url, rel: "noopener noreferrer", target: "_blank", size: "smallest", onClick: _temp$A, children: t8 }) });
5390
+ t9 = /* @__PURE__ */ jsxRuntime.jsx(ui.Tooltip, { title: "Open image in new tab", side: "bottom", children: /* @__PURE__ */ jsxRuntime.jsx(ui.IconButton, { className: "invisible group-hover:visible", variant: "filled", component: "a", href: url, rel: "noopener noreferrer", target: "_blank", size: "smallest", onClick: _temp$B, children: t8 }) });
5377
5391
  $[19] = url;
5378
5392
  $[20] = t9;
5379
5393
  } else {
@@ -5407,7 +5421,7 @@
5407
5421
  }
5408
5422
  return t11;
5409
5423
  }
5410
- function _temp$A(e_0) {
5424
+ function _temp$B(e_0) {
5411
5425
  return e_0.stopPropagation();
5412
5426
  }
5413
5427
  const FIRECMS_NS$1 = "firecms_core";
@@ -5474,7 +5488,7 @@
5474
5488
  }
5475
5489
  let t3;
5476
5490
  if ($[2] !== url) {
5477
- t3 = /* @__PURE__ */ jsxRuntime.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: [
5491
+ t3 = /* @__PURE__ */ jsxRuntime.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: [
5478
5492
  t2,
5479
5493
  url
5480
5494
  ] });
@@ -5604,7 +5618,7 @@
5604
5618
  function _temp2$d(e_0) {
5605
5619
  return e_0.stopPropagation();
5606
5620
  }
5607
- function _temp$z(e) {
5621
+ function _temp$A(e) {
5608
5622
  e.preventDefault();
5609
5623
  }
5610
5624
  function VideoPreview(t0) {
@@ -5738,7 +5752,7 @@
5738
5752
  if (Array.isArray(arrayProperty.of)) {
5739
5753
  let t1;
5740
5754
  if ($[6] !== arrayProperty.of) {
5741
- t1 = arrayProperty.of.map(_temp$y);
5755
+ t1 = arrayProperty.of.map(_temp$z);
5742
5756
  $[6] = arrayProperty.of;
5743
5757
  $[7] = t1;
5744
5758
  } else {
@@ -5876,7 +5890,7 @@
5876
5890
  }
5877
5891
  return content || null;
5878
5892
  }
5879
- function _temp$y(p, i) {
5893
+ function _temp$z(p, i) {
5880
5894
  return renderGenericArrayCell(p, i);
5881
5895
  }
5882
5896
  function renderMap(property, size) {
@@ -6320,104 +6334,77 @@
6320
6334
  actions
6321
6335
  ] });
6322
6336
  }
6323
- const EntityPreviewContainer = React__namespace.forwardRef((t0, ref) => {
6324
- const $ = reactCompilerRuntime.c(26);
6325
- let children;
6326
- let className;
6327
- let hover;
6328
- let onClick;
6329
- let props;
6330
- let style;
6331
- let t1;
6332
- let t2;
6333
- if ($[0] !== t0) {
6334
- ({
6335
- children,
6336
- hover,
6337
- onClick,
6338
- size: t1,
6339
- style,
6340
- className,
6341
- fullwidth: t2,
6342
- ...props
6343
- } = t0);
6344
- $[0] = t0;
6345
- $[1] = children;
6346
- $[2] = className;
6347
- $[3] = hover;
6348
- $[4] = onClick;
6349
- $[5] = props;
6350
- $[6] = style;
6351
- $[7] = t1;
6352
- $[8] = t2;
6353
- } else {
6354
- children = $[1];
6355
- className = $[2];
6356
- hover = $[3];
6357
- onClick = $[4];
6358
- props = $[5];
6359
- style = $[6];
6360
- t1 = $[7];
6361
- t2 = $[8];
6362
- }
6337
+ function EntityPreviewContainer(t0) {
6338
+ const $ = reactCompilerRuntime.c(15);
6339
+ const {
6340
+ children,
6341
+ hover,
6342
+ onClick,
6343
+ size: t1,
6344
+ style,
6345
+ className,
6346
+ fullwidth: t2,
6347
+ ref
6348
+ } = t0;
6363
6349
  const size = t1 === void 0 ? "medium" : t1;
6364
6350
  const fullwidth = t2 === void 0 ? true : t2;
6365
- let t3;
6366
- if ($[9] !== style) {
6367
- t3 = {
6368
- ...style,
6369
- tabindex: 0
6370
- };
6371
- $[9] = style;
6372
- $[10] = t3;
6351
+ const t3 = fullwidth ? "w-full" : "";
6352
+ 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" : "";
6353
+ const t5 = size === "small" ? "p-1" : "px-2 py-1";
6354
+ const t6 = onClick ? "cursor-pointer" : "";
6355
+ let t7;
6356
+ if ($[0] !== className || $[1] !== t3 || $[2] !== t4 || $[3] !== t5 || $[4] !== t6) {
6357
+ t7 = ui.cls("bg-white dark:bg-surface-900", "min-h-[44px]", t3, "items-center", t4, t5, "flex border rounded-lg", t6, ui.defaultBorderMixin, className);
6358
+ $[0] = className;
6359
+ $[1] = t3;
6360
+ $[2] = t4;
6361
+ $[3] = t5;
6362
+ $[4] = t6;
6363
+ $[5] = t7;
6373
6364
  } else {
6374
- t3 = $[10];
6365
+ t7 = $[5];
6375
6366
  }
6376
- const t4 = fullwidth ? "w-full" : "";
6377
- 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" : "";
6378
- const t6 = size === "small" ? "p-1" : "px-2 py-1";
6379
- const t7 = onClick ? "cursor-pointer" : "";
6367
+ const divClassName = t7;
6380
6368
  let t8;
6381
- if ($[11] !== className || $[12] !== t4 || $[13] !== t5 || $[14] !== t6 || $[15] !== t7) {
6382
- t8 = ui.cls("bg-white dark:bg-surface-900", "min-h-[44px]", t4, "items-center", t5, t6, "flex border rounded-lg", t7, ui.defaultBorderMixin, className);
6383
- $[11] = className;
6384
- $[12] = t4;
6385
- $[13] = t5;
6386
- $[14] = t6;
6387
- $[15] = t7;
6388
- $[16] = t8;
6369
+ if ($[6] !== onClick) {
6370
+ t8 = onClick ? (event) => {
6371
+ event.preventDefault();
6372
+ onClick(event);
6373
+ } : void 0;
6374
+ $[6] = onClick;
6375
+ $[7] = t8;
6389
6376
  } else {
6390
- t8 = $[16];
6377
+ t8 = $[7];
6391
6378
  }
6379
+ const handleClick = t8;
6392
6380
  let t9;
6393
- if ($[17] !== onClick) {
6394
- t9 = (event) => {
6395
- if (onClick) {
6396
- event.preventDefault();
6397
- onClick(event);
6398
- }
6381
+ if ($[8] !== divClassName || $[9] !== handleClick || $[10] !== style) {
6382
+ t9 = {
6383
+ ref,
6384
+ tabIndex: 0,
6385
+ style,
6386
+ className: divClassName,
6387
+ onClick: handleClick
6399
6388
  };
6400
- $[17] = onClick;
6401
- $[18] = t9;
6389
+ $[8] = divClassName;
6390
+ $[9] = handleClick;
6391
+ $[10] = style;
6392
+ $[11] = t9;
6402
6393
  } else {
6403
- t9 = $[18];
6394
+ t9 = $[11];
6404
6395
  }
6396
+ const divProps = t9;
6405
6397
  let t10;
6406
- if ($[19] !== children || $[20] !== props || $[21] !== ref || $[22] !== t3 || $[23] !== t8 || $[24] !== t9) {
6407
- t10 = /* @__PURE__ */ jsxRuntime.jsx("div", { ref, style: t3, className: t8, onClick: t9, ...props, children });
6408
- $[19] = children;
6409
- $[20] = props;
6410
- $[21] = ref;
6411
- $[22] = t3;
6412
- $[23] = t8;
6413
- $[24] = t9;
6414
- $[25] = t10;
6398
+ if ($[12] !== children || $[13] !== divProps) {
6399
+ t10 = /* @__PURE__ */ jsxRuntime.jsx("div", { ...divProps, children });
6400
+ $[12] = children;
6401
+ $[13] = divProps;
6402
+ $[14] = t10;
6415
6403
  } else {
6416
- t10 = $[25];
6404
+ t10 = $[14];
6417
6405
  }
6418
6406
  return t10;
6419
- });
6420
- EntityPreviewContainer.displayName = "EntityPreviewContainer";
6407
+ }
6421
6408
  const ReferencePreview = function ReferencePreview2(props) {
6422
6409
  const $ = reactCompilerRuntime.c(10);
6423
6410
  const reference = props.reference;
@@ -7051,7 +7038,7 @@
7051
7038
  timeZoneName: "short"
7052
7039
  });
7053
7040
  const parts = tzFormatter.formatToParts(date);
7054
- t32 = parts.find(_temp$x)?.value ?? "";
7041
+ t32 = parts.find(_temp$y)?.value ?? "";
7055
7042
  $[6] = date;
7056
7043
  $[7] = timezone;
7057
7044
  $[8] = t32;
@@ -7122,7 +7109,7 @@
7122
7109
  }
7123
7110
  return t3;
7124
7111
  }
7125
- function _temp$x(p) {
7112
+ function _temp$y(p) {
7126
7113
  return p.type === "timeZoneName";
7127
7114
  }
7128
7115
  function MapPropertyPreview(t0) {
@@ -7217,7 +7204,7 @@
7217
7204
  }
7218
7205
  let t1;
7219
7206
  if ($[1] !== value) {
7220
- t1 = Object.entries(value).map(_temp$w);
7207
+ t1 = Object.entries(value).map(_temp$x);
7221
7208
  $[1] = value;
7222
7209
  $[2] = t1;
7223
7210
  } else {
@@ -7233,7 +7220,7 @@
7233
7220
  }
7234
7221
  return t2;
7235
7222
  }
7236
- function _temp$w(t0) {
7223
+ function _temp$x(t0) {
7237
7224
  const [key, childValue] = t0;
7238
7225
  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");
7239
7226
  const isScalar = childValue && (typeof childValue !== "object" || isTimestampObj);
@@ -8494,7 +8481,7 @@
8494
8481
  console.trace("onChange");
8495
8482
  if (valueType === "number") {
8496
8483
  if (multiple) {
8497
- const newValue = updatedValue.map(_temp$v);
8484
+ const newValue = updatedValue.map(_temp$w);
8498
8485
  updateValue(newValue);
8499
8486
  } else {
8500
8487
  updateValue(parseFloat(updatedValue));
@@ -8565,7 +8552,7 @@
8565
8552
  function _temp2$c(v_0) {
8566
8553
  return v_0.toString();
8567
8554
  }
8568
- function _temp$v(v) {
8555
+ function _temp$w(v) {
8569
8556
  return parseFloat(v);
8570
8557
  }
8571
8558
  function VirtualTableNumberInput(props) {
@@ -8761,7 +8748,7 @@
8761
8748
  const renderValue = t3;
8762
8749
  let t4;
8763
8750
  if ($[7] !== disabled || $[8] !== internalValue || $[9] !== multiple || $[10] !== onChange || $[11] !== renderValue || $[12] !== users || $[13] !== validValue) {
8764
- t4 = multiple ? /* @__PURE__ */ jsxRuntime.jsx(ui.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__ */ jsxRuntime.jsx(ui.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) });
8751
+ t4 = multiple ? /* @__PURE__ */ jsxRuntime.jsx(ui.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__ */ jsxRuntime.jsx(ui.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) });
8765
8752
  $[7] = disabled;
8766
8753
  $[8] = internalValue;
8767
8754
  $[9] = multiple;
@@ -8778,7 +8765,7 @@
8778
8765
  function _temp2$b(user_1) {
8779
8766
  return /* @__PURE__ */ jsxRuntime.jsx(ui.SelectItem, { value: user_1.uid, children: /* @__PURE__ */ jsxRuntime.jsx(UserDisplay, { user: user_1 }) }, user_1.uid);
8780
8767
  }
8781
- function _temp$u(user_0) {
8768
+ function _temp$v(user_0) {
8782
8769
  return /* @__PURE__ */ jsxRuntime.jsx(ui.MultiSelectItem, { value: user_0.uid, children: /* @__PURE__ */ jsxRuntime.jsx(UserDisplay, { user: user_0 }) }, user_0.uid);
8783
8770
  }
8784
8771
  class ErrorBoundary extends React.Component {
@@ -9023,7 +9010,7 @@
9023
9010
  newValue = [...internalValue];
9024
9011
  newValue = removeDuplicates(newValue);
9025
9012
  setInternalValue(newValue);
9026
- const fieldValue = newValue.filter(_temp$t).map(_temp2$a);
9013
+ const fieldValue = newValue.filter(_temp$u).map(_temp2$a);
9027
9014
  if (multipleFilesSupported) {
9028
9015
  onChange(fieldValue);
9029
9016
  } else {
@@ -9144,7 +9131,7 @@
9144
9131
  function _temp2$a(e_0) {
9145
9132
  return e_0.storagePathOrDownloadUrl;
9146
9133
  }
9147
- function _temp$t(e) {
9134
+ function _temp$u(e) {
9148
9135
  return !!e.storagePathOrDownloadUrl;
9149
9136
  }
9150
9137
  function getInternalInitialValue(multipleFilesSupported, value, metadata, size) {
@@ -9434,7 +9421,7 @@
9434
9421
  const snackbarContext = useSnackbarController();
9435
9422
  let t1;
9436
9423
  if ($[0] !== storage.acceptedFiles) {
9437
- t1 = storage.acceptedFiles ? storage.acceptedFiles.map(_temp$s).reduce(_temp2$9, {}) : void 0;
9424
+ t1 = storage.acceptedFiles ? storage.acceptedFiles.map(_temp$t).reduce(_temp2$9, {}) : void 0;
9438
9425
  $[0] = storage.acceptedFiles;
9439
9426
  $[1] = t1;
9440
9427
  } else {
@@ -9663,7 +9650,7 @@
9663
9650
  ...b
9664
9651
  };
9665
9652
  }
9666
- function _temp$s(e) {
9653
+ function _temp$t(e) {
9667
9654
  return {
9668
9655
  [e]: []
9669
9656
  };
@@ -9773,7 +9760,7 @@
9773
9760
  let t1;
9774
9761
  if ($[2] !== updateValue) {
9775
9762
  t1 = (entities) => {
9776
- updateValue(entities.map(_temp$r));
9763
+ updateValue(entities.filter(Boolean).map(_temp$s));
9777
9764
  };
9778
9765
  $[2] = updateValue;
9779
9766
  $[3] = t1;
@@ -9945,7 +9932,7 @@
9945
9932
  }
9946
9933
  return t10;
9947
9934
  }, equal);
9948
- function _temp$r(e) {
9935
+ function _temp$s(e) {
9949
9936
  return getReferenceFrom(e);
9950
9937
  }
9951
9938
  function _temp2$8(ref) {
@@ -11613,7 +11600,7 @@
11613
11600
  throw Error(`Couldn't find the corresponding collection for the path: ${ofProperty.path}`);
11614
11601
  }
11615
11602
  const onMultipleEntitiesSelected = React.useCallback((entities) => {
11616
- setValue(entities.map((e) => getReferenceFrom(e)));
11603
+ setValue(entities.filter(Boolean).map((e) => getReferenceFrom(e)));
11617
11604
  }, [setValue]);
11618
11605
  const referenceDialogController = useReferenceDialog({
11619
11606
  multiselect: true,
@@ -11723,7 +11710,7 @@
11723
11710
  }
11724
11711
  let t5;
11725
11712
  if ($[15] !== placeholder) {
11726
- t5 = placeholder && /* @__PURE__ */ jsxRuntime.jsx("div", { onClick: _temp$q, className: "flex flex-col items-center justify-center w-full h-full", children: /* @__PURE__ */ jsxRuntime.jsx(ui.DescriptionIcon, { className: "text-surface-700 dark:text-surface-300" }) });
11713
+ t5 = placeholder && /* @__PURE__ */ jsxRuntime.jsx("div", { onClick: _temp$r, className: "flex flex-col items-center justify-center w-full h-full", children: /* @__PURE__ */ jsxRuntime.jsx(ui.DescriptionIcon, { className: "text-surface-700 dark:text-surface-300" }) });
11727
11714
  $[15] = placeholder;
11728
11715
  $[16] = t5;
11729
11716
  } else {
@@ -11746,7 +11733,7 @@
11746
11733
  }
11747
11734
  return t6;
11748
11735
  }
11749
- function _temp$q(e) {
11736
+ function _temp$r(e) {
11750
11737
  return e.stopPropagation();
11751
11738
  }
11752
11739
  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";
@@ -11974,7 +11961,7 @@
11974
11961
  t4 = $[7];
11975
11962
  }
11976
11963
  const style = t4;
11977
- const getImageSizeNumber = _temp$p;
11964
+ const getImageSizeNumber = _temp$q;
11978
11965
  let child;
11979
11966
  if (entry.storagePathOrDownloadUrl) {
11980
11967
  const t52 = `storage_preview_${entry.storagePathOrDownloadUrl}`;
@@ -12049,7 +12036,7 @@
12049
12036
  }
12050
12037
  return t6;
12051
12038
  }
12052
- function _temp$p(previewSize) {
12039
+ function _temp$q(previewSize) {
12053
12040
  switch (previewSize) {
12054
12041
  case "small": {
12055
12042
  return 40;
@@ -12330,7 +12317,7 @@
12330
12317
  newValue.splice(fromIndex, 1);
12331
12318
  newValue.splice(toIndex, 0, item);
12332
12319
  setInternalValue(newValue);
12333
- const fieldValue = newValue.filter(_temp3$4).map(_temp4$3);
12320
+ const fieldValue = newValue.filter(_temp3$4).map(_temp4$4);
12334
12321
  onChange(fieldValue);
12335
12322
  };
12336
12323
  $[0] = multipleFilesSupported;
@@ -12524,7 +12511,7 @@
12524
12511
  function _temp5$2(v_0) {
12525
12512
  return !!v_0.storagePathOrDownloadUrl;
12526
12513
  }
12527
- function _temp4$3(e_0) {
12514
+ function _temp4$4(e_0) {
12528
12515
  return e_0.storagePathOrDownloadUrl;
12529
12516
  }
12530
12517
  function _temp3$4(e) {
@@ -13568,7 +13555,7 @@
13568
13555
  } else {
13569
13556
  t42 = $[20];
13570
13557
  }
13571
- t3 = Object.entries(mapProperties).filter(_temp$o).map(t42);
13558
+ t3 = Object.entries(mapProperties).filter(_temp$p).map(t42);
13572
13559
  $[6] = autoFocus;
13573
13560
  $[7] = context;
13574
13561
  $[8] = disabled;
@@ -13647,7 +13634,7 @@
13647
13634
  }
13648
13635
  return t10;
13649
13636
  }
13650
- function _temp$o(t0) {
13637
+ function _temp$p(t0) {
13651
13638
  const [, property_0] = t0;
13652
13639
  return !isHidden(property_0);
13653
13640
  }
@@ -15021,7 +15008,7 @@
15021
15008
  const property = t4;
15022
15009
  let t5;
15023
15010
  if ($[9] !== properties) {
15024
- t5 = Object.entries(properties).map(_temp$n);
15011
+ t5 = Object.entries(properties).map(_temp$o);
15025
15012
  $[9] = properties;
15026
15013
  $[10] = t5;
15027
15014
  } else {
@@ -15114,7 +15101,7 @@
15114
15101
  }
15115
15102
  return t11;
15116
15103
  }
15117
- function _temp$n(t0) {
15104
+ function _temp$o(t0) {
15118
15105
  const [key, property_0] = t0;
15119
15106
  return {
15120
15107
  id: key,
@@ -17235,24 +17222,27 @@
17235
17222
  function propertiesToColumns({
17236
17223
  properties,
17237
17224
  sortable: sortable2,
17238
- forceFilter,
17239
- AdditionalHeaderWidget
17225
+ forcedFilters,
17226
+ AdditionalHeaderWidget,
17227
+ allowedFilters
17240
17228
  }) {
17241
- const disabledFilter = Boolean(forceFilter);
17242
17229
  return Object.entries(properties).flatMap(([key, property]) => getColumnKeysForProperty(property, key)).map(({
17243
17230
  key,
17244
17231
  disabled
17245
17232
  }) => {
17246
17233
  const property = getResolvedPropertyInPath(properties, key);
17247
17234
  if (!property) throw Error("Internal error: no property found in path " + key);
17248
- const filterable = filterableProperty(property);
17235
+ const filterable = property.dataType === "array" ? isDataTypeFilterable(property.of?.dataType, true) : isDataTypeFilterable(property.dataType);
17236
+ const isFilterForced = forcedFilters?.includes(key) ?? false;
17237
+ const isFilterAllowed = allowedFilters ? allowedFilters.includes(key) : filterable;
17238
+ const filterEnabled = filterable && isFilterAllowed && !isFilterForced;
17249
17239
  return {
17250
17240
  key,
17251
17241
  align: getTableCellAlignment(property),
17252
17242
  icon: getIconForProperty(property, "small"),
17253
17243
  title: property.name ?? key,
17254
17244
  sortable: sortable2,
17255
- filter: !disabledFilter && filterable,
17245
+ filter: filterEnabled,
17256
17246
  width: getTablePropertyColumnWidth(property),
17257
17247
  resizable: true,
17258
17248
  custom: {
@@ -17265,16 +17255,6 @@
17265
17255
  };
17266
17256
  });
17267
17257
  }
17268
- function filterableProperty(property, partOfArray = false) {
17269
- if (partOfArray) {
17270
- return ["string", "number", "date", "reference"].includes(property.dataType);
17271
- }
17272
- if (property.dataType === "array") {
17273
- if (property.of) return filterableProperty(property.of, true);
17274
- else return false;
17275
- }
17276
- return ["string", "number", "boolean", "date", "reference", "array"].includes(property.dataType);
17277
- }
17278
17258
  const VirtualTableHeader = React.memo(function VirtualTableHeader2(t0) {
17279
17259
  const $ = reactCompilerRuntime.c(61);
17280
17260
  const {
@@ -18434,7 +18414,7 @@
18434
18414
  let t1;
18435
18415
  if ($[0] !== text) {
18436
18416
  const urlRegex = /https?:\/\/[^\s]+/g;
18437
- t1 = text.replace(urlRegex, _temp$m);
18417
+ t1 = text.replace(urlRegex, _temp$n);
18438
18418
  $[0] = text;
18439
18419
  $[1] = t1;
18440
18420
  } else {
@@ -18453,7 +18433,7 @@
18453
18433
  }
18454
18434
  return t2;
18455
18435
  };
18456
- function _temp$m(url) {
18436
+ function _temp$n(url) {
18457
18437
  return `<a href="${url}" class="underline" target="_blank">Link</a><br/>`;
18458
18438
  }
18459
18439
  const operationLabels$2 = {
@@ -18527,10 +18507,10 @@
18527
18507
  return path ? navigationController.getCollection(path) : void 0;
18528
18508
  }, [path]);
18529
18509
  const onSingleEntitySelected = (entity) => {
18530
- updateFilter(operation, getReferenceFrom(entity));
18510
+ if (entity) updateFilter(operation, getReferenceFrom(entity));
18531
18511
  };
18532
18512
  const onMultipleEntitiesSelected = (entities) => {
18533
- updateFilter(operation, entities.map((e) => getReferenceFrom(e)));
18513
+ updateFilter(operation, entities.filter(Boolean).map((e) => getReferenceFrom(e)));
18534
18514
  };
18535
18515
  const multiple = multipleSelectOperations$2.includes(operation);
18536
18516
  const referenceDialogController = useReferenceDialog({
@@ -18705,7 +18685,7 @@
18705
18685
  }
18706
18686
  let t8;
18707
18687
  if ($[20] !== operation || $[21] !== t6 || $[22] !== t7) {
18708
- t8 = /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-[100px]", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select, { value: operation, size: "medium", fullWidth: true, position: "item-aligned", onValueChange: t6, renderValue: _temp$l, children: t7 }) });
18688
+ t8 = /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-[100px]", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select, { value: operation, size: "medium", fullWidth: true, position: "item-aligned", onValueChange: t6, renderValue: _temp$m, children: t7 }) });
18709
18689
  $[20] = operation;
18710
18690
  $[21] = t6;
18711
18691
  $[22] = t7;
@@ -18759,7 +18739,7 @@
18759
18739
  let t11;
18760
18740
  if ($[40] !== dataType || $[41] !== enumValues || $[42] !== internalValue || $[43] !== isNullOperation || $[44] !== multiple || $[45] !== name || $[46] !== operation || $[47] !== updateFilter) {
18761
18741
  t11 = enumValues && multiple && /* @__PURE__ */ jsxRuntime.jsx(ui.MultiSelect, { size: "medium", position: "item-aligned", value: Array.isArray(internalValue) ? internalValue.map(_temp3$3) : [], disabled: isNullOperation, onValueChange: (value_2) => {
18762
- updateFilter(operation, dataType === "number" ? value_2.map(_temp4$2) : value_2);
18742
+ updateFilter(operation, dataType === "number" ? value_2.map(_temp4$3) : value_2);
18763
18743
  }, multiple, endAdornment: internalValue && /* @__PURE__ */ jsxRuntime.jsx(ui.IconButton, { className: "absolute right-2 top-3", onClick: (e_2) => updateFilter(operation, void 0), children: /* @__PURE__ */ jsxRuntime.jsx(ui.CloseIcon, {}) }), children: enumValues.map((enumConfig_0) => /* @__PURE__ */ jsxRuntime.jsx(ui.MultiSelectItem, { value: String(enumConfig_0.id), children: /* @__PURE__ */ jsxRuntime.jsx(EnumValuesChip, { enumKey: String(enumConfig_0.id), enumValues, size: "small" }) }, `select_value_${name}_${enumConfig_0.id}`)) });
18764
18744
  $[40] = dataType;
18765
18745
  $[41] = enumValues;
@@ -18801,7 +18781,7 @@
18801
18781
  }
18802
18782
  return t13;
18803
18783
  }
18804
- function _temp4$2(v) {
18784
+ function _temp4$3(v) {
18805
18785
  return parseInt(v);
18806
18786
  }
18807
18787
  function _temp3$3(e_1) {
@@ -18810,7 +18790,7 @@
18810
18790
  function _temp2$6(op_2) {
18811
18791
  return /* @__PURE__ */ jsxRuntime.jsx(ui.SelectItem, { value: op_2, children: operationLabels$1[op_2] }, op_2);
18812
18792
  }
18813
- function _temp$l(op_1) {
18793
+ function _temp$m(op_1) {
18814
18794
  return operationLabels$1[op_1];
18815
18795
  }
18816
18796
  function BooleanFilterField(t0) {
@@ -18981,7 +18961,7 @@
18981
18961
  }
18982
18962
  let t8;
18983
18963
  if ($[17] !== operation || $[18] !== t6 || $[19] !== t7) {
18984
- t8 = /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-[100px]", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select, { value: operation, size: "medium", fullWidth: true, onValueChange: t6, renderValue: _temp$k, children: t7 }) });
18964
+ t8 = /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-[100px]", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select, { value: operation, size: "medium", fullWidth: true, onValueChange: t6, renderValue: _temp$l, children: t7 }) });
18985
18965
  $[17] = operation;
18986
18966
  $[18] = t6;
18987
18967
  $[19] = t7;
@@ -19031,7 +19011,7 @@
19031
19011
  function _temp2$5(op_2) {
19032
19012
  return /* @__PURE__ */ jsxRuntime.jsx(ui.SelectItem, { value: op_2, children: operationLabels[op_2] }, op_2);
19033
19013
  }
19034
- function _temp$k(op_1) {
19014
+ function _temp$l(op_1) {
19035
19015
  return operationLabels[op_1];
19036
19016
  }
19037
19017
  const SelectableTable = function SelectableTable2({
@@ -19281,7 +19261,8 @@
19281
19261
  const columnsResult = propertiesToColumns({
19282
19262
  properties,
19283
19263
  sortable: sortable2,
19284
- forceFilter,
19264
+ forcedFilters: tableController.forcedFilters,
19265
+ allowedFilters: tableController.allowedFilters,
19285
19266
  AdditionalHeaderWidget
19286
19267
  });
19287
19268
  const propertyColumnKeys = new Set(columnsResult.map((col) => col.key));
@@ -19428,7 +19409,26 @@
19428
19409
  filterValues: initialFilterUrl,
19429
19410
  sortBy: initialSortUrl
19430
19411
  } = parseFilterAndSort(location.search);
19431
- const [filterValues_0, setFilterValues] = React.useState(forceFilter ?? (updateUrl ? initialFilterUrl : void 0) ?? initialFilter ?? void 0);
19412
+ const availableFilterKeys = collection.allowedFilters ?? Object.keys(collection.properties);
19413
+ const forcedFilterKeys = collection.forceFilter ? Object.keys(collection.forceFilter) : [];
19414
+ const allowedFilterKeys = React.useMemo(() => {
19415
+ const availableKeys = availableFilterKeys.filter((key) => {
19416
+ const property = collection.properties[key];
19417
+ if (!property) return false;
19418
+ if (typeof property === "function") return false;
19419
+ const dataType = property.dataType;
19420
+ const filterable = dataType === "array" ? isDataTypeFilterable(property.of?.dataType, true) : isDataTypeFilterable(dataType);
19421
+ return filterable;
19422
+ });
19423
+ const forcedKeys = forcedFilterKeys.filter((key_0) => !availableKeys.includes(key_0));
19424
+ return [...availableKeys, ...forcedKeys];
19425
+ }, [collection.properties, availableFilterKeys, forcedFilterKeys]);
19426
+ const removeUnallowedFilters = React.useCallback((filters) => {
19427
+ if (!filters) return;
19428
+ return Object.fromEntries(Object.entries(filters).filter(([key_1]) => allowedFilterKeys.includes(key_1)));
19429
+ }, [allowedFilterKeys]);
19430
+ const initFilters = forceFilter ?? (updateUrl ? initialFilterUrl : void 0) ?? initialFilter ?? void 0;
19431
+ const [filterValues_0, setFilterValues] = React.useState(removeUnallowedFilters(initFilters));
19432
19432
  const [sortBy_0, setSortBy] = React.useState((updateUrl ? initialSortUrl : void 0) ?? initialSortInternal);
19433
19433
  useUpdateUrl(filterValues_0, sortBy_0, searchString, updateUrl);
19434
19434
  const collectionScroll = scrollRestoration?.getCollectionScroll(fullPath, filterValues_0);
@@ -19451,7 +19451,7 @@
19451
19451
  const [dataLoading, setDataLoading] = React.useState(false);
19452
19452
  const [dataLoadingError, setDataLoadingError] = React.useState();
19453
19453
  const [noMoreToLoad, setNoMoreToLoad] = React.useState(false);
19454
- const clearFilter = React.useCallback(() => setFilterValues(forceFilter ?? void 0), [forceFilter]);
19454
+ const clearFilter = React.useCallback(() => setFilterValues(removeUnallowedFilters(forceFilter)), [forceFilter, removeUnallowedFilters]);
19455
19455
  const updateFilterValues = React.useCallback((updatedFilter) => {
19456
19456
  if (forceFilter) {
19457
19457
  console.warn("Filter is not compatible with the force filter. Ignoring filter");
@@ -19460,9 +19460,9 @@
19460
19460
  if (updatedFilter && Object.keys(updatedFilter).length === 0) {
19461
19461
  setFilterValues(void 0);
19462
19462
  } else {
19463
- setFilterValues(updatedFilter);
19463
+ setFilterValues(removeUnallowedFilters(updatedFilter));
19464
19464
  }
19465
- }, [forceFilter]);
19465
+ }, [forceFilter, removeUnallowedFilters]);
19466
19466
  React.useEffect(() => {
19467
19467
  setDataLoading(true);
19468
19468
  const onEntitiesUpdate = async (entities) => {
@@ -19537,6 +19537,8 @@
19537
19537
  dataLoadingError,
19538
19538
  filterValues: filterValues_0,
19539
19539
  setFilterValues: updateFilterValues,
19540
+ allowedFilters: allowedFilterKeys,
19541
+ forcedFilters: forcedFilterKeys,
19540
19542
  sortBy: sortBy_0,
19541
19543
  setSortBy,
19542
19544
  searchString,
@@ -19760,7 +19762,7 @@
19760
19762
  const searchBlocked = t12;
19761
19763
  let t2;
19762
19764
  if ($[15] !== customizationController.plugins || $[16] !== dataSource?.initTextSearch) {
19763
- t2 = Boolean(dataSource?.initTextSearch) || customizationController.plugins?.find(_temp$j);
19765
+ t2 = Boolean(dataSource?.initTextSearch) || customizationController.plugins?.find(_temp$k);
19764
19766
  $[15] = customizationController.plugins;
19765
19767
  $[16] = dataSource?.initTextSearch;
19766
19768
  $[17] = t2;
@@ -19852,7 +19854,7 @@
19852
19854
  }
19853
19855
  return t1;
19854
19856
  }
19855
- function _temp$j(p_0) {
19857
+ function _temp$k(p_0) {
19856
19858
  return Boolean(p_0.collectionView?.onTextSearchClick);
19857
19859
  }
19858
19860
  function DeleteEntityDialog({
@@ -20474,7 +20476,7 @@
20474
20476
  T0 = ui.Collapse;
20475
20477
  t4 = favouriteCollections.length > 0;
20476
20478
  t2 = "flex flex-row flex-wrap gap-2 pb-2 min-h-[32px]";
20477
- t3 = favouriteCollections.map(_temp$i);
20479
+ t3 = favouriteCollections.map(_temp$j);
20478
20480
  $[2] = navigationController;
20479
20481
  $[3] = t1;
20480
20482
  $[4] = T0;
@@ -20508,7 +20510,7 @@
20508
20510
  }
20509
20511
  return t6;
20510
20512
  }
20511
- function _temp$i(entry_0) {
20513
+ function _temp$j(entry_0) {
20512
20514
  return /* @__PURE__ */ jsxRuntime.jsx(NavigationChip, { entry: entry_0 }, entry_0.path);
20513
20515
  }
20514
20516
  const scrollsMap = {};
@@ -20745,7 +20747,7 @@
20745
20747
  }
20746
20748
  let t4;
20747
20749
  if ($[4] !== actions) {
20748
- t4 = /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-0.5", onClick: _temp$h, children: actions });
20750
+ t4 = /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-0.5", onClick: _temp$i, children: actions });
20749
20751
  $[4] = actions;
20750
20752
  $[5] = t4;
20751
20753
  } else {
@@ -20832,7 +20834,7 @@
20832
20834
  }
20833
20835
  return t12;
20834
20836
  });
20835
- function _temp$h(event) {
20837
+ function _temp$i(event) {
20836
20838
  event.preventDefault();
20837
20839
  event.stopPropagation();
20838
20840
  }
@@ -23188,7 +23190,7 @@
23188
23190
  let t19;
23189
23191
  let t20;
23190
23192
  if ($[19] !== items2) {
23191
- t20 = items2.map(_temp$g);
23193
+ t20 = items2.map(_temp$h);
23192
23194
  $[19] = items2;
23193
23195
  $[20] = t20;
23194
23196
  } else {
@@ -23294,7 +23296,7 @@
23294
23296
  }
23295
23297
  return t29;
23296
23298
  });
23297
- function _temp$g(i) {
23299
+ function _temp$h(i) {
23298
23300
  return i.id;
23299
23301
  }
23300
23302
  function Board(t0) {
@@ -25230,7 +25232,8 @@
25230
25232
  properties,
25231
25233
  filterValues,
25232
25234
  setFilterValues,
25233
- forceFilter
25235
+ forceFilter,
25236
+ allowedFilters
25234
25237
  }) {
25235
25238
  const {
25236
25239
  t
@@ -25242,15 +25245,14 @@
25242
25245
  setLocalFilters(filterValues ?? {});
25243
25246
  }
25244
25247
  }, [open, filterValues]);
25245
- const filterableProperties = React.useMemo(() => {
25246
- return Object.entries(properties).filter(([key, property]) => {
25247
- if (!property) return false;
25248
- if (forceFilter && key in forceFilter) return false;
25249
- const baseProperty = property.dataType === "array" ? property.of : property;
25250
- if (!baseProperty) return false;
25251
- return ["string", "number", "boolean", "date", "reference"].includes(baseProperty.dataType);
25248
+ const editableFilterProperties = React.useMemo(() => {
25249
+ return Object.entries(properties).filter(([key]) => {
25250
+ const isFilterAllowed = !allowedFilters || allowedFilters.includes(key);
25251
+ const isFilterForced = Boolean(forceFilter && Object.keys(forceFilter).includes(key));
25252
+ return isFilterAllowed && !isFilterForced;
25252
25253
  });
25253
- }, [properties, forceFilter]);
25254
+ }, [properties, allowedFilters, forceFilter]);
25255
+ const hasEditableFilterProperties = editableFilterProperties.length > 0;
25254
25256
  const handleFilterChange = React.useCallback((propertyKey, value) => {
25255
25257
  setLocalFilters((prev) => {
25256
25258
  const newFilters = {
@@ -25282,22 +25284,26 @@
25282
25284
  }));
25283
25285
  }, []);
25284
25286
  const isAnyFieldHidden = Object.values(hiddenFields).some((hidden_0) => hidden_0);
25285
- const activeFilterCount = Object.keys(localFilters).length;
25286
- const renderFilterField = React.useCallback((propertyKey_1, property_0) => {
25287
- const isArray = property_0.dataType === "array";
25288
- const baseProperty_0 = isArray ? property_0.of : property_0;
25289
- if (!baseProperty_0) return null;
25287
+ const getActiveFilterCount = () => {
25288
+ const editableLocalFilters = Object.keys(localFilters).filter((key_0) => !forceFilter || !(key_0 in forceFilter));
25289
+ return editableLocalFilters.length;
25290
+ };
25291
+ const activeFilterCount = getActiveFilterCount();
25292
+ const renderFilterField = React.useCallback((propertyKey_1, property) => {
25293
+ const isArray = property.dataType === "array";
25294
+ const baseProperty = isArray ? property.of : property;
25295
+ if (!baseProperty) return null;
25290
25296
  const filterValue = localFilters[propertyKey_1];
25291
25297
  const setValue = (value_0) => handleFilterChange(propertyKey_1, value_0);
25292
- if (baseProperty_0.dataType === "reference") {
25293
- return /* @__PURE__ */ jsxRuntime.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) });
25294
- } else if (baseProperty_0.dataType === "number" || baseProperty_0.dataType === "string") {
25295
- const enumValues = baseProperty_0.enumValues ? enumToObjectEntries(baseProperty_0.enumValues) : void 0;
25296
- return /* @__PURE__ */ jsxRuntime.jsx(StringNumberFilterField, { value: filterValue, setValue, name: propertyKey_1, dataType: baseProperty_0.dataType, isArray, enumValues, title: property_0.name });
25297
- } else if (baseProperty_0.dataType === "boolean") {
25298
- return /* @__PURE__ */ jsxRuntime.jsx(BooleanFilterField, { value: filterValue, setValue, name: propertyKey_1, title: property_0.name });
25299
- } else if (baseProperty_0.dataType === "date") {
25300
- return /* @__PURE__ */ jsxRuntime.jsx(DateTimeFilterField, { value: filterValue, setValue, name: propertyKey_1, mode: baseProperty_0.mode, isArray, title: property_0.name });
25298
+ if (baseProperty.dataType === "reference") {
25299
+ return /* @__PURE__ */ jsxRuntime.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) });
25300
+ } else if (baseProperty.dataType === "number" || baseProperty.dataType === "string") {
25301
+ const enumValues = baseProperty.enumValues ? enumToObjectEntries(baseProperty.enumValues) : void 0;
25302
+ return /* @__PURE__ */ jsxRuntime.jsx(StringNumberFilterField, { value: filterValue, setValue, name: propertyKey_1, dataType: baseProperty.dataType, isArray, enumValues, title: property.name });
25303
+ } else if (baseProperty.dataType === "boolean") {
25304
+ return /* @__PURE__ */ jsxRuntime.jsx(BooleanFilterField, { value: filterValue, setValue, name: propertyKey_1, title: property.name });
25305
+ } else if (baseProperty.dataType === "date") {
25306
+ return /* @__PURE__ */ jsxRuntime.jsx(DateTimeFilterField, { value: filterValue, setValue, name: propertyKey_1, mode: baseProperty.mode, isArray, title: property.name });
25301
25307
  }
25302
25308
  return null;
25303
25309
  }, [localFilters, handleFilterChange, hiddenFields, setHiddenForField]);
@@ -25306,23 +25312,25 @@
25306
25312
  /* @__PURE__ */ jsxRuntime.jsx(ui.Typography, { variant: "h6", children: t("filters") }),
25307
25313
  activeFilterCount > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-2 px-2 py-0.5 text-xs rounded-full bg-primary text-white", children: activeFilterCount })
25308
25314
  ] }),
25309
- /* @__PURE__ */ jsxRuntime.jsx(ui.DialogContent, { children: filterableProperties.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(ui.Typography, { color: "secondary", className: "py-8 text-center", children: t("no_filterable_properties") }) : /* @__PURE__ */ jsxRuntime.jsx("table", { className: "w-full border-collapse", children: /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: filterableProperties.map(([propertyKey_2, property_1], index) => {
25315
+ /* @__PURE__ */ jsxRuntime.jsx(ui.DialogContent, { children: !hasEditableFilterProperties ? /* @__PURE__ */ jsxRuntime.jsx(ui.Typography, { color: "secondary", className: "py-8 text-center", children: t("no_filterable_properties") }) : /* @__PURE__ */ jsxRuntime.jsx("table", { className: "w-full border-collapse", children: /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: editableFilterProperties.map(([propertyKey_2, property_0], index) => {
25310
25316
  const hasFilter = propertyKey_2 in localFilters;
25311
25317
  return /* @__PURE__ */ jsxRuntime.jsxs("tr", { className: ui.cls(index > 0 && "border-t", ui.defaultBorderMixin), children: [
25312
- /* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-3 pr-4 align-middle w-[160px]", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Typography, { variant: "body2", className: ui.cls("font-medium", hasFilter && "text-primary"), children: property_1.name || propertyKey_2 }) }),
25313
- /* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-3", children: renderFilterField(propertyKey_2, property_1) })
25318
+ /* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-3 pr-4 align-middle w-[160px]", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Typography, { variant: "body2", className: ui.cls("font-medium", hasFilter && "text-primary"), children: property_0.name || propertyKey_2 }) }),
25319
+ /* @__PURE__ */ jsxRuntime.jsx("td", { className: "py-3", children: renderFilterField(propertyKey_2, property_0) })
25314
25320
  ] }, propertyKey_2);
25315
25321
  }) }) }) }),
25316
25322
  /* @__PURE__ */ jsxRuntime.jsxs(ui.DialogActions, { children: [
25317
25323
  /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { variant: "text", onClick: handleClearAll, disabled: activeFilterCount === 0, children: t("clear") }),
25318
25324
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-grow" }),
25319
- /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { variant: "text", onClick: () => onOpenChange(false), children: t("cancel") }),
25320
- /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { variant: "filled", onClick: handleApply, children: t("apply_filters") })
25325
+ hasEditableFilterProperties && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
25326
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { variant: "text", onClick: () => onOpenChange(false), children: t("cancel") }),
25327
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { variant: "filled", onClick: handleApply, children: t("apply_filters") })
25328
+ ] })
25321
25329
  ] })
25322
25330
  ] });
25323
25331
  }
25324
25332
  function EntityCollectionViewStartActions(t0) {
25325
- const $ = reactCompilerRuntime.c(36);
25333
+ const $ = reactCompilerRuntime.c(37);
25326
25334
  const {
25327
25335
  collection,
25328
25336
  relativePath,
@@ -25386,34 +25394,36 @@
25386
25394
  t3 = $[13];
25387
25395
  }
25388
25396
  const actionProps = t3;
25397
+ const hasAnyAllowedFilters = !tableController.allowedFilters || tableController.allowedFilters.length > 0;
25389
25398
  let t4;
25390
- if ($[14] !== activeFilterCount || $[15] !== largeLayout || $[16] !== resolvedProperties || $[17] !== t || $[18] !== tableController.setFilterValues) {
25391
- t4 = resolvedProperties && tableController.setFilterValues && /* @__PURE__ */ jsxRuntime.jsx(ui.Tooltip, { title: t("filters"), children: /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { color: "primary", invisible: activeFilterCount === 0, children: largeLayout ? /* @__PURE__ */ jsxRuntime.jsxs(ui.Button, { variant: "text", size: "small", onClick: () => setFiltersDialogOpen(true), startIcon: /* @__PURE__ */ jsxRuntime.jsx(ui.FilterListIcon, { size: "small" }), className: ui.cls(activeFilterCount > 0 && "text-primary"), children: [
25399
+ if ($[14] !== activeFilterCount || $[15] !== hasAnyAllowedFilters || $[16] !== largeLayout || $[17] !== resolvedProperties || $[18] !== t || $[19] !== tableController.setFilterValues) {
25400
+ t4 = resolvedProperties && tableController.setFilterValues && hasAnyAllowedFilters && /* @__PURE__ */ jsxRuntime.jsx(ui.Tooltip, { title: t("filters"), children: /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { color: "primary", invisible: activeFilterCount === 0, children: largeLayout ? /* @__PURE__ */ jsxRuntime.jsxs(ui.Button, { variant: "text", size: "small", onClick: () => setFiltersDialogOpen(true), startIcon: /* @__PURE__ */ jsxRuntime.jsx(ui.FilterListIcon, { size: "small" }), className: ui.cls(activeFilterCount > 0 && "text-primary"), children: [
25392
25401
  t("filters"),
25393
25402
  activeFilterCount > 0 ? ` (${activeFilterCount})` : ""
25394
25403
  ] }) : /* @__PURE__ */ jsxRuntime.jsx(ui.IconButton, { size: "small", onClick: () => setFiltersDialogOpen(true), className: ui.cls(activeFilterCount > 0 && "text-primary"), children: /* @__PURE__ */ jsxRuntime.jsx(ui.FilterListIcon, { size: "small" }) }) }) }, "filters_tooltip");
25395
25404
  $[14] = activeFilterCount;
25396
- $[15] = largeLayout;
25397
- $[16] = resolvedProperties;
25398
- $[17] = t;
25399
- $[18] = tableController.setFilterValues;
25400
- $[19] = t4;
25405
+ $[15] = hasAnyAllowedFilters;
25406
+ $[16] = largeLayout;
25407
+ $[17] = resolvedProperties;
25408
+ $[18] = t;
25409
+ $[19] = tableController.setFilterValues;
25410
+ $[20] = t4;
25401
25411
  } else {
25402
- t4 = $[19];
25412
+ t4 = $[20];
25403
25413
  }
25404
25414
  const filtersButton = t4;
25405
25415
  const t5 = !collection.forceFilter;
25406
25416
  let t6;
25407
- if ($[20] !== t5 || $[21] !== tableController) {
25417
+ if ($[21] !== t5 || $[22] !== tableController) {
25408
25418
  t6 = /* @__PURE__ */ jsxRuntime.jsx(ClearFilterSortButton, { tableController, enabled: t5 }, "clear_filter");
25409
- $[20] = t5;
25410
- $[21] = tableController;
25411
- $[22] = t6;
25419
+ $[21] = t5;
25420
+ $[22] = tableController;
25421
+ $[23] = t6;
25412
25422
  } else {
25413
- t6 = $[22];
25423
+ t6 = $[23];
25414
25424
  }
25415
25425
  let actions;
25416
- if ($[23] !== actionProps || $[24] !== filtersButton || $[25] !== plugins || $[26] !== t6) {
25426
+ if ($[24] !== actionProps || $[25] !== filtersButton || $[26] !== plugins || $[27] !== t6) {
25417
25427
  actions = [filtersButton, t6];
25418
25428
  if (plugins) {
25419
25429
  plugins.forEach((plugin, i) => {
@@ -25422,39 +25432,42 @@
25422
25432
  }
25423
25433
  });
25424
25434
  }
25425
- $[23] = actionProps;
25426
- $[24] = filtersButton;
25427
- $[25] = plugins;
25428
- $[26] = t6;
25429
- $[27] = actions;
25435
+ $[24] = actionProps;
25436
+ $[25] = filtersButton;
25437
+ $[26] = plugins;
25438
+ $[27] = t6;
25439
+ $[28] = actions;
25430
25440
  } else {
25431
- actions = $[27];
25441
+ actions = $[28];
25432
25442
  }
25433
25443
  let t7;
25434
- if ($[28] !== collection.forceFilter || $[29] !== filtersDialogOpen || $[30] !== resolvedProperties || $[31] !== tableController) {
25435
- t7 = resolvedProperties && tableController.setFilterValues && /* @__PURE__ */ jsxRuntime.jsx(FiltersDialog, { open: filtersDialogOpen, onOpenChange: setFiltersDialogOpen, properties: resolvedProperties, filterValues: tableController.filterValues, setFilterValues: (filterValues_0) => tableController.setFilterValues?.(filterValues_0 ?? {}), forceFilter: collection.forceFilter });
25436
- $[28] = collection.forceFilter;
25437
- $[29] = filtersDialogOpen;
25438
- $[30] = resolvedProperties;
25439
- $[31] = tableController;
25440
- $[32] = t7;
25444
+ if ($[29] !== collection.forceFilter || $[30] !== filtersDialogOpen || $[31] !== resolvedProperties || $[32] !== tableController) {
25445
+ t7 = resolvedProperties && tableController.setFilterValues && /* @__PURE__ */ jsxRuntime.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) });
25446
+ $[29] = collection.forceFilter;
25447
+ $[30] = filtersDialogOpen;
25448
+ $[31] = resolvedProperties;
25449
+ $[32] = tableController;
25450
+ $[33] = t7;
25441
25451
  } else {
25442
- t7 = $[32];
25452
+ t7 = $[33];
25443
25453
  }
25444
25454
  let t8;
25445
- if ($[33] !== actions || $[34] !== t7) {
25455
+ if ($[34] !== actions || $[35] !== t7) {
25446
25456
  t8 = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
25447
25457
  actions,
25448
25458
  t7
25449
25459
  ] });
25450
- $[33] = actions;
25451
- $[34] = t7;
25452
- $[35] = t8;
25460
+ $[34] = actions;
25461
+ $[35] = t7;
25462
+ $[36] = t8;
25453
25463
  } else {
25454
- t8 = $[35];
25464
+ t8 = $[36];
25455
25465
  }
25456
25466
  return t8;
25457
25467
  }
25468
+ function _temp$g(key_0) {
25469
+ return key_0.toString();
25470
+ }
25458
25471
  const collectionScrollCache = /* @__PURE__ */ new Map();
25459
25472
  function useScrollRestoration() {
25460
25473
  const updateCollectionScroll = ({
@@ -25513,7 +25526,12 @@
25513
25526
  const scrollRestoration = useScrollRestoration();
25514
25527
  const collection = React.useMemo(() => {
25515
25528
  const userOverride = userConfigPersistence?.getCollectionConfig(fullPath);
25516
- return userOverride ? mergeDeep(collectionProp, userOverride) : collectionProp;
25529
+ if (!userOverride) return collectionProp;
25530
+ const {
25531
+ properties,
25532
+ ...rest
25533
+ } = userOverride;
25534
+ return mergeDeep(collectionProp, rest);
25517
25535
  }, [collectionProp, fullPath, userConfigPersistence?.getCollectionConfig]);
25518
25536
  const openEntityMode = collection?.openEntityMode ?? DEFAULT_ENTITY_OPEN_MODE;
25519
25537
  const collectionRef = React.useRef(collection);
@@ -25767,11 +25785,12 @@
25767
25785
  collection,
25768
25786
  path: fullPath,
25769
25787
  propertyConfigs: customizationController.propertyConfigs,
25770
- authController
25771
- }), [collection, fullPath]);
25788
+ authController,
25789
+ userConfigPersistence
25790
+ }), [collection, fullPath, userConfigPersistence]);
25772
25791
  const hasEnumProperty = React.useMemo(() => {
25773
- const properties = resolvedCollection.properties;
25774
- return Object.values(properties).some((prop) => prop && prop.dataType === "string" && prop.enumValues);
25792
+ const properties_0 = resolvedCollection.properties;
25793
+ return Object.values(properties_0).some((prop) => prop && prop.dataType === "string" && prop.enumValues);
25775
25794
  }, [resolvedCollection.properties]);
25776
25795
  const enabledViews = React.useMemo(() => {
25777
25796
  const configured = collection.enabledViews ?? ["table", "cards", "kanban"];
@@ -25782,8 +25801,8 @@
25782
25801
  }, [collection.enabledViews, hasEnumProperty]);
25783
25802
  const kanbanPropertyOptions = React.useMemo(() => {
25784
25803
  const options = [];
25785
- const properties_0 = resolvedCollection.properties;
25786
- for (const [key_0, property_0] of Object.entries(properties_0)) {
25804
+ const properties_1 = resolvedCollection.properties;
25805
+ for (const [key_0, property_0] of Object.entries(properties_1)) {
25787
25806
  const prop_0 = property_0;
25788
25807
  if (prop_0 && prop_0.dataType === "string" && prop_0.enumValues) {
25789
25808
  options.push({
@@ -27146,7 +27165,7 @@
27146
27165
  const onMultipleEntitiesSelected = React.useCallback((entities) => {
27147
27166
  if (disabled) return;
27148
27167
  if (onMultipleReferenceSelected) {
27149
- const references = entities ? entities.map((e) => getReferenceFrom(e)) : null;
27168
+ const references = entities ? entities.filter(Boolean).map((e) => getReferenceFrom(e)) : null;
27150
27169
  onMultipleReferenceSelected({
27151
27170
  references,
27152
27171
  entities
@@ -28086,7 +28105,14 @@
28086
28105
  if (!collections_0) return void 0;
28087
28106
  const baseCollection = getCollectionByPathOrId(removeInitialAndTrailingSlashes(idOrPath), collections_0);
28088
28107
  const userOverride = includeUserOverride ? userConfigPersistence?.getCollectionConfig(idOrPath) : void 0;
28089
- const overriddenCollection = baseCollection ? mergeDeep(baseCollection, userOverride ?? {}) : void 0;
28108
+ let overriddenCollection = baseCollection;
28109
+ if (baseCollection && userOverride) {
28110
+ const {
28111
+ properties,
28112
+ ...rest
28113
+ } = userOverride;
28114
+ overriddenCollection = mergeDeep(baseCollection, rest);
28115
+ }
28090
28116
  let result = overriddenCollection;
28091
28117
  if (overriddenCollection) {
28092
28118
  const subcollections = overriddenCollection.subcollections;
@@ -30027,7 +30053,7 @@
30027
30053
  replace: true,
30028
30054
  state: {
30029
30055
  base_location: baseLocation,
30030
- panels: updatedPanels.map(_temp4$1)
30056
+ panels: updatedPanels.map(_temp4$2)
30031
30057
  }
30032
30058
  });
30033
30059
  }
@@ -30125,7 +30151,7 @@
30125
30151
  function _temp5$1(p_3) {
30126
30152
  return p_3.key;
30127
30153
  }
30128
- function _temp4$1(p_2) {
30154
+ function _temp4$2(p_2) {
30129
30155
  return p_2.key;
30130
30156
  }
30131
30157
  function _temp3$2(p_1) {
@@ -32271,7 +32297,7 @@
32271
32297
  const otherChildren = t3;
32272
32298
  const includeDrawer = drawerChildren.length > 0;
32273
32299
  const largeLayout = useLargeLayout();
32274
- const [drawerOpen, setDrawerOpen] = React.useState(false);
32300
+ const [drawerOpen, setDrawerOpen] = React.useState(_temp4$1);
32275
32301
  const [onHover, setOnHover] = React.useState(false);
32276
32302
  let t4;
32277
32303
  if ($[6] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
@@ -32293,6 +32319,10 @@
32293
32319
  if ($[8] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
32294
32320
  t6 = () => {
32295
32321
  setDrawerOpen(true);
32322
+ try {
32323
+ localStorage.setItem("firecms_drawer_open", "true");
32324
+ } catch {
32325
+ }
32296
32326
  };
32297
32327
  $[8] = t6;
32298
32328
  } else {
@@ -32303,6 +32333,10 @@
32303
32333
  if ($[9] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
32304
32334
  t7 = () => {
32305
32335
  setDrawerOpen(false);
32336
+ try {
32337
+ localStorage.setItem("firecms_drawer_open", "false");
32338
+ } catch {
32339
+ }
32306
32340
  };
32307
32341
  $[9] = t7;
32308
32342
  } else {
@@ -32655,6 +32689,13 @@
32655
32689
  function _temp3$1(child_1) {
32656
32690
  return child_1.type.componentType !== "Drawer" && child_1.type.componentType !== "AppBar";
32657
32691
  }
32692
+ function _temp4$1() {
32693
+ try {
32694
+ return localStorage.getItem("firecms_drawer_open") === "true";
32695
+ } catch {
32696
+ return false;
32697
+ }
32698
+ }
32658
32699
  const en = {
32659
32700
  // ─── Form actions ────────────────────────────────────────────
32660
32701
  save: "Save",
@@ -32792,8 +32833,8 @@
32792
32833
  // ─── Error states ─────────────────────────────────────────────
32793
32834
  error: "Error",
32794
32835
  error_uploading_file: "Error uploading file",
32795
- error_deleting: "Error deleting",
32796
- error_before_delete: "Error before delete",
32836
+ error_deleting: "Error deleting: {{message}}",
32837
+ error_before_delete: "Error before delete: {{message}}",
32797
32838
  error_updating_asset: "Error updating asset",
32798
32839
  error_deleting_asset: "Error deleting asset",
32799
32840
  error_firestore_index: "A Firestore index is required for this query.",
@@ -33130,10 +33171,18 @@
33130
33171
  auto_setup_collections_button: "Automatically set up collections",
33131
33172
  auto_setup_collections_title: "Automatically set up collections?",
33132
33173
  auto_setup_collections_desc: "This will automatically create collection configs for collections that are <b>NOT</b> already mapped",
33133
- this_can_take_a_minute: "This can take a minute or two",
33174
+ setting_up_collections: "Setting up collections",
33175
+ setting_up_collection: "Setting up {{name}}",
33134
33176
  no_collections_found_to_setup: "No collections found to setup.",
33135
33177
  collections_have_been_setup: "Collections have been automatically setup.",
33136
33178
  error_setting_up_collections: "Error automatically setting up collections",
33179
+ setup_collections_title: "Set up collections",
33180
+ setup_collections_select_desc: "Select which collections to automatically set up:",
33181
+ select_all: "Select all",
33182
+ deselect_all: "Deselect all",
33183
+ setup_collections_confirm: "Set up ({{count}})",
33184
+ collection_setup_success: "{{name}} has been set up",
33185
+ go_to_collection: "Go to collection",
33137
33186
  // --- Home Suggestions ---
33138
33187
  add_your: "Add your",
33139
33188
  database_collections: "database collections",
@@ -33461,8 +33510,8 @@
33461
33510
  // ─── Error states ─────────────────────────────────────────────
33462
33511
  error: "Error",
33463
33512
  error_uploading_file: "Error al subir archivo",
33464
- error_deleting: "Error al eliminar",
33465
- error_before_delete: "Error antes de eliminar",
33513
+ error_deleting: "Error al eliminar: {{message}}",
33514
+ error_before_delete: "Error antes de eliminar: {{message}}",
33466
33515
  error_updating_asset: "Error al actualizar recurso",
33467
33516
  error_deleting_asset: "Error al eliminar recurso",
33468
33517
  error_firestore_index: "Se requiere un índice de Firestore para esta consulta.",
@@ -33801,10 +33850,18 @@
33801
33850
  auto_setup_collections_button: "Configurar colecciones automáticamente",
33802
33851
  auto_setup_collections_title: "¿Configurar colecciones automáticamente?",
33803
33852
  auto_setup_collections_desc: "Esto creará automáticamente la configuración de las colecciones que <b>NO</b> estén mapeadas",
33804
- this_can_take_a_minute: "Esto puede tardar un minuto o dos",
33853
+ setting_up_collections: "Configurando colecciones",
33854
+ setting_up_collection: "Configurando {{name}}",
33805
33855
  no_collections_found_to_setup: "No se encontraron colecciones para configurar",
33806
33856
  collections_have_been_setup: "¡Tus colecciones han sido configuradas!",
33807
33857
  error_setting_up_collections: "Error al configurar colecciones",
33858
+ setup_collections_title: "Set up collections",
33859
+ setup_collections_select_desc: "Select which collections to automatically set up:",
33860
+ select_all: "Select all",
33861
+ deselect_all: "Deselect all",
33862
+ setup_collections_confirm: "Set up ({{count}})",
33863
+ collection_setup_success: "{{name}} has been set up",
33864
+ go_to_collection: "Go to collection",
33808
33865
  // --- Home Suggestions ---
33809
33866
  add_your: "Añade tus",
33810
33867
  database_collections: "colecciones de base de datos",
@@ -34134,8 +34191,8 @@
34134
34191
  // ─── Error states ─────────────────────────────────────────────
34135
34192
  error: "Fehler",
34136
34193
  error_uploading_file: "Fehler beim Hochladen der Datei",
34137
- error_deleting: "Fehler beim Löschen",
34138
- error_before_delete: "Fehler vor dem Löschen",
34194
+ error_deleting: "Fehler beim Löschen: {{message}}",
34195
+ error_before_delete: "Fehler vor dem Löschen: {{message}}",
34139
34196
  error_updating_asset: "Fehler beim Aktualisieren des Assets",
34140
34197
  error_deleting_asset: "Fehler beim Löschen des Assets",
34141
34198
  error_firestore_index: "Für diese Abfrage ist ein Firestore-Index erforderlich.",
@@ -34472,10 +34529,18 @@
34472
34529
  auto_setup_collections_button: "Sammlungen automatisch einrichten",
34473
34530
  auto_setup_collections_title: "Sammlungen automatisch einrichten?",
34474
34531
  auto_setup_collections_desc: "Dadurch werden automatisch Sammlungskonfigurationen für Sammlungen erstellt, die noch <b>NICHT</b> zugeordnet sind.",
34475
- this_can_take_a_minute: "Dies kann ein bis zwei Minuten dauern",
34532
+ setting_up_collections: "Sammlungen werden eingerichtet",
34533
+ setting_up_collection: "{{name}} wird eingerichtet",
34476
34534
  no_collections_found_to_setup: "Keine einzurichtenden Sammlungen gefunden",
34477
34535
  collections_have_been_setup: "Sammlungen wurden automatisch eingerichtet",
34478
34536
  error_setting_up_collections: "Fehler beim automatischen Einrichten der Sammlungen",
34537
+ setup_collections_title: "Set up collections",
34538
+ setup_collections_select_desc: "Select which collections to automatically set up:",
34539
+ select_all: "Select all",
34540
+ deselect_all: "Deselect all",
34541
+ setup_collections_confirm: "Set up ({{count}})",
34542
+ collection_setup_success: "{{name}} has been set up",
34543
+ go_to_collection: "Go to collection",
34479
34544
  add_your: "Fügen Sie Ihre",
34480
34545
  database_collections: "Datenbanksammlungen",
34481
34546
  to_firecms: "zu FireCMS hinzu",
@@ -34803,8 +34868,8 @@
34803
34868
  // ─── Error states ─────────────────────────────────────────────
34804
34869
  error: "Erreur",
34805
34870
  error_uploading_file: "Erreur lors du téléchargement du fichier",
34806
- error_deleting: "Erreur lors de la suppression",
34807
- error_before_delete: "Erreur avant la suppression",
34871
+ error_deleting: "Erreur lors de la suppression: {{message}}",
34872
+ error_before_delete: "Erreur avant la suppression: {{message}}",
34808
34873
  error_updating_asset: "Erreur lors de la mise à jour de l'actif",
34809
34874
  error_deleting_asset: "Erreur lors de la suppression de l'actif",
34810
34875
  error_firestore_index: "Un index Firestore est requis pour cette requête.",
@@ -35141,10 +35206,18 @@
35141
35206
  auto_setup_collections_button: "Configurer les collections automatiquement",
35142
35207
  auto_setup_collections_title: "Configurer les collections automatiquement ?",
35143
35208
  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",
35144
- this_can_take_a_minute: "Cela peut prendre une minute",
35209
+ setting_up_collections: "Configuration des collections",
35210
+ setting_up_collection: "Configuration de {{name}}",
35145
35211
  no_collections_found_to_setup: "Aucune collection à configurer trouvée",
35146
35212
  collections_have_been_setup: "Les collections ont été configurées",
35147
35213
  error_setting_up_collections: "Erreur lors de la configuration des collections",
35214
+ setup_collections_title: "Set up collections",
35215
+ setup_collections_select_desc: "Select which collections to automatically set up:",
35216
+ select_all: "Select all",
35217
+ deselect_all: "Deselect all",
35218
+ setup_collections_confirm: "Set up ({{count}})",
35219
+ collection_setup_success: "{{name}} has been set up",
35220
+ go_to_collection: "Go to collection",
35148
35221
  add_your: "Ajoutez vos",
35149
35222
  database_collections: "collections de base de données",
35150
35223
  to_firecms: "à FireCMS",
@@ -35472,8 +35545,8 @@
35472
35545
  // ─── Error states ─────────────────────────────────────────────
35473
35546
  error: "Errore",
35474
35547
  error_uploading_file: "Errore durante il caricamento del file",
35475
- error_deleting: "Errore durante l'eliminazione",
35476
- error_before_delete: "Errore prima dell'eliminazione",
35548
+ error_deleting: "Errore durante l'eliminazione: {{message}}",
35549
+ error_before_delete: "Errore prima dell'eliminazione: {{message}}",
35477
35550
  error_updating_asset: "Errore durante l'aggiornamento dell'asset",
35478
35551
  error_deleting_asset: "Errore durante l'eliminazione dell'asset",
35479
35552
  error_firestore_index: "Per questa query è richiesto un indice Firestore.",
@@ -35810,10 +35883,18 @@
35810
35883
  auto_setup_collections_button: "Configura le collezioni automaticamente",
35811
35884
  auto_setup_collections_title: "Configurazione automatica delle collezioni",
35812
35885
  auto_setup_collections_desc: "Configura le collezioni automaticamente in base ai dati Firestore esistenti. Lascia che FireCMS configuri il CMS perfetto per te.",
35813
- this_can_take_a_minute: "Potrebbe richiedere qualche minuto",
35886
+ setting_up_collections: "Configurazione delle collezioni",
35887
+ setting_up_collection: "Configurazione di {{name}}",
35814
35888
  no_collections_found_to_setup: "Nessuna collezione trovata da configurare",
35815
35889
  collections_have_been_setup: "Le collezioni sono state configurate",
35816
35890
  error_setting_up_collections: "Errore durante la configurazione delle collezioni",
35891
+ setup_collections_title: "Set up collections",
35892
+ setup_collections_select_desc: "Select which collections to automatically set up:",
35893
+ select_all: "Select all",
35894
+ deselect_all: "Deselect all",
35895
+ setup_collections_confirm: "Set up ({{count}})",
35896
+ collection_setup_success: "{{name}} has been set up",
35897
+ go_to_collection: "Go to collection",
35817
35898
  add_your: "Aggiungi le tue",
35818
35899
  database_collections: "collezioni del database",
35819
35900
  to_firecms: "a FireCMS",
@@ -36141,8 +36222,8 @@
36141
36222
  // ─── Error states ─────────────────────────────────────────────
36142
36223
  error: "त्रुटि",
36143
36224
  error_uploading_file: "फ़ाइल अपलोड करने में त्रुटि",
36144
- error_deleting: "हटाने में त्रुटि",
36145
- error_before_delete: "हटाने से पहले त्रुटि",
36225
+ error_deleting: "हटाने में त्रुटि: {{message}}",
36226
+ error_before_delete: "हटाने से पहले त्रुटि: {{message}}",
36146
36227
  error_updating_asset: "एसेट अपडेट करने में त्रुटि",
36147
36228
  error_deleting_asset: "एसेट हटाने में त्रुटि",
36148
36229
  error_firestore_index: "इस क्वेरी के लिए Firestore इंडेक्स आवश्यक है।",
@@ -36479,10 +36560,18 @@
36479
36560
  auto_setup_collections_button: "संग्रहों को स्वचालित रूप से सेट करें",
36480
36561
  auto_setup_collections_title: "संग्रहों की स्वचालित सेटअप",
36481
36562
  auto_setup_collections_desc: "अपने मौजूदा Firestore डेटा के आधार पर संग्रहों को स्वचालित रूप से सेट करें। FireCMS को आपके लिए परफेक्ट CMS कॉन्फ़िगर करने दें।",
36482
- this_can_take_a_minute: "इसमें एक मिनट लग सकता है",
36563
+ setting_up_collections: "संग्रह सेट किए जा रहे हैं",
36564
+ setting_up_collection: "{{name}} सेट किया जा रहा है",
36483
36565
  no_collections_found_to_setup: "सेट करने के लिए कोई संग्रह नहीं मिला",
36484
36566
  collections_have_been_setup: "संग्रहों को सेट कर दिया गया है",
36485
36567
  error_setting_up_collections: "संग्रह सेट करने में त्रुटि",
36568
+ setup_collections_title: "Set up collections",
36569
+ setup_collections_select_desc: "Select which collections to automatically set up:",
36570
+ select_all: "Select all",
36571
+ deselect_all: "Deselect all",
36572
+ setup_collections_confirm: "Set up ({{count}})",
36573
+ collection_setup_success: "{{name}} has been set up",
36574
+ go_to_collection: "Go to collection",
36486
36575
  add_your: "अपने",
36487
36576
  database_collections: "डेटाबेस संग्रह",
36488
36577
  to_firecms: "को FireCMS में जोड़ें",
@@ -36810,8 +36899,8 @@
36810
36899
  // ─── Error states ─────────────────────────────────────────────
36811
36900
  error: "Erro",
36812
36901
  error_uploading_file: "Erro ao carregar ficheiro",
36813
- error_deleting: "Erro ao eliminar",
36814
- error_before_delete: "Erro antes de eliminar",
36902
+ error_deleting: "Erro ao eliminar: {{message}}",
36903
+ error_before_delete: "Erro antes de eliminar: {{message}}",
36815
36904
  error_updating_asset: "Erro ao atualizar recurso",
36816
36905
  error_deleting_asset: "Erro ao eliminar recurso",
36817
36906
  error_firestore_index: "É necessário um índice Firestore para esta consulta.",
@@ -37148,10 +37237,18 @@
37148
37237
  auto_setup_collections_button: "Configurar coleções automaticamente",
37149
37238
  auto_setup_collections_title: "Configurar coleções automaticamente?",
37150
37239
  auto_setup_collections_desc: "Isto criará automaticamente configurações de coleção para coleções que <b>NÃO</b> estão já mapeadas",
37151
- this_can_take_a_minute: "Isto pode demorar um ou dois minutos",
37240
+ setting_up_collections: "Configurando coleções",
37241
+ setting_up_collection: "Configurando {{name}}",
37152
37242
  no_collections_found_to_setup: "Nenhuma coleção encontrada para configurar.",
37153
37243
  collections_have_been_setup: "As coleções foram configuradas automaticamente.",
37154
37244
  error_setting_up_collections: "Erro ao configurar coleções automaticamente",
37245
+ setup_collections_title: "Set up collections",
37246
+ setup_collections_select_desc: "Select which collections to automatically set up:",
37247
+ select_all: "Select all",
37248
+ deselect_all: "Deselect all",
37249
+ setup_collections_confirm: "Set up ({{count}})",
37250
+ collection_setup_success: "{{name}} has been set up",
37251
+ go_to_collection: "Go to collection",
37155
37252
  // --- Home Suggestions ---
37156
37253
  add_your: "Adicione as suas",
37157
37254
  database_collections: "coleções da base de dados",
@@ -42188,6 +42285,7 @@ ul[data-type="taskList"] li[data-checked="true"] > div > p {
42188
42285
  exports2.hydrateRegExp = hydrateRegExp;
42189
42286
  exports2.iconSynonyms = iconSynonyms;
42190
42287
  exports2.iconsSearch = iconsSearch;
42288
+ exports2.isDataTypeFilterable = isDataTypeFilterable;
42191
42289
  exports2.isDefaultFieldConfigId = isDefaultFieldConfigId;
42192
42290
  exports2.isEmptyObject = isEmptyObject;
42193
42291
  exports2.isEnumValueDisabled = isEnumValueDisabled;