@solidxai/core-ui 0.1.9-beta.19 → 0.1.9-beta.20

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 (168) hide show
  1. package/dist/components/common/GeneralSettings.js +1 -1
  2. package/dist/components/common/GeneralSettings.js.map +1 -1
  3. package/dist/components/common/GeneralSettings.tsx +1 -1
  4. package/dist/components/common/SettingsComponent.module.css +78 -2
  5. package/dist/components/common/SolidExport.d.ts.map +1 -1
  6. package/dist/components/common/SolidExport.js +1 -1
  7. package/dist/components/common/SolidExport.js.map +1 -1
  8. package/dist/components/common/SolidExport.tsx +2 -0
  9. package/dist/components/core/common/FilterComponent.d.ts.map +1 -1
  10. package/dist/components/core/common/FilterComponent.js +1 -1
  11. package/dist/components/core/common/FilterComponent.js.map +1 -1
  12. package/dist/components/core/common/FilterComponent.tsx +1 -0
  13. package/dist/components/core/common/GroupingComponent.d.ts.map +1 -1
  14. package/dist/components/core/common/GroupingComponent.js +2 -2
  15. package/dist/components/core/common/GroupingComponent.js.map +1 -1
  16. package/dist/components/core/common/GroupingComponent.tsx +2 -0
  17. package/dist/components/core/dashboard/mappers/echartsOptionMapper.d.ts.map +1 -1
  18. package/dist/components/core/dashboard/mappers/echartsOptionMapper.js +5 -2
  19. package/dist/components/core/dashboard/mappers/echartsOptionMapper.js.map +1 -1
  20. package/dist/components/core/dashboard/mappers/echartsOptionMapper.ts +5 -2
  21. package/dist/components/core/dashboard/widgets/DefaultDashboardKpiWidget.d.ts.map +1 -1
  22. package/dist/components/core/dashboard/widgets/DefaultDashboardKpiWidget.js +6 -1
  23. package/dist/components/core/dashboard/widgets/DefaultDashboardKpiWidget.js.map +1 -1
  24. package/dist/components/core/dashboard/widgets/DefaultDashboardKpiWidget.tsx +13 -1
  25. package/dist/components/core/dashboard/widgets/QueueSlaHeatmapWidget.d.ts.map +1 -1
  26. package/dist/components/core/dashboard/widgets/QueueSlaHeatmapWidget.js +54 -10
  27. package/dist/components/core/dashboard/widgets/QueueSlaHeatmapWidget.js.map +1 -1
  28. package/dist/components/core/dashboard/widgets/QueueSlaHeatmapWidget.tsx +56 -10
  29. package/dist/components/core/extension/solid-core/roleMetadata/RolePermissionsManyToManyFieldWidget.js +1 -1
  30. package/dist/components/core/extension/solid-core/roleMetadata/RolePermissionsManyToManyFieldWidget.js.map +1 -1
  31. package/dist/components/core/extension/solid-core/roleMetadata/RolePermissionsManyToManyFieldWidget.tsx +1 -1
  32. package/dist/components/core/filter/fields/SolidBooleanField.d.ts.map +1 -1
  33. package/dist/components/core/filter/fields/SolidBooleanField.js +1 -1
  34. package/dist/components/core/filter/fields/SolidBooleanField.js.map +1 -1
  35. package/dist/components/core/filter/fields/SolidBooleanField.tsx +3 -2
  36. package/dist/components/core/filter/fields/SolidDateField.d.ts.map +1 -1
  37. package/dist/components/core/filter/fields/SolidDateField.js +1 -1
  38. package/dist/components/core/filter/fields/SolidDateField.js.map +1 -1
  39. package/dist/components/core/filter/fields/SolidDateField.tsx +2 -1
  40. package/dist/components/core/filter/fields/SolidDatetimeField.d.ts.map +1 -1
  41. package/dist/components/core/filter/fields/SolidDatetimeField.js +1 -1
  42. package/dist/components/core/filter/fields/SolidDatetimeField.js.map +1 -1
  43. package/dist/components/core/filter/fields/SolidDatetimeField.tsx +3 -2
  44. package/dist/components/core/filter/fields/SolidExternalIdField.d.ts.map +1 -1
  45. package/dist/components/core/filter/fields/SolidExternalIdField.js +1 -1
  46. package/dist/components/core/filter/fields/SolidExternalIdField.js.map +1 -1
  47. package/dist/components/core/filter/fields/SolidExternalIdField.tsx +2 -1
  48. package/dist/components/core/filter/fields/SolidIdField.d.ts.map +1 -1
  49. package/dist/components/core/filter/fields/SolidIdField.js +1 -1
  50. package/dist/components/core/filter/fields/SolidIdField.js.map +1 -1
  51. package/dist/components/core/filter/fields/SolidIdField.tsx +1 -0
  52. package/dist/components/core/filter/fields/SolidIntField.d.ts.map +1 -1
  53. package/dist/components/core/filter/fields/SolidIntField.js +1 -1
  54. package/dist/components/core/filter/fields/SolidIntField.js.map +1 -1
  55. package/dist/components/core/filter/fields/SolidIntField.tsx +2 -1
  56. package/dist/components/core/filter/fields/SolidMediaMultipleField.d.ts.map +1 -1
  57. package/dist/components/core/filter/fields/SolidMediaMultipleField.js +1 -1
  58. package/dist/components/core/filter/fields/SolidMediaMultipleField.js.map +1 -1
  59. package/dist/components/core/filter/fields/SolidMediaMultipleField.tsx +2 -1
  60. package/dist/components/core/filter/fields/SolidMediaSingleField.d.ts.map +1 -1
  61. package/dist/components/core/filter/fields/SolidMediaSingleField.js +1 -1
  62. package/dist/components/core/filter/fields/SolidMediaSingleField.js.map +1 -1
  63. package/dist/components/core/filter/fields/SolidMediaSingleField.tsx +2 -1
  64. package/dist/components/core/filter/fields/SolidSelectionDynamicField.d.ts.map +1 -1
  65. package/dist/components/core/filter/fields/SolidSelectionDynamicField.js +1 -1
  66. package/dist/components/core/filter/fields/SolidSelectionDynamicField.js.map +1 -1
  67. package/dist/components/core/filter/fields/SolidSelectionDynamicField.tsx +3 -2
  68. package/dist/components/core/filter/fields/SolidSelectionStaticField.d.ts.map +1 -1
  69. package/dist/components/core/filter/fields/SolidSelectionStaticField.js +1 -1
  70. package/dist/components/core/filter/fields/SolidSelectionStaticField.js.map +1 -1
  71. package/dist/components/core/filter/fields/SolidSelectionStaticField.tsx +3 -2
  72. package/dist/components/core/filter/fields/SolidShortTextField.d.ts.map +1 -1
  73. package/dist/components/core/filter/fields/SolidShortTextField.js +1 -1
  74. package/dist/components/core/filter/fields/SolidShortTextField.js.map +1 -1
  75. package/dist/components/core/filter/fields/SolidShortTextField.tsx +2 -1
  76. package/dist/components/core/filter/fields/SolidTimeField.d.ts.map +1 -1
  77. package/dist/components/core/filter/fields/SolidTimeField.js +1 -1
  78. package/dist/components/core/filter/fields/SolidTimeField.js.map +1 -1
  79. package/dist/components/core/filter/fields/SolidTimeField.tsx +3 -2
  80. package/dist/components/core/filter/fields/SolidUuidField.d.ts.map +1 -1
  81. package/dist/components/core/filter/fields/SolidUuidField.js +1 -1
  82. package/dist/components/core/filter/fields/SolidUuidField.js.map +1 -1
  83. package/dist/components/core/filter/fields/SolidUuidField.tsx +2 -1
  84. package/dist/components/core/filter/fields/relations/SolidRelationManyToManyField.d.ts.map +1 -1
  85. package/dist/components/core/filter/fields/relations/SolidRelationManyToManyField.js +1 -1
  86. package/dist/components/core/filter/fields/relations/SolidRelationManyToManyField.js.map +1 -1
  87. package/dist/components/core/filter/fields/relations/SolidRelationManyToManyField.tsx +3 -2
  88. package/dist/components/core/filter/fields/relations/SolidRelationManyToOneField.d.ts.map +1 -1
  89. package/dist/components/core/filter/fields/relations/SolidRelationManyToOneField.js +1 -1
  90. package/dist/components/core/filter/fields/relations/SolidRelationManyToOneField.js.map +1 -1
  91. package/dist/components/core/filter/fields/relations/SolidRelationManyToOneField.tsx +3 -2
  92. package/dist/components/core/filter/fields/relations/SolidRelationOneToManyField.d.ts.map +1 -1
  93. package/dist/components/core/filter/fields/relations/SolidRelationOneToManyField.js +1 -1
  94. package/dist/components/core/filter/fields/relations/SolidRelationOneToManyField.js.map +1 -1
  95. package/dist/components/core/filter/fields/relations/SolidRelationOneToManyField.tsx +3 -2
  96. package/dist/components/core/form/SolidFormFooter.js +1 -1
  97. package/dist/components/core/form/SolidFormFooter.js.map +1 -1
  98. package/dist/components/core/form/SolidFormFooter.tsx +1 -1
  99. package/dist/components/core/form/SolidFormView.js +2 -2
  100. package/dist/components/core/form/SolidFormView.js.map +1 -1
  101. package/dist/components/core/form/SolidFormView.tsx +2 -2
  102. package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.js +1 -1
  103. package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.js.map +1 -1
  104. package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.tsx +1 -1
  105. package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.js +1 -1
  106. package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.js.map +1 -1
  107. package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.tsx +1 -1
  108. package/dist/components/core/form/fields/relations/SolidRelationOneToManyField.js +1 -1
  109. package/dist/components/core/form/fields/relations/SolidRelationOneToManyField.js.map +1 -1
  110. package/dist/components/core/form/fields/relations/SolidRelationOneToManyField.tsx +1 -1
  111. package/dist/components/core/form/fields/relations/widgets/helpers/InlineRelationEntityDialog.js +1 -1
  112. package/dist/components/core/form/fields/relations/widgets/helpers/InlineRelationEntityDialog.js.map +1 -1
  113. package/dist/components/core/form/fields/relations/widgets/helpers/InlineRelationEntityDialog.tsx +1 -1
  114. package/dist/components/core/kanban/SolidKanbanView.js +1 -1
  115. package/dist/components/core/kanban/SolidKanbanView.js.map +1 -1
  116. package/dist/components/core/kanban/SolidKanbanView.tsx +1 -1
  117. package/dist/components/core/list/SolidDataTable.d.ts.map +1 -1
  118. package/dist/components/core/list/SolidDataTable.js +2 -1
  119. package/dist/components/core/list/SolidDataTable.js.map +1 -1
  120. package/dist/components/core/list/SolidDataTable.tsx +8 -9
  121. package/dist/components/core/list/SolidListView.js +13 -15
  122. package/dist/components/core/list/SolidListView.js.map +1 -1
  123. package/dist/components/core/list/SolidListView.tsx +12 -12
  124. package/dist/components/core/list/columns/SolidMediaMultipleColumn.js +1 -1
  125. package/dist/components/core/list/columns/SolidMediaMultipleColumn.js.map +1 -1
  126. package/dist/components/core/list/columns/SolidMediaMultipleColumn.tsx +1 -1
  127. package/dist/components/core/model/FieldMetaData.d.ts.map +1 -1
  128. package/dist/components/core/model/FieldMetaData.js +1 -1
  129. package/dist/components/core/model/FieldMetaData.js.map +1 -1
  130. package/dist/components/core/model/FieldMetaData.tsx +10 -4
  131. package/dist/components/core/tree/SolidTreeView.js +2 -2
  132. package/dist/components/core/tree/SolidTreeView.js.map +1 -1
  133. package/dist/components/core/tree/SolidTreeView.tsx +3 -3
  134. package/dist/components/core/users/CreateUser.js +1 -1
  135. package/dist/components/core/users/CreateUser.js.map +1 -1
  136. package/dist/components/core/users/CreateUser.tsx +1 -1
  137. package/dist/components/layout/AdminHeaderActions.d.ts +7 -0
  138. package/dist/components/layout/AdminHeaderActions.d.ts.map +1 -0
  139. package/dist/components/layout/AdminHeaderActions.js +77 -0
  140. package/dist/components/layout/AdminHeaderActions.js.map +1 -0
  141. package/dist/components/layout/AdminHeaderActions.tsx +155 -0
  142. package/dist/components/layout/AdminTopHeader.d.ts.map +1 -1
  143. package/dist/components/layout/AdminTopHeader.js +3 -16
  144. package/dist/components/layout/AdminTopHeader.js.map +1 -1
  145. package/dist/components/layout/AdminTopHeader.tsx +4 -64
  146. package/dist/components/layout/AppSidebar.d.ts.map +1 -1
  147. package/dist/components/layout/AppSidebar.js +2 -1
  148. package/dist/components/layout/AppSidebar.js.map +1 -1
  149. package/dist/components/layout/AppSidebar.tsx +2 -0
  150. package/dist/components/shad-cn-ui/SolidDatePicker.d.ts +1 -1
  151. package/dist/components/shad-cn-ui/SolidDatePicker.d.ts.map +1 -1
  152. package/dist/components/shad-cn-ui/SolidDatePicker.js +2 -2
  153. package/dist/components/shad-cn-ui/SolidDatePicker.js.map +1 -1
  154. package/dist/components/shad-cn-ui/SolidDatePicker.tsx +4 -0
  155. package/dist/components/shad-cn-ui/SolidSelect.d.ts +2 -1
  156. package/dist/components/shad-cn-ui/SolidSelect.d.ts.map +1 -1
  157. package/dist/components/shad-cn-ui/SolidSelect.js +51 -1
  158. package/dist/components/shad-cn-ui/SolidSelect.js.map +1 -1
  159. package/dist/components/shad-cn-ui/SolidSelect.tsx +95 -0
  160. package/dist/resources/globals.css +93 -12
  161. package/dist/resources/shadcn-base.css +339 -171
  162. package/dist/resources/solid-responsive.css +235 -50
  163. package/dist/routes/pages/admin/core/DashboardPage.d.ts.map +1 -1
  164. package/dist/routes/pages/admin/core/DashboardPage.js +101 -21
  165. package/dist/routes/pages/admin/core/DashboardPage.js.map +1 -1
  166. package/dist/routes/pages/admin/core/DashboardPage.module.css +33 -0
  167. package/dist/routes/pages/admin/core/DashboardPage.tsx +144 -17
  168. package/package.json +1 -1
@@ -1330,8 +1330,8 @@ export const SolidTreeView = forwardRef<SolidTreeViewHandle, SolidTreeViewParams
1330
1330
  const end = total === 0 ? 0 : Math.min(offset + limit, total);
1331
1331
 
1332
1332
  return (
1333
- <div className="w-full solid-table-paginator solid-table-paginator-align-end flex items-center justify-end gap-3 text-sm rounded-md border border-border/60 px-3 py-1.5 bg-background">
1334
- <div className="solid-paginator-meta flex items-center gap-2 ml-auto">
1333
+ <div className="w-full solid-table-paginator solid-table-paginator-align-end flex items-center justify-end gap-3 text-sm rounded-md border border-border/60 px-2 sm:px-3 py-1.5 bg-background">
1334
+ <div className="solid-paginator-meta flex items-center gap-2 sm:ml-auto">
1335
1335
  <span className="solid-paginator-label">Rows</span>
1336
1336
  <select
1337
1337
  value={limit}
@@ -1620,7 +1620,7 @@ export const SolidTreeView = forwardRef<SolidTreeViewHandle, SolidTreeViewParams
1620
1620
 
1621
1621
  return (
1622
1622
  <div className="page-parent-wrapper solid-list-page-wrapper solid-tree-page-wrapper flex h-full min-h-0 overflow-hidden">
1623
- <div className="solid-list-content h-full flex flex-column flex-grow-1">
1623
+ <div className="solid-list-content flex flex-column flex-grow-1">
1624
1624
  <div className="solid-list-surface solid-tree-surface flex flex-column flex-1 min-h-0">
1625
1625
  {/* ── Header ── */}
1626
1626
  <div className="page-header solid-list-toolbar solid-tree-toolbar flex-column lg:flex-row">
@@ -239,7 +239,7 @@ var CreateUser = function (_a) {
239
239
  }); };
240
240
  return (_jsxs("div", { className: "solid-form-wrapper", children: [_jsx("div", { className: "solid-form-section", children: _jsxs("form", { onSubmit: formik.handleSubmit, children: [_jsxs("div", { className: "solid-form-header flex align-items-center justify-content-between gap-3 flex-wrap", children: [_jsxs("div", { className: "solid-user-form-titleblock flex align-items-center gap-3", children: [_jsx(BackButton, {}), _jsxs("div", { children: [_jsx("div", { className: "form-wrapper-title", children: isEditMode ? "Update User" : "Create User" }), _jsx("p", { className: "solid-user-form-subtitle m-0", children: isEditMode
241
241
  ? "Update account details, access roles, and security controls."
242
- : "Create a user account and assign the right access roles." })] })] }), _jsxs("div", { className: "gap-3 flex flex-wrap", children: [isEditMode && failedAttempts > 0 ? (_jsx(SolidButton, { size: "small", type: "button", variant: "outline", loading: isUserUpdating, onClick: handleUnblockUser, children: "Unblock User" })) : null, formik.dirty ? (_jsx(SolidButton, { size: "small", type: "submit", loading: isSaving, children: "Save" })) : null, data ? (_jsx(SolidButton, { size: "small", type: "button", variant: "destructive", loading: isUserDeleting, onClick: function () { return deleteUser(data.id); }, children: "Delete" })) : null, _jsx(CancelButton, {})] })] }), _jsx(SolidFormHeader, {}), _jsx("div", { className: "px-4 py-3 md:p-4 solid-form-content", children: isEditMode ? (_jsx(SolidTabGroup, { value: activeTab, onValueChange: setActiveTab, tabs: [
242
+ : "Create a user account and assign the right access roles." })] })] }), _jsxs("div", { className: "gap-3 flex flex-wrap", children: [isEditMode && failedAttempts > 0 ? (_jsx(SolidButton, { size: "small", type: "button", variant: "outline", loading: isUserUpdating, onClick: handleUnblockUser, children: "Unblock User" })) : null, formik.dirty ? (_jsx(SolidButton, { size: "small", type: "submit", loading: isSaving, children: "Save" })) : null, data ? (_jsx(SolidButton, { size: "small", type: "button", variant: "destructive", loading: isUserDeleting, onClick: function () { return deleteUser(data.id); }, children: "Delete" })) : null, _jsx(CancelButton, {})] })] }), _jsx(SolidFormHeader, {}), _jsx("div", { className: "px-3 py-3 md:p-4 solid-form-content", children: isEditMode ? (_jsx(SolidTabGroup, { value: activeTab, onValueChange: setActiveTab, tabs: [
243
243
  {
244
244
  value: "userDetails",
245
245
  label: "User Details",
@@ -1 +1 @@
1
- {"version":3,"file":"CreateUser.js","sourceRoot":"","sources":["../../../../src/components/core/users/CreateUser.tsx"],"names":[],"mappings":"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","sourcesContent":["import { FetchBaseQueryError } from \"@reduxjs/toolkit/dist/query\";\nimport { useFormik } from \"formik\";\nimport { useEffect, useState } from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport * as Yup from \"yup\";\nimport { BackButton } from \"../../../components/common/BackButton\";\nimport { CancelButton } from \"../../../components/common/CancelButton\";\nimport { SolidFormHeader } from \"../../../components/common/SolidFormHeader\";\nimport { ERROR_MESSAGES } from \"../../../constants/error-messages\";\nimport { useRouter } from \"../../../hooks/useRouter\";\nimport { useRegisterPrivateMutation, useUpdateUserMutation } from \"../../../redux/api/authApi\";\nimport { useGetrolesQuery } from \"../../../redux/api/roleApi\";\nimport { useDeleteUserMutation } from \"../../../redux/api/userApi\";\nimport { showToast } from \"../../../redux/features/toastSlice\";\nimport {\n SolidButton,\n SolidCheckbox,\n SolidInput,\n SolidMessage,\n SolidPanel,\n SolidPasswordInput,\n SolidSwitch,\n SolidTabGroup,\n} from \"../../shad-cn-ui\";\nimport { ApiKeysTab, GenerateApiKeyModal, RevealApiKeyModal } from \"./ApiKeysTab\";\nimport \"./CreateUser.css\";\n\ninterface ErrorResponseData {\n message: string;\n statusCode: number;\n error: string;\n}\n\nfunction cx(...parts: Array<string | false | undefined>) {\n return parts.filter(Boolean).join(\" \");\n}\n\nconst CreateUser = ({ data, params }: any) => {\n const dispatch = useDispatch();\n const router = useRouter();\n const [selectedRoles, setSelectedRoles] = useState<string[]>([]);\n const [failedAttempts, setFailedAttempts] = useState<number>(data?.failedLoginAttempts ?? 0);\n const [activeTab, setActiveTab] = useState(\"userDetails\");\n const [newUserIdForApiKey, setNewUserIdForApiKey] = useState<number | null>(null);\n const [revealKey, setRevealKey] = useState<{ apiKey: string; keyName: string } | null>(null);\n\n const [registerPrivate, { isLoading, error: userCreateError }] = useRegisterPrivateMutation();\n const [\n updateUser,\n {\n isLoading: isUserUpdating,\n isSuccess: isUpdateUserSuccess,\n error: userUpdateError,\n },\n ] = useUpdateUserMutation();\n\n const [deleteUser, { isLoading: isUserDeleting, isSuccess: isDeleteUserSuccess }] = useDeleteUserMutation();\n const { data: rolesData } = useGetrolesQuery(\"\");\n\n useEffect(() => {\n if (data?.roles) {\n setSelectedRoles(data.roles.map((role: any) => role.name));\n }\n setFailedAttempts(data?.failedLoginAttempts ?? 0);\n }, [data]);\n\n const initialValues = {\n fullName: data?.fullName ?? \"\",\n username: data?.username ?? \"\",\n email: data?.email ?? \"\",\n mobile: data?.mobile ?? \"\",\n password: \"\",\n confirmPassword: \"\",\n active: data?.active ?? true,\n isAllowedToGenerateApiKeys: data?.isAllowedToGenerateApiKeys ?? false,\n };\n\n const validationSchema = Yup.object({\n fullName: Yup.string().required(ERROR_MESSAGES.FIELD_REUQIRED(\"Full Name\")),\n username: Yup.string().required(\"Username is required\"),\n email: Yup.string()\n .email(ERROR_MESSAGES.FIELD_INVALID(\"email address\"))\n .required(ERROR_MESSAGES.FIELD_REUQIRED(\"Email\")),\n password: Yup.string().min(6, ERROR_MESSAGES.PASSWORD_CHARACTER(6)).nullable(),\n confirmPassword: Yup.string().when(\"password\", {\n is: (val: any) => !!val,\n then: (schema) => schema.oneOf([Yup.ref(\"password\")], ERROR_MESSAGES.FIELD_MUST_MATCH(\"Password\")).nullable(),\n otherwise: (schema) => schema.notRequired().nullable(),\n }),\n mobile: Yup.string().nullable(),\n });\n\n function isFetchBaseQueryErrorWithErrorResponse(\n error: any\n ): error is FetchBaseQueryError & { data: ErrorResponseData } {\n return error && typeof error === \"object\" && \"data\" in error && \"message\" in error.data;\n }\n\n const formik = useFormik({\n initialValues,\n validationSchema,\n enableReinitialize: true,\n onSubmit: async (values) => {\n if (data) {\n const userData: any = {\n fullName: values.fullName,\n username: values.username,\n email: values.email,\n mobile: values.mobile,\n roles: selectedRoles,\n active: values.active,\n isAllowedToGenerateApiKeys: values.isAllowedToGenerateApiKeys,\n };\n\n if (values.password) {\n userData.password = values.password;\n }\n\n updateUser({ id: data.id, data: userData });\n return;\n }\n\n try {\n const response = await registerPrivate({\n fullName: values.fullName,\n username: values.username,\n email: values.email,\n mobile: values.mobile,\n password: values.password,\n roles: selectedRoles,\n isAllowedToGenerateApiKeys: values.isAllowedToGenerateApiKeys,\n }).unwrap();\n\n if (values.isAllowedToGenerateApiKeys) {\n const userId = (response as any)?.data?.id ?? (response as any)?.id;\n if (userId) {\n setNewUserIdForApiKey(userId);\n return;\n }\n }\n router.back();\n } catch {\n // error shown via userCreateError effect\n }\n },\n });\n\n const fieldError = (fieldName: keyof typeof initialValues) =>\n formik.touched[fieldName] && formik.errors[fieldName] ? String(formik.errors[fieldName]) : \"\";\n\n const handleCheckboxChange = (roleName: string) => {\n const updatedRoles = selectedRoles.includes(roleName)\n ? selectedRoles.filter((name) => name !== roleName)\n : [...selectedRoles, roleName];\n\n setSelectedRoles(updatedRoles);\n formik.setFieldTouched(\"roles\", true);\n formik.setFieldValue(\"roles\", updatedRoles);\n };\n\n useEffect(() => {\n const handleError = (errorToast: any) => {\n let errorMessage: any = [ERROR_MESSAGES.ERROR_OCCURED];\n\n if (isFetchBaseQueryErrorWithErrorResponse(errorToast)) {\n errorMessage = errorToast.data.message;\n } else {\n errorMessage = [ERROR_MESSAGES.SOMETHING_WRONG];\n }\n\n const detail = Array.isArray(errorMessage) ? errorMessage.join(\", \") : errorMessage;\n dispatch(showToast({ severity: \"error\", summary: ERROR_MESSAGES.ERROR, detail }));\n };\n\n if (userCreateError) handleError(userCreateError);\n if (userUpdateError) handleError(userUpdateError);\n }, [dispatch, userCreateError, userUpdateError]);\n\n useEffect(() => {\n if (isDeleteUserSuccess || isUpdateUserSuccess) {\n router.back();\n }\n }, [isDeleteUserSuccess, isUpdateUserSuccess, router]);\n\n const isEditMode = params.id !== \"new\";\n const isSaving = isLoading || isUserUpdating;\n\n const handleUnblockUser = async () => {\n if (!data?.id) return;\n\n try {\n await updateUser({\n id: data.id,\n data: { failedLoginAttempts: 0 },\n }).unwrap();\n dispatch(\n showToast({\n severity: \"success\",\n summary: \"Success\",\n detail: \"User is unblocked.\",\n })\n );\n setFailedAttempts(0);\n } catch {\n // error shown via userUpdateError effect\n }\n };\n\n return (\n <div className=\"solid-form-wrapper\">\n <div className=\"solid-form-section\">\n <form onSubmit={formik.handleSubmit}>\n <div className=\"solid-form-header flex align-items-center justify-content-between gap-3 flex-wrap\">\n <div className=\"solid-user-form-titleblock flex align-items-center gap-3\">\n <BackButton />\n <div>\n <div className=\"form-wrapper-title\">{isEditMode ? \"Update User\" : \"Create User\"}</div>\n <p className=\"solid-user-form-subtitle m-0\">\n {isEditMode\n ? \"Update account details, access roles, and security controls.\"\n : \"Create a user account and assign the right access roles.\"}\n </p>\n </div>\n </div>\n <div className=\"gap-3 flex flex-wrap\">\n {isEditMode && failedAttempts > 0 ? (\n <SolidButton size=\"small\" type=\"button\" variant=\"outline\" loading={isUserUpdating} onClick={handleUnblockUser}>\n Unblock User\n </SolidButton>\n ) : null}\n {formik.dirty ? (\n <SolidButton size=\"small\" type=\"submit\" loading={isSaving}>\n Save\n </SolidButton>\n ) : null}\n {data ? (\n <SolidButton\n size=\"small\"\n type=\"button\"\n variant=\"destructive\"\n loading={isUserDeleting}\n onClick={() => deleteUser(data.id)}\n >\n Delete\n </SolidButton>\n ) : null}\n <CancelButton />\n </div>\n </div>\n\n <SolidFormHeader />\n\n <div className=\"px-4 py-3 md:p-4 solid-form-content\">\n {isEditMode ? (\n <SolidTabGroup\n value={activeTab}\n onValueChange={setActiveTab}\n tabs={[\n {\n value: \"userDetails\",\n label: \"User Details\",\n content: (\n <UserDetailsContent\n formik={formik}\n fieldError={fieldError}\n rolesData={rolesData}\n selectedRoles={selectedRoles}\n handleCheckboxChange={handleCheckboxChange}\n isEditMode={isEditMode}\n />\n ),\n },\n {\n value: \"apiKeys\",\n label: \"API Keys\",\n content: (\n <div className=\"solid-user-edit-api-keys-pane\">\n <ApiKeysTab userId={data?.id} canCreate={data?.isAllowedToGenerateApiKeys ?? false} />\n </div>\n ),\n },\n ]}\n />\n ) : (\n <UserDetailsContent\n formik={formik}\n fieldError={fieldError}\n rolesData={rolesData}\n selectedRoles={selectedRoles}\n handleCheckboxChange={handleCheckboxChange}\n isEditMode={isEditMode}\n />\n )}\n </div>\n </form>\n </div>\n\n {newUserIdForApiKey !== null && (\n <GenerateApiKeyModal\n open={true}\n userId={newUserIdForApiKey}\n onClose={() => {\n setNewUserIdForApiKey(null);\n router.back();\n }}\n onCreated={(apiKey, keyName) => {\n setNewUserIdForApiKey(null);\n setRevealKey({ apiKey, keyName });\n }}\n />\n )}\n\n {revealKey && (\n <RevealApiKeyModal\n open={true}\n apiKey={revealKey.apiKey}\n keyName={revealKey.keyName}\n onClose={() => {\n setRevealKey(null);\n router.back();\n }}\n />\n )}\n </div>\n );\n};\n\n/** Extracted form body so it can be used both inside and outside the tab wrapper */\nfunction UserDetailsContent({\n formik,\n fieldError,\n rolesData,\n selectedRoles,\n handleCheckboxChange,\n isEditMode,\n}: {\n formik: any;\n fieldError: (field: any) => string;\n rolesData: any;\n selectedRoles: string[];\n handleCheckboxChange: (roleName: string) => void;\n isEditMode: boolean;\n}) {\n return (\n <div className=\"solid-user-details-layout\">\n <div className=\"solid-user-details-stack\">\n <SolidPanel header=\"Basic Info\" className=\"solid-column-panel\">\n <div className=\"grid formgrid\">\n <div className=\"field col-12 md:col-6 flex flex-column gap-2\">\n <label htmlFor=\"fullName\" className=\"form-field-label\">\n Full Name\n </label>\n <SolidInput\n type=\"text\"\n id=\"fullName\"\n name=\"fullName\"\n autoComplete=\"off\"\n onChange={formik.handleChange}\n onBlur={formik.handleBlur}\n value={formik.values.fullName}\n className={cx(fieldError(\"fullName\") && \"solid-user-form-input-invalid\")}\n />\n {fieldError(\"fullName\") ? <SolidMessage severity=\"error\" text={fieldError(\"fullName\")} /> : null}\n </div>\n\n <div className=\"field col-12 md:col-6 flex flex-column gap-2\">\n <label htmlFor=\"username\" className=\"form-field-label\">\n Username\n </label>\n <SolidInput\n type=\"text\"\n id=\"username\"\n name=\"username\"\n autoComplete=\"off\"\n disabled={Boolean(formik.values.username) && isEditMode}\n onChange={formik.handleChange}\n onBlur={formik.handleBlur}\n value={formik.values.username}\n className={cx(fieldError(\"username\") && \"solid-user-form-input-invalid\")}\n />\n {fieldError(\"username\") ? <SolidMessage severity=\"error\" text={fieldError(\"username\")} /> : null}\n </div>\n\n <div className=\"field col-12 md:col-6 flex flex-column gap-2 mt-3\">\n <label htmlFor=\"email\" className=\"form-field-label\">\n Email\n </label>\n <SolidInput\n type=\"email\"\n id=\"email\"\n name=\"email\"\n autoComplete=\"off\"\n disabled={isEditMode}\n onChange={formik.handleChange}\n onBlur={formik.handleBlur}\n value={formik.values.email}\n className={cx(fieldError(\"email\") && \"solid-user-form-input-invalid\")}\n />\n {fieldError(\"email\") ? <SolidMessage severity=\"error\" text={fieldError(\"email\")} /> : null}\n </div>\n\n <div className=\"field col-12 md:col-6 flex flex-column gap-2 mt-3\">\n <label htmlFor=\"mobile\" className=\"form-field-label\">\n Mobile\n </label>\n <SolidInput\n type=\"text\"\n id=\"mobile\"\n name=\"mobile\"\n autoComplete=\"off\"\n onChange={formik.handleChange}\n onBlur={formik.handleBlur}\n value={formik.values.mobile}\n className={cx(fieldError(\"mobile\") && \"solid-user-form-input-invalid\")}\n />\n {fieldError(\"mobile\") ? <SolidMessage severity=\"error\" text={fieldError(\"mobile\")} /> : null}\n </div>\n\n {!isEditMode ? (\n <>\n <div className=\"field col-12 md:col-6 flex flex-column gap-2 mt-3\">\n <label htmlFor=\"password\" className=\"form-field-label\">\n Password\n </label>\n <SolidPasswordInput\n id=\"password\"\n name=\"password\"\n autoComplete=\"off\"\n value={formik.values.password}\n onChange={formik.handleChange}\n onBlur={formik.handleBlur}\n className={cx(fieldError(\"password\") && \"solid-user-form-input-invalid\")}\n />\n {fieldError(\"password\") ? <SolidMessage severity=\"error\" text={fieldError(\"password\")} /> : null}\n </div>\n\n <div className=\"field col-12 md:col-6 flex flex-column gap-2 mt-3\">\n <label htmlFor=\"confirmPassword\" className=\"form-field-label\">\n Confirm Password\n </label>\n <SolidPasswordInput\n id=\"confirmPassword\"\n name=\"confirmPassword\"\n autoComplete=\"off\"\n value={formik.values.confirmPassword}\n onChange={formik.handleChange}\n onBlur={formik.handleBlur}\n className={cx(fieldError(\"confirmPassword\") && \"solid-user-form-input-invalid\")}\n />\n {fieldError(\"confirmPassword\") ? (\n <SolidMessage severity=\"error\" text={fieldError(\"confirmPassword\")} />\n ) : null}\n </div>\n </>\n ) : null}\n </div>\n </SolidPanel>\n\n <SolidPanel toggleable header=\"Access\" className=\"solid-column-panel\">\n <div className=\"formgrid grid solid-user-access-grid\">\n {isEditMode ? (\n <div className=\"field col-12 solid-user-access-row\">\n <div className=\"solid-user-access-copy\">\n <p className=\"form-field-label m-0\">Active User</p>\n <p className=\"solid-user-section-helper m-0 mt-1\">\n Control whether this user account is active and allowed to sign in.\n </p>\n </div>\n <SolidSwitch\n checked={formik.values.active}\n onChange={(checked) => formik.setFieldValue(\"active\", checked)}\n />\n </div>\n ) : null}\n <div className=\"field col-12 solid-user-access-row\">\n <div className=\"solid-user-access-copy\">\n <p className=\"form-field-label m-0\">Allow API Key Generation</p>\n <p className=\"solid-user-section-helper m-0 mt-1\">\n When enabled, this user can generate API keys for programmatic access.\n </p>\n </div>\n <SolidSwitch\n checked={formik.values.isAllowedToGenerateApiKeys}\n onChange={(checked) => formik.setFieldValue(\"isAllowedToGenerateApiKeys\", checked)}\n />\n </div>\n </div>\n </SolidPanel>\n\n <SolidPanel toggleable header=\"Roles\" className=\"solid-column-panel\">\n <p className=\"solid-user-section-copy\">Select the roles that should be assigned to this user.</p>\n <div className=\"solid-user-role-grid\">\n {rolesData?.data?.records?.map((role: any) => (\n <div\n key={role.name}\n className={cx(\"solid-user-role-card\", selectedRoles.includes(role.name) && \"is-selected\")}\n >\n <SolidCheckbox\n id={role.name}\n checked={selectedRoles.includes(role.name)}\n onChange={() => handleCheckboxChange(role.name)}\n label={role.name}\n className=\"solid-user-role-control\"\n />\n </div>\n ))}\n </div>\n </SolidPanel>\n </div>\n </div>\n );\n}\n\nexport default CreateUser;\n"]}
1
+ {"version":3,"file":"CreateUser.js","sourceRoot":"","sources":["../../../../src/components/core/users/CreateUser.tsx"],"names":[],"mappings":"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","sourcesContent":["import { FetchBaseQueryError } from \"@reduxjs/toolkit/dist/query\";\nimport { useFormik } from \"formik\";\nimport { useEffect, useState } from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport * as Yup from \"yup\";\nimport { BackButton } from \"../../../components/common/BackButton\";\nimport { CancelButton } from \"../../../components/common/CancelButton\";\nimport { SolidFormHeader } from \"../../../components/common/SolidFormHeader\";\nimport { ERROR_MESSAGES } from \"../../../constants/error-messages\";\nimport { useRouter } from \"../../../hooks/useRouter\";\nimport { useRegisterPrivateMutation, useUpdateUserMutation } from \"../../../redux/api/authApi\";\nimport { useGetrolesQuery } from \"../../../redux/api/roleApi\";\nimport { useDeleteUserMutation } from \"../../../redux/api/userApi\";\nimport { showToast } from \"../../../redux/features/toastSlice\";\nimport {\n SolidButton,\n SolidCheckbox,\n SolidInput,\n SolidMessage,\n SolidPanel,\n SolidPasswordInput,\n SolidSwitch,\n SolidTabGroup,\n} from \"../../shad-cn-ui\";\nimport { ApiKeysTab, GenerateApiKeyModal, RevealApiKeyModal } from \"./ApiKeysTab\";\nimport \"./CreateUser.css\";\n\ninterface ErrorResponseData {\n message: string;\n statusCode: number;\n error: string;\n}\n\nfunction cx(...parts: Array<string | false | undefined>) {\n return parts.filter(Boolean).join(\" \");\n}\n\nconst CreateUser = ({ data, params }: any) => {\n const dispatch = useDispatch();\n const router = useRouter();\n const [selectedRoles, setSelectedRoles] = useState<string[]>([]);\n const [failedAttempts, setFailedAttempts] = useState<number>(data?.failedLoginAttempts ?? 0);\n const [activeTab, setActiveTab] = useState(\"userDetails\");\n const [newUserIdForApiKey, setNewUserIdForApiKey] = useState<number | null>(null);\n const [revealKey, setRevealKey] = useState<{ apiKey: string; keyName: string } | null>(null);\n\n const [registerPrivate, { isLoading, error: userCreateError }] = useRegisterPrivateMutation();\n const [\n updateUser,\n {\n isLoading: isUserUpdating,\n isSuccess: isUpdateUserSuccess,\n error: userUpdateError,\n },\n ] = useUpdateUserMutation();\n\n const [deleteUser, { isLoading: isUserDeleting, isSuccess: isDeleteUserSuccess }] = useDeleteUserMutation();\n const { data: rolesData } = useGetrolesQuery(\"\");\n\n useEffect(() => {\n if (data?.roles) {\n setSelectedRoles(data.roles.map((role: any) => role.name));\n }\n setFailedAttempts(data?.failedLoginAttempts ?? 0);\n }, [data]);\n\n const initialValues = {\n fullName: data?.fullName ?? \"\",\n username: data?.username ?? \"\",\n email: data?.email ?? \"\",\n mobile: data?.mobile ?? \"\",\n password: \"\",\n confirmPassword: \"\",\n active: data?.active ?? true,\n isAllowedToGenerateApiKeys: data?.isAllowedToGenerateApiKeys ?? false,\n };\n\n const validationSchema = Yup.object({\n fullName: Yup.string().required(ERROR_MESSAGES.FIELD_REUQIRED(\"Full Name\")),\n username: Yup.string().required(\"Username is required\"),\n email: Yup.string()\n .email(ERROR_MESSAGES.FIELD_INVALID(\"email address\"))\n .required(ERROR_MESSAGES.FIELD_REUQIRED(\"Email\")),\n password: Yup.string().min(6, ERROR_MESSAGES.PASSWORD_CHARACTER(6)).nullable(),\n confirmPassword: Yup.string().when(\"password\", {\n is: (val: any) => !!val,\n then: (schema) => schema.oneOf([Yup.ref(\"password\")], ERROR_MESSAGES.FIELD_MUST_MATCH(\"Password\")).nullable(),\n otherwise: (schema) => schema.notRequired().nullable(),\n }),\n mobile: Yup.string().nullable(),\n });\n\n function isFetchBaseQueryErrorWithErrorResponse(\n error: any\n ): error is FetchBaseQueryError & { data: ErrorResponseData } {\n return error && typeof error === \"object\" && \"data\" in error && \"message\" in error.data;\n }\n\n const formik = useFormik({\n initialValues,\n validationSchema,\n enableReinitialize: true,\n onSubmit: async (values) => {\n if (data) {\n const userData: any = {\n fullName: values.fullName,\n username: values.username,\n email: values.email,\n mobile: values.mobile,\n roles: selectedRoles,\n active: values.active,\n isAllowedToGenerateApiKeys: values.isAllowedToGenerateApiKeys,\n };\n\n if (values.password) {\n userData.password = values.password;\n }\n\n updateUser({ id: data.id, data: userData });\n return;\n }\n\n try {\n const response = await registerPrivate({\n fullName: values.fullName,\n username: values.username,\n email: values.email,\n mobile: values.mobile,\n password: values.password,\n roles: selectedRoles,\n isAllowedToGenerateApiKeys: values.isAllowedToGenerateApiKeys,\n }).unwrap();\n\n if (values.isAllowedToGenerateApiKeys) {\n const userId = (response as any)?.data?.id ?? (response as any)?.id;\n if (userId) {\n setNewUserIdForApiKey(userId);\n return;\n }\n }\n router.back();\n } catch {\n // error shown via userCreateError effect\n }\n },\n });\n\n const fieldError = (fieldName: keyof typeof initialValues) =>\n formik.touched[fieldName] && formik.errors[fieldName] ? String(formik.errors[fieldName]) : \"\";\n\n const handleCheckboxChange = (roleName: string) => {\n const updatedRoles = selectedRoles.includes(roleName)\n ? selectedRoles.filter((name) => name !== roleName)\n : [...selectedRoles, roleName];\n\n setSelectedRoles(updatedRoles);\n formik.setFieldTouched(\"roles\", true);\n formik.setFieldValue(\"roles\", updatedRoles);\n };\n\n useEffect(() => {\n const handleError = (errorToast: any) => {\n let errorMessage: any = [ERROR_MESSAGES.ERROR_OCCURED];\n\n if (isFetchBaseQueryErrorWithErrorResponse(errorToast)) {\n errorMessage = errorToast.data.message;\n } else {\n errorMessage = [ERROR_MESSAGES.SOMETHING_WRONG];\n }\n\n const detail = Array.isArray(errorMessage) ? errorMessage.join(\", \") : errorMessage;\n dispatch(showToast({ severity: \"error\", summary: ERROR_MESSAGES.ERROR, detail }));\n };\n\n if (userCreateError) handleError(userCreateError);\n if (userUpdateError) handleError(userUpdateError);\n }, [dispatch, userCreateError, userUpdateError]);\n\n useEffect(() => {\n if (isDeleteUserSuccess || isUpdateUserSuccess) {\n router.back();\n }\n }, [isDeleteUserSuccess, isUpdateUserSuccess, router]);\n\n const isEditMode = params.id !== \"new\";\n const isSaving = isLoading || isUserUpdating;\n\n const handleUnblockUser = async () => {\n if (!data?.id) return;\n\n try {\n await updateUser({\n id: data.id,\n data: { failedLoginAttempts: 0 },\n }).unwrap();\n dispatch(\n showToast({\n severity: \"success\",\n summary: \"Success\",\n detail: \"User is unblocked.\",\n })\n );\n setFailedAttempts(0);\n } catch {\n // error shown via userUpdateError effect\n }\n };\n\n return (\n <div className=\"solid-form-wrapper\">\n <div className=\"solid-form-section\">\n <form onSubmit={formik.handleSubmit}>\n <div className=\"solid-form-header flex align-items-center justify-content-between gap-3 flex-wrap\">\n <div className=\"solid-user-form-titleblock flex align-items-center gap-3\">\n <BackButton />\n <div>\n <div className=\"form-wrapper-title\">{isEditMode ? \"Update User\" : \"Create User\"}</div>\n <p className=\"solid-user-form-subtitle m-0\">\n {isEditMode\n ? \"Update account details, access roles, and security controls.\"\n : \"Create a user account and assign the right access roles.\"}\n </p>\n </div>\n </div>\n <div className=\"gap-3 flex flex-wrap\">\n {isEditMode && failedAttempts > 0 ? (\n <SolidButton size=\"small\" type=\"button\" variant=\"outline\" loading={isUserUpdating} onClick={handleUnblockUser}>\n Unblock User\n </SolidButton>\n ) : null}\n {formik.dirty ? (\n <SolidButton size=\"small\" type=\"submit\" loading={isSaving}>\n Save\n </SolidButton>\n ) : null}\n {data ? (\n <SolidButton\n size=\"small\"\n type=\"button\"\n variant=\"destructive\"\n loading={isUserDeleting}\n onClick={() => deleteUser(data.id)}\n >\n Delete\n </SolidButton>\n ) : null}\n <CancelButton />\n </div>\n </div>\n\n <SolidFormHeader />\n\n <div className=\"px-3 py-3 md:p-4 solid-form-content\">\n {isEditMode ? (\n <SolidTabGroup\n value={activeTab}\n onValueChange={setActiveTab}\n tabs={[\n {\n value: \"userDetails\",\n label: \"User Details\",\n content: (\n <UserDetailsContent\n formik={formik}\n fieldError={fieldError}\n rolesData={rolesData}\n selectedRoles={selectedRoles}\n handleCheckboxChange={handleCheckboxChange}\n isEditMode={isEditMode}\n />\n ),\n },\n {\n value: \"apiKeys\",\n label: \"API Keys\",\n content: (\n <div className=\"solid-user-edit-api-keys-pane\">\n <ApiKeysTab userId={data?.id} canCreate={data?.isAllowedToGenerateApiKeys ?? false} />\n </div>\n ),\n },\n ]}\n />\n ) : (\n <UserDetailsContent\n formik={formik}\n fieldError={fieldError}\n rolesData={rolesData}\n selectedRoles={selectedRoles}\n handleCheckboxChange={handleCheckboxChange}\n isEditMode={isEditMode}\n />\n )}\n </div>\n </form>\n </div>\n\n {newUserIdForApiKey !== null && (\n <GenerateApiKeyModal\n open={true}\n userId={newUserIdForApiKey}\n onClose={() => {\n setNewUserIdForApiKey(null);\n router.back();\n }}\n onCreated={(apiKey, keyName) => {\n setNewUserIdForApiKey(null);\n setRevealKey({ apiKey, keyName });\n }}\n />\n )}\n\n {revealKey && (\n <RevealApiKeyModal\n open={true}\n apiKey={revealKey.apiKey}\n keyName={revealKey.keyName}\n onClose={() => {\n setRevealKey(null);\n router.back();\n }}\n />\n )}\n </div>\n );\n};\n\n/** Extracted form body so it can be used both inside and outside the tab wrapper */\nfunction UserDetailsContent({\n formik,\n fieldError,\n rolesData,\n selectedRoles,\n handleCheckboxChange,\n isEditMode,\n}: {\n formik: any;\n fieldError: (field: any) => string;\n rolesData: any;\n selectedRoles: string[];\n handleCheckboxChange: (roleName: string) => void;\n isEditMode: boolean;\n}) {\n return (\n <div className=\"solid-user-details-layout\">\n <div className=\"solid-user-details-stack\">\n <SolidPanel header=\"Basic Info\" className=\"solid-column-panel\">\n <div className=\"grid formgrid\">\n <div className=\"field col-12 md:col-6 flex flex-column gap-2\">\n <label htmlFor=\"fullName\" className=\"form-field-label\">\n Full Name\n </label>\n <SolidInput\n type=\"text\"\n id=\"fullName\"\n name=\"fullName\"\n autoComplete=\"off\"\n onChange={formik.handleChange}\n onBlur={formik.handleBlur}\n value={formik.values.fullName}\n className={cx(fieldError(\"fullName\") && \"solid-user-form-input-invalid\")}\n />\n {fieldError(\"fullName\") ? <SolidMessage severity=\"error\" text={fieldError(\"fullName\")} /> : null}\n </div>\n\n <div className=\"field col-12 md:col-6 flex flex-column gap-2\">\n <label htmlFor=\"username\" className=\"form-field-label\">\n Username\n </label>\n <SolidInput\n type=\"text\"\n id=\"username\"\n name=\"username\"\n autoComplete=\"off\"\n disabled={Boolean(formik.values.username) && isEditMode}\n onChange={formik.handleChange}\n onBlur={formik.handleBlur}\n value={formik.values.username}\n className={cx(fieldError(\"username\") && \"solid-user-form-input-invalid\")}\n />\n {fieldError(\"username\") ? <SolidMessage severity=\"error\" text={fieldError(\"username\")} /> : null}\n </div>\n\n <div className=\"field col-12 md:col-6 flex flex-column gap-2 mt-3\">\n <label htmlFor=\"email\" className=\"form-field-label\">\n Email\n </label>\n <SolidInput\n type=\"email\"\n id=\"email\"\n name=\"email\"\n autoComplete=\"off\"\n disabled={isEditMode}\n onChange={formik.handleChange}\n onBlur={formik.handleBlur}\n value={formik.values.email}\n className={cx(fieldError(\"email\") && \"solid-user-form-input-invalid\")}\n />\n {fieldError(\"email\") ? <SolidMessage severity=\"error\" text={fieldError(\"email\")} /> : null}\n </div>\n\n <div className=\"field col-12 md:col-6 flex flex-column gap-2 mt-3\">\n <label htmlFor=\"mobile\" className=\"form-field-label\">\n Mobile\n </label>\n <SolidInput\n type=\"text\"\n id=\"mobile\"\n name=\"mobile\"\n autoComplete=\"off\"\n onChange={formik.handleChange}\n onBlur={formik.handleBlur}\n value={formik.values.mobile}\n className={cx(fieldError(\"mobile\") && \"solid-user-form-input-invalid\")}\n />\n {fieldError(\"mobile\") ? <SolidMessage severity=\"error\" text={fieldError(\"mobile\")} /> : null}\n </div>\n\n {!isEditMode ? (\n <>\n <div className=\"field col-12 md:col-6 flex flex-column gap-2 mt-3\">\n <label htmlFor=\"password\" className=\"form-field-label\">\n Password\n </label>\n <SolidPasswordInput\n id=\"password\"\n name=\"password\"\n autoComplete=\"off\"\n value={formik.values.password}\n onChange={formik.handleChange}\n onBlur={formik.handleBlur}\n className={cx(fieldError(\"password\") && \"solid-user-form-input-invalid\")}\n />\n {fieldError(\"password\") ? <SolidMessage severity=\"error\" text={fieldError(\"password\")} /> : null}\n </div>\n\n <div className=\"field col-12 md:col-6 flex flex-column gap-2 mt-3\">\n <label htmlFor=\"confirmPassword\" className=\"form-field-label\">\n Confirm Password\n </label>\n <SolidPasswordInput\n id=\"confirmPassword\"\n name=\"confirmPassword\"\n autoComplete=\"off\"\n value={formik.values.confirmPassword}\n onChange={formik.handleChange}\n onBlur={formik.handleBlur}\n className={cx(fieldError(\"confirmPassword\") && \"solid-user-form-input-invalid\")}\n />\n {fieldError(\"confirmPassword\") ? (\n <SolidMessage severity=\"error\" text={fieldError(\"confirmPassword\")} />\n ) : null}\n </div>\n </>\n ) : null}\n </div>\n </SolidPanel>\n\n <SolidPanel toggleable header=\"Access\" className=\"solid-column-panel\">\n <div className=\"formgrid grid solid-user-access-grid\">\n {isEditMode ? (\n <div className=\"field col-12 solid-user-access-row\">\n <div className=\"solid-user-access-copy\">\n <p className=\"form-field-label m-0\">Active User</p>\n <p className=\"solid-user-section-helper m-0 mt-1\">\n Control whether this user account is active and allowed to sign in.\n </p>\n </div>\n <SolidSwitch\n checked={formik.values.active}\n onChange={(checked) => formik.setFieldValue(\"active\", checked)}\n />\n </div>\n ) : null}\n <div className=\"field col-12 solid-user-access-row\">\n <div className=\"solid-user-access-copy\">\n <p className=\"form-field-label m-0\">Allow API Key Generation</p>\n <p className=\"solid-user-section-helper m-0 mt-1\">\n When enabled, this user can generate API keys for programmatic access.\n </p>\n </div>\n <SolidSwitch\n checked={formik.values.isAllowedToGenerateApiKeys}\n onChange={(checked) => formik.setFieldValue(\"isAllowedToGenerateApiKeys\", checked)}\n />\n </div>\n </div>\n </SolidPanel>\n\n <SolidPanel toggleable header=\"Roles\" className=\"solid-column-panel\">\n <p className=\"solid-user-section-copy\">Select the roles that should be assigned to this user.</p>\n <div className=\"solid-user-role-grid\">\n {rolesData?.data?.records?.map((role: any) => (\n <div\n key={role.name}\n className={cx(\"solid-user-role-card\", selectedRoles.includes(role.name) && \"is-selected\")}\n >\n <SolidCheckbox\n id={role.name}\n checked={selectedRoles.includes(role.name)}\n onChange={() => handleCheckboxChange(role.name)}\n label={role.name}\n className=\"solid-user-role-control\"\n />\n </div>\n ))}\n </div>\n </SolidPanel>\n </div>\n </div>\n );\n}\n\nexport default CreateUser;\n"]}
@@ -250,7 +250,7 @@ const CreateUser = ({ data, params }: any) => {
250
250
 
251
251
  <SolidFormHeader />
252
252
 
253
- <div className="px-4 py-3 md:p-4 solid-form-content">
253
+ <div className="px-3 py-3 md:p-4 solid-form-content">
254
254
  {isEditMode ? (
255
255
  <SolidTabGroup
256
256
  value={activeTab}
@@ -0,0 +1,7 @@
1
+ type AdminHeaderActionsProps = {
2
+ variant: "header" | "sidebar";
3
+ className?: string;
4
+ };
5
+ export declare const AdminHeaderActions: ({ variant, className }: AdminHeaderActionsProps) => import("react/jsx-runtime").JSX.Element | null;
6
+ export {};
7
+ //# sourceMappingURL=AdminHeaderActions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminHeaderActions.d.ts","sourceRoot":"","sources":["../../../src/components/layout/AdminHeaderActions.tsx"],"names":[],"mappings":"AAUA,KAAK,uBAAuB,GAAG;IAC7B,OAAO,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AA2BF,eAAO,MAAM,kBAAkB,2BAAiC,uBAAuB,mDAkHtF,CAAC"}
@@ -0,0 +1,77 @@
1
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
2
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
3
+ if (ar || !(i in from)) {
4
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
5
+ ar[i] = from[i];
6
+ }
7
+ }
8
+ return to.concat(ar || Array.prototype.slice.call(from));
9
+ };
10
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
11
+ import { useContext } from "react";
12
+ import { useDispatch, useSelector } from "react-redux";
13
+ import { usePathname } from "../../hooks/usePathname";
14
+ import { useRouter } from "../../hooks/useRouter";
15
+ import { useSession } from "../../hooks/useSession";
16
+ import { env } from "../../adapters/env";
17
+ import { hasAnyRole } from "../../helpers/rolesHelper";
18
+ import { enterStudioMode } from "../../redux/features/solidStudioSlice";
19
+ import { LayoutContext } from "./context/layoutcontext";
20
+ var StudioSparkleIcon = function () { return (_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", "aria-hidden": "true", children: [_jsx("path", { d: "M7 1v2M7 11v2M1 7h2M11 7h2M2.93 2.93l1.41 1.41M9.66 9.66l1.41 1.41M2.93 11.07l1.41-1.41M9.66 4.34l1.41-1.41", stroke: "currentColor", strokeWidth: "1.4", strokeLinecap: "round" }), _jsx("circle", { cx: "7", cy: "7", r: "2", stroke: "currentColor", strokeWidth: "1.4" })] })); };
21
+ var ThemeToggleIcon = function () { return (_jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [_jsx("path", { d: "M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }), _jsx("path", { d: "M12 3l0 18", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }), _jsx("path", { d: "M12 9l4.65 -4.65", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }), _jsx("path", { d: "M12 14.3l7.37 -7.37", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }), _jsx("path", { d: "M12 19.6l8.85 -8.85", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" })] })); };
22
+ export var AdminHeaderActions = function (_a) {
23
+ var variant = _a.variant, _b = _a.className, className = _b === void 0 ? "" : _b;
24
+ var pathname = usePathname();
25
+ var router = useRouter();
26
+ var dispatch = useDispatch();
27
+ var session = useSession().data;
28
+ var _c = useContext(LayoutContext), toggleThemeMode = _c.toggleThemeMode, themeMode = _c.themeMode;
29
+ var user = session === null || session === void 0 ? void 0 : session.user;
30
+ var isAdmin = hasAnyRole(user === null || user === void 0 ? void 0 : user.roles, ["Admin"]);
31
+ var isStudioMode = useSelector(function (state) { var _a, _b; return (_b = (_a = state.solidStudio) === null || _a === void 0 ? void 0 : _a.isStudioMode) !== null && _b !== void 0 ? _b : false; });
32
+ var isDev = env("VITE_SOLIDX_ENV") === "dev";
33
+ var showBack = /\/admin\/core\/[^/]+\/[^/]+\/form\/[^/]+/.test(pathname);
34
+ var actions = __spreadArray(__spreadArray(__spreadArray([], (isAdmin && isDev && !isStudioMode
35
+ ? [{
36
+ key: "studio",
37
+ label: "Studio",
38
+ onClick: function () {
39
+ dispatch(enterStudioMode());
40
+ router.push("/studio");
41
+ },
42
+ title: "Enter SolidX Studio",
43
+ icon: _jsx(StudioSparkleIcon, {}),
44
+ }]
45
+ : []), true), [
46
+ {
47
+ key: "theme",
48
+ label: themeMode === "dark" ? "Light Mode" : "Dark Mode",
49
+ onClick: toggleThemeMode,
50
+ title: "Toggle theme",
51
+ icon: _jsx(ThemeToggleIcon, {}),
52
+ }
53
+ ], false), (showBack
54
+ ? [{
55
+ key: "back",
56
+ label: "Back",
57
+ onClick: function () { return router.back(); },
58
+ title: "Go back",
59
+ }]
60
+ : []), true);
61
+ if (!actions.length) {
62
+ return null;
63
+ }
64
+ if (variant === "sidebar") {
65
+ return (_jsx("div", { className: "solid-sidebar-mobile-actions md:hidden ".concat(className).trim(), children: actions.map(function (action) { return (_jsx("button", { type: "button", className: "solid-sidebar-mobile-action", onClick: action.onClick, title: action.title, "aria-label": action.title, children: action.label }, action.key)); }) }));
66
+ }
67
+ return (_jsx("div", { className: "solid-admin-header-actions hidden md:flex ".concat(className).trim(), children: actions.map(function (action) {
68
+ if (action.key === "studio") {
69
+ return (_jsxs("button", { type: "button", className: "solid-studio-trigger-btn", onClick: action.onClick, title: action.title, "aria-label": action.title, children: [action.icon, _jsx("span", { className: "solid-studio-trigger-label", children: action.label })] }, action.key));
70
+ }
71
+ if (action.key === "theme") {
72
+ return (_jsxs("button", { type: "button", className: "solid-admin-theme-toggle", onClick: action.onClick, "aria-label": action.title, title: action.title, children: [action.icon, _jsx("span", { className: "solid-sr-only", children: action.label })] }, action.key));
73
+ }
74
+ return (_jsx("button", { type: "button", className: "solid-admin-back-btn", onClick: action.onClick, "aria-label": action.title, children: action.label }, action.key));
75
+ }) }));
76
+ };
77
+ //# sourceMappingURL=AdminHeaderActions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminHeaderActions.js","sourceRoot":"","sources":["../../../src/components/layout/AdminHeaderActions.tsx"],"names":[],"mappings":"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","sourcesContent":["import { ReactNode, useContext } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { usePathname } from \"../../hooks/usePathname\";\nimport { useRouter } from \"../../hooks/useRouter\";\nimport { useSession } from \"../../hooks/useSession\";\nimport { env } from \"../../adapters/env\";\nimport { hasAnyRole } from \"../../helpers/rolesHelper\";\nimport { enterStudioMode } from \"../../redux/features/solidStudioSlice\";\nimport { LayoutContext } from \"./context/layoutcontext\";\n\ntype AdminHeaderActionsProps = {\n variant: \"header\" | \"sidebar\";\n className?: string;\n};\n\ntype AdminAction = {\n key: string;\n label: string;\n onClick: () => void;\n title: string;\n icon?: ReactNode;\n};\n\nconst StudioSparkleIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M7 1v2M7 11v2M1 7h2M11 7h2M2.93 2.93l1.41 1.41M9.66 9.66l1.41 1.41M2.93 11.07l1.41-1.41M9.66 4.34l1.41-1.41\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" />\n <circle cx=\"7\" cy=\"7\" r=\"2\" stroke=\"currentColor\" strokeWidth=\"1.4\" />\n </svg>\n);\n\nconst ThemeToggleIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 3l0 18\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 9l4.65 -4.65\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 14.3l7.37 -7.37\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 19.6l8.85 -8.85\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nexport const AdminHeaderActions = ({ variant, className = \"\" }: AdminHeaderActionsProps) => {\n const pathname = usePathname();\n const router = useRouter();\n const dispatch = useDispatch();\n const { data: session } = useSession();\n const { toggleThemeMode, themeMode } = useContext(LayoutContext);\n const user = session?.user;\n const isAdmin = hasAnyRole(user?.roles, [\"Admin\"]);\n const isStudioMode = useSelector((state: any) => state.solidStudio?.isStudioMode ?? false);\n const isDev = env(\"VITE_SOLIDX_ENV\") === \"dev\";\n const showBack = /\\/admin\\/core\\/[^/]+\\/[^/]+\\/form\\/[^/]+/.test(pathname);\n\n const actions: AdminAction[] = [\n ...(isAdmin && isDev && !isStudioMode\n ? [{\n key: \"studio\",\n label: \"Studio\",\n onClick: () => {\n dispatch(enterStudioMode());\n router.push(\"/studio\");\n },\n title: \"Enter SolidX Studio\",\n icon: <StudioSparkleIcon />,\n }]\n : []),\n {\n key: \"theme\",\n label: themeMode === \"dark\" ? \"Light Mode\" : \"Dark Mode\",\n onClick: toggleThemeMode,\n title: \"Toggle theme\",\n icon: <ThemeToggleIcon />,\n },\n ...(showBack\n ? [{\n key: \"back\",\n label: \"Back\",\n onClick: () => router.back(),\n title: \"Go back\",\n }]\n : []),\n ];\n\n if (!actions.length) {\n return null;\n }\n\n if (variant === \"sidebar\") {\n return (\n <div className={`solid-sidebar-mobile-actions md:hidden ${className}`.trim()}>\n {actions.map((action) => (\n <button\n key={action.key}\n type=\"button\"\n className=\"solid-sidebar-mobile-action\"\n onClick={action.onClick}\n title={action.title}\n aria-label={action.title}\n >\n {action.label}\n </button>\n ))}\n </div>\n );\n }\n\n return (\n <div className={`solid-admin-header-actions hidden md:flex ${className}`.trim()}>\n {actions.map((action) => {\n if (action.key === \"studio\") {\n return (\n <button\n key={action.key}\n type=\"button\"\n className=\"solid-studio-trigger-btn\"\n onClick={action.onClick}\n title={action.title}\n aria-label={action.title}\n >\n {action.icon}\n <span className=\"solid-studio-trigger-label\">{action.label}</span>\n </button>\n );\n }\n\n if (action.key === \"theme\") {\n return (\n <button\n key={action.key}\n type=\"button\"\n className=\"solid-admin-theme-toggle\"\n onClick={action.onClick}\n aria-label={action.title}\n title={action.title}\n >\n {action.icon}\n <span className=\"solid-sr-only\">{action.label}</span>\n </button>\n );\n }\n\n return (\n <button\n key={action.key}\n type=\"button\"\n className=\"solid-admin-back-btn\"\n onClick={action.onClick}\n aria-label={action.title}\n >\n {action.label}\n </button>\n );\n })}\n </div>\n );\n};\n"]}
@@ -0,0 +1,155 @@
1
+ import { ReactNode, useContext } from "react";
2
+ import { useDispatch, useSelector } from "react-redux";
3
+ import { usePathname } from "../../hooks/usePathname";
4
+ import { useRouter } from "../../hooks/useRouter";
5
+ import { useSession } from "../../hooks/useSession";
6
+ import { env } from "../../adapters/env";
7
+ import { hasAnyRole } from "../../helpers/rolesHelper";
8
+ import { enterStudioMode } from "../../redux/features/solidStudioSlice";
9
+ import { LayoutContext } from "./context/layoutcontext";
10
+
11
+ type AdminHeaderActionsProps = {
12
+ variant: "header" | "sidebar";
13
+ className?: string;
14
+ };
15
+
16
+ type AdminAction = {
17
+ key: string;
18
+ label: string;
19
+ onClick: () => void;
20
+ title: string;
21
+ icon?: ReactNode;
22
+ };
23
+
24
+ const StudioSparkleIcon = () => (
25
+ <svg width="14" height="14" viewBox="0 0 14 14" fill="none" aria-hidden="true">
26
+ <path d="M7 1v2M7 11v2M1 7h2M11 7h2M2.93 2.93l1.41 1.41M9.66 9.66l1.41 1.41M2.93 11.07l1.41-1.41M9.66 4.34l1.41-1.41" stroke="currentColor" strokeWidth="1.4" strokeLinecap="round" />
27
+ <circle cx="7" cy="7" r="2" stroke="currentColor" strokeWidth="1.4" />
28
+ </svg>
29
+ );
30
+
31
+ const ThemeToggleIcon = () => (
32
+ <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" aria-hidden="true">
33
+ <path d="M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
34
+ <path d="M12 3l0 18" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
35
+ <path d="M12 9l4.65 -4.65" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
36
+ <path d="M12 14.3l7.37 -7.37" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
37
+ <path d="M12 19.6l8.85 -8.85" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
38
+ </svg>
39
+ );
40
+
41
+ export const AdminHeaderActions = ({ variant, className = "" }: AdminHeaderActionsProps) => {
42
+ const pathname = usePathname();
43
+ const router = useRouter();
44
+ const dispatch = useDispatch();
45
+ const { data: session } = useSession();
46
+ const { toggleThemeMode, themeMode } = useContext(LayoutContext);
47
+ const user = session?.user;
48
+ const isAdmin = hasAnyRole(user?.roles, ["Admin"]);
49
+ const isStudioMode = useSelector((state: any) => state.solidStudio?.isStudioMode ?? false);
50
+ const isDev = env("VITE_SOLIDX_ENV") === "dev";
51
+ const showBack = /\/admin\/core\/[^/]+\/[^/]+\/form\/[^/]+/.test(pathname);
52
+
53
+ const actions: AdminAction[] = [
54
+ ...(isAdmin && isDev && !isStudioMode
55
+ ? [{
56
+ key: "studio",
57
+ label: "Studio",
58
+ onClick: () => {
59
+ dispatch(enterStudioMode());
60
+ router.push("/studio");
61
+ },
62
+ title: "Enter SolidX Studio",
63
+ icon: <StudioSparkleIcon />,
64
+ }]
65
+ : []),
66
+ {
67
+ key: "theme",
68
+ label: themeMode === "dark" ? "Light Mode" : "Dark Mode",
69
+ onClick: toggleThemeMode,
70
+ title: "Toggle theme",
71
+ icon: <ThemeToggleIcon />,
72
+ },
73
+ ...(showBack
74
+ ? [{
75
+ key: "back",
76
+ label: "Back",
77
+ onClick: () => router.back(),
78
+ title: "Go back",
79
+ }]
80
+ : []),
81
+ ];
82
+
83
+ if (!actions.length) {
84
+ return null;
85
+ }
86
+
87
+ if (variant === "sidebar") {
88
+ return (
89
+ <div className={`solid-sidebar-mobile-actions md:hidden ${className}`.trim()}>
90
+ {actions.map((action) => (
91
+ <button
92
+ key={action.key}
93
+ type="button"
94
+ className="solid-sidebar-mobile-action"
95
+ onClick={action.onClick}
96
+ title={action.title}
97
+ aria-label={action.title}
98
+ >
99
+ {action.label}
100
+ </button>
101
+ ))}
102
+ </div>
103
+ );
104
+ }
105
+
106
+ return (
107
+ <div className={`solid-admin-header-actions hidden md:flex ${className}`.trim()}>
108
+ {actions.map((action) => {
109
+ if (action.key === "studio") {
110
+ return (
111
+ <button
112
+ key={action.key}
113
+ type="button"
114
+ className="solid-studio-trigger-btn"
115
+ onClick={action.onClick}
116
+ title={action.title}
117
+ aria-label={action.title}
118
+ >
119
+ {action.icon}
120
+ <span className="solid-studio-trigger-label">{action.label}</span>
121
+ </button>
122
+ );
123
+ }
124
+
125
+ if (action.key === "theme") {
126
+ return (
127
+ <button
128
+ key={action.key}
129
+ type="button"
130
+ className="solid-admin-theme-toggle"
131
+ onClick={action.onClick}
132
+ aria-label={action.title}
133
+ title={action.title}
134
+ >
135
+ {action.icon}
136
+ <span className="solid-sr-only">{action.label}</span>
137
+ </button>
138
+ );
139
+ }
140
+
141
+ return (
142
+ <button
143
+ key={action.key}
144
+ type="button"
145
+ className="solid-admin-back-btn"
146
+ onClick={action.onClick}
147
+ aria-label={action.title}
148
+ >
149
+ {action.label}
150
+ </button>
151
+ );
152
+ })}
153
+ </div>
154
+ );
155
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"AdminTopHeader.d.ts","sourceRoot":"","sources":["../../../src/components/layout/AdminTopHeader.tsx"],"names":[],"mappings":"AA0BA,eAAO,MAAM,cAAc,+CAoL1B,CAAC"}
1
+ {"version":3,"file":"AdminTopHeader.d.ts","sourceRoot":"","sources":["../../../src/components/layout/AdminTopHeader.tsx"],"names":[],"mappings":"AAcA,eAAO,MAAM,cAAc,+CAoI1B,CAAC"}
@@ -1,33 +1,20 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useContext, useMemo } from "react";
3
- import { useDispatch, useSelector } from "react-redux";
2
+ import { useMemo } from "react";
4
3
  import { usePathname } from "../../hooks/usePathname";
5
4
  import { useSearchParams } from "../../hooks/useSearchParams";
6
5
  import { useRouter } from "../../hooks/useRouter";
7
- import { useSession } from "../../hooks/useSession";
8
6
  import { useGetSolidActionByIdQuery } from "../../redux/api/solidActionApi";
9
- import { LayoutContext } from "./context/layoutcontext";
10
- import { enterStudioMode } from "../../redux/features/solidStudioSlice";
11
- import { hasAnyRole } from "../../helpers/rolesHelper";
12
- import { env } from "../../adapters/env";
7
+ import { AdminHeaderActions } from "./AdminHeaderActions";
13
8
  var SIDEBAR_TOGGLE_EVENT = "solidx:sidebar-toggle";
14
9
  var toLabel = function (value) {
15
10
  return decodeURIComponent(value)
16
11
  .replace(/[-_]/g, " ")
17
12
  .replace(/\b\w/g, function (m) { return m.toUpperCase(); });
18
13
  };
19
- var StudioSparkleIcon = function () { return (_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", "aria-hidden": "true", children: [_jsx("path", { d: "M7 1v2M7 11v2M1 7h2M11 7h2M2.93 2.93l1.41 1.41M9.66 9.66l1.41 1.41M2.93 11.07l1.41-1.41M9.66 4.34l1.41-1.41", stroke: "currentColor", strokeWidth: "1.4", strokeLinecap: "round" }), _jsx("circle", { cx: "7", cy: "7", r: "2", stroke: "currentColor", strokeWidth: "1.4" })] })); };
20
14
  export var AdminTopHeader = function () {
21
15
  var pathname = usePathname();
22
16
  var searchParams = useSearchParams();
23
17
  var router = useRouter();
24
- var dispatch = useDispatch();
25
- var toggleThemeMode = useContext(LayoutContext).toggleThemeMode;
26
- var session = useSession().data;
27
- var user = session === null || session === void 0 ? void 0 : session.user;
28
- var isAdmin = hasAnyRole(user === null || user === void 0 ? void 0 : user.roles, ["Admin"]);
29
- var isStudioMode = useSelector(function (state) { var _a, _b; return (_b = (_a = state.solidStudio) === null || _a === void 0 ? void 0 : _a.isStudioMode) !== null && _b !== void 0 ? _b : false; });
30
- var isDev = env("VITE_SOLIDX_ENV") === "dev";
31
18
  // We treat actionId as the source of truth for breadcrumb labels.
32
19
  // If present, we resolve module/model/action via action-metadata API
33
20
  // so breadcrumbs are consistent across list/form/tree/kanban pages.
@@ -103,6 +90,6 @@ export var AdminTopHeader = function () {
103
90
  }
104
91
  }
105
92
  };
106
- return (_jsx("header", { className: "solid-admin-header", children: _jsxs("div", { className: "solid-admin-header-inner", children: [_jsx("button", { type: "button", className: "solid-admin-sidebar-trigger", onClick: triggerSidebar, "aria-label": "Toggle sidebar", children: _jsxs("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: [_jsx("rect", { x: "1.5", y: "2", width: "13", height: "12", rx: "2", stroke: "currentColor" }), _jsx("path", { d: "M5.5 2V14", stroke: "currentColor" }), _jsx("rect", { x: "8", y: "5.25", width: "4.5", height: "5.5", rx: "0.9", stroke: "currentColor" })] }) }), _jsx("div", { className: "solid-admin-header-sep" }), _jsx("nav", { className: "solid-admin-breadcrumbs", "aria-label": "Breadcrumb", children: crumbs.map(function (crumb, index) { return (_jsxs("span", { className: "solid-admin-crumb", children: [index > 0 && _jsx("span", { className: "solid-admin-crumb-sep", children: "\u203A" }), index === 1 && showBack ? (_jsx("button", { type: "button", className: "solid-admin-crumb-link", onClick: function () { return handleBreadcrumbClick(index); }, style: { background: "none", border: "none", cursor: "pointer", color: "inherit", textDecoration: "underline" }, children: crumb })) : (_jsx("span", { children: crumb }))] }, "".concat(crumb, "-").concat(index))); }) }), _jsxs("div", { className: "solid-admin-header-actions", children: [isAdmin && isDev && !isStudioMode && (_jsxs("button", { type: "button", className: "solid-studio-trigger-btn", onClick: function () { dispatch(enterStudioMode()); router.push("/studio"); }, title: "Enter SolidX Studio", "aria-label": "Enter SolidX Studio", children: [_jsx(StudioSparkleIcon, {}), _jsx("span", { className: "solid-studio-trigger-label", children: "Studio" })] })), _jsxs("button", { type: "button", className: "solid-admin-theme-toggle", onClick: toggleThemeMode, "aria-label": "Toggle theme", title: "Toggle theme", children: [_jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [_jsx("path", { d: "M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }), _jsx("path", { d: "M12 3l0 18", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }), _jsx("path", { d: "M12 9l4.65 -4.65", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }), _jsx("path", { d: "M12 14.3l7.37 -7.37", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }), _jsx("path", { d: "M12 19.6l8.85 -8.85", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" })] }), _jsx("span", { className: "solid-sr-only", children: "Toggle theme" })] }), showBack && (_jsx("button", { type: "button", className: "solid-admin-back-btn", onClick: function () { return router.back(); }, "aria-label": "Go back", children: "Back" }))] })] }) }));
93
+ return (_jsx("header", { className: "solid-admin-header", children: _jsxs("div", { className: "solid-admin-header-inner", children: [_jsx("button", { type: "button", className: "solid-admin-sidebar-trigger", onClick: triggerSidebar, "aria-label": "Toggle sidebar", children: _jsxs("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: [_jsx("rect", { x: "1.5", y: "2", width: "13", height: "12", rx: "2", stroke: "currentColor" }), _jsx("path", { d: "M5.5 2V14", stroke: "currentColor" }), _jsx("rect", { x: "8", y: "5.25", width: "4.5", height: "5.5", rx: "0.9", stroke: "currentColor" })] }) }), _jsx("div", { className: "solid-admin-header-sep" }), _jsx("nav", { className: "solid-admin-breadcrumbs", "aria-label": "Breadcrumb", children: crumbs.map(function (crumb, index) { return (_jsxs("span", { className: "solid-admin-crumb", children: [index > 0 && _jsx("span", { className: "solid-admin-crumb-sep", children: "\u203A" }), index === 1 && showBack ? (_jsx("button", { type: "button", className: "solid-admin-crumb-link", onClick: function () { return handleBreadcrumbClick(index); }, style: { background: "none", border: "none", cursor: "pointer", color: "inherit", textDecoration: "underline" }, children: crumb })) : (_jsx("span", { className: "solid-bread-crum-text-wrapper", children: crumb }))] }, "".concat(crumb, "-").concat(index))); }) }), _jsx(AdminHeaderActions, { variant: "header" })] }) }));
107
94
  };
108
95
  //# sourceMappingURL=AdminTopHeader.js.map