@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.
- package/README.md +215 -0
- package/dist/components/auth/SolidLogin.js +1 -1
- package/dist/components/auth/SolidLogin.js.map +1 -1
- package/dist/components/auth/SolidLogin.tsx +2 -2
- package/dist/components/common/GeneralSettings.d.ts.map +1 -1
- package/dist/components/common/GeneralSettings.js +79 -45
- package/dist/components/common/GeneralSettings.js.map +1 -1
- package/dist/components/common/GeneralSettings.tsx +94 -45
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.d.ts +33 -7
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.d.ts.map +1 -1
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js +132 -40
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js.map +1 -1
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.tsx +373 -55
- 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/components/shad-cn-ui/SolidTabs.d.ts +2 -1
- package/dist/components/shad-cn-ui/SolidTabs.d.ts.map +1 -1
- package/dist/components/shad-cn-ui/SolidTabs.js +5 -5
- package/dist/components/shad-cn-ui/SolidTabs.js.map +1 -1
- package/dist/components/shad-cn-ui/SolidTabs.tsx +6 -0
- 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 +18 -0
- package/dist/routes/guards/GuestGuard.js.map +1 -0
- package/dist/routes/guards/GuestGuard.tsx +20 -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"}
|