@firecms/core 3.0.0-canary.279 → 3.0.0-canary.280

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 (46) hide show
  1. package/dist/components/UserDisplay.d.ts +7 -0
  2. package/dist/components/VirtualTable/fields/VirtualTableUserSelect.d.ts +12 -0
  3. package/dist/contexts/InternalUserManagementContext.d.ts +3 -0
  4. package/dist/core/FireCMS.d.ts +0 -1
  5. package/dist/core/field_configs.d.ts +1 -1
  6. package/dist/form/field_bindings/UserSelectFieldBinding.d.ts +12 -0
  7. package/dist/hooks/index.d.ts +1 -0
  8. package/dist/hooks/useInternalUserManagementController.d.ts +12 -0
  9. package/dist/index.es.js +474 -84
  10. package/dist/index.es.js.map +1 -1
  11. package/dist/index.umd.js +473 -83
  12. package/dist/index.umd.js.map +1 -1
  13. package/dist/preview/components/UserPreview.d.ts +8 -0
  14. package/dist/preview/index.d.ts +1 -0
  15. package/dist/types/firecms.d.ts +15 -0
  16. package/dist/types/firecms_context.d.ts +16 -0
  17. package/dist/types/index.d.ts +1 -0
  18. package/dist/types/internal_user_management.d.ts +20 -0
  19. package/dist/types/plugins.d.ts +2 -0
  20. package/dist/types/properties.d.ts +9 -0
  21. package/dist/types/property_config.d.ts +1 -1
  22. package/dist/types/user.d.ts +1 -1
  23. package/package.json +5 -5
  24. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +12 -0
  25. package/src/components/UserDisplay.tsx +54 -0
  26. package/src/components/VirtualTable/fields/VirtualTableUserSelect.tsx +99 -0
  27. package/src/contexts/InternalUserManagementContext.tsx +4 -0
  28. package/src/core/FireCMS.tsx +22 -13
  29. package/src/core/field_configs.tsx +15 -1
  30. package/src/form/field_bindings/UserSelectFieldBinding.tsx +94 -0
  31. package/src/hooks/index.tsx +2 -0
  32. package/src/hooks/useFireCMSContext.tsx +6 -2
  33. package/src/hooks/useInternalUserManagementController.tsx +16 -0
  34. package/src/preview/PropertyPreview.tsx +8 -0
  35. package/src/preview/components/UserPreview.tsx +22 -0
  36. package/src/preview/index.ts +1 -0
  37. package/src/types/firecms.tsx +16 -0
  38. package/src/types/firecms_context.tsx +17 -0
  39. package/src/types/index.ts +1 -0
  40. package/src/types/internal_user_management.ts +24 -0
  41. package/src/types/plugins.tsx +3 -0
  42. package/src/types/properties.ts +10 -0
  43. package/src/types/property_config.tsx +1 -0
  44. package/src/types/user.ts +1 -1
  45. package/src/util/entities.ts +1 -1
  46. package/src/util/entity_cache.ts +2 -2
package/dist/index.umd.js CHANGED
@@ -520,7 +520,7 @@
520
520
  return result;
521
521
  }
522
522
  function getReferenceFrom(entity) {
523
- return new EntityReference(entity.id, entity.path);
523
+ return new EntityReference(entity.id, entity.path, entity.databaseId);
524
524
  }
525
525
  function traverseValuesProperties(inputValues, properties, operation) {
526
526
  const updatedValues = Object.entries(properties).map(([key, property]) => {
@@ -4071,6 +4071,10 @@
4071
4071
  const useAnalyticsController = () => {
4072
4072
  return React.useContext(AnalyticsContext);
4073
4073
  };
4074
+ const InternalUserManagementContext = React.createContext({});
4075
+ const useInternalUserManagementController = () => {
4076
+ return React.useContext(InternalUserManagementContext);
4077
+ };
4074
4078
  const useFireCMSContext = () => {
4075
4079
  const authController = useAuthController();
4076
4080
  const sideDialogsController = useSideDialogsController();
@@ -4083,6 +4087,7 @@
4083
4087
  const dialogsController = useDialogsController();
4084
4088
  const customizationController = useCustomizationController();
4085
4089
  const analyticsController = useAnalyticsController();
4090
+ const userManagement = useInternalUserManagementController();
4086
4091
  const fireCMSContextRef = React.useRef({
4087
4092
  authController,
4088
4093
  sideDialogsController,
@@ -4094,7 +4099,8 @@
4094
4099
  userConfigPersistence,
4095
4100
  dialogsController,
4096
4101
  customizationController,
4097
- analyticsController
4102
+ analyticsController,
4103
+ userManagement
4098
4104
  });
4099
4105
  React.useEffect(() => {
4100
4106
  fireCMSContextRef.current = {
@@ -4108,7 +4114,8 @@
4108
4114
  userConfigPersistence,
4109
4115
  dialogsController,
4110
4116
  customizationController,
4111
- analyticsController
4117
+ analyticsController,
4118
+ userManagement
4112
4119
  };
4113
4120
  }, [authController, dialogsController, navigation, sideDialogsController]);
4114
4121
  return fireCMSContextRef.current;
@@ -4169,7 +4176,7 @@
4169
4176
  }
4170
4177
  setDataLoading(false);
4171
4178
  setDataLoadingError(void 0);
4172
- setData(entities.map(_temp$r));
4179
+ setData(entities.map(_temp$t));
4173
4180
  setNoMoreToLoad(!itemCount || entities.length < itemCount);
4174
4181
  };
4175
4182
  const onError = (error) => {
@@ -4202,7 +4209,7 @@
4202
4209
  orderBy: sortByProperty,
4203
4210
  order: currentSort
4204
4211
  }).then(onEntitiesUpdate).catch(onError);
4205
- return _temp2$d;
4212
+ return _temp2$e;
4206
4213
  }
4207
4214
  };
4208
4215
  $[4] = collection;
@@ -4250,9 +4257,9 @@
4250
4257
  }
4251
4258
  return t5;
4252
4259
  }
4253
- function _temp2$d() {
4260
+ function _temp2$e() {
4254
4261
  }
4255
- function _temp$r(e_0) {
4262
+ function _temp$t(e_0) {
4256
4263
  return {
4257
4264
  ...e_0
4258
4265
  };
@@ -4317,7 +4324,7 @@
4317
4324
  setEntity(CACHE[`${path}/${entityId}`]);
4318
4325
  setDataLoading(false);
4319
4326
  setDataLoadingError(void 0);
4320
- return _temp$q;
4327
+ return _temp$s;
4321
4328
  } else {
4322
4329
  if (entityId && path && collection) {
4323
4330
  if (dataSource.listenEntity) {
@@ -4336,7 +4343,7 @@
4336
4343
  databaseId,
4337
4344
  collection
4338
4345
  }).then(onEntityUpdate).catch(onError);
4339
- return _temp2$c;
4346
+ return _temp2$d;
4340
4347
  }
4341
4348
  } else {
4342
4349
  onEntityUpdate(void 0);
@@ -4383,9 +4390,9 @@
4383
4390
  }
4384
4391
  function _temp3$4() {
4385
4392
  }
4386
- function _temp2$c() {
4393
+ function _temp2$d() {
4387
4394
  }
4388
- function _temp$q() {
4395
+ function _temp$s() {
4389
4396
  }
4390
4397
  async function saveEntityWithCallbacks({
4391
4398
  collection,
@@ -5012,7 +5019,7 @@
5012
5019
  }
5013
5020
  let t9;
5014
5021
  if ($[16] !== url) {
5015
- 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$p, children: t8 }) });
5022
+ 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$r, children: t8 }) });
5016
5023
  $[16] = url;
5017
5024
  $[17] = t9;
5018
5025
  } else {
@@ -5046,7 +5053,7 @@
5046
5053
  }
5047
5054
  return t11;
5048
5055
  }
5049
- function _temp$p(e_0) {
5056
+ function _temp$r(e_0) {
5050
5057
  return e_0.stopPropagation();
5051
5058
  }
5052
5059
  function UrlComponentPreview(t0) {
@@ -5079,7 +5086,7 @@
5079
5086
  }
5080
5087
  let t3;
5081
5088
  if ($[2] !== url) {
5082
- 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$o, target: "_blank", children: [
5089
+ 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$q, target: "_blank", children: [
5083
5090
  t2,
5084
5091
  url
5085
5092
  ] });
@@ -5182,7 +5189,7 @@
5182
5189
  }
5183
5190
  let t7;
5184
5191
  if ($[24] !== t4 || $[25] !== t6 || $[26] !== url) {
5185
- t7 = /* @__PURE__ */ jsxRuntime.jsxs("a", { href: url, rel: "noopener noreferrer", target: "_blank", onClick: _temp2$b, className: "flex flex-col items-center justify-center", style: t4, children: [
5192
+ t7 = /* @__PURE__ */ jsxRuntime.jsxs("a", { href: url, rel: "noopener noreferrer", target: "_blank", onClick: _temp2$c, className: "flex flex-col items-center justify-center", style: t4, children: [
5186
5193
  t5,
5187
5194
  t6
5188
5195
  ] });
@@ -5207,10 +5214,10 @@
5207
5214
  }
5208
5215
  }
5209
5216
  }
5210
- function _temp2$b(e_0) {
5217
+ function _temp2$c(e_0) {
5211
5218
  return e_0.stopPropagation();
5212
5219
  }
5213
- function _temp$o(e) {
5220
+ function _temp$q(e) {
5214
5221
  e.preventDefault();
5215
5222
  }
5216
5223
  function VideoPreview(t0) {
@@ -5344,7 +5351,7 @@
5344
5351
  if (Array.isArray(arrayProperty.of)) {
5345
5352
  let t1;
5346
5353
  if ($[6] !== arrayProperty.of) {
5347
- t1 = arrayProperty.of.map(_temp$n);
5354
+ t1 = arrayProperty.of.map(_temp$p);
5348
5355
  $[6] = arrayProperty.of;
5349
5356
  $[7] = t1;
5350
5357
  } else {
@@ -5482,7 +5489,7 @@
5482
5489
  }
5483
5490
  return content || null;
5484
5491
  }
5485
- function _temp$n(p, i) {
5492
+ function _temp$p(p, i) {
5486
5493
  return renderGenericArrayCell(p, i);
5487
5494
  }
5488
5495
  function renderMap(property, size) {
@@ -6665,7 +6672,7 @@
6665
6672
  }
6666
6673
  let t1;
6667
6674
  if ($[1] !== value) {
6668
- t1 = Object.entries(value).map(_temp$m);
6675
+ t1 = Object.entries(value).map(_temp$o);
6669
6676
  $[1] = value;
6670
6677
  $[2] = t1;
6671
6678
  } else {
@@ -6681,7 +6688,7 @@
6681
6688
  }
6682
6689
  return t2;
6683
6690
  }
6684
- function _temp$m(t0) {
6691
+ function _temp$o(t0) {
6685
6692
  const [key, childValue] = t0;
6686
6693
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: ui.cls(ui.defaultBorderMixin, "last:border-b-0 border-b"), children: [
6687
6694
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-row pt-0.5 pb-0.5 gap-2", children: [
@@ -6814,6 +6821,120 @@
6814
6821
  return t1;
6815
6822
  }
6816
6823
  }
6824
+ function UserDisplay(t0) {
6825
+ const $ = reactCompilerRuntime.c(18);
6826
+ const {
6827
+ user
6828
+ } = t0;
6829
+ if (!user) {
6830
+ let t12;
6831
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
6832
+ t12 = /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-text-secondary dark:text-text-secondary-dark", children: "Select a user" });
6833
+ $[0] = t12;
6834
+ } else {
6835
+ t12 = $[0];
6836
+ }
6837
+ return t12;
6838
+ }
6839
+ let t1;
6840
+ if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
6841
+ t1 = ui.cls("inline-flex items-center gap-4 px-2 py-1 rounded-xl", "bg-surface-accent-100 dark:bg-surface-accent-800", "border", ui.defaultBorderMixin);
6842
+ $[1] = t1;
6843
+ } else {
6844
+ t1 = $[1];
6845
+ }
6846
+ let t2;
6847
+ if ($[2] !== user.displayName || $[3] !== user.email || $[4] !== user.photoURL) {
6848
+ t2 = user.photoURL ? /* @__PURE__ */ jsxRuntime.jsx("img", { src: user.photoURL, alt: user.displayName || user.email || "User", className: ui.cls("rounded-full object-cover", "w-6 h-6") }) : /* @__PURE__ */ jsxRuntime.jsx(ui.AccountCircleIcon, { className: ui.cls("text-text-secondary dark:text-text-secondary-dark", "w-6 h-6") });
6849
+ $[2] = user.displayName;
6850
+ $[3] = user.email;
6851
+ $[4] = user.photoURL;
6852
+ $[5] = t2;
6853
+ } else {
6854
+ t2 = $[5];
6855
+ }
6856
+ let t3;
6857
+ if ($[6] === Symbol.for("react.memo_cache_sentinel")) {
6858
+ t3 = ui.cls("font-regular truncate", "text-sm");
6859
+ $[6] = t3;
6860
+ } else {
6861
+ t3 = $[6];
6862
+ }
6863
+ const t4 = user.displayName || user.email || "-";
6864
+ let t5;
6865
+ if ($[7] !== t4) {
6866
+ t5 = /* @__PURE__ */ jsxRuntime.jsx("span", { className: t3, children: t4 });
6867
+ $[7] = t4;
6868
+ $[8] = t5;
6869
+ } else {
6870
+ t5 = $[8];
6871
+ }
6872
+ let t6;
6873
+ if ($[9] !== user.displayName || $[10] !== user.email) {
6874
+ t6 = user.displayName && user.email && /* @__PURE__ */ jsxRuntime.jsx("span", { className: ui.cls("text-text-secondary dark:text-text-secondary-dark truncate", "text-xs"), children: user.email });
6875
+ $[9] = user.displayName;
6876
+ $[10] = user.email;
6877
+ $[11] = t6;
6878
+ } else {
6879
+ t6 = $[11];
6880
+ }
6881
+ let t7;
6882
+ if ($[12] !== t5 || $[13] !== t6) {
6883
+ t7 = /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col min-w-0", children: [
6884
+ t5,
6885
+ t6
6886
+ ] });
6887
+ $[12] = t5;
6888
+ $[13] = t6;
6889
+ $[14] = t7;
6890
+ } else {
6891
+ t7 = $[14];
6892
+ }
6893
+ let t8;
6894
+ if ($[15] !== t2 || $[16] !== t7) {
6895
+ t8 = /* @__PURE__ */ jsxRuntime.jsxs("div", { className: t1, children: [
6896
+ t2,
6897
+ t7
6898
+ ] });
6899
+ $[15] = t2;
6900
+ $[16] = t7;
6901
+ $[17] = t8;
6902
+ } else {
6903
+ t8 = $[17];
6904
+ }
6905
+ return t8;
6906
+ }
6907
+ function UserPreview(t0) {
6908
+ const $ = reactCompilerRuntime.c(5);
6909
+ const {
6910
+ value
6911
+ } = t0;
6912
+ const {
6913
+ getUser
6914
+ } = useInternalUserManagementController();
6915
+ if (!value) {
6916
+ return null;
6917
+ }
6918
+ let t1;
6919
+ if ($[0] !== getUser || $[1] !== value) {
6920
+ t1 = getUser(value);
6921
+ $[0] = getUser;
6922
+ $[1] = value;
6923
+ $[2] = t1;
6924
+ } else {
6925
+ t1 = $[2];
6926
+ }
6927
+ const user = t1;
6928
+ let t2;
6929
+ if ($[3] !== user) {
6930
+ t2 = /* @__PURE__ */ jsxRuntime.jsx(UserDisplay, { user });
6931
+ $[3] = user;
6932
+ $[4] = t2;
6933
+ } else {
6934
+ t2 = $[4];
6935
+ }
6936
+ return t2;
6937
+ }
6817
6938
  const PropertyPreview = React.memo(function PropertyPreview2(props) {
6818
6939
  const $ = reactCompilerRuntime.c(31);
6819
6940
  const authController = useAuthController();
@@ -6914,21 +7035,25 @@
6914
7035
  }
6915
7036
  content = t02;
6916
7037
  } else {
6917
- if (stringProperty.reference) {
6918
- if (typeof stringProperty.reference.path === "string") {
6919
- content = /* @__PURE__ */ jsxRuntime.jsx(ReferencePreview, { disabled: !stringProperty.reference.path, previewProperties: stringProperty.reference.previewProperties, includeId: stringProperty.reference.includeId, includeEntityLink: stringProperty.reference.includeEntityLink, size: props.size, reference: new EntityReference(value, stringProperty.reference.path) });
6920
- } else {
6921
- let t02;
6922
- if ($[23] === Symbol.for("react.memo_cache_sentinel")) {
6923
- t02 = /* @__PURE__ */ jsxRuntime.jsx(EmptyValue, {});
6924
- $[23] = t02;
7038
+ if (stringProperty.userSelect) {
7039
+ content = /* @__PURE__ */ jsxRuntime.jsx(UserPreview, { value, property: stringProperty, propertyKey, size: props.size });
7040
+ } else {
7041
+ if (stringProperty.reference) {
7042
+ if (typeof stringProperty.reference.path === "string") {
7043
+ content = /* @__PURE__ */ jsxRuntime.jsx(ReferencePreview, { disabled: !stringProperty.reference.path, previewProperties: stringProperty.reference.previewProperties, includeId: stringProperty.reference.includeId, includeEntityLink: stringProperty.reference.includeEntityLink, size: props.size, reference: new EntityReference(value, stringProperty.reference.path) });
6925
7044
  } else {
6926
- t02 = $[23];
7045
+ let t02;
7046
+ if ($[23] === Symbol.for("react.memo_cache_sentinel")) {
7047
+ t02 = /* @__PURE__ */ jsxRuntime.jsx(EmptyValue, {});
7048
+ $[23] = t02;
7049
+ } else {
7050
+ t02 = $[23];
7051
+ }
7052
+ content = t02;
6927
7053
  }
6928
- content = t02;
7054
+ } else {
7055
+ content = /* @__PURE__ */ jsxRuntime.jsx(StringPropertyPreview, { ...props, property: stringProperty, value });
6929
7056
  }
6930
- } else {
6931
- content = /* @__PURE__ */ jsxRuntime.jsx(StringPropertyPreview, { ...props, property: stringProperty, value });
6932
7057
  }
6933
7058
  }
6934
7059
  }
@@ -7449,7 +7574,7 @@
7449
7574
  console.trace("onChange");
7450
7575
  if (valueType === "number") {
7451
7576
  if (multiple) {
7452
- const newValue = updatedValue.map(_temp$l);
7577
+ const newValue = updatedValue.map(_temp$n);
7453
7578
  updateValue(newValue);
7454
7579
  } else {
7455
7580
  updateValue(parseFloat(updatedValue));
@@ -7486,7 +7611,7 @@
7486
7611
  const renderValue = t3;
7487
7612
  let t4;
7488
7613
  if ($[10] !== disabled || $[11] !== enumValues || $[12] !== internalValue || $[13] !== multiple || $[14] !== onChange || $[15] !== renderValue || $[16] !== small || $[17] !== validValue) {
7489
- 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.map(_temp2$a) : [], onValueChange: onChange, children: enumValues?.map((enumConfig) => /* @__PURE__ */ jsxRuntime.jsx(ui.MultiSelectItem, { value: String(enumConfig.id), children: /* @__PURE__ */ jsxRuntime.jsx(EnumValuesChip, { enumKey: enumConfig.id, enumValues, size: small ? "small" : "medium" }) }, enumConfig.id)) }) : /* @__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?.toString() : "", onValueChange: onChange, renderValue, children: enumValues?.map((enumConfig_0) => /* @__PURE__ */ jsxRuntime.jsx(ui.SelectItem, { value: String(enumConfig_0.id), children: /* @__PURE__ */ jsxRuntime.jsx(EnumValuesChip, { enumKey: enumConfig_0.id, enumValues, size: small ? "small" : "medium" }) }, enumConfig_0.id)) });
7614
+ 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.map(_temp2$b) : [], onValueChange: onChange, children: enumValues?.map((enumConfig) => /* @__PURE__ */ jsxRuntime.jsx(ui.MultiSelectItem, { value: String(enumConfig.id), children: /* @__PURE__ */ jsxRuntime.jsx(EnumValuesChip, { enumKey: enumConfig.id, enumValues, size: small ? "small" : "medium" }) }, enumConfig.id)) }) : /* @__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?.toString() : "", onValueChange: onChange, renderValue, children: enumValues?.map((enumConfig_0) => /* @__PURE__ */ jsxRuntime.jsx(ui.SelectItem, { value: String(enumConfig_0.id), children: /* @__PURE__ */ jsxRuntime.jsx(EnumValuesChip, { enumKey: enumConfig_0.id, enumValues, size: small ? "small" : "medium" }) }, enumConfig_0.id)) });
7490
7615
  $[10] = disabled;
7491
7616
  $[11] = enumValues;
7492
7617
  $[12] = internalValue;
@@ -7501,10 +7626,10 @@
7501
7626
  }
7502
7627
  return t4;
7503
7628
  }
7504
- function _temp2$a(v_0) {
7629
+ function _temp2$b(v_0) {
7505
7630
  return v_0.toString();
7506
7631
  }
7507
- function _temp$l(v) {
7632
+ function _temp$n(v) {
7508
7633
  return parseFloat(v);
7509
7634
  }
7510
7635
  function VirtualTableNumberInput(props) {
@@ -7635,6 +7760,89 @@
7635
7760
  }
7636
7761
  return t4;
7637
7762
  }
7763
+ function VirtualTableUserSelect(props) {
7764
+ const $ = reactCompilerRuntime.c(15);
7765
+ const {
7766
+ internalValue,
7767
+ disabled,
7768
+ focused,
7769
+ updateValue,
7770
+ multiple
7771
+ } = props;
7772
+ const {
7773
+ users,
7774
+ getUser
7775
+ } = useInternalUserManagementController();
7776
+ const validValue = Array.isArray(internalValue) && multiple || !Array.isArray(internalValue) && !multiple;
7777
+ const ref = React.useRef(null);
7778
+ let t0;
7779
+ let t1;
7780
+ if ($[0] !== focused) {
7781
+ t0 = () => {
7782
+ if (ref.current && focused) {
7783
+ ref.current?.focus({
7784
+ preventScroll: true
7785
+ });
7786
+ }
7787
+ };
7788
+ t1 = [focused, ref];
7789
+ $[0] = focused;
7790
+ $[1] = t0;
7791
+ $[2] = t1;
7792
+ } else {
7793
+ t0 = $[1];
7794
+ t1 = $[2];
7795
+ }
7796
+ React.useEffect(t0, t1);
7797
+ let t2;
7798
+ if ($[3] !== updateValue) {
7799
+ t2 = (updatedValue) => {
7800
+ if (!updatedValue) {
7801
+ updateValue(null);
7802
+ } else {
7803
+ updateValue(updatedValue);
7804
+ }
7805
+ };
7806
+ $[3] = updateValue;
7807
+ $[4] = t2;
7808
+ } else {
7809
+ t2 = $[4];
7810
+ }
7811
+ const onChange = t2;
7812
+ let t3;
7813
+ if ($[5] !== getUser) {
7814
+ t3 = (userId) => {
7815
+ const user = getUser(userId);
7816
+ return /* @__PURE__ */ jsxRuntime.jsx(UserDisplay, { user });
7817
+ };
7818
+ $[5] = getUser;
7819
+ $[6] = t3;
7820
+ } else {
7821
+ t3 = $[6];
7822
+ }
7823
+ const renderValue = t3;
7824
+ let t4;
7825
+ if ($[7] !== disabled || $[8] !== internalValue || $[9] !== multiple || $[10] !== onChange || $[11] !== renderValue || $[12] !== users || $[13] !== validValue) {
7826
+ 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$m) }) : /* @__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$a) });
7827
+ $[7] = disabled;
7828
+ $[8] = internalValue;
7829
+ $[9] = multiple;
7830
+ $[10] = onChange;
7831
+ $[11] = renderValue;
7832
+ $[12] = users;
7833
+ $[13] = validValue;
7834
+ $[14] = t4;
7835
+ } else {
7836
+ t4 = $[14];
7837
+ }
7838
+ return t4;
7839
+ }
7840
+ function _temp2$a(user_1) {
7841
+ return /* @__PURE__ */ jsxRuntime.jsx(ui.SelectItem, { value: user_1.uid, children: /* @__PURE__ */ jsxRuntime.jsx(UserDisplay, { user: user_1 }) }, user_1.uid);
7842
+ }
7843
+ function _temp$m(user_0) {
7844
+ return /* @__PURE__ */ jsxRuntime.jsx(ui.MultiSelectItem, { value: user_0.uid, children: /* @__PURE__ */ jsxRuntime.jsx(UserDisplay, { user: user_0 }) }, user_0.uid);
7845
+ }
7638
7846
  class ErrorBoundary extends React.Component {
7639
7847
  constructor(props) {
7640
7848
  super(props);
@@ -8063,7 +8271,7 @@
8063
8271
  const snackbarContext = useSnackbarController();
8064
8272
  let t1;
8065
8273
  if ($[0] !== storage.acceptedFiles) {
8066
- t1 = storage.acceptedFiles ? storage.acceptedFiles.map(_temp$k).reduce(_temp2$9, {}) : void 0;
8274
+ t1 = storage.acceptedFiles ? storage.acceptedFiles.map(_temp$l).reduce(_temp2$9, {}) : void 0;
8067
8275
  $[0] = storage.acceptedFiles;
8068
8276
  $[1] = t1;
8069
8277
  } else {
@@ -8292,7 +8500,7 @@
8292
8500
  ...b
8293
8501
  };
8294
8502
  }
8295
- function _temp$k(e) {
8503
+ function _temp$l(e) {
8296
8504
  return {
8297
8505
  [e]: []
8298
8506
  };
@@ -8399,7 +8607,7 @@
8399
8607
  let t1;
8400
8608
  if ($[2] !== updateValue) {
8401
8609
  t1 = (entities) => {
8402
- updateValue(entities.map(_temp$j));
8610
+ updateValue(entities.map(_temp$k));
8403
8611
  };
8404
8612
  $[2] = updateValue;
8405
8613
  $[3] = t1;
@@ -8560,7 +8768,7 @@
8560
8768
  }
8561
8769
  return t10;
8562
8770
  }, equal);
8563
- function _temp$j(e) {
8771
+ function _temp$k(e) {
8564
8772
  return getReferenceFrom(e);
8565
8773
  }
8566
8774
  function _temp2$8(ref) {
@@ -9422,6 +9630,9 @@
9422
9630
  if (stringProperty_0.enumValues) {
9423
9631
  innerComponent = /* @__PURE__ */ jsxRuntime.jsx(VirtualTableSelect, { name: propertyKey, multiple: false, focused: selected, disabled, valueType: "string", small: getPreviewSizeFrom(size) !== "medium", enumValues: stringProperty_0.enumValues, error: validationError ?? error, internalValue, updateValue });
9424
9632
  fullHeight = true;
9633
+ } else if (stringProperty_0.userSelect) {
9634
+ innerComponent = /* @__PURE__ */ jsxRuntime.jsx(VirtualTableUserSelect, { name: propertyKey, multiple: false, focused: selected, disabled, small: getPreviewSizeFrom(size) !== "medium", error: validationError ?? error, internalValue, updateValue });
9635
+ fullHeight = true;
9425
9636
  } else if (stringProperty_0.markdown || !stringProperty_0.storage || !stringProperty_0.reference) {
9426
9637
  const multiline = Boolean(stringProperty_0.multiline) || Boolean(stringProperty_0.markdown);
9427
9638
  innerComponent = /* @__PURE__ */ jsxRuntime.jsx(VirtualTableInput, { error: validationError ?? error, disabled, multiline, focused: selected, value: internalValue, updateValue });
@@ -9486,7 +9697,8 @@
9486
9697
  return {
9487
9698
  __type: "EntityReference",
9488
9699
  id: value.id,
9489
- path: value.path
9700
+ path: value.path,
9701
+ databaseId: value.databaseId
9490
9702
  };
9491
9703
  }
9492
9704
  if (value instanceof GeoPoint) {
@@ -9510,7 +9722,7 @@
9510
9722
  case "Date":
9511
9723
  return new Date(value.value);
9512
9724
  case "EntityReference":
9513
- return new EntityReference(value.id, value.path);
9725
+ return new EntityReference(value.id, value.path, value.databaseId);
9514
9726
  case "GeoPoint":
9515
9727
  return new GeoPoint(value.latitude, value.longitude);
9516
9728
  case "Vector":
@@ -9722,7 +9934,7 @@
9722
9934
  }
9723
9935
  let t6;
9724
9936
  if ($[6] !== t3 || $[7] !== t4) {
9725
- t6 = /* @__PURE__ */ jsxRuntime.jsx(ui.Tooltip, { title: "Table row size", side: "right", sideOffset: 4, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select, { value: t3, className: "w-16 ml-2", size: "small", onValueChange: t4, renderValue: _temp$i, children: t5 }) });
9937
+ t6 = /* @__PURE__ */ jsxRuntime.jsx(ui.Tooltip, { title: "Table row size", side: "right", sideOffset: 4, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select, { value: t3, className: "w-16 ml-2", size: "small", onValueChange: t4, renderValue: _temp$j, children: t5 }) });
9726
9938
  $[6] = t3;
9727
9939
  $[7] = t4;
9728
9940
  $[8] = t6;
@@ -9809,7 +10021,7 @@
9809
10021
  function _temp2$7(size_0) {
9810
10022
  return /* @__PURE__ */ jsxRuntime.jsx(ui.SelectItem, { value: size_0, className: "w-12 font-medium text-center", children: size_0.toUpperCase() }, size_0);
9811
10023
  }
9812
- function _temp$i(v_0) {
10024
+ function _temp$j(v_0) {
9813
10025
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "font-medium", children: v_0.toUpperCase() });
9814
10026
  }
9815
10027
  function getTableCellAlignment(property) {
@@ -10923,7 +11135,7 @@
10923
11135
  let t1;
10924
11136
  if ($[0] !== text) {
10925
11137
  const urlRegex = /https?:\/\/[^\s]+/g;
10926
- t1 = text.replace(urlRegex, _temp$h);
11138
+ t1 = text.replace(urlRegex, _temp$i);
10927
11139
  $[0] = text;
10928
11140
  $[1] = t1;
10929
11141
  } else {
@@ -10942,7 +11154,7 @@
10942
11154
  }
10943
11155
  return t2;
10944
11156
  };
10945
- function _temp$h(url) {
11157
+ function _temp$i(url) {
10946
11158
  return `<a href="${url}" class="underline" target="_blank">Link</a><br/>`;
10947
11159
  }
10948
11160
  const operationLabels$2 = {
@@ -11150,7 +11362,7 @@
11150
11362
  }
11151
11363
  let t6;
11152
11364
  if ($[16] !== operation || $[17] !== t4 || $[18] !== t5) {
11153
- t6 = /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-[80px]", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select, { value: operation, fullWidth: true, position: "item-aligned", onValueChange: t4, renderValue: _temp$g, children: t5 }) });
11365
+ t6 = /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-[80px]", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select, { value: operation, fullWidth: true, position: "item-aligned", onValueChange: t4, renderValue: _temp$h, children: t5 }) });
11154
11366
  $[16] = operation;
11155
11367
  $[17] = t4;
11156
11368
  $[18] = t5;
@@ -11274,7 +11486,7 @@
11274
11486
  function _temp2$6(op_1) {
11275
11487
  return /* @__PURE__ */ jsxRuntime.jsx(ui.SelectItem, { value: op_1, children: operationLabels$1[op_1] }, op_1);
11276
11488
  }
11277
- function _temp$g(op_0) {
11489
+ function _temp$h(op_0) {
11278
11490
  return operationLabels$1[op_0];
11279
11491
  }
11280
11492
  function BooleanFilterField(t0) {
@@ -11413,7 +11625,7 @@
11413
11625
  }
11414
11626
  let t6;
11415
11627
  if ($[13] !== operation || $[14] !== t4 || $[15] !== t5) {
11416
- t6 = /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-[80px]", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select, { value: operation, size: "large", fullWidth: true, onValueChange: t4, renderValue: _temp$f, children: t5 }) });
11628
+ t6 = /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-[80px]", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Select, { value: operation, size: "large", fullWidth: true, onValueChange: t4, renderValue: _temp$g, children: t5 }) });
11417
11629
  $[13] = operation;
11418
11630
  $[14] = t4;
11419
11631
  $[15] = t5;
@@ -11502,7 +11714,7 @@
11502
11714
  function _temp2$5(op_1) {
11503
11715
  return /* @__PURE__ */ jsxRuntime.jsx(ui.SelectItem, { value: op_1, children: operationLabels[op_1] }, op_1);
11504
11716
  }
11505
- function _temp$f(op_0) {
11717
+ function _temp$g(op_0) {
11506
11718
  return operationLabels[op_0];
11507
11719
  }
11508
11720
  const SelectableTable = function SelectableTable2({
@@ -12206,7 +12418,7 @@
12206
12418
  const searchBlocked = t12;
12207
12419
  let t2;
12208
12420
  if ($[15] !== customizationController.plugins || $[16] !== dataSource?.initTextSearch) {
12209
- t2 = Boolean(dataSource?.initTextSearch) || customizationController.plugins?.find(_temp$e);
12421
+ t2 = Boolean(dataSource?.initTextSearch) || customizationController.plugins?.find(_temp$f);
12210
12422
  $[15] = customizationController.plugins;
12211
12423
  $[16] = dataSource?.initTextSearch;
12212
12424
  $[17] = t2;
@@ -12298,7 +12510,7 @@
12298
12510
  }
12299
12511
  return t1;
12300
12512
  }
12301
- function _temp$e(p_0) {
12513
+ function _temp$f(p_0) {
12302
12514
  return Boolean(p_0.collectionView?.onTextSearchClick);
12303
12515
  }
12304
12516
  function DeleteEntityDialog({
@@ -12891,7 +13103,7 @@
12891
13103
  T0 = ui.Collapse;
12892
13104
  t4 = favouriteCollections.length > 0;
12893
13105
  t2 = "flex flex-row flex-wrap gap-2 pb-2 min-h-[32px]";
12894
- t3 = favouriteCollections.map(_temp$d);
13106
+ t3 = favouriteCollections.map(_temp$e);
12895
13107
  $[2] = navigationController;
12896
13108
  $[3] = t1;
12897
13109
  $[4] = T0;
@@ -12925,7 +13137,7 @@
12925
13137
  }
12926
13138
  return t6;
12927
13139
  }
12928
- function _temp$d(entry_0) {
13140
+ function _temp$e(entry_0) {
12929
13141
  return /* @__PURE__ */ jsxRuntime.jsx(NavigationChip, { entry: entry_0 }, entry_0.path);
12930
13142
  }
12931
13143
  const scrollsMap = {};
@@ -13142,7 +13354,7 @@
13142
13354
  }
13143
13355
  let t4;
13144
13356
  if ($[4] !== actions) {
13145
- t4 = /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1", onClick: _temp$c, children: actions });
13357
+ t4 = /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1", onClick: _temp$d, children: actions });
13146
13358
  $[4] = actions;
13147
13359
  $[5] = t4;
13148
13360
  } else {
@@ -13229,7 +13441,7 @@
13229
13441
  }
13230
13442
  return t12;
13231
13443
  });
13232
- function _temp$c(event) {
13444
+ function _temp$d(event) {
13233
13445
  event.preventDefault();
13234
13446
  event.stopPropagation();
13235
13447
  }
@@ -16103,7 +16315,7 @@
16103
16315
  }
16104
16316
  let t5;
16105
16317
  if ($[14] !== placeholder) {
16106
- t5 = placeholder && /* @__PURE__ */ jsxRuntime.jsx("div", { onClick: _temp$b, 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" }) });
16318
+ t5 = placeholder && /* @__PURE__ */ jsxRuntime.jsx("div", { onClick: _temp$c, 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" }) });
16107
16319
  $[14] = placeholder;
16108
16320
  $[15] = t5;
16109
16321
  } else {
@@ -16126,7 +16338,7 @@
16126
16338
  }
16127
16339
  return t6;
16128
16340
  }
16129
- function _temp$b(e) {
16341
+ function _temp$c(e) {
16130
16342
  return e.stopPropagation();
16131
16343
  }
16132
16344
  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";
@@ -16344,7 +16556,7 @@
16344
16556
  t4 = $[7];
16345
16557
  }
16346
16558
  const style = t4;
16347
- const getImageSizeNumber = _temp$a;
16559
+ const getImageSizeNumber = _temp$b;
16348
16560
  let child;
16349
16561
  if (entry.storagePathOrDownloadUrl) {
16350
16562
  const t52 = `storage_preview_${entry.storagePathOrDownloadUrl}`;
@@ -16419,7 +16631,7 @@
16419
16631
  }
16420
16632
  return t6;
16421
16633
  }
16422
- function _temp$a(previewSize) {
16634
+ function _temp$b(previewSize) {
16423
16635
  switch (previewSize) {
16424
16636
  case "small": {
16425
16637
  return 40;
@@ -17875,7 +18087,7 @@
17875
18087
  } else {
17876
18088
  t42 = $[20];
17877
18089
  }
17878
- t3 = Object.entries(mapProperties).filter(_temp$9).map(t42);
18090
+ t3 = Object.entries(mapProperties).filter(_temp$a).map(t42);
17879
18091
  $[6] = autoFocus;
17880
18092
  $[7] = context;
17881
18093
  $[8] = disabled;
@@ -17945,7 +18157,7 @@
17945
18157
  }
17946
18158
  return t10;
17947
18159
  }
17948
- function _temp$9(t0) {
18160
+ function _temp$a(t0) {
17949
18161
  const [, property_0] = t0;
17950
18162
  return !isHidden(property_0);
17951
18163
  }
@@ -19015,7 +19227,7 @@
19015
19227
  const property = t4;
19016
19228
  let t5;
19017
19229
  if ($[9] !== properties) {
19018
- t5 = Object.entries(properties).map(_temp$8);
19230
+ t5 = Object.entries(properties).map(_temp$9);
19019
19231
  $[9] = properties;
19020
19232
  $[10] = t5;
19021
19233
  } else {
@@ -19106,7 +19318,7 @@
19106
19318
  }
19107
19319
  return t11;
19108
19320
  }
19109
- function _temp$8(t0) {
19321
+ function _temp$9(t0) {
19110
19322
  const [key, property_0] = t0;
19111
19323
  return {
19112
19324
  id: key,
@@ -20763,7 +20975,7 @@
20763
20975
  }
20764
20976
  let t7;
20765
20977
  if ($[18] !== breadcrumbs.breadcrumbs) {
20766
- t7 = (breadcrumbs.breadcrumbs ?? []).length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mr-8 hidden lg:block", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-row gap-2", children: breadcrumbs.breadcrumbs.map(_temp$7) }) });
20978
+ t7 = (breadcrumbs.breadcrumbs ?? []).length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mr-8 hidden lg:block", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-row gap-2", children: breadcrumbs.breadcrumbs.map(_temp$8) }) });
20767
20979
  $[18] = breadcrumbs.breadcrumbs;
20768
20980
  $[19] = t7;
20769
20981
  } else {
@@ -20875,7 +21087,7 @@
20875
21087
  }
20876
21088
  return t14;
20877
21089
  };
20878
- function _temp$7(breadcrumb, index) {
21090
+ function _temp$8(breadcrumb, index) {
20879
21091
  return /* @__PURE__ */ jsxRuntime.jsxs(React.Fragment, { children: [
20880
21092
  /* @__PURE__ */ jsxRuntime.jsx(ui.Typography, { variant: "caption", color: "secondary", children: "/" }),
20881
21093
  /* @__PURE__ */ jsxRuntime.jsx(reactRouterDom.Link, { className: "visited:text-inherit visited:dark:text-inherit block", to: breadcrumb.url, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Typography, { variant: "caption", color: "secondary", children: breadcrumb.title }) }, index)
@@ -21309,7 +21521,7 @@
21309
21521
  } else {
21310
21522
  const searchResult = iconsSearch.search(value);
21311
21523
  const limited = searchResult.slice(0, 50);
21312
- setKeys(limited.map(_temp$6));
21524
+ setKeys(limited.map(_temp$7));
21313
21525
  }
21314
21526
  }, UPDATE_SEARCH_INDEX_WAIT_MS);
21315
21527
  $[0] = t3;
@@ -21376,7 +21588,7 @@
21376
21588
  }
21377
21589
  return t8;
21378
21590
  }
21379
- function _temp$6(e) {
21591
+ function _temp$7(e) {
21380
21592
  return e.item.key;
21381
21593
  }
21382
21594
  function FieldCaption(t0) {
@@ -22002,7 +22214,7 @@
22002
22214
  t0 = $[0];
22003
22215
  }
22004
22216
  const configCache = React.useRef(t0);
22005
- const getCollectionFromStorage = _temp$5;
22217
+ const getCollectionFromStorage = _temp$6;
22006
22218
  let t1;
22007
22219
  if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
22008
22220
  t1 = (path) => {
@@ -22125,7 +22337,7 @@
22125
22337
  }
22126
22338
  return t11;
22127
22339
  }
22128
- function _temp$5(storageKey) {
22340
+ function _temp$6(storageKey) {
22129
22341
  const item = localStorage.getItem(storageKey);
22130
22342
  return item ? JSON.parse(item) : {};
22131
22343
  }
@@ -23460,7 +23672,7 @@
23460
23672
  t3 = () => {
23461
23673
  const state = location.state;
23462
23674
  const panelKeys = state?.panels ?? [];
23463
- const newPanels_0 = panelKeys.map((key) => routesStore.current[key]).filter(_temp$4);
23675
+ const newPanels_0 = panelKeys.map((key) => routesStore.current[key]).filter(_temp$5);
23464
23676
  if (!equal(sidePanelsRef.current.map(_temp2$3), newPanels_0.map(_temp3$1))) {
23465
23677
  updateSidePanels(newPanels_0);
23466
23678
  }
@@ -23608,7 +23820,7 @@
23608
23820
  function _temp2$3(p_0) {
23609
23821
  return p_0.key;
23610
23822
  }
23611
- function _temp$4(p) {
23823
+ function _temp$5(p) {
23612
23824
  return Boolean(p);
23613
23825
  }
23614
23826
  function useBuildDataSource({
@@ -23903,7 +24115,7 @@
23903
24115
  const dataSourceKey = dataSourceDelegate.key;
23904
24116
  let t1;
23905
24117
  if ($[0] !== plugins) {
23906
- t1 = plugins?.map(_temp$3);
24118
+ t1 = plugins?.map(_temp$4);
23907
24119
  $[0] = plugins;
23908
24120
  $[1] = t1;
23909
24121
  } else {
@@ -23939,7 +24151,7 @@
23939
24151
  React.useEffect(t2, t3);
23940
24152
  return accessResponse;
23941
24153
  }
23942
- function _temp$3(plugin) {
24154
+ function _temp$4(plugin) {
23943
24155
  return plugin.key;
23944
24156
  }
23945
24157
  function FireCMS(props) {
@@ -23952,22 +24164,27 @@
23952
24164
  authController,
23953
24165
  storageSource,
23954
24166
  dataSourceDelegate,
23955
- plugins: pluginsProp,
24167
+ plugins: _pluginsProp,
23956
24168
  onAnalyticsEvent,
23957
24169
  propertyConfigs,
23958
24170
  entityViews,
23959
24171
  entityActions,
23960
24172
  components,
23961
24173
  navigationController,
23962
- apiKey
24174
+ apiKey,
24175
+ userManagement: _userManagement
23963
24176
  } = props;
23964
- if (pluginsProp) {
24177
+ if (_pluginsProp) {
23965
24178
  console.warn("The `plugins` prop is deprecated in the FireCMS component. You should pass your plugins to `useBuildNavigationController` instead.");
23966
24179
  }
23967
- const plugins = navigationController.plugins ?? pluginsProp;
24180
+ const plugins = navigationController.plugins ?? _pluginsProp;
24181
+ const userManagement = plugins?.find((p) => p.userManagement)?.userManagement ?? _userManagement ?? {
24182
+ users: [],
24183
+ getUser: (uid) => null
24184
+ };
23968
24185
  const sideDialogsController = useBuildSideDialogsController();
23969
24186
  const sideEntityController = useBuildSideEntityController(navigationController, sideDialogsController, authController);
23970
- const pluginsLoading = plugins?.some((p) => p.loading) ?? false;
24187
+ const pluginsLoading = plugins?.some((p_0) => p_0.loading) ?? false;
23971
24188
  const loading = authController.initialLoading || navigationController.loading || pluginsLoading;
23972
24189
  const customizationController = {
23973
24190
  dateTimeFormat,
@@ -24014,7 +24231,7 @@
24014
24231
  accessResponse?.message && /* @__PURE__ */ jsxRuntime.jsx(ui.Typography, { children: accessResponse?.message })
24015
24232
  ] });
24016
24233
  }
24017
- return /* @__PURE__ */ jsxRuntime.jsx(AnalyticsContext.Provider, { value: analyticsController, children: /* @__PURE__ */ jsxRuntime.jsx(CustomizationControllerContext.Provider, { value: customizationController, children: /* @__PURE__ */ jsxRuntime.jsx(UserConfigurationPersistenceContext.Provider, { value: userConfigPersistence, children: /* @__PURE__ */ jsxRuntime.jsx(StorageSourceContext.Provider, { value: storageSource, children: /* @__PURE__ */ jsxRuntime.jsx(DataSourceContext.Provider, { value: dataSource, children: /* @__PURE__ */ jsxRuntime.jsx(AuthControllerContext.Provider, { value: authController, children: /* @__PURE__ */ jsxRuntime.jsx(SideDialogsControllerContext.Provider, { value: sideDialogsController, children: /* @__PURE__ */ jsxRuntime.jsx(SideEntityControllerContext.Provider, { value: sideEntityController, children: /* @__PURE__ */ jsxRuntime.jsx(NavigationContext.Provider, { value: navigationController, children: /* @__PURE__ */ jsxRuntime.jsx(DialogsProvider, { children: /* @__PURE__ */ jsxRuntime.jsx(BreadcrumbsProvider, { children: /* @__PURE__ */ jsxRuntime.jsx(FireCMSInternal, { loading, children }) }) }) }) }) }) }) }) }) }) }) });
24234
+ return /* @__PURE__ */ jsxRuntime.jsx(AnalyticsContext.Provider, { value: analyticsController, children: /* @__PURE__ */ jsxRuntime.jsx(CustomizationControllerContext.Provider, { value: customizationController, children: /* @__PURE__ */ jsxRuntime.jsx(UserConfigurationPersistenceContext.Provider, { value: userConfigPersistence, children: /* @__PURE__ */ jsxRuntime.jsx(StorageSourceContext.Provider, { value: storageSource, children: /* @__PURE__ */ jsxRuntime.jsx(DataSourceContext.Provider, { value: dataSource, children: /* @__PURE__ */ jsxRuntime.jsx(AuthControllerContext.Provider, { value: authController, children: /* @__PURE__ */ jsxRuntime.jsx(SideDialogsControllerContext.Provider, { value: sideDialogsController, children: /* @__PURE__ */ jsxRuntime.jsx(SideEntityControllerContext.Provider, { value: sideEntityController, children: /* @__PURE__ */ jsxRuntime.jsx(NavigationContext.Provider, { value: navigationController, children: /* @__PURE__ */ jsxRuntime.jsx(InternalUserManagementContext.Provider, { value: userManagement, children: /* @__PURE__ */ jsxRuntime.jsx(DialogsProvider, { children: /* @__PURE__ */ jsxRuntime.jsx(BreadcrumbsProvider, { children: /* @__PURE__ */ jsxRuntime.jsx(FireCMSInternal, { loading, children }) }) }) }) }) }) }) }) }) }) }) }) });
24018
24235
  }
24019
24236
  function FireCMSInternal(t0) {
24020
24237
  const $ = reactCompilerRuntime.c(7);
@@ -24184,7 +24401,7 @@
24184
24401
  } = navigation.topLevelNavigation;
24185
24402
  let t1;
24186
24403
  if ($[0] !== adminMenuOpen || $[1] !== analyticsController || $[2] !== className || $[3] !== closeDrawer || $[4] !== drawerOpen || $[5] !== groups || $[6] !== largeLayout || $[7] !== logo || $[8] !== navigate || $[9] !== navigationEntries || $[10] !== style || $[11] !== tooltipsOpen) {
24187
- const adminViews = navigationEntries.filter(_temp$2) ?? [];
24404
+ const adminViews = navigationEntries.filter(_temp$3) ?? [];
24188
24405
  let t2;
24189
24406
  let t3;
24190
24407
  let t4;
@@ -24337,7 +24554,7 @@
24337
24554
  function _temp2$2(g) {
24338
24555
  return g !== "Admin";
24339
24556
  }
24340
- function _temp$2(e) {
24557
+ function _temp$3(e) {
24341
24558
  return e.type === "admin";
24342
24559
  }
24343
24560
  function DrawerLogo(t0) {
@@ -24397,6 +24614,165 @@
24397
24614
  }
24398
24615
  return t6;
24399
24616
  }
24617
+ function UserSelectFieldBinding(t0) {
24618
+ const $ = reactCompilerRuntime.c(43);
24619
+ const {
24620
+ propertyKey,
24621
+ value,
24622
+ setValue,
24623
+ error,
24624
+ showError,
24625
+ disabled,
24626
+ property,
24627
+ includeDescription,
24628
+ size: t1
24629
+ } = t0;
24630
+ const size = t1 === void 0 ? "large" : t1;
24631
+ const {
24632
+ users,
24633
+ getUser
24634
+ } = useInternalUserManagementController();
24635
+ let t2;
24636
+ if ($[0] !== setValue) {
24637
+ t2 = (e) => {
24638
+ e.stopPropagation();
24639
+ e.preventDefault();
24640
+ setValue(null);
24641
+ };
24642
+ $[0] = setValue;
24643
+ $[1] = t2;
24644
+ } else {
24645
+ t2 = $[1];
24646
+ }
24647
+ const handleClearClick = t2;
24648
+ let t3;
24649
+ if ($[2] !== value) {
24650
+ t3 = value !== void 0 && value != null ? value.toString() : "";
24651
+ $[2] = value;
24652
+ $[3] = t3;
24653
+ } else {
24654
+ t3 = $[3];
24655
+ }
24656
+ let t4;
24657
+ if ($[4] === Symbol.for("react.memo_cache_sentinel")) {
24658
+ t4 = ui.cls("w-full");
24659
+ $[4] = t4;
24660
+ } else {
24661
+ t4 = $[4];
24662
+ }
24663
+ let t5;
24664
+ if ($[5] !== property) {
24665
+ t5 = getIconForProperty(property, "small");
24666
+ $[5] = property;
24667
+ $[6] = t5;
24668
+ } else {
24669
+ t5 = $[6];
24670
+ }
24671
+ const t6 = property.validation?.required;
24672
+ let t7;
24673
+ if ($[7] !== property.name || $[8] !== t5 || $[9] !== t6) {
24674
+ t7 = /* @__PURE__ */ jsxRuntime.jsx(LabelWithIcon, { icon: t5, required: t6, title: property.name, className: "h-8 text-text-secondary dark:text-text-secondary-dark ml-3.5 my-0" });
24675
+ $[7] = property.name;
24676
+ $[8] = t5;
24677
+ $[9] = t6;
24678
+ $[10] = t7;
24679
+ } else {
24680
+ t7 = $[10];
24681
+ }
24682
+ let t8;
24683
+ if ($[11] !== propertyKey || $[12] !== t7) {
24684
+ t8 = /* @__PURE__ */ jsxRuntime.jsx(PropertyIdCopyTooltip, { propertyKey, children: t7 });
24685
+ $[11] = propertyKey;
24686
+ $[12] = t7;
24687
+ $[13] = t8;
24688
+ } else {
24689
+ t8 = $[13];
24690
+ }
24691
+ let t9;
24692
+ if ($[14] !== disabled || $[15] !== handleClearClick || $[16] !== property.clearable || $[17] !== value) {
24693
+ t9 = property.clearable && !disabled && value && /* @__PURE__ */ jsxRuntime.jsx(ui.IconButton, { size: "small", onClick: handleClearClick, children: /* @__PURE__ */ jsxRuntime.jsx(ui.CloseIcon, { size: "small" }) });
24694
+ $[14] = disabled;
24695
+ $[15] = handleClearClick;
24696
+ $[16] = property.clearable;
24697
+ $[17] = value;
24698
+ $[18] = t9;
24699
+ } else {
24700
+ t9 = $[18];
24701
+ }
24702
+ let t10;
24703
+ if ($[19] !== setValue) {
24704
+ t10 = (updatedValue) => {
24705
+ const newValue = updatedValue || null;
24706
+ return setValue(newValue);
24707
+ };
24708
+ $[19] = setValue;
24709
+ $[20] = t10;
24710
+ } else {
24711
+ t10 = $[20];
24712
+ }
24713
+ let t11;
24714
+ if ($[21] !== getUser) {
24715
+ t11 = (userId) => {
24716
+ const user = getUser(userId);
24717
+ return /* @__PURE__ */ jsxRuntime.jsx(UserDisplay, { user });
24718
+ };
24719
+ $[21] = getUser;
24720
+ $[22] = t11;
24721
+ } else {
24722
+ t11 = $[22];
24723
+ }
24724
+ let t12;
24725
+ if ($[23] !== users) {
24726
+ t12 = users && users.map(_temp$2);
24727
+ $[23] = users;
24728
+ $[24] = t12;
24729
+ } else {
24730
+ t12 = $[24];
24731
+ }
24732
+ let t13;
24733
+ if ($[25] !== disabled || $[26] !== size || $[27] !== t10 || $[28] !== t11 || $[29] !== t12 || $[30] !== t3 || $[31] !== t8 || $[32] !== t9) {
24734
+ t13 = /* @__PURE__ */ jsxRuntime.jsx(ui.Select, { value: t3, disabled, size, fullWidth: true, position: "item-aligned", inputClassName: t4, label: t8, endAdornment: t9, onValueChange: t10, renderValue: t11, children: t12 });
24735
+ $[25] = disabled;
24736
+ $[26] = size;
24737
+ $[27] = t10;
24738
+ $[28] = t11;
24739
+ $[29] = t12;
24740
+ $[30] = t3;
24741
+ $[31] = t8;
24742
+ $[32] = t9;
24743
+ $[33] = t13;
24744
+ } else {
24745
+ t13 = $[33];
24746
+ }
24747
+ let t14;
24748
+ if ($[34] !== disabled || $[35] !== error || $[36] !== includeDescription || $[37] !== property || $[38] !== showError) {
24749
+ t14 = /* @__PURE__ */ jsxRuntime.jsx(FieldHelperText, { includeDescription, showError, error, disabled, property });
24750
+ $[34] = disabled;
24751
+ $[35] = error;
24752
+ $[36] = includeDescription;
24753
+ $[37] = property;
24754
+ $[38] = showError;
24755
+ $[39] = t14;
24756
+ } else {
24757
+ t14 = $[39];
24758
+ }
24759
+ let t15;
24760
+ if ($[40] !== t13 || $[41] !== t14) {
24761
+ t15 = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
24762
+ t13,
24763
+ t14
24764
+ ] });
24765
+ $[40] = t13;
24766
+ $[41] = t14;
24767
+ $[42] = t15;
24768
+ } else {
24769
+ t15 = $[42];
24770
+ }
24771
+ return t15;
24772
+ }
24773
+ function _temp$2(user_0) {
24774
+ return /* @__PURE__ */ jsxRuntime.jsx(ui.SelectItem, { value: user_0.uid, children: /* @__PURE__ */ jsxRuntime.jsx(UserDisplay, { user: user_0 }) }, user_0.uid);
24775
+ }
24400
24776
  function isDefaultFieldConfigId(id) {
24401
24777
  return Object.keys(DEFAULT_FIELD_CONFIGS).includes(id);
24402
24778
  }
@@ -24498,6 +24874,16 @@
24498
24874
  Field: MultiSelectFieldBinding
24499
24875
  }
24500
24876
  },
24877
+ user_select: {
24878
+ key: "user_select",
24879
+ name: "User select",
24880
+ description: "Select a user from the user management system. Store the user ID.",
24881
+ Icon: ui.PersonIcon,
24882
+ property: {
24883
+ dataType: "string",
24884
+ Field: UserSelectFieldBinding
24885
+ }
24886
+ },
24501
24887
  number_input: {
24502
24888
  key: "number_input",
24503
24889
  name: "Number input",
@@ -24712,6 +25098,8 @@
24712
25098
  return "email";
24713
25099
  } else if (property.enumValues) {
24714
25100
  return "select";
25101
+ } else if (property.userSelect) {
25102
+ return "user_select";
24715
25103
  } else if (property.reference) {
24716
25104
  return "reference_as_string";
24717
25105
  } else {
@@ -25750,6 +26138,7 @@
25750
26138
  exports2.SwitchFieldBinding = SwitchFieldBinding;
25751
26139
  exports2.TextFieldBinding = TextFieldBinding;
25752
26140
  exports2.UrlComponentPreview = UrlComponentPreview;
26141
+ exports2.UserPreview = UserPreview;
25753
26142
  exports2.Vector = Vector;
25754
26143
  exports2.VirtualTable = VirtualTable;
25755
26144
  exports2.addInitialSlash = addInitialSlash;
@@ -25895,6 +26284,7 @@
25895
26284
  exports2.useDialogsController = useDialogsController;
25896
26285
  exports2.useEntityFetch = useEntityFetch;
25897
26286
  exports2.useFireCMSContext = useFireCMSContext;
26287
+ exports2.useInternalUserManagementController = useInternalUserManagementController;
25898
26288
  exports2.useLargeLayout = useLargeLayout;
25899
26289
  exports2.useModeController = useModeController;
25900
26290
  exports2.useNavigationController = useNavigationController;