@solidxai/core-ui 0.1.7-beta.8 → 0.1.7

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 (131) hide show
  1. package/README.md +215 -0
  2. package/dist/components/auth/SolidLogin.js +1 -1
  3. package/dist/components/auth/SolidLogin.js.map +1 -1
  4. package/dist/components/auth/SolidLogin.tsx +2 -2
  5. package/dist/components/common/GeneralSettings.d.ts.map +1 -1
  6. package/dist/components/common/GeneralSettings.js +79 -45
  7. package/dist/components/common/GeneralSettings.js.map +1 -1
  8. package/dist/components/common/GeneralSettings.tsx +94 -45
  9. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.d.ts +33 -7
  10. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.d.ts.map +1 -1
  11. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js +132 -40
  12. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js.map +1 -1
  13. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.tsx +373 -55
  14. package/dist/components/core/chatter/SolidChatter.d.ts +2 -1
  15. package/dist/components/core/chatter/SolidChatter.d.ts.map +1 -1
  16. package/dist/components/core/chatter/SolidChatter.js +2 -2
  17. package/dist/components/core/chatter/SolidChatter.js.map +1 -1
  18. package/dist/components/core/chatter/SolidChatter.tsx +2 -1
  19. package/dist/components/core/chatter/SolidChatterHeader.d.ts +1 -0
  20. package/dist/components/core/chatter/SolidChatterHeader.d.ts.map +1 -1
  21. package/dist/components/core/chatter/SolidChatterHeader.js +3 -3
  22. package/dist/components/core/chatter/SolidChatterHeader.js.map +1 -1
  23. package/dist/components/core/chatter/SolidChatterHeader.tsx +4 -3
  24. package/dist/components/core/chatter/SolidMessageComposer.d.ts +2 -1
  25. package/dist/components/core/chatter/SolidMessageComposer.d.ts.map +1 -1
  26. package/dist/components/core/chatter/SolidMessageComposer.js +3 -1
  27. package/dist/components/core/chatter/SolidMessageComposer.js.map +1 -1
  28. package/dist/components/core/chatter/SolidMessageComposer.tsx +3 -1
  29. package/dist/components/core/common/SolidViewLayoutManager.d.ts +17 -0
  30. package/dist/components/core/common/SolidViewLayoutManager.d.ts.map +1 -1
  31. package/dist/components/core/common/SolidViewLayoutManager.js +58 -1
  32. package/dist/components/core/common/SolidViewLayoutManager.js.map +1 -1
  33. package/dist/components/core/common/SolidViewLayoutManager.ts +43 -2
  34. package/dist/components/core/extension/solid-core/chatterMessage/form/SolidChatterMessageCoModelEntityIdFormViewWidget.d.ts +3 -0
  35. package/dist/components/core/extension/solid-core/chatterMessage/form/SolidChatterMessageCoModelEntityIdFormViewWidget.d.ts.map +1 -0
  36. package/dist/components/core/extension/solid-core/chatterMessage/form/SolidChatterMessageCoModelEntityIdFormViewWidget.js +92 -0
  37. package/dist/components/core/extension/solid-core/chatterMessage/form/SolidChatterMessageCoModelEntityIdFormViewWidget.js.map +1 -0
  38. package/dist/components/core/extension/solid-core/chatterMessage/form/SolidChatterMessageCoModelEntityIdFormViewWidget.tsx +68 -0
  39. package/dist/components/core/extension/solid-core/chatterMessage/list/SolidChatterMessageCoModelEntityIdListViewWidget.d.ts +3 -0
  40. package/dist/components/core/extension/solid-core/chatterMessage/list/SolidChatterMessageCoModelEntityIdListViewWidget.d.ts.map +1 -0
  41. package/dist/components/core/extension/solid-core/chatterMessage/list/SolidChatterMessageCoModelEntityIdListViewWidget.js +87 -0
  42. package/dist/components/core/extension/solid-core/chatterMessage/list/SolidChatterMessageCoModelEntityIdListViewWidget.js.map +1 -0
  43. package/dist/components/core/extension/solid-core/chatterMessage/list/SolidChatterMessageCoModelEntityIdListViewWidget.tsx +70 -0
  44. package/dist/components/core/extension/solid-core/listOfValues/form/SolidLovTypeChangeFormEditWidget.d.ts +3 -0
  45. package/dist/components/core/extension/solid-core/listOfValues/form/SolidLovTypeChangeFormEditWidget.d.ts.map +1 -0
  46. package/dist/components/core/extension/solid-core/listOfValues/form/SolidLovTypeChangeFormEditWidget.js +111 -0
  47. package/dist/components/core/extension/solid-core/listOfValues/form/SolidLovTypeChangeFormEditWidget.js.map +1 -0
  48. package/dist/components/core/extension/solid-core/listOfValues/form/SolidLovTypeChangeFormEditWidget.tsx +122 -0
  49. package/dist/components/core/extension/solid-core/mqMessage/form/SolidMqMessageStageFormViewWIdget.d.ts +3 -0
  50. package/dist/components/core/extension/solid-core/mqMessage/form/SolidMqMessageStageFormViewWIdget.d.ts.map +1 -0
  51. package/dist/components/core/extension/solid-core/mqMessage/form/SolidMqMessageStageFormViewWIdget.js +10 -0
  52. package/dist/components/core/extension/solid-core/mqMessage/form/SolidMqMessageStageFormViewWIdget.js.map +1 -0
  53. package/dist/components/core/extension/solid-core/mqMessage/form/SolidMqMessageStageFormViewWIdget.tsx +21 -0
  54. package/dist/components/core/extension/solid-core/mqMessage/form/mqMessageOnFormLoadHandler.d.ts +8 -0
  55. package/dist/components/core/extension/solid-core/mqMessage/form/mqMessageOnFormLoadHandler.d.ts.map +1 -0
  56. package/dist/components/core/extension/solid-core/mqMessage/form/mqMessageOnFormLoadHandler.js +62 -0
  57. package/dist/components/core/extension/solid-core/mqMessage/form/mqMessageOnFormLoadHandler.js.map +1 -0
  58. package/dist/components/core/extension/solid-core/mqMessage/form/mqMessageOnFormLoadHandler.tsx +27 -0
  59. package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessageStageListViewWidget.d.ts +3 -0
  60. package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessageStageListViewWidget.d.ts.map +1 -0
  61. package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessageStageListViewWidget.js +8 -0
  62. package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessageStageListViewWidget.js.map +1 -0
  63. package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessageStageListViewWidget.tsx +15 -0
  64. package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessagesSummarizeListHeaderAction.d.ts +3 -0
  65. package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessagesSummarizeListHeaderAction.d.ts.map +1 -0
  66. package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessagesSummarizeListHeaderAction.js +158 -0
  67. package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessagesSummarizeListHeaderAction.js.map +1 -0
  68. package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessagesSummarizeListHeaderAction.tsx +185 -0
  69. package/dist/components/core/extension/solid-core/mqMessage/ui/MqMessageStageBadge.d.ts +17 -0
  70. package/dist/components/core/extension/solid-core/mqMessage/ui/MqMessageStageBadge.d.ts.map +1 -0
  71. package/dist/components/core/extension/solid-core/mqMessage/ui/MqMessageStageBadge.js +52 -0
  72. package/dist/components/core/extension/solid-core/mqMessage/ui/MqMessageStageBadge.js.map +1 -0
  73. package/dist/components/core/extension/solid-core/mqMessage/ui/MqMessageStageBadge.tsx +83 -0
  74. package/dist/components/core/locales/SolidChatterLocaleTabView.d.ts.map +1 -1
  75. package/dist/components/core/locales/SolidChatterLocaleTabView.js +7 -5
  76. package/dist/components/core/locales/SolidChatterLocaleTabView.js.map +1 -1
  77. package/dist/components/core/locales/SolidChatterLocaleTabView.tsx +3 -0
  78. package/dist/components/core/users/ApiKeysTab/ApiKeysTab.css +38 -0
  79. package/dist/components/core/users/ApiKeysTab/ApiKeysTab.d.ts +1 -0
  80. package/dist/components/core/users/ApiKeysTab/ApiKeysTab.d.ts.map +1 -1
  81. package/dist/components/core/users/ApiKeysTab/ApiKeysTab.js +4 -3
  82. package/dist/components/core/users/ApiKeysTab/ApiKeysTab.js.map +1 -1
  83. package/dist/components/core/users/ApiKeysTab/ApiKeysTab.tsx +13 -3
  84. package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.d.ts +2 -1
  85. package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.d.ts.map +1 -1
  86. package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.js +6 -5
  87. package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.js.map +1 -1
  88. package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.tsx +6 -7
  89. package/dist/components/core/users/CreateUser.d.ts.map +1 -1
  90. package/dist/components/core/users/CreateUser.js +89 -35
  91. package/dist/components/core/users/CreateUser.js.map +1 -1
  92. package/dist/components/core/users/CreateUser.tsx +291 -165
  93. package/dist/components/layout/SolidAiStudioLayout.d.ts.map +1 -1
  94. package/dist/components/layout/SolidAiStudioLayout.js +123 -8
  95. package/dist/components/layout/SolidAiStudioLayout.js.map +1 -1
  96. package/dist/components/layout/SolidAiStudioLayout.tsx +70 -6
  97. package/dist/components/shad-cn-ui/SolidTabs.d.ts +2 -1
  98. package/dist/components/shad-cn-ui/SolidTabs.d.ts.map +1 -1
  99. package/dist/components/shad-cn-ui/SolidTabs.js +5 -5
  100. package/dist/components/shad-cn-ui/SolidTabs.js.map +1 -1
  101. package/dist/components/shad-cn-ui/SolidTabs.tsx +6 -0
  102. package/dist/helpers/registry.d.ts.map +1 -1
  103. package/dist/helpers/registry.js +10 -6
  104. package/dist/helpers/registry.js.map +1 -1
  105. package/dist/helpers/registry.ts +11 -7
  106. package/dist/index.d.ts +3 -0
  107. package/dist/index.d.ts.map +1 -1
  108. package/dist/index.js +3 -0
  109. package/dist/index.js.map +1 -1
  110. package/dist/index.ts +11 -0
  111. package/dist/redux/api/apiKeyApi.d.ts +8 -1
  112. package/dist/redux/api/apiKeyApi.d.ts.map +1 -1
  113. package/dist/redux/api/apiKeyApi.js +12 -1
  114. package/dist/redux/api/apiKeyApi.js.map +1 -1
  115. package/dist/redux/api/apiKeyApi.ts +9 -0
  116. package/dist/redux/store/defaultStoreConfig.d.ts +16 -1
  117. package/dist/redux/store/defaultStoreConfig.d.ts.map +1 -1
  118. package/dist/redux/store/defaultStoreConfig.js +3 -1
  119. package/dist/redux/store/defaultStoreConfig.js.map +1 -1
  120. package/dist/redux/store/defaultStoreConfig.ts +3 -1
  121. package/dist/routes/guards/GuestGuard.d.ts +2 -0
  122. package/dist/routes/guards/GuestGuard.d.ts.map +1 -0
  123. package/dist/routes/guards/GuestGuard.js +18 -0
  124. package/dist/routes/guards/GuestGuard.js.map +1 -0
  125. package/dist/routes/guards/GuestGuard.tsx +20 -0
  126. package/dist/routes/solidRoutes.d.ts.map +1 -1
  127. package/dist/routes/solidRoutes.js +2 -1
  128. package/dist/routes/solidRoutes.js.map +1 -1
  129. package/dist/routes/solidRoutes.tsx +2 -1
  130. package/dist/types/solid-core.d.ts +1 -0
  131. package/package.json +1 -1
@@ -19,7 +19,10 @@ import {
19
19
  SolidMessage,
20
20
  SolidPanel,
21
21
  SolidPasswordInput,
22
+ SolidSwitch,
23
+ SolidTabGroup,
22
24
  } from "../../shad-cn-ui";
25
+ import { ApiKeysTab, GenerateApiKeyModal, RevealApiKeyModal } from "./ApiKeysTab";
23
26
 
24
27
  interface ErrorResponseData {
25
28
  message: string;
@@ -35,8 +38,11 @@ const CreateUser = ({ data, params }: any) => {
35
38
  const dispatch = useDispatch();
36
39
  const router = useRouter();
37
40
  const [selectedRoles, setSelectedRoles] = useState<string[]>([]);
41
+ const [activeTab, setActiveTab] = useState("userDetails");
42
+ const [newUserIdForApiKey, setNewUserIdForApiKey] = useState<number | null>(null);
43
+ const [revealKey, setRevealKey] = useState<{ apiKey: string; keyName: string } | null>(null);
38
44
 
39
- const [registerPrivate, { isLoading, error: userCreateError, isSuccess }] = useRegisterPrivateMutation();
45
+ const [registerPrivate, { isLoading, error: userCreateError }] = useRegisterPrivateMutation();
40
46
  const [
41
47
  updateUser,
42
48
  {
@@ -63,6 +69,7 @@ const CreateUser = ({ data, params }: any) => {
63
69
  password: "",
64
70
  confirmPassword: "",
65
71
  failedLoginAttempts: data?.failedLoginAttempts ?? 0,
72
+ isAllowedToGenerateApiKeys: data?.isAllowedToGenerateApiKeys ?? false,
66
73
  };
67
74
 
68
75
  const validationSchema = Yup.object({
@@ -103,6 +110,7 @@ const CreateUser = ({ data, params }: any) => {
103
110
  mobile: values.mobile,
104
111
  roles: selectedRoles,
105
112
  failedLoginAttempts: values.failedLoginAttempts,
113
+ isAllowedToGenerateApiKeys: values.isAllowedToGenerateApiKeys,
106
114
  };
107
115
 
108
116
  if (values.password) {
@@ -113,15 +121,29 @@ const CreateUser = ({ data, params }: any) => {
113
121
  return;
114
122
  }
115
123
 
116
- registerPrivate({
117
- fullName: values.fullName,
118
- username: values.username,
119
- email: values.email,
120
- mobile: values.mobile,
121
- password: values.password,
122
- roles: selectedRoles,
123
- failedLoginAttempts: values.failedLoginAttempts,
124
- });
124
+ try {
125
+ const response = await registerPrivate({
126
+ fullName: values.fullName,
127
+ username: values.username,
128
+ email: values.email,
129
+ mobile: values.mobile,
130
+ password: values.password,
131
+ roles: selectedRoles,
132
+ failedLoginAttempts: values.failedLoginAttempts,
133
+ isAllowedToGenerateApiKeys: values.isAllowedToGenerateApiKeys,
134
+ }).unwrap();
135
+
136
+ if (values.isAllowedToGenerateApiKeys) {
137
+ const userId = (response as any)?.data?.id ?? (response as any)?.id;
138
+ if (userId) {
139
+ setNewUserIdForApiKey(userId);
140
+ return;
141
+ }
142
+ }
143
+ router.back();
144
+ } catch {
145
+ // error shown via userCreateError effect
146
+ }
125
147
  },
126
148
  });
127
149
 
@@ -157,14 +179,15 @@ const CreateUser = ({ data, params }: any) => {
157
179
  }, [dispatch, userCreateError, userUpdateError]);
158
180
 
159
181
  useEffect(() => {
160
- if (isSuccess || isDeleteUserSuccess || isUpdateUserSuccess) {
182
+ if (isDeleteUserSuccess || isUpdateUserSuccess) {
161
183
  router.back();
162
184
  }
163
- }, [isDeleteUserSuccess, isSuccess, isUpdateUserSuccess, router]);
185
+ }, [isDeleteUserSuccess, isUpdateUserSuccess, router]);
164
186
 
165
187
  const isEditMode = params.id !== "new";
166
188
  const isSaving = isLoading || isUserUpdating;
167
189
 
190
+
168
191
  return (
169
192
  <div className="solid-form-wrapper">
170
193
  <div className="solid-form-section">
@@ -205,165 +228,268 @@ const CreateUser = ({ data, params }: any) => {
205
228
  <SolidFormHeader />
206
229
 
207
230
  <div className="px-4 py-3 md:p-4 solid-form-content">
208
- <div className="grid">
209
- <div className="col-12 lg:col-10 xl:col-8 mx-auto">
210
- <SolidPanel header="Basic Info" className="solid-column-panel solid-user-form-panel">
211
- <div className="grid formgrid">
212
- <div className="field col-12 md:col-6 flex flex-column gap-2">
213
- <label htmlFor="fullName" className="form-field-label">
214
- Full Name
215
- </label>
216
- <SolidInput
217
- type="text"
218
- id="fullName"
219
- name="fullName"
220
- autoComplete="off"
221
- onChange={formik.handleChange}
222
- onBlur={formik.handleBlur}
223
- value={formik.values.fullName}
224
- className={cx(fieldError("fullName") && "solid-user-form-input-invalid")}
225
- />
226
- {fieldError("fullName") ? <SolidMessage severity="error" text={fieldError("fullName")} /> : null}
227
- </div>
228
-
229
- <div className="field col-12 md:col-6 flex flex-column gap-2">
230
- <label htmlFor="username" className="form-field-label">
231
- Username
232
- </label>
233
- <SolidInput
234
- type="text"
235
- id="username"
236
- name="username"
237
- autoComplete="off"
238
- disabled={Boolean(data)}
239
- onChange={formik.handleChange}
240
- onBlur={formik.handleBlur}
241
- value={formik.values.username}
242
- className={cx(fieldError("username") && "solid-user-form-input-invalid")}
231
+ {isEditMode ? (
232
+ <SolidTabGroup
233
+ value={activeTab}
234
+ onValueChange={setActiveTab}
235
+ tabs={[
236
+ {
237
+ value: "userDetails",
238
+ label: "User Details",
239
+ content: <UserDetailsContent
240
+ formik={formik}
241
+ fieldError={fieldError}
242
+ rolesData={rolesData}
243
+ selectedRoles={selectedRoles}
244
+ handleCheckboxChange={handleCheckboxChange}
245
+ isEditMode={isEditMode}
246
+ />,
247
+ },
248
+ {
249
+ value: "apiKeys",
250
+ label: "API Keys",
251
+ content: <div className="pt-4">
252
+ <ApiKeysTab
253
+ userId={data?.id}
254
+ canCreate={data?.isAllowedToGenerateApiKeys ?? false}
243
255
  />
244
- {fieldError("username") ? <SolidMessage severity="error" text={fieldError("username")} /> : null}
245
- </div>
246
-
247
- <div className="field col-12 md:col-6 flex flex-column gap-2 mt-3">
248
- <label htmlFor="email" className="form-field-label">
249
- Email
250
- </label>
251
- <SolidInput
252
- type="email"
253
- id="email"
254
- name="email"
255
- autoComplete="off"
256
- disabled={Boolean(data)}
257
- onChange={formik.handleChange}
258
- onBlur={formik.handleBlur}
259
- value={formik.values.email}
260
- className={cx(fieldError("email") && "solid-user-form-input-invalid")}
261
- />
262
- {fieldError("email") ? <SolidMessage severity="error" text={fieldError("email")} /> : null}
263
- </div>
264
-
265
- <div className="field col-12 md:col-6 flex flex-column gap-2 mt-3">
266
- <label htmlFor="mobile" className="form-field-label">
267
- Mobile
268
- </label>
269
- <SolidInput
270
- type="text"
271
- id="mobile"
272
- name="mobile"
273
- autoComplete="off"
274
- onChange={formik.handleChange}
275
- onBlur={formik.handleBlur}
276
- value={formik.values.mobile}
277
- className={cx(fieldError("mobile") && "solid-user-form-input-invalid")}
278
- />
279
- {fieldError("mobile") ? <SolidMessage severity="error" text={fieldError("mobile")} /> : null}
280
- </div>
281
-
282
- {!isEditMode ? (
283
- <>
284
- <div className="field col-12 md:col-6 flex flex-column gap-2 mt-3">
285
- <label htmlFor="password" className="form-field-label">
286
- Password
287
- </label>
288
- <SolidPasswordInput
289
- id="password"
290
- name="password"
291
- autoComplete="off"
292
- value={formik.values.password}
293
- onChange={formik.handleChange}
294
- onBlur={formik.handleBlur}
295
- className={cx(fieldError("password") && "solid-user-form-input-invalid")}
296
- />
297
- {fieldError("password") ? <SolidMessage severity="error" text={fieldError("password")} /> : null}
298
- </div>
299
-
300
- <div className="field col-12 md:col-6 flex flex-column gap-2 mt-3">
301
- <label htmlFor="confirmPassword" className="form-field-label">
302
- Confirm Password
303
- </label>
304
- <SolidPasswordInput
305
- id="confirmPassword"
306
- name="confirmPassword"
307
- autoComplete="off"
308
- value={formik.values.confirmPassword}
309
- onChange={formik.handleChange}
310
- onBlur={formik.handleBlur}
311
- className={cx(fieldError("confirmPassword") && "solid-user-form-input-invalid")}
312
- />
313
- {fieldError("confirmPassword") ? (
314
- <SolidMessage severity="error" text={fieldError("confirmPassword")} />
315
- ) : null}
316
- </div>
317
- </>
318
- ) : (
319
- <div className="field col-12 md:col-6 flex flex-column gap-2 mt-3">
320
- <label htmlFor="failedLoginAttempts" className="form-field-label">
321
- Failed Login Attempts
322
- </label>
323
- <SolidInput
324
- type="number"
325
- id="failedLoginAttempts"
326
- name="failedLoginAttempts"
327
- autoComplete="off"
328
- onChange={formik.handleChange}
329
- onBlur={formik.handleBlur}
330
- value={formik.values.failedLoginAttempts}
331
- className={cx(fieldError("failedLoginAttempts") && "solid-user-form-input-invalid")}
332
- />
333
- {fieldError("failedLoginAttempts") ? (
334
- <SolidMessage severity="error" text={fieldError("failedLoginAttempts")} />
335
- ) : null}
336
- <p className="solid-user-form-helper">
337
- Your account has been locked due to repeated unsuccessful login attempts. Please contact your
338
- system admin.
339
- </p>
340
- </div>
341
- )}
342
- </div>
343
- </SolidPanel>
344
-
345
- <SolidPanel toggleable header="Roles" className="solid-column-panel solid-user-form-panel mt-5">
346
- <p className="solid-user-form-panel-copy">Select the roles that should be assigned to this user.</p>
347
- <div className="formgrid grid solid-user-role-grid">
348
- {rolesData?.data?.records?.map((role: any) => (
349
- <div key={role.name} className="field col-12 md:col-6 solid-user-role-item">
350
- <SolidCheckbox
351
- id={role.name}
352
- checked={selectedRoles.includes(role.name)}
353
- onChange={() => handleCheckboxChange(role.name)}
354
- label={role.name}
355
- />
356
- </div>
357
- ))}
358
- </div>
359
- </SolidPanel>
360
- </div>
361
- </div>
256
+ </div>,
257
+ },
258
+ ]}
259
+ />
260
+ ) : (
261
+ <UserDetailsContent
262
+ formik={formik}
263
+ fieldError={fieldError}
264
+ rolesData={rolesData}
265
+ selectedRoles={selectedRoles}
266
+ handleCheckboxChange={handleCheckboxChange}
267
+ isEditMode={isEditMode}
268
+ />
269
+ )}
362
270
  </div>
363
271
  </form>
364
272
  </div>
273
+
274
+ {newUserIdForApiKey !== null && (
275
+ <GenerateApiKeyModal
276
+ open={true}
277
+ userId={newUserIdForApiKey}
278
+ onClose={() => {
279
+ setNewUserIdForApiKey(null);
280
+ router.back();
281
+ }}
282
+ onCreated={(apiKey, keyName) => {
283
+ setNewUserIdForApiKey(null);
284
+ setRevealKey({ apiKey, keyName });
285
+ }}
286
+ />
287
+ )}
288
+
289
+ {revealKey && (
290
+ <RevealApiKeyModal
291
+ open={true}
292
+ apiKey={revealKey.apiKey}
293
+ keyName={revealKey.keyName}
294
+ onClose={() => {
295
+ setRevealKey(null);
296
+ router.back();
297
+ }}
298
+ />
299
+ )}
365
300
  </div>
366
301
  );
367
302
  };
368
303
 
304
+ /** Extracted form body so it can be used both inside and outside the tab wrapper */
305
+ function UserDetailsContent({
306
+ formik,
307
+ fieldError,
308
+ rolesData,
309
+ selectedRoles,
310
+ handleCheckboxChange,
311
+ isEditMode,
312
+ }: {
313
+ formik: any;
314
+ fieldError: (field: any) => string;
315
+ rolesData: any;
316
+ selectedRoles: string[];
317
+ handleCheckboxChange: (roleName: string) => void;
318
+ isEditMode: boolean;
319
+ }) {
320
+ return (
321
+ <div className="grid">
322
+ <div className="col-12 lg:col-10 xl:col-8 mx-auto">
323
+ <SolidPanel header="Basic Info" className="solid-column-panel solid-user-form-panel">
324
+ <div className="grid formgrid">
325
+ <div className="field col-12 md:col-6 flex flex-column gap-2">
326
+ <label htmlFor="fullName" className="form-field-label">
327
+ Full Name
328
+ </label>
329
+ <SolidInput
330
+ type="text"
331
+ id="fullName"
332
+ name="fullName"
333
+ autoComplete="off"
334
+ onChange={formik.handleChange}
335
+ onBlur={formik.handleBlur}
336
+ value={formik.values.fullName}
337
+ className={cx(fieldError("fullName") && "solid-user-form-input-invalid")}
338
+ />
339
+ {fieldError("fullName") ? <SolidMessage severity="error" text={fieldError("fullName")} /> : null}
340
+ </div>
341
+
342
+ <div className="field col-12 md:col-6 flex flex-column gap-2">
343
+ <label htmlFor="username" className="form-field-label">
344
+ Username
345
+ </label>
346
+ <SolidInput
347
+ type="text"
348
+ id="username"
349
+ name="username"
350
+ autoComplete="off"
351
+ disabled={Boolean(formik.values.username) && isEditMode}
352
+ onChange={formik.handleChange}
353
+ onBlur={formik.handleBlur}
354
+ value={formik.values.username}
355
+ className={cx(fieldError("username") && "solid-user-form-input-invalid")}
356
+ />
357
+ {fieldError("username") ? <SolidMessage severity="error" text={fieldError("username")} /> : null}
358
+ </div>
359
+
360
+ <div className="field col-12 md:col-6 flex flex-column gap-2 mt-3">
361
+ <label htmlFor="email" className="form-field-label">
362
+ Email
363
+ </label>
364
+ <SolidInput
365
+ type="email"
366
+ id="email"
367
+ name="email"
368
+ autoComplete="off"
369
+ disabled={isEditMode}
370
+ onChange={formik.handleChange}
371
+ onBlur={formik.handleBlur}
372
+ value={formik.values.email}
373
+ className={cx(fieldError("email") && "solid-user-form-input-invalid")}
374
+ />
375
+ {fieldError("email") ? <SolidMessage severity="error" text={fieldError("email")} /> : null}
376
+ </div>
377
+
378
+ <div className="field col-12 md:col-6 flex flex-column gap-2 mt-3">
379
+ <label htmlFor="mobile" className="form-field-label">
380
+ Mobile
381
+ </label>
382
+ <SolidInput
383
+ type="text"
384
+ id="mobile"
385
+ name="mobile"
386
+ autoComplete="off"
387
+ onChange={formik.handleChange}
388
+ onBlur={formik.handleBlur}
389
+ value={formik.values.mobile}
390
+ className={cx(fieldError("mobile") && "solid-user-form-input-invalid")}
391
+ />
392
+ {fieldError("mobile") ? <SolidMessage severity="error" text={fieldError("mobile")} /> : null}
393
+ </div>
394
+
395
+ {!isEditMode ? (
396
+ <>
397
+ <div className="field col-12 md:col-6 flex flex-column gap-2 mt-3">
398
+ <label htmlFor="password" className="form-field-label">
399
+ Password
400
+ </label>
401
+ <SolidPasswordInput
402
+ id="password"
403
+ name="password"
404
+ autoComplete="off"
405
+ value={formik.values.password}
406
+ onChange={formik.handleChange}
407
+ onBlur={formik.handleBlur}
408
+ className={cx(fieldError("password") && "solid-user-form-input-invalid")}
409
+ />
410
+ {fieldError("password") ? <SolidMessage severity="error" text={fieldError("password")} /> : null}
411
+ </div>
412
+
413
+ <div className="field col-12 md:col-6 flex flex-column gap-2 mt-3">
414
+ <label htmlFor="confirmPassword" className="form-field-label">
415
+ Confirm Password
416
+ </label>
417
+ <SolidPasswordInput
418
+ id="confirmPassword"
419
+ name="confirmPassword"
420
+ autoComplete="off"
421
+ value={formik.values.confirmPassword}
422
+ onChange={formik.handleChange}
423
+ onBlur={formik.handleBlur}
424
+ className={cx(fieldError("confirmPassword") && "solid-user-form-input-invalid")}
425
+ />
426
+ {fieldError("confirmPassword") ? (
427
+ <SolidMessage severity="error" text={fieldError("confirmPassword")} />
428
+ ) : null}
429
+ </div>
430
+ </>
431
+ ) : (
432
+ <div className="field col-12 md:col-6 flex flex-column gap-2 mt-3">
433
+ <label htmlFor="failedLoginAttempts" className="form-field-label">
434
+ Failed Login Attempts
435
+ </label>
436
+ <SolidInput
437
+ type="number"
438
+ id="failedLoginAttempts"
439
+ name="failedLoginAttempts"
440
+ autoComplete="off"
441
+ onChange={formik.handleChange}
442
+ onBlur={formik.handleBlur}
443
+ value={formik.values.failedLoginAttempts}
444
+ className={cx(fieldError("failedLoginAttempts") && "solid-user-form-input-invalid")}
445
+ />
446
+ {fieldError("failedLoginAttempts") ? (
447
+ <SolidMessage severity="error" text={fieldError("failedLoginAttempts")} />
448
+ ) : null}
449
+ <p className="solid-user-form-helper">
450
+ Your account has been locked due to repeated unsuccessful login attempts. Please contact your
451
+ system admin.
452
+ </p>
453
+ </div>
454
+ )}
455
+ </div>
456
+ </SolidPanel>
457
+
458
+ <SolidPanel toggleable header="Access" className="solid-column-panel solid-user-form-panel mt-5">
459
+ <div className="formgrid grid">
460
+ <div className="field col-12 flex align-items-center justify-content-between gap-3">
461
+ <div>
462
+ <p className="form-field-label m-0">Allow API Key Generation</p>
463
+ <p className="solid-user-form-helper m-0 mt-1">
464
+ When enabled, this user can generate API keys for programmatic access.
465
+ </p>
466
+ </div>
467
+ <SolidSwitch
468
+ checked={formik.values.isAllowedToGenerateApiKeys}
469
+ onChange={(checked) => formik.setFieldValue("isAllowedToGenerateApiKeys", checked)}
470
+ />
471
+ </div>
472
+ </div>
473
+ </SolidPanel>
474
+
475
+ <SolidPanel toggleable header="Roles" className="solid-column-panel solid-user-form-panel mt-5">
476
+ <p className="solid-user-form-panel-copy">Select the roles that should be assigned to this user.</p>
477
+ <div className="formgrid grid solid-user-role-grid">
478
+ {rolesData?.data?.records?.map((role: any) => (
479
+ <div key={role.name} className="field col-12 md:col-6 solid-user-role-item">
480
+ <SolidCheckbox
481
+ id={role.name}
482
+ checked={selectedRoles.includes(role.name)}
483
+ onChange={() => handleCheckboxChange(role.name)}
484
+ label={role.name}
485
+ />
486
+ </div>
487
+ ))}
488
+ </div>
489
+ </SolidPanel>
490
+ </div>
491
+ </div>
492
+ );
493
+ }
494
+
369
495
  export default CreateUser;
@@ -1 +1 @@
1
- {"version":3,"file":"SolidAiStudioLayout.d.ts","sourceRoot":"","sources":["../../../src/components/layout/SolidAiStudioLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAiC3D,eAAO,MAAM,QAAQ,+CAIpB,CAAC;AAyBF,wBAAgB,WAAW,6BAqH1B;AASD,wBAAgB,kBAAkB,SAsBjC;AAID,wBAAgB,kBAAkB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAE7E;AAGD,eAAO,MAAM,mBAAmB,2BAAqB,CAAC;AACtD,eAAO,MAAM,gBAAgB,oBAAc,CAAC"}
1
+ {"version":3,"file":"SolidAiStudioLayout.d.ts","sourceRoot":"","sources":["../../../src/components/layout/SolidAiStudioLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAmC3D,eAAO,MAAM,QAAQ,+CAIpB,CAAC;AAyBF,wBAAgB,WAAW,6BAmL1B;AASD,wBAAgB,kBAAkB,SAsBjC;AAID,wBAAgB,kBAAkB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAE7E;AAGD,eAAO,MAAM,mBAAmB,2BAAqB,CAAC;AACtD,eAAO,MAAM,gBAAgB,oBAAc,CAAC"}