@rebasepro/admin 0.0.1-canary.f81da60 → 0.1.2

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 (95) hide show
  1. package/dist/{CollectionEditorDialog-D509-IMx.js → CollectionEditorDialog-ywdxhs1L.js} +18 -18
  2. package/dist/CollectionEditorDialog-ywdxhs1L.js.map +1 -0
  3. package/dist/{CollectionsStudioView-B549BDpU.js → CollectionsStudioView-BDzMFzqH.js} +4 -4
  4. package/dist/{CollectionsStudioView-B549BDpU.js.map → CollectionsStudioView-BDzMFzqH.js.map} +1 -1
  5. package/dist/{ContentHomePage--Bl1FXk7.js → ContentHomePage-0tHuEIm_.js} +26 -26
  6. package/dist/ContentHomePage-0tHuEIm_.js.map +1 -0
  7. package/dist/{ExportCollectionAction-CttNAdM1.js → ExportCollectionAction-BIrq92To.js} +2 -2
  8. package/dist/{ExportCollectionAction-CttNAdM1.js.map → ExportCollectionAction-BIrq92To.js.map} +1 -1
  9. package/dist/{ImportCollectionAction-BB33kxAN.js → ImportCollectionAction-h8yg_To8.js} +2 -2
  10. package/dist/{ImportCollectionAction-BB33kxAN.js.map → ImportCollectionAction-h8yg_To8.js.map} +1 -1
  11. package/dist/{PropertyEditView-UtDO8g0A.js → PropertyEditView-BuZrNnBN.js} +79 -101
  12. package/dist/PropertyEditView-BuZrNnBN.js.map +1 -0
  13. package/dist/{RolesView-B0E7L0hE.js → RolesView-CMPsaIXo.js} +2 -2
  14. package/dist/{RolesView-B0E7L0hE.js.map → RolesView-CMPsaIXo.js.map} +1 -1
  15. package/dist/{UsersView-BM2_7VPV.js → UsersView-BkeblMVT.js} +6 -28
  16. package/dist/UsersView-BkeblMVT.js.map +1 -0
  17. package/dist/collection_editor/ConfigControllerProvider.d.ts +0 -4
  18. package/dist/collection_editor/ui/collection_editor/CollectionDetailsForm.d.ts +1 -3
  19. package/dist/collection_editor/ui/collection_editor/CollectionEditorDialog.d.ts +0 -2
  20. package/dist/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.d.ts +1 -2
  21. package/dist/collection_editor_ui.js +3 -3
  22. package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +5 -1
  23. package/dist/components/EntityCollectionView/EntityCollectionViewActions.d.ts +2 -1
  24. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +2 -1
  25. package/dist/components/EntityEditView.d.ts +6 -0
  26. package/dist/components/RebaseCMS.d.ts +1 -1
  27. package/dist/{index-C9YDsMC9.js → index-BuZaHcyc.js} +3 -3
  28. package/dist/index-BuZaHcyc.js.map +1 -0
  29. package/dist/{index-CNDetux9.js → index-CS6uJ7oW.js} +2 -2
  30. package/dist/{index-CNDetux9.js.map → index-CS6uJ7oW.js.map} +1 -1
  31. package/dist/{index-DO7lMeNB.js → index-eRJbMvHi.js} +3 -3
  32. package/dist/index-eRJbMvHi.js.map +1 -0
  33. package/dist/index.js +18 -14
  34. package/dist/index.js.map +1 -1
  35. package/dist/util/navigation_utils.d.ts +10 -1
  36. package/dist/{util-DK1O3uM0.js → util-zfU1zOCX.js} +713 -603
  37. package/dist/util-zfU1zOCX.js.map +1 -0
  38. package/package.json +8 -8
  39. package/src/collection_editor/ConfigControllerProvider.tsx +1 -10
  40. package/src/collection_editor/ui/collection_editor/CollectionDetailsForm.tsx +3 -47
  41. package/src/collection_editor/ui/collection_editor/CollectionEditorDialog.tsx +2 -10
  42. package/src/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.tsx +1 -3
  43. package/src/collection_editor/ui/collection_editor/CollectionRelationsTab.tsx +3 -3
  44. package/src/collection_editor/ui/collection_editor/GetCodeDialog.tsx +0 -1
  45. package/src/collection_editor/ui/collection_editor/PropertyFieldPreview.tsx +6 -6
  46. package/src/collection_editor/ui/collection_editor/properties/MapPropertyField.tsx +1 -1
  47. package/src/collection_editor/ui/collection_editor/properties/ReferencePropertyField.tsx +15 -49
  48. package/src/collection_editor/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.tsx +2 -3
  49. package/src/collection_editor/ui/collection_editor/templates/pages_template.ts +1 -1
  50. package/src/collection_editor/ui/collection_editor/templates/products_template.ts +2 -2
  51. package/src/components/DefaultAppBar.tsx +2 -2
  52. package/src/components/DefaultDrawer.tsx +25 -17
  53. package/src/components/DrawerNavigationGroup.tsx +4 -4
  54. package/src/components/DrawerNavigationItem.tsx +6 -6
  55. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +5 -3
  56. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +1 -1
  57. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +8 -2
  58. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +2 -2
  59. package/src/components/EntityCollectionTable/table_bindings.tsx +37 -27
  60. package/src/components/EntityCollectionView/EntityCard.tsx +2 -2
  61. package/src/components/EntityCollectionView/EntityCollectionCardView.tsx +4 -3
  62. package/src/components/EntityCollectionView/EntityCollectionListView.tsx +7 -6
  63. package/src/components/EntityCollectionView/EntityCollectionView.tsx +50 -7
  64. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +17 -8
  65. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +8 -4
  66. package/src/components/EntityCollectionView/useEntityPreviewSlots.ts +33 -5
  67. package/src/components/EntityEditView.tsx +80 -81
  68. package/src/components/EntitySidePanel.tsx +11 -7
  69. package/src/components/HomePage/ContentHomePage.tsx +24 -15
  70. package/src/components/HomePage/NavigationCard.tsx +4 -4
  71. package/src/components/HomePage/NavigationGroup.tsx +2 -2
  72. package/src/components/RebaseAuthGate.tsx +2 -0
  73. package/src/components/RebaseCMS.tsx +4 -3
  74. package/src/components/RebaseNavigation.tsx +7 -4
  75. package/src/components/RelationSelector.tsx +30 -2
  76. package/src/components/SelectableTable/SelectableTable.tsx +2 -2
  77. package/src/components/UserSelector.tsx +1 -1
  78. package/src/components/admin/UsersView.tsx +2 -17
  79. package/src/components/app/Scaffold.tsx +3 -3
  80. package/src/components/field_configs.tsx +3 -3
  81. package/src/form/PropertyFieldBinding.tsx +10 -6
  82. package/src/hooks/navigation/useResolvedViews.tsx +1 -3
  83. package/src/hooks/navigation/useTopLevelNavigation.ts +1 -1
  84. package/src/hooks/navigation/utils.ts +1 -1
  85. package/src/preview/PropertyPreview.tsx +17 -13
  86. package/src/routes/RebaseRoute.tsx +27 -2
  87. package/src/util/navigation_utils.ts +16 -2
  88. package/src/util/previews.ts +14 -5
  89. package/dist/CollectionEditorDialog-D509-IMx.js.map +0 -1
  90. package/dist/ContentHomePage--Bl1FXk7.js.map +0 -1
  91. package/dist/PropertyEditView-UtDO8g0A.js.map +0 -1
  92. package/dist/UsersView-BM2_7VPV.js.map +0 -1
  93. package/dist/index-C9YDsMC9.js.map +0 -1
  94. package/dist/index-DO7lMeNB.js.map +0 -1
  95. package/dist/util-DK1O3uM0.js.map +0 -1
@@ -9,7 +9,7 @@ import { useSnackbarController, useTranslation, ConfirmationDialog } from "@reba
9
9
  import "@rebasepro/formex";
10
10
  import "zod";
11
11
  import "@rebasepro/utils";
12
- import { i as useBreadcrumbsController, e as useCollectionRegistryController } from "./util-DK1O3uM0.js";
12
+ import { i as useBreadcrumbsController, e as useCollectionRegistryController } from "./util-zfU1zOCX.js";
13
13
  import "date-fns";
14
14
  import "date-fns/locale";
15
15
  import { getDataSourceCapabilities } from "@rebasepro/types";
@@ -423,4 +423,4 @@ function CollectionPermissionsMatrix(t0) {
423
423
  export {
424
424
  RolesView
425
425
  };
426
- //# sourceMappingURL=RolesView-B0E7L0hE.js.map
426
+ //# sourceMappingURL=RolesView-CMPsaIXo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RolesView-B0E7L0hE.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 { Button, Chip, Container, Dialog, DialogActions, DialogContent, DialogTitle, IconButton, Paper, Table, TableBody, TableCell, TableHeader, TableRow, TextField, Typography, CircularProgress, CenteredView, Tooltip, Checkbox, LoadingButton, defaultBorderMixin , iconSize } from \"@rebasepro/ui\";\nimport { PlusIcon, Trash2Icon } from \"lucide-react\";\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 = () => {\n if (!saveRole) return;\n const defaultRoles: Role[] = [\n { id: \"admin\",\nname: \"Admin\",\nisAdmin: true },\n { id: \"editor\",\nname: \"Editor\",\nisAdmin: false },\n { id: \"viewer\",\nname: \"Viewer\",\nisAdmin: false }\n ];\n defaultRoles.forEach(role => saveRole(role));\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 <span className=\"font-medium\">{t(\"is_admin\")}</span>\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={!isNewRole && !isAdmin}\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","forEach","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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"}
1
+ {"version":3,"file":"RolesView-CMPsaIXo.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 { Button, Chip, Container, Dialog, DialogActions, DialogContent, DialogTitle, IconButton, Paper, Table, TableBody, TableCell, TableHeader, TableRow, TextField, Typography, CircularProgress, CenteredView, Tooltip, Checkbox, LoadingButton, defaultBorderMixin , iconSize } from \"@rebasepro/ui\";\nimport { PlusIcon, Trash2Icon } from \"lucide-react\";\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 = () => {\n if (!saveRole) return;\n const defaultRoles: Role[] = [\n { id: \"admin\",\nname: \"Admin\",\nisAdmin: true },\n { id: \"editor\",\nname: \"Editor\",\nisAdmin: false },\n { id: \"viewer\",\nname: \"Viewer\",\nisAdmin: false }\n ];\n defaultRoles.forEach(role => saveRole(role));\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 <span className=\"font-medium\">{t(\"is_admin\")}</span>\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={!isNewRole && !isAdmin}\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","forEach","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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"}
@@ -1,15 +1,15 @@
1
1
  import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
2
  import React__default, { useState, useRef, useCallback, useEffect } from "react";
3
- import { useSnackbarController, useAuthController, useTranslation, ConfirmationDialog } from "@rebasepro/core";
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, Button, CircularProgress, Select, SelectItem, SearchBar, Table, TableHeader, TableCell, TableBody, TableRow, Skeleton, Tooltip, IconButton, iconSize, CenteredView, Dialog, DialogTitle, DialogContent, TextField, MultiSelect, MultiSelectItem, DialogActions, LoadingButton } from "@rebasepro/ui";
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
7
  import { PlusIcon, KeyRoundIcon, Trash2Icon, ChevronLeftIcon, ChevronRightIcon, MailIcon, CheckCircleIcon, CopyIcon } from "lucide-react";
8
8
  import "@rebasepro/common";
9
9
  import "@rebasepro/formex";
10
10
  import "zod";
11
11
  import "@rebasepro/utils";
12
- import { i as useBreadcrumbsController } from "./util-DK1O3uM0.js";
12
+ import { i as useBreadcrumbsController } from "./util-zfU1zOCX.js";
13
13
  import "date-fns";
14
14
  import "date-fns/locale";
15
15
  import "@rebasepro/types";
@@ -159,26 +159,7 @@ function UsersView({
159
159
  displayUsers = filtered.slice(page * PAGE_SIZE, (page + 1) * PAGE_SIZE);
160
160
  }
161
161
  const totalPages = Math.max(1, Math.ceil(displayTotal / PAGE_SIZE));
162
- const hasAdmin = allUsers.some((u_0) => u_0.roles?.includes("admin"));
163
- const handleBootstrap = async () => {
164
- if (!bootstrapAdmin) return;
165
- setBootstrapping(true);
166
- try {
167
- await bootstrapAdmin();
168
- snackbarController.open({
169
- type: "success",
170
- message: t("bootstrap_admin_success")
171
- });
172
- window.location.reload();
173
- } catch (error_0) {
174
- snackbarController.open({
175
- type: "error",
176
- message: error_0 instanceof Error ? error_0.message : t("failed_to_bootstrap_admin")
177
- });
178
- } finally {
179
- setBootstrapping(false);
180
- }
181
- };
162
+ allUsers.some((u_0) => u_0.roles?.includes("admin"));
182
163
  const handleAddUser = () => {
183
164
  setSelectedUser(void 0);
184
165
  setFormKey((k) => k + 1);
@@ -235,10 +216,7 @@ function UsersView({
235
216
  }
236
217
  };
237
218
  return /* @__PURE__ */ jsxs(Container, { className: "w-full flex flex-col py-4 gap-4", maxWidth: "6xl", children: [
238
- !delegateLoading && !hasAdmin && !usersError && loggedInUser && bootstrapAdmin && /* @__PURE__ */ jsxs("div", { className: "bg-yellow-100 dark:bg-yellow-900 border border-yellow-400 dark:border-yellow-700 rounded p-4 flex items-center justify-between", children: [
239
- /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(Typography, { variant: "label", className: "text-yellow-800 dark:text-yellow-200", children: t("no_users_or_roles_defined") }) }),
240
- /* @__PURE__ */ jsx(Button, { onClick: handleBootstrap, disabled: bootstrapping, children: bootstrapping ? /* @__PURE__ */ jsx(CircularProgress, { size: "small" }) : t("add_logged_user_as_admin") })
241
- ] }),
219
+ /* @__PURE__ */ jsx(BootstrapAdminBanner, { className: "mb-4" }),
242
220
  /* @__PURE__ */ jsxs("div", { className: "flex items-center mt-12 mb-4 gap-4", children: [
243
221
  /* @__PURE__ */ jsx(Typography, { gutterBottom: true, variant: "h4", className: "grow mb-0", component: "h4", children: t("users") }),
244
222
  roles && roles.length > 0 && /* @__PURE__ */ jsxs(Select, { value: roleFilter || "__all__", onValueChange: (v) => handleRoleFilterChange(v === "__all__" ? "" : v), placeholder: t("all_roles") || "All Roles", size: "small", className: "w-48", children: [
@@ -491,4 +469,4 @@ function UserDetailsForm({
491
469
  export {
492
470
  UsersView
493
471
  };
494
- //# sourceMappingURL=UsersView-BM2_7VPV.js.map
472
+ //# sourceMappingURL=UsersView-BkeblMVT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UsersView-BkeblMVT.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 { Button, Container, Dialog, DialogActions, DialogContent, DialogTitle, IconButton, Table, TableBody, TableCell, TableHeader, TableRow, TextField, Typography, CircularProgress, CenteredView, Tooltip, MultiSelect, MultiSelectItem, LoadingButton, SearchBar, Select, SelectItem, Skeleton , iconSize } from \"@rebasepro/ui\";\nimport { MailIcon, KeyRoundIcon, PlusIcon, Trash2Icon, CopyIcon, CheckCircleIcon, ChevronLeftIcon, ChevronRightIcon } from \"lucide-react\";\nimport { RoleChip } from \"./RoleChip\";\nimport { UserManagementDelegate, Role, UserCreationResult } from \"@rebasepro/types\";\nimport { ConfirmationDialog, BootstrapAdminBanner } from \"@rebasepro/core\";\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 && hasServerSearch && !initialFetchDone.current) {\n initialFetchDone.current = true;\n fetchPageRef.current(0, \"\", roleFilter, true);\n }\n }, [delegateLoading, 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={5}>\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// CreationResultDialog Component\n// ============================================\nfunction CreationResultDialog({\n result,\n onClose\n}: {\n result: UserCreationResult;\n onClose: () => void;\n}) {\n const { t } = useTranslation();\n const snackbarController = useSnackbarController();\n const [copied, setCopied] = useState(false);\n\n const handleCopyPassword = async () => {\n if (!result.temporaryPassword) return;\n try {\n await navigator.clipboard.writeText(result.temporaryPassword);\n setCopied(true);\n snackbarController.open({ type: \"success\",\nmessage: t(\"password_copied\") ?? \"Password copied to clipboard\" });\n setTimeout(() => setCopied(false), 3000);\n } catch {\n // Fallback for older browsers\n const textArea = document.createElement(\"textarea\");\n textArea.value = result.temporaryPassword;\n document.body.appendChild(textArea);\n textArea.select();\n document.execCommand(\"copy\");\n document.body.removeChild(textArea);\n setCopied(true);\n setTimeout(() => setCopied(false), 3000);\n }\n };\n\n if (result.invitationSent) {\n // Invitation sent via email\n return (\n <Dialog open={true} onOpenChange={(open) => !open ? onClose() : undefined} maxWidth=\"xl\">\n <DialogTitle variant=\"h5\" gutterBottom={false}>\n <div className=\"flex items-center gap-3\">\n <MailIcon/>\n {t(\"invitation_sent_title\") ?? \"Invitation Sent\"}\n </div>\n </DialogTitle>\n <DialogContent>\n <div className=\"flex flex-col gap-4 py-2\">\n <div className=\"bg-green-50 dark:bg-green-900/30 border border-green-200 dark:border-green-800 rounded-lg p-4\">\n <Typography className=\"text-green-800 dark:text-green-200\">\n {(t(\"invitation_sent\") ?? \"An invitation email has been sent to {{email}}. They can use the link to set their password.\")\n .replace(\"{{email}}\", result.user.email ?? \"\")}\n </Typography>\n </div>\n </div>\n </DialogContent>\n <DialogActions>\n <Button variant=\"filled\" onClick={onClose}>\n {t(\"ok\")}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n if (result.temporaryPassword) {\n // No email — show temporary password\n return (\n <Dialog open={true} onOpenChange={(open) => !open ? onClose() : undefined} maxWidth=\"xl\">\n <DialogTitle variant=\"h5\" gutterBottom={false}>\n {t(\"temporary_password\") ?? \"Temporary Password\"}\n </DialogTitle>\n <DialogContent>\n <div className=\"flex flex-col gap-4 py-2\">\n <div className=\"bg-amber-50 dark:bg-amber-900/30 border border-amber-200 dark:border-amber-800 rounded-lg p-4\">\n <Typography className=\"text-amber-800 dark:text-amber-200\" variant=\"body2\">\n {t(\"temporary_password_description\") ??\n \"Email is not configured. Share this temporary password with the user securely. It will not be shown again.\"}\n </Typography>\n </div>\n\n <div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"mb-1\">\n {t(\"email\")}\n </Typography>\n <Typography>\n {result.user.email}\n </Typography>\n </div>\n\n <div>\n <Typography variant=\"caption\" color=\"secondary\" className=\"mb-1\">\n {t(\"temporary_password\") ?? \"Temporary Password\"}\n </Typography>\n <div className=\"flex items-center gap-2 mt-1\">\n <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\">\n {result.temporaryPassword}\n </code>\n <Tooltip title={t(\"copy_password\") ?? \"CopyIcon password\"} asChild>\n <IconButton onClick={handleCopyPassword}>\n {copied ? <CheckCircleIcon className=\"text-green-600\"/> : <CopyIcon/>}\n </IconButton>\n </Tooltip>\n </div>\n </div>\n </div>\n </DialogContent>\n <DialogActions>\n <Button variant=\"filled\" onClick={onClose}>\n {t(\"ok\")}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n // Shouldn't happen, but fallback\n return null;\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","CreationResultDialog","onClose","copied","setCopied","handleCopyPassword","temporaryPassword","navigator","clipboard","writeText","textArea","document","createElement","body","appendChild","select","execCommand","removeChild","invitationSent","replace","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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"}
@@ -20,10 +20,6 @@ export interface ConfigControllerProviderProps {
20
20
  * Use this builder to define the permissions for the configuration per user.
21
21
  */
22
22
  configPermissions?: CollectionEditorPermissionsBuilder;
23
- /**
24
- * Groups that cannot be used to create new collections.
25
- */
26
- reservedGroups?: string[];
27
23
  extraView?: {
28
24
  View: React.ComponentType<{
29
25
  path: string;
@@ -1,10 +1,8 @@
1
1
  import { EntityCollection } from "@rebasepro/types";
2
- export declare function CollectionDetailsForm({ isNewCollection, reservedGroups, existingPaths, existingIds, groups, parentCollection, expandKanban }: {
2
+ export declare function CollectionDetailsForm({ isNewCollection, existingPaths, existingIds, parentCollection, expandKanban }: {
3
3
  isNewCollection: boolean;
4
- reservedGroups?: string[];
5
4
  existingPaths?: string[];
6
5
  existingIds?: string[];
7
- groups: string[] | null;
8
6
  parentCollection?: EntityCollection;
9
7
  parentCollectionSlugs?: string[];
10
8
  parentEntityIds?: string[];
@@ -8,7 +8,6 @@ export interface CollectionEditorDialogProps {
8
8
  open: boolean;
9
9
  isNewCollection: boolean;
10
10
  initialValues?: {
11
- group?: string;
12
11
  slug?: string;
13
12
  name?: string;
14
13
  };
@@ -23,7 +22,6 @@ export interface CollectionEditorDialogProps {
23
22
  parentEntityIds?: string[];
24
23
  handleClose: (collection?: EntityCollection) => void;
25
24
  configController: CollectionsConfigController;
26
- reservedGroups?: string[];
27
25
  collectionInference?: CollectionInference;
28
26
  extraView?: {
29
27
  View: React.ComponentType<{
@@ -6,12 +6,11 @@ type CollectionEditorFormProps = {
6
6
  propertyErrorsRef?: React.MutableRefObject<any>;
7
7
  onPropertyError: (propertyKey: string, namespace: string | undefined, error?: Record<string, any>) => void;
8
8
  setDirty?: (dirty: boolean) => void;
9
- reservedGroups?: string[];
10
9
  extraIcon: React.ReactNode | any;
11
10
  getUser?: (uid: string) => User | null;
12
11
  getData?: () => Promise<object[]>;
13
12
  doCollectionInference?: (collection: EntityCollection) => Promise<Partial<EntityCollection> | null> | undefined;
14
13
  propertyConfigs: Record<string, PropertyConfig>;
15
14
  };
16
- export declare function CollectionPropertiesEditorForm({ showErrors, isNewCollection, propertyErrorsRef, onPropertyError, setDirty, reservedGroups, extraIcon, getUser, getData, doCollectionInference, propertyConfigs }: CollectionEditorFormProps): import("react/jsx-runtime").JSX.Element;
15
+ export declare function CollectionPropertiesEditorForm({ showErrors, isNewCollection, propertyErrorsRef, onPropertyError, setDirty, extraIcon, getUser, getData, doCollectionInference, propertyConfigs }: CollectionEditorFormProps): import("react/jsx-runtime").JSX.Element;
17
16
  export {};
@@ -1,6 +1,6 @@
1
- import { CollectionEditorDialog } from "./CollectionEditorDialog-D509-IMx.js";
2
- import { P, a } from "./PropertyEditView-UtDO8g0A.js";
3
- import { C, a as a2 } from "./CollectionsStudioView-B549BDpU.js";
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";
4
4
  export {
5
5
  CollectionEditorDialog,
6
6
  C as CollectionStudioView,
@@ -9,6 +9,10 @@ interface CollectionTableToolbarProps {
9
9
  viewModeToggle?: React.ReactNode;
10
10
  title?: React.ReactNode;
11
11
  onTextSearch?: (searchString?: string) => void;
12
+ /**
13
+ * Initial search string to pre-populate the search bar (e.g. from URL params).
14
+ */
15
+ initialSearchText?: string;
12
16
  /**
13
17
  * When true the toolbar is in "compact" mode for the split-view left panel.
14
18
  * - Search bar, loading spinner, and view-mode toggle are hidden.
@@ -17,5 +21,5 @@ interface CollectionTableToolbarProps {
17
21
  */
18
22
  compact?: boolean;
19
23
  }
20
- export declare function CollectionTableToolbar({ actions, actionsStart, loading, onTextSearch, title, viewModeToggle, compact }: CollectionTableToolbarProps): import("react/jsx-runtime").JSX.Element;
24
+ export declare function CollectionTableToolbar({ actions, actionsStart, loading, onTextSearch, title, viewModeToggle, initialSearchText, compact }: CollectionTableToolbarProps): import("react/jsx-runtime").JSX.Element;
21
25
  export {};
@@ -15,5 +15,6 @@ export type EntityCollectionViewActionsProps<M extends Record<string, unknown>>
15
15
  collectionEntitiesCount?: number;
16
16
  compact?: boolean;
17
17
  children?: React.ReactNode;
18
+ openNewDocument: (defaultValues?: Record<string, unknown>) => void;
18
19
  };
19
- export declare function EntityCollectionViewActions<M extends Record<string, unknown>>({ collection, relativePath, parentCollectionSlugs, parentEntityIds, onNewClick, onMultipleDeleteClick, selectionEnabled, path, selectionController, tableController, collectionEntitiesCount, compact, children }: EntityCollectionViewActionsProps<M>): import("react/jsx-runtime").JSX.Element;
20
+ export declare function EntityCollectionViewActions<M extends Record<string, unknown>>({ collection, relativePath, parentCollectionSlugs, parentEntityIds, onNewClick, onMultipleDeleteClick, selectionEnabled, path, selectionController, tableController, collectionEntitiesCount, compact, children, openNewDocument }: EntityCollectionViewActionsProps<M>): import("react/jsx-runtime").JSX.Element;
@@ -15,5 +15,6 @@ export type EntityCollectionViewStartActionsProps<M extends Record<string, unkno
15
15
  */
16
16
  resolvedProperties?: Properties;
17
17
  compact?: boolean;
18
+ openNewDocument: (defaultValues?: Record<string, unknown>) => void;
18
19
  };
19
- export declare function EntityCollectionViewStartActions<M extends Record<string, unknown>>({ collection, relativePath, parentCollectionSlugs, parentEntityIds, path, selectionController, tableController, collectionEntitiesCount, resolvedProperties, compact }: EntityCollectionViewStartActionsProps<M>): import("react/jsx-runtime").JSX.Element;
20
+ export declare function EntityCollectionViewStartActions<M extends Record<string, unknown>>({ collection, relativePath, parentCollectionSlugs, parentEntityIds, path, selectionController, tableController, collectionEntitiesCount, resolvedProperties, compact, openNewDocument }: EntityCollectionViewStartActionsProps<M>): import("react/jsx-runtime").JSX.Element;
@@ -34,6 +34,12 @@ export interface EntityEditViewProps<M extends Record<string, unknown> = Record<
34
34
  layout?: "side_panel" | "full_screen" | "split";
35
35
  barActions?: (params: BarActionsParams) => any;
36
36
  formProps?: Partial<EntityFormProps<M>>;
37
+ /**
38
+ * Pre-populate the form with these values when creating a new entity.
39
+ * Only applied when the form is in "new" mode (no entityId).
40
+ * Sourced from EntitySidePanelProps (side panel) or location.state (full screen).
41
+ */
42
+ defaultValues?: Partial<M>;
37
43
  }
38
44
  /**
39
45
  * This is the default view that is used as the content of a side panel when
@@ -7,4 +7,4 @@ import type { RebaseCMSConfig } from "@rebasepro/types";
7
7
  * is auto-wired as a native feature (slots, provider, Studio view) without
8
8
  * needing any external plugin.
9
9
  */
10
- export declare function RebaseCMS({ collections, homePage, entityViews, entityActions, plugins, collectionEditor }: RebaseCMSConfig): null;
10
+ export declare function RebaseCMS({ collections, homePage, entityViews, entityActions, plugins, collectionEditor, navigationGroupMappings }: RebaseCMSConfig): null;
@@ -1,8 +1,8 @@
1
- import { I as ImportCollectionAction } from "./ImportCollectionAction-BB33kxAN.js";
2
- import { a, P } from "./ImportCollectionAction-BB33kxAN.js";
1
+ import { I as ImportCollectionAction } from "./ImportCollectionAction-h8yg_To8.js";
2
+ import { a, P } from "./ImportCollectionAction-h8yg_To8.js";
3
3
  export {
4
4
  ImportCollectionAction,
5
5
  a as ImportDataPreview,
6
6
  P as PropertySelectEntry
7
7
  };
8
- //# sourceMappingURL=index-C9YDsMC9.js.map
8
+ //# sourceMappingURL=index-BuZaHcyc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-BuZaHcyc.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
@@ -3,7 +3,7 @@ import { useState, useRef, useEffect } from "react";
3
3
  import { Chip, Tooltip, cls, defaultBorderMixin, Typography, iconSize, Label, IconButton, ErrorBoundary } from "@rebasepro/ui";
4
4
  import { ArrowLeftIcon, HistoryIcon } from "lucide-react";
5
5
  import { c } from "react-compiler-runtime";
6
- import { c as getPropertyInPath, l as PropertyPreview } from "./util-DK1O3uM0.js";
6
+ import { c as getPropertyInPath, l as PropertyPreview } from "./util-zfU1zOCX.js";
7
7
  import { useAuthController, useSnackbarController, ConfirmationDialog } from "@rebasepro/core";
8
8
  import { getValueInPath } from "@rebasepro/utils";
9
9
  import "fast-equals";
@@ -460,4 +460,4 @@ export {
460
460
  EntityHistoryView,
461
461
  UserChip
462
462
  };
463
- //# sourceMappingURL=index-CNDetux9.js.map
463
+ //# sourceMappingURL=index-CS6uJ7oW.js.map