@rebasepro/admin 0.1.2 → 0.2.1

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 (241) hide show
  1. package/LICENSE +21 -6
  2. package/dist/{CollectionEditorDialog-ywdxhs1L.js → CollectionEditorDialog-BXIh2AXg.js} +40 -31
  3. package/dist/CollectionEditorDialog-BXIh2AXg.js.map +1 -0
  4. package/dist/{CollectionsStudioView-BDzMFzqH.js → CollectionsStudioView-jR8iz_ja.js} +6 -8
  5. package/dist/CollectionsStudioView-jR8iz_ja.js.map +1 -0
  6. package/dist/{ContentHomePage-0tHuEIm_.js → ContentHomePage-BQZWuOFb.js} +5 -7
  7. package/dist/ContentHomePage-BQZWuOFb.js.map +1 -0
  8. package/dist/{ExportCollectionAction-BIrq92To.js → ExportCollectionAction-CMdiiv1L.js} +36 -38
  9. package/dist/ExportCollectionAction-CMdiiv1L.js.map +1 -0
  10. package/dist/{ImportCollectionAction-h8yg_To8.js → ImportCollectionAction-C05lE0IW.js} +5 -7
  11. package/dist/ImportCollectionAction-C05lE0IW.js.map +1 -0
  12. package/dist/{PropertyEditView-BuZrNnBN.js → PropertyEditView-BB5xjnhZ.js} +261 -165
  13. package/dist/PropertyEditView-BB5xjnhZ.js.map +1 -0
  14. package/dist/{RolesView-CMPsaIXo.js → RolesView-CULIHWZ9.js} +22 -11
  15. package/dist/RolesView-CULIHWZ9.js.map +1 -0
  16. package/dist/{UsersView-BkeblMVT.js → UsersView-D7_AtJ44.js} +7 -71
  17. package/dist/UsersView-D7_AtJ44.js.map +1 -0
  18. package/dist/collection_editor/ui/collection_editor/LayoutModeSwitch.d.ts +2 -2
  19. package/dist/collection_editor/ui/collection_editor/properties/VectorPropertyField.d.ts +3 -0
  20. package/dist/collection_editor_ui.js +5 -5
  21. package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +1 -1
  22. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +1 -1
  23. package/dist/components/EntityCollectionView/EntityCollectionListView.d.ts +18 -2
  24. package/dist/components/EntityCollectionView/FilterPresetsButton.d.ts +21 -0
  25. package/dist/components/EntityDetailView.d.ts +31 -0
  26. package/dist/components/EntityEditView.d.ts +3 -2
  27. package/dist/components/ReferenceTable/EntitySelectionTable.d.ts +1 -1
  28. package/dist/components/admin/CreationResultDialog.d.ts +5 -0
  29. package/dist/components/admin/RolesFilterSelect.d.ts +2 -0
  30. package/dist/components/admin/UserRolesSelectField.d.ts +2 -0
  31. package/dist/components/common/default_entity_actions.d.ts +7 -1
  32. package/dist/components/field_configs.d.ts +1 -1
  33. package/dist/components/index.d.ts +1 -0
  34. package/dist/data_import/utils/data.d.ts +1 -1
  35. package/dist/data_import/utils/file_headers.d.ts +6 -1
  36. package/dist/data_import/utils/file_to_json.d.ts +1 -11
  37. package/dist/data_import/utils/transforms.d.ts +11 -0
  38. package/dist/editor.js +2 -4
  39. package/dist/editor.js.map +1 -1
  40. package/dist/form/EntityForm.d.ts +1 -1
  41. package/dist/form/field_bindings/RelationFieldBinding.d.ts +1 -1
  42. package/dist/form/field_bindings/VectorFieldBinding.d.ts +11 -0
  43. package/dist/form/index.d.ts +1 -0
  44. package/dist/hooks/navigation/useResolvedViews.d.ts +2 -1
  45. package/dist/{index-CS6uJ7oW.js → index-BAM9KCmM.js} +4 -6
  46. package/dist/index-BAM9KCmM.js.map +1 -0
  47. package/dist/{index-BuZaHcyc.js → index-CoSNm3e3.js} +3 -3
  48. package/dist/index-CoSNm3e3.js.map +1 -0
  49. package/dist/{index-eRJbMvHi.js → index-D5OQhv-T.js} +3 -3
  50. package/dist/index-D5OQhv-T.js.map +1 -0
  51. package/dist/index.d.ts +4 -1
  52. package/dist/index.js +352 -148
  53. package/dist/index.js.map +1 -1
  54. package/dist/types/components/EntityFormActionsProps.d.ts +1 -1
  55. package/dist/types/components/EntityFormProps.d.ts +2 -1
  56. package/dist/types/fields.d.ts +3 -3
  57. package/dist/util/navigation_utils.d.ts +1 -1
  58. package/dist/{util-zfU1zOCX.js → util-DtbWD7LF.js} +5304 -2572
  59. package/dist/util-DtbWD7LF.js.map +1 -0
  60. package/package.json +45 -39
  61. package/src/collection_editor/ConfigControllerProvider.tsx +1 -1
  62. package/src/collection_editor/ui/AddKanbanColumnAction.tsx +12 -2
  63. package/src/collection_editor/ui/CollectionViewHeaderAction.tsx +1 -2
  64. package/src/collection_editor/ui/EditorCollectionAction.tsx +1 -2
  65. package/src/collection_editor/ui/EditorCollectionActionStart.tsx +1 -2
  66. package/src/collection_editor/ui/EditorEntityAction.tsx +1 -2
  67. package/src/collection_editor/ui/HomePageEditorCollectionAction.tsx +1 -2
  68. package/src/collection_editor/ui/NewCollectionButton.tsx +1 -2
  69. package/src/collection_editor/ui/NewCollectionCard.tsx +4 -6
  70. package/src/collection_editor/ui/PropertyAddColumnComponent.tsx +1 -2
  71. package/src/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.tsx +10 -2
  72. package/src/collection_editor/ui/collection_editor/CollectionDetailsForm.tsx +18 -2
  73. package/src/collection_editor/ui/collection_editor/CollectionEditorDialog.tsx +22 -7
  74. package/src/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.tsx +16 -2
  75. package/src/collection_editor/ui/collection_editor/CollectionJsonImportDialog.tsx +19 -9
  76. package/src/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.tsx +13 -2
  77. package/src/collection_editor/ui/collection_editor/CollectionRLSTab.tsx +24 -2
  78. package/src/collection_editor/ui/collection_editor/CollectionRelationsTab.tsx +22 -3
  79. package/src/collection_editor/ui/collection_editor/CollectionStudioView.tsx +1 -2
  80. package/src/collection_editor/ui/collection_editor/CollectionsStudioView.tsx +11 -2
  81. package/src/collection_editor/ui/collection_editor/DisplaySettingsForm.tsx +12 -2
  82. package/src/collection_editor/ui/collection_editor/EntityActionsEditTab.tsx +16 -3
  83. package/src/collection_editor/ui/collection_editor/EnumForm.tsx +17 -2
  84. package/src/collection_editor/ui/collection_editor/GeneralSettingsForm.tsx +18 -2
  85. package/src/collection_editor/ui/collection_editor/GetCodeDialog.tsx +1 -2
  86. package/src/collection_editor/ui/collection_editor/KanbanConfigSection.tsx +1 -2
  87. package/src/collection_editor/ui/collection_editor/LayoutModeSwitch.tsx +17 -5
  88. package/src/collection_editor/ui/collection_editor/PropertyEditView.tsx +32 -6
  89. package/src/collection_editor/ui/collection_editor/PropertyFieldPreview.tsx +7 -7
  90. package/src/collection_editor/ui/collection_editor/PropertyTree.tsx +14 -2
  91. package/src/collection_editor/ui/collection_editor/SubcollectionsEditTab.tsx +16 -2
  92. package/src/collection_editor/ui/collection_editor/ViewModeSwitch.tsx +9 -2
  93. package/src/collection_editor/ui/collection_editor/properties/BlockPropertyField.tsx +1 -2
  94. package/src/collection_editor/ui/collection_editor/properties/MapPropertyField.tsx +1 -2
  95. package/src/collection_editor/ui/collection_editor/properties/MarkdownPropertyField.tsx +9 -2
  96. package/src/collection_editor/ui/collection_editor/properties/StoragePropertyField.tsx +11 -2
  97. package/src/collection_editor/ui/collection_editor/properties/VectorPropertyField.tsx +34 -0
  98. package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsEditor.tsx +15 -7
  99. package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsPanel.tsx +1 -2
  100. package/src/collection_editor/ui/collection_editor/properties/conditions/EnumConditionsEditor.tsx +15 -3
  101. package/src/collection_editor/ui/collection_editor/properties/conditions/property_paths.ts +1 -1
  102. package/src/collection_editor/ui/collection_editor/properties/validation/ValidationPanel.tsx +1 -2
  103. package/src/collection_editor/useLocalCollectionsConfigController.tsx +0 -2
  104. package/src/collection_editor/validateCollectionJson.ts +9 -9
  105. package/src/components/AdminModeSyncer.tsx +1 -1
  106. package/src/components/ArrayContainer.tsx +19 -15
  107. package/src/components/ClearFilterSortButton.tsx +1 -2
  108. package/src/components/CollectionEditorDialogs.tsx +1 -1
  109. package/src/components/DefaultAppBar.tsx +15 -3
  110. package/src/components/DefaultDrawer.tsx +3 -3
  111. package/src/components/DrawerNavigationGroup.tsx +1 -2
  112. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +14 -6
  113. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +1 -1
  114. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +1 -1
  115. package/src/components/EntityCollectionTable/fields/TableMultipleRelationField.tsx +1 -2
  116. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +1 -2
  117. package/src/components/EntityCollectionTable/fields/TableRelationField.tsx +1 -2
  118. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +1 -2
  119. package/src/components/EntityCollectionTable/fields/VirtualTableSelect.tsx +0 -1
  120. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +15 -27
  121. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +1 -2
  122. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +1 -2
  123. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +3 -5
  124. package/src/components/EntityCollectionTable/table_bindings.tsx +51 -45
  125. package/src/components/EntityCollectionView/Board.tsx +1 -2
  126. package/src/components/EntityCollectionView/BoardColumn.tsx +9 -2
  127. package/src/components/EntityCollectionView/BoardColumnTitle.tsx +5 -4
  128. package/src/components/EntityCollectionView/EntityCollectionBoardView.tsx +18 -16
  129. package/src/components/EntityCollectionView/EntityCollectionCardView.tsx +16 -17
  130. package/src/components/EntityCollectionView/EntityCollectionListView.tsx +87 -18
  131. package/src/components/EntityCollectionView/EntityCollectionView.tsx +20 -11
  132. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +6 -7
  133. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +14 -5
  134. package/src/components/EntityCollectionView/FilterPresetsButton.tsx +292 -0
  135. package/src/components/EntityCollectionView/FiltersDialog.tsx +1 -2
  136. package/src/components/EntityCollectionView/SplitListView.tsx +76 -25
  137. package/src/components/EntityCollectionView/ViewModeToggle.tsx +20 -7
  138. package/src/components/EntityCollectionView/hooks/useKanbanDragAndDrop.ts +1 -1
  139. package/src/components/EntityCollectionView/useBoardDataController.tsx +74 -6
  140. package/src/components/EntityCollectionView/useEntityPreviewSlots.ts +1 -1
  141. package/src/components/EntityDetailView.tsx +619 -0
  142. package/src/components/EntityEditView.tsx +29 -10
  143. package/src/components/EntityEditViewFormActions.tsx +20 -7
  144. package/src/components/EntityPreview.tsx +14 -5
  145. package/src/components/EntitySidePanel.tsx +116 -62
  146. package/src/components/EntityView.tsx +1 -2
  147. package/src/components/HomePage/ContentHomePage.tsx +1 -1
  148. package/src/components/HomePage/FavouritesView.tsx +1 -2
  149. package/src/components/HomePage/NavigationCard.tsx +1 -2
  150. package/src/components/HomePage/NavigationCardBinding.tsx +1 -2
  151. package/src/components/HomePage/NavigationGroup.tsx +1 -2
  152. package/src/components/HomePage/SmallNavigationCard.tsx +1 -2
  153. package/src/components/PropertyIdCopyTooltip.tsx +1 -2
  154. package/src/components/RebaseAuthGate.tsx +2 -2
  155. package/src/components/RebaseNavigation.tsx +9 -7
  156. package/src/components/ReferenceTable/EntitySelectionTable.tsx +12 -8
  157. package/src/components/RelationSelector.tsx +34 -6
  158. package/src/components/SearchIconsView.tsx +10 -2
  159. package/src/components/SelectableTable/SelectableTable.tsx +2 -2
  160. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +1 -2
  161. package/src/components/SideDialogs.tsx +63 -38
  162. package/src/components/UserSelector.tsx +30 -6
  163. package/src/components/admin/CreationResultDialog.tsx +135 -0
  164. package/src/components/admin/RolesFilterSelect.tsx +45 -0
  165. package/src/components/admin/RolesView.tsx +53 -14
  166. package/src/components/admin/UserRolesSelectField.tsx +50 -0
  167. package/src/components/admin/UsersView.tsx +41 -124
  168. package/src/components/app/Scaffold.tsx +1 -2
  169. package/src/components/common/default_entity_actions.tsx +119 -12
  170. package/src/components/field_configs.tsx +39 -3
  171. package/src/components/history/EntityHistoryEntry.tsx +1 -2
  172. package/src/components/history/EntityHistoryView.tsx +1 -2
  173. package/src/components/index.ts +2 -0
  174. package/src/data_export/export/BasicExportAction.tsx +35 -38
  175. package/src/data_export/export/ExportCollectionAction.tsx +39 -40
  176. package/src/data_import/components/DataNewPropertiesMapping.tsx +15 -2
  177. package/src/data_import/components/ImportFileUpload.tsx +1 -2
  178. package/src/data_import/components/ImportNewPropertyFieldPreview.tsx +1 -2
  179. package/src/data_import/import/ImportCollectionAction.tsx +21 -8
  180. package/src/data_import/utils/data.ts +23 -5
  181. package/src/data_import/utils/file_headers.ts +13 -89
  182. package/src/data_import/utils/file_to_json.ts +43 -68
  183. package/src/data_import/utils/transforms.ts +47 -0
  184. package/src/editor/components/SlashCommandMenu.tsx +17 -2
  185. package/src/editor/components/editor-bubble-item.tsx +1 -1
  186. package/src/editor/extensions/Image/index.ts +1 -1
  187. package/src/editor/extensions/Image.ts +1 -1
  188. package/src/editor/selectors/color-selector.tsx +1 -2
  189. package/src/editor/selectors/link-selector.tsx +1 -2
  190. package/src/editor/selectors/node-selector.tsx +16 -2
  191. package/src/editor/selectors/text-buttons.tsx +1 -2
  192. package/src/editor/utils/prosemirror-utils.ts +1 -1
  193. package/src/form/EntityForm.tsx +16 -6
  194. package/src/form/EntityFormActions.tsx +11 -3
  195. package/src/form/PropertyFieldBinding.tsx +5 -12
  196. package/src/form/components/FieldHelperText.tsx +1 -2
  197. package/src/form/components/LocalChangesMenu.tsx +17 -2
  198. package/src/form/components/StorageItemPreview.tsx +1 -2
  199. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +1 -2
  200. package/src/form/field_bindings/KeyValueFieldBinding.tsx +17 -2
  201. package/src/form/field_bindings/MapFieldBinding.tsx +1 -1
  202. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +10 -3
  203. package/src/form/field_bindings/MultiSelectFieldBinding.tsx +1 -2
  204. package/src/form/field_bindings/MultipleRelationFieldBinding.tsx +1 -2
  205. package/src/form/field_bindings/ReferenceAsStringFieldBinding.tsx +7 -7
  206. package/src/form/field_bindings/RelationFieldBinding.tsx +150 -147
  207. package/src/form/field_bindings/RepeatFieldBinding.tsx +1 -1
  208. package/src/form/field_bindings/SelectFieldBinding.tsx +1 -2
  209. package/src/form/field_bindings/TextFieldBinding.tsx +10 -2
  210. package/src/form/field_bindings/VectorFieldBinding.tsx +202 -0
  211. package/src/form/index.tsx +1 -0
  212. package/src/form/validation.ts +54 -2
  213. package/src/hooks/navigation/useBuildNavigationStateController.tsx +2 -1
  214. package/src/hooks/navigation/useResolvedViews.tsx +30 -15
  215. package/src/hooks/navigation/useTopLevelNavigation.ts +1 -1
  216. package/src/index.ts +6 -0
  217. package/src/preview/PropertyPreview.tsx +1 -1
  218. package/src/preview/components/ImagePreview.tsx +1 -1
  219. package/src/preview/components/UrlComponentPreview.tsx +1 -2
  220. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +2 -2
  221. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +23 -24
  222. package/src/routes/RebaseRoute.tsx +64 -35
  223. package/src/types/components/EntityFormActionsProps.tsx +1 -1
  224. package/src/types/components/EntityFormProps.tsx +3 -1
  225. package/src/types/fields.tsx +4 -3
  226. package/src/util/navigation_utils.ts +4 -3
  227. package/src/util/previews.ts +1 -1
  228. package/src/util/property_utils.tsx +22 -6
  229. package/src/util/resolutions.ts +2 -2
  230. package/dist/CollectionEditorDialog-ywdxhs1L.js.map +0 -1
  231. package/dist/CollectionsStudioView-BDzMFzqH.js.map +0 -1
  232. package/dist/ContentHomePage-0tHuEIm_.js.map +0 -1
  233. package/dist/ExportCollectionAction-BIrq92To.js.map +0 -1
  234. package/dist/ImportCollectionAction-h8yg_To8.js.map +0 -1
  235. package/dist/PropertyEditView-BuZrNnBN.js.map +0 -1
  236. package/dist/RolesView-CMPsaIXo.js.map +0 -1
  237. package/dist/UsersView-BkeblMVT.js.map +0 -1
  238. package/dist/index-BuZaHcyc.js.map +0 -1
  239. package/dist/index-CS6uJ7oW.js.map +0 -1
  240. package/dist/index-eRJbMvHi.js.map +0 -1
  241. package/dist/util-zfU1zOCX.js.map +0 -1
@@ -2,14 +2,13 @@ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
2
  import { c } from "react-compiler-runtime";
3
3
  import React__default, { useState } from "react";
4
4
  import "fast-equals";
5
- import { CenteredView, CircularProgress, Container, Typography, Button, Table, TableHeader, TableCell, TableBody, TableRow, Checkbox, Tooltip, IconButton, iconSize, Dialog, DialogTitle, DialogContent, TextField, DialogActions, LoadingButton, Chip, defaultBorderMixin } from "@rebasepro/ui";
6
- import { PlusIcon, Trash2Icon } from "lucide-react";
5
+ import { CenteredView, CircularProgress, Container, Typography, Button, PlusIcon, Table, TableHeader, TableCell, TableBody, TableRow, Checkbox, Tooltip, IconButton, Trash2Icon, iconSize, Dialog, DialogTitle, DialogContent, TextField, Label, DialogActions, LoadingButton, Chip, defaultBorderMixin } from "@rebasepro/ui";
7
6
  import "@rebasepro/common";
8
7
  import { useSnackbarController, useTranslation, ConfirmationDialog } from "@rebasepro/core";
9
8
  import "@rebasepro/formex";
10
9
  import "zod";
11
10
  import "@rebasepro/utils";
12
- import { i as useBreadcrumbsController, e as useCollectionRegistryController } from "./util-zfU1zOCX.js";
11
+ import { b9 as useBreadcrumbsController, bh as useCollectionRegistryController } from "./util-DtbWD7LF.js";
13
12
  import "date-fns";
14
13
  import "date-fns/locale";
15
14
  import { getDataSourceCapabilities } from "@rebasepro/types";
@@ -19,8 +18,7 @@ import "@dnd-kit/sortable";
19
18
  import "@dnd-kit/utilities";
20
19
  import "react-dropzone";
21
20
  import "react-router-dom";
22
- import "react-router";
23
- import "xlsx";
21
+ import "exceljs";
24
22
  import "@rebasepro/schema-inference";
25
23
  import { R as RoleChip } from "./RoleChip-QtUFXeTp.js";
26
24
  function RolesView({
@@ -84,7 +82,7 @@ function RolesView({
84
82
  setDeleteInProgress(false);
85
83
  }
86
84
  };
87
- const createDefaultRoles = () => {
85
+ const createDefaultRoles = async () => {
88
86
  if (!saveRole) return;
89
87
  const defaultRoles = [{
90
88
  id: "admin",
@@ -99,7 +97,20 @@ function RolesView({
99
97
  name: "Viewer",
100
98
  isAdmin: false
101
99
  }];
102
- defaultRoles.forEach((role_0) => saveRole(role_0));
100
+ try {
101
+ for (const role_0 of defaultRoles) {
102
+ await saveRole(role_0);
103
+ }
104
+ snackbarController.open({
105
+ type: "success",
106
+ message: t("saved_correctly")
107
+ });
108
+ } catch (error_0) {
109
+ snackbarController.open({
110
+ type: "error",
111
+ message: error_0 instanceof Error ? error_0.message : t("error_saving_role")
112
+ });
113
+ }
103
114
  };
104
115
  if (loading) {
105
116
  return /* @__PURE__ */ jsx(CenteredView, { children: /* @__PURE__ */ jsx(CircularProgress, {}) });
@@ -202,15 +213,15 @@ function RoleDetailsForm({
202
213
  /* @__PURE__ */ jsx(TextField, { name: "name", required: true, error: submitCount > 0 && Boolean(errors.name), value: roleName, onChange: (e_1) => setRoleName(e_1.target.value), label: t("role_name") }),
203
214
  submitCount > 0 && errors.name && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "error", children: errors.name })
204
215
  ] }),
205
- /* @__PURE__ */ jsx("div", { className: "col-span-12 sm:col-span-4 flex items-start pt-2", children: /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-2 cursor-pointer mt-3", children: [
216
+ /* @__PURE__ */ jsx("div", { className: "col-span-12 sm:col-span-4 flex items-start pt-2", children: /* @__PURE__ */ jsxs(Label, { className: "flex items-center gap-2 cursor-pointer mt-3", children: [
206
217
  /* @__PURE__ */ jsx(Checkbox, { checked: isAdmin, onCheckedChange: (checked) => setIsAdmin(Boolean(checked)) }),
207
- /* @__PURE__ */ jsx("span", { className: "font-medium", children: t("is_admin") })
218
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", className: "font-medium", children: t("is_admin") })
208
219
  ] }) }),
209
220
  /* @__PURE__ */ jsx("div", { className: "col-span-12", children: /* @__PURE__ */ jsx(CollectionPermissionsMatrix, { roleId, isAdmin }) })
210
221
  ] }) }),
211
222
  /* @__PURE__ */ jsxs(DialogActions, { children: [
212
223
  /* @__PURE__ */ jsx(Button, { variant: "text", onClick: handleClose, children: t("cancel") }),
213
- /* @__PURE__ */ jsx(LoadingButton, { variant: "filled", type: "submit", disabled: !isNewRole && !isAdmin, loading: isSubmitting, children: isNewRole ? t("create_role") : t("update") })
224
+ /* @__PURE__ */ jsx(LoadingButton, { variant: "filled", type: "submit", disabled: isSubmitting, loading: isSubmitting, children: isNewRole ? t("create_role") : t("update") })
214
225
  ] })
215
226
  ] }) });
216
227
  }
@@ -423,4 +434,4 @@ function CollectionPermissionsMatrix(t0) {
423
434
  export {
424
435
  RolesView
425
436
  };
426
- //# sourceMappingURL=RolesView-CMPsaIXo.js.map
437
+ //# sourceMappingURL=RolesView-CULIHWZ9.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RolesView-CULIHWZ9.js","sources":["../src/components/admin/RolesView.tsx"],"sourcesContent":["\nimport React, { useState } from \"react\";\nimport { useCollectionRegistryController } from \"../../index\";\nimport { useSnackbarController, useTranslation } from \"@rebasepro/core\";\nimport { getDataSourceCapabilities, Role, SecurityRule, UserManagementDelegate } from \"@rebasepro/types\";\nimport { useBreadcrumbsController } from \"../../index\";\nimport {\n Button,\n CenteredView,\n Checkbox,\n Chip,\n CircularProgress,\n Container,\n defaultBorderMixin,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n IconButton,\n iconSize,\n Label,\n LoadingButton,\n Paper,\n PlusIcon,\n Table,\n TableBody,\n TableCell,\n TableHeader,\n TableRow,\n TextField,\n Tooltip,\n Trash2Icon,\n Typography\n} from \"@rebasepro/ui\";\nimport { RoleChip } from \"./RoleChip\";\nimport { ConfirmationDialog } from \"@rebasepro/core\";\n\n// ============================================\n// RolesView Component\n// ============================================\nexport function RolesView({ userManagement }: { userManagement: UserManagementDelegate }) {\n const { roles, saveRole, deleteRole, loading, allowDefaultRolesCreation, rolesError } = userManagement;\n const snackbarController = useSnackbarController();\n const { t } = useTranslation();\n const breadcrumbs = useBreadcrumbsController();\n\n React.useEffect(() => {\n breadcrumbs.set({\n breadcrumbs: [{ title: t(\"roles\"),\nurl: \"/roles\" }]\n });\n\n }, []);\n\n const [dialogOpen, setDialogOpen] = useState(false);\n const [selectedRole, setSelectedRole] = useState<Role | undefined>();\n const [deleteConfirmOpen, setDeleteConfirmOpen] = useState(false);\n const [roleToDelete, setRoleToDelete] = useState<Role | undefined>();\n const [deleteInProgress, setDeleteInProgress] = useState(false);\n\n const handleAddRole = () => {\n setSelectedRole(undefined);\n setDialogOpen(true);\n };\n\n const handleEditRole = (role: Role) => {\n setSelectedRole(role);\n setDialogOpen(true);\n };\n\n const handleClose = () => {\n setDialogOpen(false);\n setSelectedRole(undefined);\n };\n\n const handleDelete = async () => {\n if (!roleToDelete || !deleteRole) return;\n setDeleteInProgress(true);\n try {\n await deleteRole(roleToDelete);\n snackbarController.open({ type: \"success\",\nmessage: t(\"role_deleted_successfully\") });\n setDeleteConfirmOpen(false);\n setRoleToDelete(undefined);\n } catch (error: unknown) {\n snackbarController.open({ type: \"error\",\nmessage: error instanceof Error ? error.message : t(\"error_deleting_role\") });\n } finally {\n setDeleteInProgress(false);\n }\n };\n\n const createDefaultRoles = async () => {\n if (!saveRole) return;\n const defaultRoles: Role[] = [\n { id: \"admin\",\n name: \"Admin\",\n isAdmin: true },\n { id: \"editor\",\n name: \"Editor\",\n isAdmin: false },\n { id: \"viewer\",\n name: \"Viewer\",\n isAdmin: false }\n ];\n try {\n for (const role of defaultRoles) {\n await saveRole(role);\n }\n snackbarController.open({\n type: \"success\",\n message: t(\"saved_correctly\")\n });\n } catch (error: unknown) {\n snackbarController.open({\n type: \"error\",\n message: error instanceof Error ? error.message : t(\"error_saving_role\")\n });\n }\n };\n\n if (loading) {\n return <CenteredView><CircularProgress/></CenteredView>;\n }\n\n return (\n <Container className=\"w-full flex flex-col py-4 gap-4\" maxWidth={\"6xl\"}>\n <div className=\"flex items-center mt-12 mb-4 gap-4\">\n <Typography gutterBottom variant=\"h4\" className=\"grow mb-0\" component=\"h4\">\n {t(\"roles\")}\n </Typography>\n <Button startIcon={<PlusIcon/>} onClick={handleAddRole} disabled={!saveRole}>\n {t(\"add_role\")}\n </Button>\n </div>\n\n <div className=\"w-full overflow-auto\">\n <Table className=\"w-full\">\n <TableHeader>\n <TableCell header>{t(\"role\")}</TableCell>\n <TableCell header className=\"items-center\">{t(\"is_admin\")}</TableCell>\n <TableCell header className=\"w-24 text-right\">{t(\"actions\")}</TableCell>\n </TableHeader>\n <TableBody>\n {roles && roles.map((role: Role) => {\n\n return (\n <TableRow key={role.id} onClick={() => saveRole && handleEditRole(role)}>\n <TableCell>\n <RoleChip role={role}/>\n </TableCell>\n <TableCell className=\"items-center\">\n <Checkbox checked={role.isAdmin ?? false} disabled/>\n </TableCell>\n <TableCell className=\"text-right whitespace-nowrap\">\n <div className=\"flex justify-end items-center gap-1\">\n {!role.isAdmin && deleteRole && (\n <Tooltip asChild title={t(\"delete_this_role\")}>\n <IconButton\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n setRoleToDelete(role);\n setDeleteConfirmOpen(true);\n }}>\n <Trash2Icon size={iconSize.small}/>\n </IconButton>\n </Tooltip>\n )}\n </div>\n </TableCell>\n </TableRow>\n );\n })}\n\n {(!roles || roles.length === 0) && (\n <TableRow>\n <TableCell colspan={3}>\n <CenteredView className=\"flex flex-col gap-4 my-8 items-center\">\n <Typography variant=\"label\">\n {rolesError\n ? t(\"no_permission_to_view_roles\")\n : t(\"no_roles_yet\")}\n </Typography>\n {rolesError && (\n <Typography variant=\"caption\" color=\"secondary\">\n {t(\"no_permission_description\")}\n </Typography>\n )}\n {!rolesError && allowDefaultRolesCreation && saveRole && (\n <Button onClick={createDefaultRoles}>\n {t(\"create_default_roles\")}\n </Button>\n )}\n </CenteredView>\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </div>\n\n {/* Role Edit Dialog */}\n {saveRole && (\n <RoleDetailsForm\n key={selectedRole?.id ?? \"new\"}\n open={dialogOpen}\n role={selectedRole}\n saveRole={saveRole}\n handleClose={handleClose}\n />\n )}\n\n {/* Delete Confirmation */}\n <ConfirmationDialog\n open={deleteConfirmOpen}\n loading={deleteInProgress}\n onAccept={handleDelete}\n onCancel={() => { setDeleteConfirmOpen(false); setRoleToDelete(undefined); }}\n title={<>{t(\"delete_confirmation_title\")}</>}\n body={<>{t(\"delete_role_confirmation\")}</>}\n />\n </Container>\n );\n}\n\n// ============================================\n// RoleDetailsForm Component\n// ============================================\nfunction RoleDetailsForm({\n open,\n role: roleProp,\n saveRole,\n handleClose\n}: {\n open: boolean;\n role?: Role;\n saveRole: (role: Role) => Promise<void>;\n handleClose: () => void;\n}) {\n const snackbarController = useSnackbarController();\n const { t } = useTranslation();\n const isNewRole = !roleProp;\n\n const [roleId, setRoleId] = useState(roleProp?.id || \"\");\n const [roleName, setRoleName] = useState(roleProp?.name || \"\");\n const [isAdmin, setIsAdmin] = useState(roleProp?.isAdmin ?? false);\n\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [errors, setErrors] = useState<{ id?: string; name?: string }>({});\n const [submitCount, setSubmitCount] = useState(0);\n\n const validate = () => {\n const newErrors: typeof errors = {};\n if (!roleId) newErrors.id = \"Required\";\n if (!roleName) newErrors.name = \"Required\";\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setSubmitCount(c => c + 1);\n\n if (!validate()) return;\n\n setIsSubmitting(true);\n try {\n await saveRole({\n id: roleId,\n name: roleName,\n isAdmin\n });\n handleClose();\n } catch (error: unknown) {\n snackbarController.open({ type: \"error\",\nmessage: error instanceof Error ? error.message : \"Failed to save role\" });\n } finally {\n setIsSubmitting(false);\n }\n };\n\n return (\n <Dialog open={open} onOpenChange={(open) => !open ? handleClose() : undefined} maxWidth=\"4xl\">\n <form onSubmit={handleSubmit} autoComplete=\"off\" noValidate\n style={{ display: \"flex\",\nflexDirection: \"column\",\nposition: \"relative\",\nheight: \"100%\" }}>\n\n <DialogTitle variant=\"h4\" gutterBottom={false}>\n {t(\"role\")}\n </DialogTitle>\n\n <DialogContent className=\"h-full grow overflow-y-auto\">\n <div className=\"grid grid-cols-12 gap-4\">\n <div className=\"col-span-12 sm:col-span-4\">\n <TextField\n name=\"id\"\n required\n error={submitCount > 0 && Boolean(errors.id)}\n value={roleId}\n onChange={(e) => setRoleId(e.target.value)}\n label={t(\"role_id\")}\n disabled={!isNewRole}\n />\n {submitCount > 0 && errors.id && (\n <Typography variant=\"caption\" color=\"error\">{errors.id}</Typography>\n )}\n </div>\n\n <div className=\"col-span-12 sm:col-span-4\">\n <TextField\n name=\"name\"\n required\n error={submitCount > 0 && Boolean(errors.name)}\n value={roleName}\n onChange={(e) => setRoleName(e.target.value)}\n label={t(\"role_name\")}\n />\n {submitCount > 0 && errors.name && (\n <Typography variant=\"caption\" color=\"error\">{errors.name}</Typography>\n )}\n </div>\n\n <div className=\"col-span-12 sm:col-span-4 flex items-start pt-2\">\n <Label className=\"flex items-center gap-2 cursor-pointer mt-3\">\n <Checkbox\n checked={isAdmin}\n onCheckedChange={(checked) => setIsAdmin(Boolean(checked))}\n />\n <Typography variant=\"body2\" className=\"font-medium\">{t(\"is_admin\")}</Typography>\n </Label>\n </div>\n\n <div className=\"col-span-12\">\n <CollectionPermissionsMatrix roleId={roleId} isAdmin={isAdmin}/>\n </div>\n </div>\n </DialogContent>\n\n <DialogActions>\n <Button variant=\"text\" onClick={handleClose}>\n {t(\"cancel\")}\n </Button>\n <LoadingButton\n variant=\"filled\"\n type=\"submit\"\n disabled={isSubmitting}\n loading={isSubmitting}\n >\n {isNewRole ? t(\"create_role\") : t(\"update\")}\n </LoadingButton>\n </DialogActions>\n </form>\n </Dialog>\n );\n}\n\n// ============================================\n// CollectionPermissionsMatrix\n// ============================================\nconst CRUD_OPS = [\n { op: \"select\" as const,\nlabel: \"read\" },\n { op: \"insert\" as const,\nlabel: \"create\" },\n { op: \"update\" as const,\nlabel: \"edit\" },\n { op: \"delete\" as const,\nlabel: \"delete\" }\n];\n\nfunction hasRoleAccess(\n rules: SecurityRule[] | undefined,\n roleId: string,\n op: \"select\" | \"insert\" | \"update\" | \"delete\"\n): boolean {\n if (!rules || rules.length === 0) return true;\n const applicable = rules.filter(r =>\n r.operation === op || r.operation === \"all\" ||\n r.operations?.includes(op) || r.operations?.includes(\"all\")\n );\n if (applicable.length === 0) return false;\n const forRole = applicable.filter(r =>\n !r.roles || r.roles.length === 0 || r.roles.includes(roleId) || r.roles.includes(\"public\")\n );\n if (forRole.length === 0) return false;\n for (const r of forRole) {\n if ((r.mode ?? \"permissive\") === \"restrictive\") return false;\n }\n return forRole.some(r => (r.mode ?? \"permissive\") === \"permissive\");\n}\n\nfunction PermCell({ granted }: { granted: boolean }) {\n return (\n <span className={granted\n ? \"text-green-500 dark:text-green-400 font-bold\"\n : \"text-surface-300 dark:text-surface-600\"}\n >\n {granted ? \"✓\" : \"✗\"}\n </span>\n );\n}\n\nfunction CollectionPermissionsMatrix({ roleId, isAdmin }: { roleId: string; isAdmin: boolean }) {\n const { collections } = useCollectionRegistryController();\n const { t } = useTranslation();\n\n if (!collections || collections.length === 0) {\n return (\n <div className=\"mt-4\">\n <Typography variant=\"label\" className=\"text-surface-400\">{t(\"no_collections_configured\")}</Typography>\n </div>\n );\n }\n\n const topLevel = collections;\n\n return (\n <div className=\"mt-4\">\n <Typography variant=\"label\" className=\"mb-2 block text-surface-500 dark:text-surface-400 uppercase tracking-wide text-xs\">\n {t(\"collection_permissions\")}\n </Typography>\n <div className={`rounded-lg overflow-hidden border w-full ${defaultBorderMixin}`}>\n <Table className=\"w-full\">\n <TableHeader>\n <TableCell header>{t(\"collection\")}</TableCell>\n {CRUD_OPS.map(({ op, label }) => (\n <TableCell key={op} header align=\"center\" className=\"w-20\">{t(label)}</TableCell>\n ))}\n </TableHeader>\n <TableBody>\n {topLevel.map((collection) => {\n const capabilities = getDataSourceCapabilities(collection.driver);\n const rules = capabilities.supportsRLS && 'securityRules' in collection ? collection.securityRules : undefined;\n const noRules = !rules || rules.length === 0;\n return (\n <TableRow key={collection.slug}>\n <TableCell>\n <div className=\"flex items-center gap-1.5\">\n <span className=\"font-medium\">{collection.name}</span>\n {noRules && !isAdmin && (\n <Tooltip title={t(\"no_security_rules_defined\")}>\n <Chip size=\"smallest\" colorScheme=\"gray\">{t(\"no_rules\")}</Chip>\n </Tooltip>\n )}\n </div>\n <span className=\"text-xs text-surface-400 font-mono\">{collection.slug}</span>\n </TableCell>\n {CRUD_OPS.map(({ op }) => (\n <TableCell key={op} align=\"center\" className=\"w-20\">\n <PermCell granted={isAdmin || hasRoleAccess(rules, roleId, op)}/>\n </TableCell>\n ))}\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n </div>\n </div>\n );\n}\n\n"],"names":["RolesView","userManagement","roles","saveRole","deleteRole","loading","allowDefaultRolesCreation","rolesError","snackbarController","useSnackbarController","t","useTranslation","breadcrumbs","useBreadcrumbsController","React","useEffect","set","title","url","dialogOpen","setDialogOpen","useState","selectedRole","setSelectedRole","deleteConfirmOpen","setDeleteConfirmOpen","roleToDelete","setRoleToDelete","deleteInProgress","setDeleteInProgress","handleAddRole","undefined","handleEditRole","role","handleClose","handleDelete","open","type","message","error","Error","createDefaultRoles","defaultRoles","id","name","isAdmin","map","e","stopPropagation","iconSize","small","length","RoleDetailsForm","roleProp","isNewRole","roleId","setRoleId","roleName","setRoleName","setIsAdmin","isSubmitting","setIsSubmitting","errors","setErrors","submitCount","setSubmitCount","validate","newErrors","Object","keys","handleSubmit","preventDefault","c","display","flexDirection","position","height","Boolean","target","value","checked","CRUD_OPS","op","label","hasRoleAccess","rules","applicable","filter","r","operation","operations","includes","forRole","mode","some","PermCell","t0","$","_c","granted","t1","t2","t3","CollectionPermissionsMatrix","collections","useCollectionRegistryController","topLevel","t4","t5","t6","t7","t8","collection","capabilities","getDataSourceCapabilities","driver","supportsRLS","securityRules","noRules","slug","t9","op_0","defaultBorderMixin","t10"],"mappings":"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"}
@@ -3,13 +3,12 @@ import React__default, { useState, useRef, useCallback, useEffect } from "react"
3
3
  import { useSnackbarController, useAuthController, useTranslation, BootstrapAdminBanner, ConfirmationDialog } from "@rebasepro/core";
4
4
  import "react-compiler-runtime";
5
5
  import "fast-equals";
6
- import { Container, Typography, Select, SelectItem, SearchBar, Button, Table, TableHeader, TableCell, TableBody, TableRow, Skeleton, Tooltip, IconButton, iconSize, CenteredView, Dialog, DialogTitle, DialogContent, TextField, MultiSelect, MultiSelectItem, DialogActions, LoadingButton } from "@rebasepro/ui";
7
- import { PlusIcon, KeyRoundIcon, Trash2Icon, ChevronLeftIcon, ChevronRightIcon, MailIcon, CheckCircleIcon, CopyIcon } from "lucide-react";
6
+ import { Container, Typography, Select, SelectItem, SearchBar, Button, PlusIcon, Table, TableHeader, TableCell, TableBody, TableRow, Skeleton, Tooltip, IconButton, KeyRoundIcon, iconSize, Trash2Icon, CenteredView, ChevronLeftIcon, ChevronRightIcon, Dialog, DialogTitle, DialogContent, TextField, MultiSelect, MultiSelectItem, DialogActions, LoadingButton } from "@rebasepro/ui";
8
7
  import "@rebasepro/common";
9
8
  import "@rebasepro/formex";
10
9
  import "zod";
11
10
  import "@rebasepro/utils";
12
- import { i as useBreadcrumbsController } from "./util-zfU1zOCX.js";
11
+ import { b9 as useBreadcrumbsController, m as CreationResultDialog } from "./util-DtbWD7LF.js";
13
12
  import "date-fns";
14
13
  import "date-fns/locale";
15
14
  import "@rebasepro/types";
@@ -19,8 +18,7 @@ import "@dnd-kit/sortable";
19
18
  import "@dnd-kit/utilities";
20
19
  import "react-dropzone";
21
20
  import "react-router-dom";
22
- import "react-router";
23
- import "xlsx";
21
+ import "exceljs";
24
22
  import "@rebasepro/schema-inference";
25
23
  import { R as RoleChip } from "./RoleChip-QtUFXeTp.js";
26
24
  const PAGE_SIZE = 25;
@@ -103,11 +101,11 @@ function UsersView({
103
101
  fetchPageRef.current = fetchPage;
104
102
  const initialFetchDone = useRef(false);
105
103
  useEffect(() => {
106
- if (!delegateLoading && hasServerSearch && !initialFetchDone.current) {
104
+ if (!delegateLoading && !usersError && hasServerSearch && !initialFetchDone.current) {
107
105
  initialFetchDone.current = true;
108
106
  fetchPageRef.current(0, "", roleFilter, true);
109
107
  }
110
- }, [delegateLoading, hasServerSearch, roleFilter]);
108
+ }, [delegateLoading, usersError, hasServerSearch, roleFilter]);
111
109
  const handleSearch = useCallback((value) => {
112
110
  setSearchQuery(value);
113
111
  setPage(0);
@@ -280,7 +278,7 @@ function UsersView({
280
278
  }, children: /* @__PURE__ */ jsx(Trash2Icon, { size: iconSize.small }) }) })
281
279
  ] }) })
282
280
  ] }, user_0.uid)),
283
- displayUsers.length === 0 && !tableLoading && !delegateLoading && /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(TableCell, { colspan: 5, children: /* @__PURE__ */ jsxs(CenteredView, { className: "flex flex-col gap-4 my-8 items-center", children: [
281
+ displayUsers.length === 0 && !tableLoading && !delegateLoading && /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(TableCell, { colspan: 6, children: /* @__PURE__ */ jsxs(CenteredView, { className: "flex flex-col gap-4 my-8 items-center", children: [
284
282
  /* @__PURE__ */ jsx(Typography, { variant: "label", children: usersError ? t("no_permission_to_view_users") : searchQuery ? t("no_users_found") : t("no_users_yet") }),
285
283
  usersError && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", children: t("no_permission_description") })
286
284
  ] }) }) })
@@ -310,68 +308,6 @@ function UsersView({
310
308
  }, title: /* @__PURE__ */ jsx(Fragment, { children: t("reset_password") }), body: /* @__PURE__ */ jsx(Fragment, { children: t("reset_password_confirmation") }) })
311
309
  ] });
312
310
  }
313
- function CreationResultDialog({
314
- result,
315
- onClose
316
- }) {
317
- const {
318
- t
319
- } = useTranslation();
320
- const snackbarController = useSnackbarController();
321
- const [copied, setCopied] = useState(false);
322
- const handleCopyPassword = async () => {
323
- if (!result.temporaryPassword) return;
324
- try {
325
- await navigator.clipboard.writeText(result.temporaryPassword);
326
- setCopied(true);
327
- snackbarController.open({
328
- type: "success",
329
- message: t("password_copied") ?? "Password copied to clipboard"
330
- });
331
- setTimeout(() => setCopied(false), 3e3);
332
- } catch {
333
- const textArea = document.createElement("textarea");
334
- textArea.value = result.temporaryPassword;
335
- document.body.appendChild(textArea);
336
- textArea.select();
337
- document.execCommand("copy");
338
- document.body.removeChild(textArea);
339
- setCopied(true);
340
- setTimeout(() => setCopied(false), 3e3);
341
- }
342
- };
343
- if (result.invitationSent) {
344
- return /* @__PURE__ */ jsxs(Dialog, { open: true, onOpenChange: (open) => !open ? onClose() : void 0, maxWidth: "xl", children: [
345
- /* @__PURE__ */ jsx(DialogTitle, { variant: "h5", gutterBottom: false, children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
346
- /* @__PURE__ */ jsx(MailIcon, {}),
347
- t("invitation_sent_title") ?? "Invitation Sent"
348
- ] }) }),
349
- /* @__PURE__ */ jsx(DialogContent, { children: /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-4 py-2", children: /* @__PURE__ */ jsx("div", { className: "bg-green-50 dark:bg-green-900/30 border border-green-200 dark:border-green-800 rounded-lg p-4", children: /* @__PURE__ */ jsx(Typography, { className: "text-green-800 dark:text-green-200", children: (t("invitation_sent") ?? "An invitation email has been sent to {{email}}. They can use the link to set their password.").replace("{{email}}", result.user.email ?? "") }) }) }) }),
350
- /* @__PURE__ */ jsx(DialogActions, { children: /* @__PURE__ */ jsx(Button, { variant: "filled", onClick: onClose, children: t("ok") }) })
351
- ] });
352
- }
353
- if (result.temporaryPassword) {
354
- return /* @__PURE__ */ jsxs(Dialog, { open: true, onOpenChange: (open_0) => !open_0 ? onClose() : void 0, maxWidth: "xl", children: [
355
- /* @__PURE__ */ jsx(DialogTitle, { variant: "h5", gutterBottom: false, children: t("temporary_password") ?? "Temporary Password" }),
356
- /* @__PURE__ */ jsx(DialogContent, { children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4 py-2", children: [
357
- /* @__PURE__ */ jsx("div", { className: "bg-amber-50 dark:bg-amber-900/30 border border-amber-200 dark:border-amber-800 rounded-lg p-4", children: /* @__PURE__ */ jsx(Typography, { className: "text-amber-800 dark:text-amber-200", variant: "body2", children: t("temporary_password_description") ?? "Email is not configured. Share this temporary password with the user securely. It will not be shown again." }) }),
358
- /* @__PURE__ */ jsxs("div", { children: [
359
- /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", className: "mb-1", children: t("email") }),
360
- /* @__PURE__ */ jsx(Typography, { children: result.user.email })
361
- ] }),
362
- /* @__PURE__ */ jsxs("div", { children: [
363
- /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", className: "mb-1", children: t("temporary_password") ?? "Temporary Password" }),
364
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 mt-1", children: [
365
- /* @__PURE__ */ jsx("code", { className: "flex-grow bg-surface-100 dark:bg-surface-900 border border-surface-300 dark:border-surface-600 rounded px-3 py-2 font-mono text-base select-all", children: result.temporaryPassword }),
366
- /* @__PURE__ */ jsx(Tooltip, { title: t("copy_password") ?? "CopyIcon password", asChild: true, children: /* @__PURE__ */ jsx(IconButton, { onClick: handleCopyPassword, children: copied ? /* @__PURE__ */ jsx(CheckCircleIcon, { className: "text-green-600" }) : /* @__PURE__ */ jsx(CopyIcon, {}) }) })
367
- ] })
368
- ] })
369
- ] }) }),
370
- /* @__PURE__ */ jsx(DialogActions, { children: /* @__PURE__ */ jsx(Button, { variant: "filled", onClick: onClose, children: t("ok") }) })
371
- ] });
372
- }
373
- return null;
374
- }
375
311
  function UserDetailsForm({
376
312
  open,
377
313
  user: userProp,
@@ -469,4 +405,4 @@ function UserDetailsForm({
469
405
  export {
470
406
  UsersView
471
407
  };
472
- //# sourceMappingURL=UsersView-BkeblMVT.js.map
408
+ //# sourceMappingURL=UsersView-D7_AtJ44.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UsersView-D7_AtJ44.js","sources":["../src/components/admin/UsersView.tsx"],"sourcesContent":["\nimport React, { useState, useEffect, useCallback, useRef } from \"react\";\nimport { User } from \"@rebasepro/types\";\nimport { useSnackbarController, useAuthController, useTranslation } from \"@rebasepro/core\";\nimport { useBreadcrumbsController } from \"../../index\";\nimport {\n Alert,\n Button,\n CenteredView,\n CheckCircleIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n CircularProgress,\n Container,\n CopyIcon,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n IconButton,\n iconSize,\n KeyRoundIcon,\n LoadingButton,\n MailIcon,\n MultiSelect,\n MultiSelectItem,\n PlusIcon,\n SearchBar,\n Select,\n SelectItem,\n Skeleton,\n Table,\n TableBody,\n TableCell,\n TableHeader,\n TableRow,\n TextField,\n Tooltip,\n Trash2Icon,\n Typography\n} from \"@rebasepro/ui\";\nimport { RoleChip } from \"./RoleChip\";\nimport { UserManagementDelegate, Role, UserCreationResult } from \"@rebasepro/types\";\nimport { ConfirmationDialog, BootstrapAdminBanner } from \"@rebasepro/core\";\nimport { CreationResultDialog } from \"./CreationResultDialog\";\n\n\nconst PAGE_SIZE = 25;\n\n// ============================================\n// UsersView Component\n// ============================================\nexport function UsersView({ userManagement }: {\n userManagement: UserManagementDelegate;\n}) {\n const { roles, saveUser, createUser, deleteUser, resetPassword, loading: delegateLoading, bootstrapAdmin, usersError } = userManagement;\n const snackbarController = useSnackbarController();\n const { user: loggedInUser } = useAuthController();\n const { t } = useTranslation();\n const breadcrumbs = useBreadcrumbsController();\n\n React.useEffect(() => {\n breadcrumbs.set({\n breadcrumbs: [{ title: t(\"users\"),\nurl: \"/users\" }]\n });\n\n }, []);\n\n const [dialogOpen, setDialogOpen] = useState(false);\n const [selectedUser, setSelectedUser] = useState<User | undefined>();\n const [deleteConfirmOpen, setDeleteConfirmOpen] = useState(false);\n const [userToDelete, setUserToDelete] = useState<User | undefined>();\n const [deleteInProgress, setDeleteInProgress] = useState(false);\n const [formKey, setFormKey] = useState(0);\n const [bootstrapping, setBootstrapping] = useState(false);\n\n // Creation result state\n const [creationResult, setCreationResult] = useState<UserCreationResult | null>(null);\n\n // Reset password\n const [resetConfirmOpen, setResetConfirmOpen] = useState(false);\n const [userToReset, setUserToReset] = useState<User | undefined>();\n const [resetInProgress, setResetInProgress] = useState(false);\n\n // Check if server-side search is available\n const hasServerSearch = !!userManagement.searchUsers;\n\n // ---- Server-side pagination state ----\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [roleFilter, setRoleFilter] = useState<string>(\"\");\n const [page, setPage] = useState(0);\n const [paginatedUsers, setPaginatedUsers] = useState<User[]>([]);\n const [totalUsers, setTotalUsers] = useState(0);\n const [tableLoading, setTableLoading] = useState(hasServerSearch);\n\n // Debounce timer ref for search\n const searchTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Fallback: use in-memory users if no searchUsers\n const allUsers = userManagement.users;\n\n /**\n * Fetch a page of users from the server.\n * Only shows the loading skeleton when we have no data yet (initial load).\n * Subsequent re-fetches (pagination, search) update in-place without flashing.\n */\n const fetchPage = useCallback(async (pageNum: number, search: string, filterRole: string, forceLoading = false) => {\n if (!userManagement.searchUsers) return;\n\n // Only show skeleton on initial load or explicit requests (search/filter/page change).\n // This avoids flashing skeletons when the effect re-fires from dep changes.\n if (forceLoading) {\n setTableLoading(true);\n }\n try {\n const result = await userManagement.searchUsers({\n search: search || undefined,\n roleId: filterRole || undefined,\n limit: PAGE_SIZE,\n offset: pageNum * PAGE_SIZE,\n orderBy: \"createdAt\",\n orderDir: \"desc\"\n });\n setPaginatedUsers(result.users);\n setTotalUsers(result.total);\n } catch (error: unknown) {\n console.error(\"Failed to fetch users:\", error);\n snackbarController.open({ type: \"error\",\nmessage: error instanceof Error ? error.message : \"Failed to load users\" });\n } finally {\n setTableLoading(false);\n }\n }, [userManagement.searchUsers, snackbarController]);\n\n // Stable ref for fetchPage so the initial-load effect doesn't re-fire\n // every time fetchPage's reference changes (which happens on parent re-renders).\n const fetchPageRef = useRef(fetchPage);\n fetchPageRef.current = fetchPage;\n const initialFetchDone = useRef(false);\n\n // Load initial page when delegate finishes loading — runs exactly once.\n useEffect(() => {\n if (!delegateLoading && !usersError && hasServerSearch && !initialFetchDone.current) {\n initialFetchDone.current = true;\n fetchPageRef.current(0, \"\", roleFilter, true);\n }\n }, [delegateLoading, usersError, hasServerSearch, roleFilter]);\n\n // Handle search changes (debounced)\n const handleSearch = useCallback((value: string) => {\n setSearchQuery(value);\n setPage(0);\n\n if (searchTimerRef.current) {\n clearTimeout(searchTimerRef.current);\n }\n\n if (hasServerSearch) {\n searchTimerRef.current = setTimeout(() => {\n fetchPage(0, value, roleFilter, true);\n }, 300);\n }\n }, [hasServerSearch, fetchPage, roleFilter]);\n\n const handleRoleFilterChange = useCallback((newRole: string) => {\n setRoleFilter(newRole);\n setPage(0);\n if (hasServerSearch) {\n fetchPage(0, searchQuery, newRole, true);\n }\n }, [hasServerSearch, fetchPage, searchQuery]);\n\n // Handle page change\n const handlePageChange = useCallback((newPage: number) => {\n setPage(newPage);\n if (hasServerSearch) {\n fetchPage(newPage, searchQuery, roleFilter, true);\n }\n }, [hasServerSearch, fetchPage, searchQuery, roleFilter]);\n\n // Refresh current page (after create/update/delete)\n const refreshCurrentPage = useCallback(() => {\n if (hasServerSearch) {\n fetchPage(page, searchQuery, roleFilter);\n }\n }, [hasServerSearch, fetchPage, page, searchQuery, roleFilter]);\n\n // Determine which users to show\n let displayUsers: User[];\n let displayTotal: number;\n\n if (hasServerSearch) {\n displayUsers = paginatedUsers;\n displayTotal = totalUsers;\n } else {\n // Fallback: local filtering for backward compat\n const filtered = allUsers.filter(u => {\n let matches = true;\n if (searchQuery) {\n const q = searchQuery.toLowerCase();\n matches = !!(u.email?.toLowerCase().includes(q) || u.displayName?.toLowerCase().includes(q));\n }\n if (matches && roleFilter) {\n matches = !!u.roles?.includes(roleFilter);\n }\n return matches;\n });\n displayTotal = filtered.length;\n displayUsers = filtered.slice(page * PAGE_SIZE, (page + 1) * PAGE_SIZE);\n }\n\n const totalPages = Math.max(1, Math.ceil(displayTotal / PAGE_SIZE));\n\n // Check if any admin exists\n const hasAdmin = allUsers.some(u => u.roles?.includes(\"admin\"));\n\n const handleBootstrap = async () => {\n if (!bootstrapAdmin) return;\n setBootstrapping(true);\n try {\n await bootstrapAdmin();\n snackbarController.open({ type: \"success\",\nmessage: t(\"bootstrap_admin_success\") });\n window.location.reload();\n } catch (error: unknown) {\n snackbarController.open({ type: \"error\",\nmessage: error instanceof Error ? error.message : t(\"failed_to_bootstrap_admin\") });\n } finally {\n setBootstrapping(false);\n }\n };\n\n const handleAddUser = () => {\n setSelectedUser(undefined);\n setFormKey(k => k + 1);\n setDialogOpen(true);\n };\n\n const handleEditUser = (user: User) => {\n setSelectedUser(user);\n setDialogOpen(true);\n };\n\n const handleClose = () => {\n setDialogOpen(false);\n setSelectedUser(undefined);\n };\n\n const handleDelete = async () => {\n if (!userToDelete || !deleteUser) return;\n setDeleteInProgress(true);\n try {\n await deleteUser(userToDelete);\n snackbarController.open({ type: \"success\",\nmessage: t(\"user_deleted_successfully\") });\n setDeleteConfirmOpen(false);\n setUserToDelete(undefined);\n refreshCurrentPage();\n } catch (error: unknown) {\n snackbarController.open({ type: \"error\",\nmessage: error instanceof Error ? error.message : t(\"error_deleting_user\") });\n } finally {\n setDeleteInProgress(false);\n }\n };\n\n const handleResetPassword = async () => {\n if (!userToReset || !resetPassword) return;\n setResetInProgress(true);\n try {\n const result = await resetPassword(userToReset);\n setResetConfirmOpen(false);\n setUserToReset(undefined);\n setCreationResult(result);\n snackbarController.open({ type: \"success\",\nmessage: t(\"reset_password_success\") });\n } catch (error: unknown) {\n snackbarController.open({ type: \"error\",\nmessage: error instanceof Error ? error.message : t(\"error_resetting_password\") });\n } finally {\n setResetInProgress(false);\n }\n };\n\n return (\n <Container className=\"w-full flex flex-col py-4 gap-4\" maxWidth={\"6xl\"}>\n <BootstrapAdminBanner className=\"mb-4\" />\n\n <div className=\"flex items-center mt-12 mb-4 gap-4\">\n <Typography gutterBottom variant=\"h4\" className=\"grow mb-0\" component=\"h4\">\n {t(\"users\")}\n </Typography>\n {roles && roles.length > 0 && (\n <Select\n value={roleFilter || \"__all__\"}\n onValueChange={(v) => handleRoleFilterChange(v === \"__all__\" ? \"\" : v)}\n placeholder={t(\"all_roles\") || \"All Roles\"}\n size=\"small\"\n className=\"w-48\"\n >\n <SelectItem value=\"__all__\">{t(\"all_roles\") || \"All Roles\"}</SelectItem>\n {roles.map(role => (\n <SelectItem key={role.id} value={role.id}>{role.name}</SelectItem>\n ))}\n </Select>\n )}\n <SearchBar\n placeholder={t(\"search_users\")}\n onTextSearch={(v) => handleSearch(v || \"\")}\n size=\"small\"\n expandable\n />\n <Button startIcon={<PlusIcon/>} onClick={handleAddUser} disabled={!saveUser}>\n {t(\"add_user\")}\n </Button>\n </div>\n\n <div className=\"overflow-auto\">\n <Table className=\"w-full\">\n <TableHeader>\n <TableCell header className=\"w-48\">{t(\"id\") || \"ID\"}</TableCell>\n <TableCell header>{t(\"email\")}</TableCell>\n <TableCell header>{t(\"name\")}</TableCell>\n <TableCell header>{t(\"roles\")}</TableCell>\n <TableCell header className=\"whitespace-nowrap\">{t(\"created\")}</TableCell>\n <TableCell header className=\"w-24 text-right\">{t(\"actions\")}</TableCell>\n </TableHeader>\n <TableBody>\n {(tableLoading || delegateLoading) ? (\n [\n { email: \"w-48\",\nname: \"w-32\",\nroles: [\"w-16\", \"w-20\"] },\n { email: \"w-32\",\nname: \"w-24\",\nroles: [\"w-24\"] },\n { email: \"w-40\",\nname: \"w-36\",\nroles: [\"w-16\", \"w-16\"] }\n ].map((row, i) => (\n <TableRow key={`skeleton-${i}`}>\n <TableCell className=\"font-mono text-xs\"><Skeleton className=\"h-3 w-40\"/></TableCell>\n <TableCell><Skeleton className={`h-4 ${row.email}`}/></TableCell>\n <TableCell className=\"font-medium\"><Skeleton className={`h-4 ${row.name}`}/></TableCell>\n <TableCell>\n <div className=\"flex flex-wrap gap-2\">\n {row.roles.map((w, j) => (\n <Skeleton key={j} className={`h-6 ${w} rounded-full`}/>\n ))}\n </div>\n </TableCell>\n <TableCell className=\"whitespace-nowrap text-sm\">\n <Skeleton className=\"h-4 w-20\"/>\n </TableCell>\n <TableCell className=\"text-right whitespace-nowrap\">\n <div className=\"flex justify-end items-center gap-1\">\n <Skeleton className=\"h-7 w-7 rounded-md\"/>\n <Skeleton className=\"h-7 w-7 rounded-md\"/>\n </div>\n </TableCell>\n </TableRow>\n ))\n ) : (\n displayUsers.map(user => (\n <TableRow key={user.uid} onClick={() => saveUser && handleEditUser(user)}>\n <TableCell className=\"font-mono text-xs\">{user.uid}</TableCell>\n <TableCell>{user.email}</TableCell>\n <TableCell className=\"font-medium\">{user.displayName}</TableCell>\n <TableCell>\n <div className=\"flex flex-wrap gap-2\">\n {user.roles?.map((roleId: string) => {\n const role = roles?.find(r => r.id === roleId);\n return role ? <RoleChip key={roleId} role={role}/> : <span key={roleId}>{roleId}</span>;\n })}\n </div>\n </TableCell>\n <TableCell className=\"whitespace-nowrap text-sm text-surface-accent-600 dark:text-surface-accent-400\">\n {user.createdAt ? new Date(user.createdAt).toLocaleDateString() : \"-\"}\n </TableCell>\n <TableCell className=\"text-right whitespace-nowrap\">\n <div className=\"flex justify-end items-center gap-1\">\n {resetPassword && (\n <Tooltip asChild title={t(\"reset_password\")}>\n <IconButton\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n setUserToReset(user);\n setResetConfirmOpen(true);\n }}>\n <KeyRoundIcon size={iconSize.small}/>\n </IconButton>\n </Tooltip>\n )}\n {deleteUser && (\n <Tooltip asChild title={t(\"delete_this_user\")}>\n <IconButton\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n setUserToDelete(user);\n setDeleteConfirmOpen(true);\n }}>\n <Trash2Icon size={iconSize.small}/>\n </IconButton>\n </Tooltip>\n )}\n </div>\n </TableCell>\n </TableRow>\n )))}\n\n {displayUsers.length === 0 && !tableLoading && !delegateLoading && (\n <TableRow>\n <TableCell colspan={6}>\n <CenteredView className=\"flex flex-col gap-4 my-8 items-center\">\n <Typography variant=\"label\">\n {usersError\n ? t(\"no_permission_to_view_users\")\n : searchQuery ? t(\"no_users_found\") : t(\"no_users_yet\")}\n </Typography>\n {usersError && (\n <Typography variant=\"caption\" color=\"secondary\">\n {t(\"no_permission_description\")}\n </Typography>\n )}\n </CenteredView>\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </div>\n\n {/* Pagination */}\n {displayTotal > PAGE_SIZE && (\n <div className=\"flex items-center justify-between px-2 py-3\">\n <Typography variant=\"body2\" className=\"text-surface-accent-500 dark:text-surface-accent-400\">\n {`${page * PAGE_SIZE + 1}–${Math.min((page + 1) * PAGE_SIZE, displayTotal)} / ${displayTotal}`}\n </Typography>\n <div className=\"flex items-center gap-1\">\n <IconButton\n size=\"small\"\n disabled={page === 0}\n onClick={() => handlePageChange(page - 1)}>\n <ChevronLeftIcon size={iconSize.smallest}/>\n </IconButton>\n <Typography variant=\"body2\" className=\"px-3 text-surface-accent-600 dark:text-surface-accent-300\">\n {page + 1} / {totalPages}\n </Typography>\n <IconButton\n size=\"small\"\n disabled={page >= totalPages - 1}\n onClick={() => handlePageChange(page + 1)}>\n <ChevronRightIcon size={iconSize.smallest}/>\n </IconButton>\n </div>\n </div>\n )}\n\n {/* User Edit Dialog */}\n {saveUser && (\n <UserDetailsForm\n key={selectedUser?.uid ?? `new-${formKey}`}\n open={dialogOpen}\n user={selectedUser}\n roles={roles}\n saveUser={saveUser}\n createUser={createUser}\n handleClose={handleClose}\n onCreationResult={setCreationResult}\n onSaved={refreshCurrentPage}\n />\n )}\n\n {/* Creation Result Dialog */}\n {creationResult && (\n <CreationResultDialog\n result={creationResult}\n onClose={() => setCreationResult(null)}\n />\n )}\n\n {/* Delete Confirmation */}\n <ConfirmationDialog\n open={deleteConfirmOpen}\n loading={deleteInProgress}\n onAccept={handleDelete}\n onCancel={() => { setDeleteConfirmOpen(false); setUserToDelete(undefined); }}\n title={<>{t(\"delete_confirmation_title\")}</>}\n body={<>{t(\"delete_user_confirmation\")}</>}\n />\n\n {/* Reset Password Confirmation */}\n <ConfirmationDialog\n open={resetConfirmOpen}\n loading={resetInProgress}\n onAccept={handleResetPassword}\n onCancel={() => { setResetConfirmOpen(false); setUserToReset(undefined); }}\n title={<>{t(\"reset_password\")}</>}\n body={<>{t(\"reset_password_confirmation\")}</>}\n />\n </Container>\n );\n}\n\n// ============================================\n// UserDetailsForm Component\n// ============================================\nfunction UserDetailsForm({\n open,\n user: userProp,\n roles,\n saveUser,\n createUser,\n handleClose,\n onCreationResult,\n onSaved\n}: {\n open: boolean;\n user?: User;\n roles?: Role[];\n saveUser: (user: User) => Promise<User>;\n createUser?: (user: User) => Promise<UserCreationResult>;\n handleClose: () => void;\n onCreationResult?: (result: UserCreationResult) => void;\n onSaved?: () => void;\n}) {\n const snackbarController = useSnackbarController();\n const { t } = useTranslation();\n const isNewUser = !userProp;\n\n const [displayName, setDisplayName] = useState(userProp?.displayName || \"\");\n const [email, setEmail] = useState(userProp?.email || \"\");\n const [selectedRoleIds, setSelectedRoleIds] = useState<string[]>(\n userProp?.roles || []\n );\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [errors, setErrors] = useState<{ displayName?: string; email?: string; roles?: string }>({});\n const [submitCount, setSubmitCount] = useState(0);\n\n const validate = () => {\n const newErrors: typeof errors = {};\n if (!displayName) newErrors.displayName = \"Required\";\n if (!email) newErrors.email = \"Required\";\n else if (!/\\S+@\\S+\\.\\S+/.test(email)) newErrors.email = \"Invalid email\";\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setSubmitCount(c => c + 1);\n\n if (!validate()) return;\n\n setIsSubmitting(true);\n try {\n const userRoles = selectedRoleIds;\n const userToSave: User = {\n uid: userProp?.uid || crypto.randomUUID(),\n email,\n displayName: displayName || null,\n photoURL: userProp?.photoURL || null,\n providerId: userProp?.providerId || \"custom\",\n isAnonymous: userProp?.isAnonymous || false,\n roles: userRoles\n };\n\n if (isNewUser && createUser && onCreationResult) {\n // Use createUser for new users to get invitation/password info\n const result = await createUser(userToSave);\n handleClose();\n onCreationResult(result);\n } else {\n await saveUser(userToSave);\n handleClose();\n }\n onSaved?.();\n } catch (error: unknown) {\n snackbarController.open({ type: \"error\",\nmessage: error instanceof Error ? error.message : \"Failed to save user\" });\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const dirty = isNewUser ||\n displayName !== (userProp?.displayName || \"\") ||\n email !== (userProp?.email || \"\") ||\n (() => {\n const prev = userProp?.roles || [];\n if (selectedRoleIds.length !== prev.length) return true;\n const set = new Set(prev);\n return selectedRoleIds.some(id => !set.has(id));\n })();\n\n return (\n <Dialog open={open} onOpenChange={(open) => !open ? handleClose() : undefined} maxWidth=\"4xl\">\n <form onSubmit={handleSubmit} autoComplete=\"off\" noValidate\n style={{ display: \"flex\",\nflexDirection: \"column\",\nposition: \"relative\",\nheight: \"100%\" }}>\n\n <DialogTitle variant=\"h4\" gutterBottom={false}>\n {t(\"user\")}\n </DialogTitle>\n\n <DialogContent className=\"h-full grow\">\n <div className=\"grid grid-cols-12 gap-4\">\n {!isNewUser && (\n <div className=\"col-span-12\">\n <TextField\n name=\"uid\"\n value={userProp?.uid || \"\"}\n label={t(\"id\") || \"ID\"}\n disabled\n />\n </div>\n )}\n <div className=\"col-span-12\">\n <TextField\n name=\"displayName\"\n required\n error={submitCount > 0 && Boolean(errors.displayName)}\n value={displayName}\n onChange={(e) => setDisplayName(e.target.value)}\n label={t(\"name\")}\n />\n {submitCount > 0 && errors.displayName && (\n <Typography variant=\"caption\" color=\"error\">{errors.displayName}</Typography>\n )}\n </div>\n\n <div className=\"col-span-12\">\n <TextField\n required\n error={submitCount > 0 && Boolean(errors.email)}\n name=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n label={t(\"email\")}\n disabled={!isNewUser}\n />\n {submitCount > 0 && errors.email && (\n <Typography variant=\"caption\" color=\"error\">{errors.email}</Typography>\n )}\n </div>\n\n {roles && roles.length > 0 && (\n <div className=\"col-span-12\">\n <MultiSelect\n className=\"w-full\"\n label={t(\"roles\")}\n value={selectedRoleIds}\n onValueChange={(value: string[]) => setSelectedRoleIds(value)}\n >\n {roles.map(role => (\n <MultiSelectItem key={role.id} value={role.id}>\n <RoleChip role={role}/>\n </MultiSelectItem>\n ))}\n </MultiSelect>\n </div>\n )}\n </div>\n </DialogContent>\n\n <DialogActions>\n <Button variant=\"text\" onClick={handleClose}>\n {t(\"cancel\")}\n </Button>\n <LoadingButton\n variant=\"filled\"\n type=\"submit\"\n disabled={!dirty}\n loading={isSubmitting}\n >\n {isNewUser ? t(\"create_user\") : t(\"update\")}\n </LoadingButton>\n </DialogActions>\n </form>\n </Dialog>\n );\n}\n"],"names":["PAGE_SIZE","UsersView","userManagement","roles","saveUser","createUser","deleteUser","resetPassword","loading","delegateLoading","bootstrapAdmin","usersError","snackbarController","useSnackbarController","user","loggedInUser","useAuthController","t","useTranslation","breadcrumbs","useBreadcrumbsController","React","useEffect","set","title","url","dialogOpen","setDialogOpen","useState","selectedUser","setSelectedUser","deleteConfirmOpen","setDeleteConfirmOpen","userToDelete","setUserToDelete","deleteInProgress","setDeleteInProgress","formKey","setFormKey","bootstrapping","setBootstrapping","creationResult","setCreationResult","resetConfirmOpen","setResetConfirmOpen","userToReset","setUserToReset","resetInProgress","setResetInProgress","hasServerSearch","searchUsers","searchQuery","setSearchQuery","roleFilter","setRoleFilter","page","setPage","paginatedUsers","setPaginatedUsers","totalUsers","setTotalUsers","tableLoading","setTableLoading","searchTimerRef","useRef","allUsers","users","fetchPage","useCallback","pageNum","search","filterRole","forceLoading","result","undefined","roleId","limit","offset","orderBy","orderDir","total","error","console","open","type","message","Error","fetchPageRef","current","initialFetchDone","handleSearch","value","clearTimeout","setTimeout","handleRoleFilterChange","newRole","handlePageChange","newPage","refreshCurrentPage","displayUsers","displayTotal","filtered","filter","u","matches","q","toLowerCase","email","includes","displayName","length","slice","totalPages","Math","max","ceil","some","handleAddUser","k","handleEditUser","handleClose","handleDelete","handleResetPassword","v","map","role","id","name","row","i","w","j","uid","find","r","createdAt","Date","toLocaleDateString","e","stopPropagation","iconSize","small","min","smallest","UserDetailsForm","userProp","onCreationResult","onSaved","isNewUser","setDisplayName","setEmail","selectedRoleIds","setSelectedRoleIds","isSubmitting","setIsSubmitting","errors","setErrors","submitCount","setSubmitCount","validate","newErrors","test","Object","keys","handleSubmit","preventDefault","c","userRoles","userToSave","crypto","randomUUID","photoURL","providerId","isAnonymous","dirty","prev","Set","has","display","flexDirection","position","height","Boolean","target"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  export declare function LayoutModeSwitch({ value, onChange, className }: {
2
- value: "side_panel" | "full_screen" | "split";
3
- onChange: (value: "side_panel" | "full_screen" | "split") => void;
2
+ value: "side_panel" | "full_screen" | "split" | "dialog";
3
+ onChange: (value: "side_panel" | "full_screen" | "split" | "dialog") => void;
4
4
  className?: string;
5
5
  }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,3 @@
1
+ export declare function VectorPropertyField({ disabled }: {
2
+ disabled: boolean;
3
+ }): import("react/jsx-runtime").JSX.Element;
@@ -1,11 +1,11 @@
1
- import { CollectionEditorDialog } from "./CollectionEditorDialog-ywdxhs1L.js";
2
- import { P, a } from "./PropertyEditView-BuZrNnBN.js";
3
- import { C, a as a2 } from "./CollectionsStudioView-BDzMFzqH.js";
1
+ import { CollectionEditorDialog } from "./CollectionEditorDialog-BXIh2AXg.js";
2
+ import { a, b } from "./PropertyEditView-BB5xjnhZ.js";
3
+ import { C, a as a2 } from "./CollectionsStudioView-jR8iz_ja.js";
4
4
  export {
5
5
  CollectionEditorDialog,
6
6
  C as CollectionStudioView,
7
7
  a2 as CollectionsStudioView,
8
- P as PropertyForm,
9
- a as PropertyFormDialog
8
+ a as PropertyForm,
9
+ b as PropertyFormDialog
10
10
  };
11
11
  //# sourceMappingURL=collection_editor_ui.js.map
@@ -30,7 +30,7 @@ export declare const EntityCollectionRowActions: ({ entity, collection, path, wi
30
30
  selectionController?: SelectionController;
31
31
  highlightEntity?: (entity: Entity<any>) => void;
32
32
  unhighlightEntity?: (entity: Entity<any>) => void;
33
- openEntityMode: "side_panel" | "full_screen" | "split";
33
+ openEntityMode: "side_panel" | "full_screen" | "split" | "dialog";
34
34
  sortableNodeRef?: (node: HTMLElement | null) => void;
35
35
  sortableStyle?: React.CSSProperties;
36
36
  sortableAttributes?: Record<string, any>;
@@ -108,7 +108,7 @@ export type EntityCollectionTableProps<M extends Record<string, unknown>, USER e
108
108
  emptyComponent?: React.ReactNode;
109
109
  getIdColumnWidth?: () => number;
110
110
  enablePopupIcon: boolean;
111
- openEntityMode?: "side_panel" | "full_screen" | "split";
111
+ openEntityMode?: "side_panel" | "full_screen" | "split" | "dialog";
112
112
  /**
113
113
  * Callback when columns are reordered via drag-and-drop
114
114
  */
@@ -1,6 +1,6 @@
1
1
  import type { EntityCollection } from "@rebasepro/types";
2
2
  import React from "react";
3
- import { CollectionSize, Entity, EntityTableController, SelectionController } from "@rebasepro/types";
3
+ import { CollectionSize, Entity, EntityAction, EntityTableController, SelectionController } from "@rebasepro/types";
4
4
  export type EntityCollectionListViewProps<M extends Record<string, unknown> = Record<string, unknown>> = {
5
5
  collection: EntityCollection<M>;
6
6
  tableController: EntityTableController<M>;
@@ -23,6 +23,22 @@ export type EntityCollectionListViewProps<M extends Record<string, unknown> = Re
23
23
  * row is visually highlighted with a primary accent.
24
24
  */
25
25
  selectedEntityId?: string | number;
26
+ /**
27
+ * Callback to get entity actions for a given entity.
28
+ * Only actions with `showActionsInListView: true` will be rendered.
29
+ */
30
+ getActionsForEntity?: (params: {
31
+ entity?: Entity<M>;
32
+ customEntityActions?: EntityAction[];
33
+ }) => EntityAction[];
34
+ /**
35
+ * Full path of the collection, used as context for action handlers.
36
+ */
37
+ path?: string;
38
+ /**
39
+ * How entities open when an action triggers navigation.
40
+ */
41
+ openEntityMode?: "side_panel" | "full_screen" | "split" | "dialog";
26
42
  };
27
43
  /**
28
44
  * Classic CMS list view for displaying entities.
@@ -31,4 +47,4 @@ export type EntityCollectionListViewProps<M extends Record<string, unknown> = Re
31
47
  * - Column-sortable headers
32
48
  * - Infinite scroll
33
49
  */
34
- export declare function EntityCollectionListView<M extends Record<string, unknown> = Record<string, unknown>>({ collection, tableController, onEntityClick, selectionController, selectionEnabled, highlightedEntities, emptyComponent, size, selectedEntityId }: EntityCollectionListViewProps<M>): import("react/jsx-runtime").JSX.Element;
50
+ export declare function EntityCollectionListView<M extends Record<string, unknown> = Record<string, unknown>>({ collection, tableController, onEntityClick, selectionController, selectionEnabled, highlightedEntities, emptyComponent, size, selectedEntityId, getActionsForEntity, path, openEntityMode }: EntityCollectionListViewProps<M>): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,21 @@
1
+ import type { EntityTableController, FilterPreset } from "@rebasepro/types";
2
+ export interface FilterPresetsButtonProps<M extends Record<string, unknown>> {
3
+ filterPresets: FilterPreset<Extract<keyof M, string> | (string & {})>[];
4
+ tableController: EntityTableController<M>;
5
+ compact?: boolean;
6
+ }
7
+ /**
8
+ * Filter Presets — displayed as inline toggle chips in the collection toolbar.
9
+ *
10
+ * Active state is **derived** from the controller's actual filter values,
11
+ * not tracked locally. A chip is "active" when ALL of its filter entries
12
+ * match the current controller state (deep value comparison, no JSON.stringify).
13
+ *
14
+ * This means:
15
+ * - Toggling a preset on adds its filters to the controller.
16
+ * - Toggling it off removes its filter keys.
17
+ * - Changing filters via the dialog automatically deactivates unmatched chips.
18
+ * - Clearing all filters deactivates all chips.
19
+ * - Multiple presets can be active simultaneously.
20
+ */
21
+ export declare function FilterPresetsButton<M extends Record<string, unknown>>({ filterPresets, tableController, compact }: FilterPresetsButtonProps<M>): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,31 @@
1
+ import type { EntityCollection } from "@rebasepro/types";
2
+ import React from "react";
3
+ import { EntityStatus } from "@rebasepro/types";
4
+ export declare const MAIN_TAB_VALUE = "__main_##Q$SC^#S6";
5
+ export declare const JSON_TAB_VALUE = "__json";
6
+ export declare const HISTORY_TAB_VALUE = "__rebase_history";
7
+ export type BarActionsParams = {
8
+ values: object;
9
+ status: EntityStatus;
10
+ path: string;
11
+ entityId?: string | number;
12
+ };
13
+ export type OnTabChangeParams<M extends Record<string, unknown>> = {
14
+ path: string;
15
+ entityId?: string | number;
16
+ selectedTab?: string;
17
+ collection: EntityCollection<M>;
18
+ };
19
+ export interface EntityDetailViewProps<M extends Record<string, unknown> = Record<string, unknown>> {
20
+ path: string;
21
+ collection: EntityCollection<M>;
22
+ entityId: string | number;
23
+ selectedTab?: string;
24
+ parentCollectionSlugs: string[];
25
+ parentEntityIds: string[];
26
+ onTabChange?: (props: OnTabChangeParams<M>) => void;
27
+ onEditClick?: () => void;
28
+ layout?: "side_panel" | "full_screen" | "split" | "dialog";
29
+ barActions?: (params: BarActionsParams) => React.ReactNode;
30
+ }
31
+ export declare function EntityDetailView<M extends Record<string, unknown>>({ entityId, ...props }: EntityDetailViewProps<M>): import("react/jsx-runtime").JSX.Element;
@@ -31,7 +31,8 @@ export interface EntityEditViewProps<M extends Record<string, unknown> = Record<
31
31
  onValuesModified?: (modified: boolean, values: M) => void;
32
32
  onSaved?: (params: OnUpdateParams) => void;
33
33
  onTabChange?: (props: OnTabChangeParams<M>) => void;
34
- layout?: "side_panel" | "full_screen" | "split";
34
+ navigateBack?: () => void;
35
+ layout?: "side_panel" | "full_screen" | "split" | "dialog";
35
36
  barActions?: (params: BarActionsParams) => any;
36
37
  formProps?: Partial<EntityFormProps<M>>;
37
38
  /**
@@ -46,7 +47,7 @@ export interface EntityEditViewProps<M extends Record<string, unknown> = Record<
46
47
  * an entity is opened.
47
48
  */
48
49
  export declare function EntityEditView<M extends Record<string, unknown>>({ entityId, ...props }: EntityEditViewProps<M>): import("react/jsx-runtime").JSX.Element;
49
- export declare function EntityEditViewInner<M extends Record<string, unknown>>({ path, entityId, selectedTab: selectedTabProp, collection, parentCollectionSlugs, parentEntityIds, onValuesModified, onSaved, onTabChange, entity, initialDirtyValues, dataLoading, layout, barActions, status, setStatus, formProps, canEdit }: EntityEditViewProps<M> & {
50
+ export declare function EntityEditViewInner<M extends Record<string, unknown>>({ path, entityId, selectedTab: selectedTabProp, collection, parentCollectionSlugs, parentEntityIds, onValuesModified, onSaved, onTabChange, navigateBack, entity, initialDirtyValues, dataLoading, layout, barActions, status, setStatus, formProps, canEdit }: EntityEditViewProps<M> & {
50
51
  entity?: Entity<M>;
51
52
  initialDirtyValues?: Partial<M>;
52
53
  dataLoading: boolean;
@@ -56,4 +56,4 @@ export interface EntitySelectionProps<M extends Record<string, unknown>> {
56
56
  * You probably want to open this dialog as a side view using {@link useEntitySelectionTable}
57
57
  * @group Components
58
58
  */
59
- export declare function EntitySelectionTable<M extends Record<string, unknown>>({ onSingleEntitySelected, onMultipleEntitiesSelected, multiselect, collection, path: pathInput, selectedEntityIds: selectedEntityIdsProp, description, fixedFilter, maxSelection }: EntitySelectionProps<M>): import("react/jsx-runtime").JSX.Element;
59
+ export declare function EntitySelectionTable<M extends Record<string, unknown>>(props: EntitySelectionProps<M>): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,5 @@
1
+ import { UserCreationResult } from "@rebasepro/types";
2
+ export declare function CreationResultDialog({ result, onClose }: {
3
+ result: UserCreationResult;
4
+ onClose: () => void;
5
+ }): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,2 @@
1
+ import { CollectionActionsProps } from "@rebasepro/types";
2
+ export declare function RolesFilterSelect({ tableController }: CollectionActionsProps<any>): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,2 @@
1
+ import { FieldProps } from "../../types/fields";
2
+ export declare function UserRolesSelectField({ propertyKey, value, setValue, disabled }: FieldProps): import("react/jsx-runtime").JSX.Element;