@solidxai/core-ui 0.1.7-beta.8 → 0.1.7-beta.9
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.
- package/dist/components/common/GeneralSettings.d.ts.map +1 -1
- package/dist/components/common/GeneralSettings.js +68 -36
- package/dist/components/common/GeneralSettings.js.map +1 -1
- package/dist/components/common/GeneralSettings.tsx +81 -42
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.d.ts +27 -5
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.d.ts.map +1 -1
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js +25 -37
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js.map +1 -1
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.tsx +131 -52
- package/dist/components/core/chatter/SolidChatter.d.ts +2 -1
- package/dist/components/core/chatter/SolidChatter.d.ts.map +1 -1
- package/dist/components/core/chatter/SolidChatter.js +2 -2
- package/dist/components/core/chatter/SolidChatter.js.map +1 -1
- package/dist/components/core/chatter/SolidChatter.tsx +2 -1
- package/dist/components/core/chatter/SolidChatterHeader.d.ts +1 -0
- package/dist/components/core/chatter/SolidChatterHeader.d.ts.map +1 -1
- package/dist/components/core/chatter/SolidChatterHeader.js +3 -3
- package/dist/components/core/chatter/SolidChatterHeader.js.map +1 -1
- package/dist/components/core/chatter/SolidChatterHeader.tsx +4 -3
- package/dist/components/core/chatter/SolidMessageComposer.d.ts +2 -1
- package/dist/components/core/chatter/SolidMessageComposer.d.ts.map +1 -1
- package/dist/components/core/chatter/SolidMessageComposer.js +3 -1
- package/dist/components/core/chatter/SolidMessageComposer.js.map +1 -1
- package/dist/components/core/chatter/SolidMessageComposer.tsx +3 -1
- package/dist/components/core/common/SolidViewLayoutManager.d.ts +17 -0
- package/dist/components/core/common/SolidViewLayoutManager.d.ts.map +1 -1
- package/dist/components/core/common/SolidViewLayoutManager.js +58 -1
- package/dist/components/core/common/SolidViewLayoutManager.js.map +1 -1
- package/dist/components/core/common/SolidViewLayoutManager.ts +43 -2
- package/dist/components/core/extension/solid-core/chatterMessage/form/SolidChatterMessageCoModelEntityIdFormViewWidget.d.ts +3 -0
- package/dist/components/core/extension/solid-core/chatterMessage/form/SolidChatterMessageCoModelEntityIdFormViewWidget.d.ts.map +1 -0
- package/dist/components/core/extension/solid-core/chatterMessage/form/SolidChatterMessageCoModelEntityIdFormViewWidget.js +92 -0
- package/dist/components/core/extension/solid-core/chatterMessage/form/SolidChatterMessageCoModelEntityIdFormViewWidget.js.map +1 -0
- package/dist/components/core/extension/solid-core/chatterMessage/form/SolidChatterMessageCoModelEntityIdFormViewWidget.tsx +68 -0
- package/dist/components/core/extension/solid-core/chatterMessage/list/SolidChatterMessageCoModelEntityIdListViewWidget.d.ts +3 -0
- package/dist/components/core/extension/solid-core/chatterMessage/list/SolidChatterMessageCoModelEntityIdListViewWidget.d.ts.map +1 -0
- package/dist/components/core/extension/solid-core/chatterMessage/list/SolidChatterMessageCoModelEntityIdListViewWidget.js +87 -0
- package/dist/components/core/extension/solid-core/chatterMessage/list/SolidChatterMessageCoModelEntityIdListViewWidget.js.map +1 -0
- package/dist/components/core/extension/solid-core/chatterMessage/list/SolidChatterMessageCoModelEntityIdListViewWidget.tsx +70 -0
- package/dist/components/core/extension/solid-core/listOfValues/form/SolidLovTypeChangeFormEditWidget.d.ts +3 -0
- package/dist/components/core/extension/solid-core/listOfValues/form/SolidLovTypeChangeFormEditWidget.d.ts.map +1 -0
- package/dist/components/core/extension/solid-core/listOfValues/form/SolidLovTypeChangeFormEditWidget.js +111 -0
- package/dist/components/core/extension/solid-core/listOfValues/form/SolidLovTypeChangeFormEditWidget.js.map +1 -0
- package/dist/components/core/extension/solid-core/listOfValues/form/SolidLovTypeChangeFormEditWidget.tsx +122 -0
- package/dist/components/core/extension/solid-core/mqMessage/form/SolidMqMessageStageFormViewWIdget.d.ts +3 -0
- package/dist/components/core/extension/solid-core/mqMessage/form/SolidMqMessageStageFormViewWIdget.d.ts.map +1 -0
- package/dist/components/core/extension/solid-core/mqMessage/form/SolidMqMessageStageFormViewWIdget.js +10 -0
- package/dist/components/core/extension/solid-core/mqMessage/form/SolidMqMessageStageFormViewWIdget.js.map +1 -0
- package/dist/components/core/extension/solid-core/mqMessage/form/SolidMqMessageStageFormViewWIdget.tsx +21 -0
- package/dist/components/core/extension/solid-core/mqMessage/form/mqMessageOnFormLoadHandler.d.ts +8 -0
- package/dist/components/core/extension/solid-core/mqMessage/form/mqMessageOnFormLoadHandler.d.ts.map +1 -0
- package/dist/components/core/extension/solid-core/mqMessage/form/mqMessageOnFormLoadHandler.js +62 -0
- package/dist/components/core/extension/solid-core/mqMessage/form/mqMessageOnFormLoadHandler.js.map +1 -0
- package/dist/components/core/extension/solid-core/mqMessage/form/mqMessageOnFormLoadHandler.tsx +27 -0
- package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessageStageListViewWidget.d.ts +3 -0
- package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessageStageListViewWidget.d.ts.map +1 -0
- package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessageStageListViewWidget.js +8 -0
- package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessageStageListViewWidget.js.map +1 -0
- package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessageStageListViewWidget.tsx +15 -0
- package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessagesSummarizeListHeaderAction.d.ts +3 -0
- package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessagesSummarizeListHeaderAction.d.ts.map +1 -0
- package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessagesSummarizeListHeaderAction.js +158 -0
- package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessagesSummarizeListHeaderAction.js.map +1 -0
- package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessagesSummarizeListHeaderAction.tsx +185 -0
- package/dist/components/core/extension/solid-core/mqMessage/ui/MqMessageStageBadge.d.ts +17 -0
- package/dist/components/core/extension/solid-core/mqMessage/ui/MqMessageStageBadge.d.ts.map +1 -0
- package/dist/components/core/extension/solid-core/mqMessage/ui/MqMessageStageBadge.js +52 -0
- package/dist/components/core/extension/solid-core/mqMessage/ui/MqMessageStageBadge.js.map +1 -0
- package/dist/components/core/extension/solid-core/mqMessage/ui/MqMessageStageBadge.tsx +83 -0
- package/dist/components/core/locales/SolidChatterLocaleTabView.d.ts.map +1 -1
- package/dist/components/core/locales/SolidChatterLocaleTabView.js +7 -5
- package/dist/components/core/locales/SolidChatterLocaleTabView.js.map +1 -1
- package/dist/components/core/locales/SolidChatterLocaleTabView.tsx +3 -0
- package/dist/components/core/users/ApiKeysTab/ApiKeysTab.css +38 -0
- package/dist/components/core/users/ApiKeysTab/ApiKeysTab.d.ts +1 -0
- package/dist/components/core/users/ApiKeysTab/ApiKeysTab.d.ts.map +1 -1
- package/dist/components/core/users/ApiKeysTab/ApiKeysTab.js +4 -3
- package/dist/components/core/users/ApiKeysTab/ApiKeysTab.js.map +1 -1
- package/dist/components/core/users/ApiKeysTab/ApiKeysTab.tsx +13 -3
- package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.d.ts +2 -1
- package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.d.ts.map +1 -1
- package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.js +6 -5
- package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.js.map +1 -1
- package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.tsx +6 -7
- package/dist/components/core/users/CreateUser.d.ts.map +1 -1
- package/dist/components/core/users/CreateUser.js +89 -35
- package/dist/components/core/users/CreateUser.js.map +1 -1
- package/dist/components/core/users/CreateUser.tsx +291 -165
- package/dist/components/layout/SolidAiStudioLayout.d.ts.map +1 -1
- package/dist/components/layout/SolidAiStudioLayout.js +123 -8
- package/dist/components/layout/SolidAiStudioLayout.js.map +1 -1
- package/dist/components/layout/SolidAiStudioLayout.tsx +70 -6
- package/dist/helpers/registry.d.ts.map +1 -1
- package/dist/helpers/registry.js +10 -6
- package/dist/helpers/registry.js.map +1 -1
- package/dist/helpers/registry.ts +11 -7
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/index.ts +11 -0
- package/dist/redux/api/apiKeyApi.d.ts +8 -1
- package/dist/redux/api/apiKeyApi.d.ts.map +1 -1
- package/dist/redux/api/apiKeyApi.js +12 -1
- package/dist/redux/api/apiKeyApi.js.map +1 -1
- package/dist/redux/api/apiKeyApi.ts +9 -0
- package/dist/redux/store/defaultStoreConfig.d.ts +16 -1
- package/dist/redux/store/defaultStoreConfig.d.ts.map +1 -1
- package/dist/redux/store/defaultStoreConfig.js +3 -1
- package/dist/redux/store/defaultStoreConfig.js.map +1 -1
- package/dist/redux/store/defaultStoreConfig.ts +3 -1
- package/dist/routes/guards/GuestGuard.d.ts +2 -0
- package/dist/routes/guards/GuestGuard.d.ts.map +1 -0
- package/dist/routes/guards/GuestGuard.js +23 -0
- package/dist/routes/guards/GuestGuard.js.map +1 -0
- package/dist/routes/guards/GuestGuard.tsx +24 -0
- package/dist/routes/solidRoutes.d.ts.map +1 -1
- package/dist/routes/solidRoutes.js +2 -1
- package/dist/routes/solidRoutes.js.map +1 -1
- package/dist/routes/solidRoutes.tsx +2 -1
- package/dist/types/solid-core.d.ts +1 -0
- 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
|
|
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
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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 (
|
|
182
|
+
if (isDeleteUserSuccess || isUpdateUserSuccess) {
|
|
161
183
|
router.back();
|
|
162
184
|
}
|
|
163
|
-
}, [isDeleteUserSuccess,
|
|
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
|
-
|
|
209
|
-
<
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
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
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
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;
|
|
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"}
|