@cundi/refine-xaf 1.0.0 → 1.0.1
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 +43 -1
- package/dist/index.css +90 -0
- package/dist/index.d.mts +145 -7
- package/dist/index.d.ts +145 -7
- package/dist/index.js +641 -276
- package/dist/index.mjs +580 -222
- package/package.json +8 -1
package/dist/index.js
CHANGED
|
@@ -35,11 +35,13 @@ __export(index_exports, {
|
|
|
35
35
|
ApplicationUserCreate: () => ApplicationUserCreate,
|
|
36
36
|
ApplicationUserEdit: () => ApplicationUserEdit,
|
|
37
37
|
ApplicationUserList: () => ApplicationUserList,
|
|
38
|
+
AuthCallback: () => AuthCallback,
|
|
38
39
|
Base64Upload: () => Base64Upload,
|
|
39
40
|
ColorModeContext: () => ColorModeContext,
|
|
40
41
|
ColorModeContextProvider: () => ColorModeContextProvider,
|
|
41
42
|
Header: () => Header,
|
|
42
43
|
HttpError: () => HttpError,
|
|
44
|
+
KeycloakLoginPage: () => KeycloakLoginPage,
|
|
43
45
|
LoginPage: () => LoginPage,
|
|
44
46
|
RelatedList: () => RelatedList,
|
|
45
47
|
RoleCreate: () => RoleCreate,
|
|
@@ -53,17 +55,22 @@ __export(index_exports, {
|
|
|
53
55
|
authProvider: () => authProvider,
|
|
54
56
|
authService: () => authService,
|
|
55
57
|
dataProvider: () => dataProvider,
|
|
58
|
+
generatePassword: () => generatePassword,
|
|
56
59
|
getBaseUrl: () => getBaseUrl,
|
|
57
60
|
httpClient: () => httpClient,
|
|
61
|
+
keycloakService: () => keycloakService,
|
|
58
62
|
parseJwt: () => parseJwt,
|
|
59
63
|
useColorMode: () => useColorMode,
|
|
60
|
-
useModelTypes: () => useModelTypes
|
|
64
|
+
useModelTypes: () => useModelTypes,
|
|
65
|
+
validatePasswordStrength: () => validatePasswordStrength
|
|
61
66
|
});
|
|
62
67
|
module.exports = __toCommonJS(index_exports);
|
|
63
68
|
|
|
64
69
|
// src/utils/httpClient.ts
|
|
65
70
|
var import_meta = {};
|
|
66
71
|
var TOKEN_KEY = "refine-auth";
|
|
72
|
+
var MAX_RETRIES = 3;
|
|
73
|
+
var BASE_RETRY_DELAY = 1e3;
|
|
67
74
|
var HttpError = class _HttpError extends Error {
|
|
68
75
|
constructor(statusCode, message2, body) {
|
|
69
76
|
super(message2);
|
|
@@ -79,8 +86,15 @@ var HttpError = class _HttpError extends Error {
|
|
|
79
86
|
var getBaseUrl = () => {
|
|
80
87
|
return import_meta.env?.VITE_API_URL || "";
|
|
81
88
|
};
|
|
82
|
-
var
|
|
83
|
-
|
|
89
|
+
var delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
90
|
+
var isRetryableError = (error) => {
|
|
91
|
+
if (error instanceof HttpError) {
|
|
92
|
+
return error.statusCode >= 500;
|
|
93
|
+
}
|
|
94
|
+
return true;
|
|
95
|
+
};
|
|
96
|
+
var httpClient = async (endpoint, options = {}, retryCount = 0) => {
|
|
97
|
+
const { skipAuth, noRetry, headers, ...restOptions } = options;
|
|
84
98
|
const baseUrl = getBaseUrl();
|
|
85
99
|
const url = endpoint.startsWith("http") ? endpoint : `${baseUrl}${endpoint.startsWith("/") ? "" : "/"}${endpoint}`;
|
|
86
100
|
const defaultHeaders = {
|
|
@@ -109,7 +123,14 @@ var httpClient = async (endpoint, options = {}) => {
|
|
|
109
123
|
} catch {
|
|
110
124
|
parsedError = errorBody;
|
|
111
125
|
}
|
|
112
|
-
|
|
126
|
+
const error = new HttpError(response.status, response.statusText, parsedError);
|
|
127
|
+
if (!noRetry && retryCount < MAX_RETRIES && isRetryableError(error)) {
|
|
128
|
+
const retryDelay = BASE_RETRY_DELAY * Math.pow(2, retryCount);
|
|
129
|
+
console.warn(`Request failed with ${response.status}, retrying in ${retryDelay}ms... (${retryCount + 1}/${MAX_RETRIES})`);
|
|
130
|
+
await delay(retryDelay);
|
|
131
|
+
return httpClient(endpoint, options, retryCount + 1);
|
|
132
|
+
}
|
|
133
|
+
throw error;
|
|
113
134
|
}
|
|
114
135
|
if (response.status === 204) {
|
|
115
136
|
return null;
|
|
@@ -119,6 +140,12 @@ var httpClient = async (endpoint, options = {}) => {
|
|
|
119
140
|
if (error instanceof HttpError) {
|
|
120
141
|
throw error;
|
|
121
142
|
}
|
|
143
|
+
if (!noRetry && retryCount < MAX_RETRIES && isRetryableError(error)) {
|
|
144
|
+
const retryDelay = BASE_RETRY_DELAY * Math.pow(2, retryCount);
|
|
145
|
+
console.warn(`Network error, retrying in ${retryDelay}ms... (${retryCount + 1}/${MAX_RETRIES})`);
|
|
146
|
+
await delay(retryDelay);
|
|
147
|
+
return httpClient(endpoint, options, retryCount + 1);
|
|
148
|
+
}
|
|
122
149
|
throw new HttpError(500, "Network Error", error);
|
|
123
150
|
}
|
|
124
151
|
};
|
|
@@ -176,22 +203,208 @@ var authService = {
|
|
|
176
203
|
}
|
|
177
204
|
};
|
|
178
205
|
|
|
206
|
+
// src/utils/pkceUtils.ts
|
|
207
|
+
var STORAGE_KEY_CODE_VERIFIER = "pkce_code_verifier";
|
|
208
|
+
var STORAGE_KEY_STATE = "pkce_state";
|
|
209
|
+
function generateRandomString(length) {
|
|
210
|
+
const charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~";
|
|
211
|
+
const randomValues = new Uint8Array(length);
|
|
212
|
+
crypto.getRandomValues(randomValues);
|
|
213
|
+
let result = "";
|
|
214
|
+
for (let i = 0; i < length; i++) {
|
|
215
|
+
result += charset[randomValues[i] % charset.length];
|
|
216
|
+
}
|
|
217
|
+
return result;
|
|
218
|
+
}
|
|
219
|
+
async function sha256(plain) {
|
|
220
|
+
const encoder = new TextEncoder();
|
|
221
|
+
const data = encoder.encode(plain);
|
|
222
|
+
const hash = await crypto.subtle.digest("SHA-256", data);
|
|
223
|
+
const base64 = btoa(String.fromCharCode(...new Uint8Array(hash)));
|
|
224
|
+
return base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
|
|
225
|
+
}
|
|
226
|
+
function generateCodeVerifier() {
|
|
227
|
+
return generateRandomString(128);
|
|
228
|
+
}
|
|
229
|
+
async function generateCodeChallenge(verifier) {
|
|
230
|
+
return await sha256(verifier);
|
|
231
|
+
}
|
|
232
|
+
function generateState() {
|
|
233
|
+
return generateRandomString(32);
|
|
234
|
+
}
|
|
235
|
+
function saveCodeVerifier(verifier) {
|
|
236
|
+
sessionStorage.setItem(STORAGE_KEY_CODE_VERIFIER, verifier);
|
|
237
|
+
}
|
|
238
|
+
function getCodeVerifier() {
|
|
239
|
+
return sessionStorage.getItem(STORAGE_KEY_CODE_VERIFIER);
|
|
240
|
+
}
|
|
241
|
+
function clearCodeVerifier() {
|
|
242
|
+
sessionStorage.removeItem(STORAGE_KEY_CODE_VERIFIER);
|
|
243
|
+
}
|
|
244
|
+
function saveState(state) {
|
|
245
|
+
sessionStorage.setItem(STORAGE_KEY_STATE, state);
|
|
246
|
+
}
|
|
247
|
+
function getState() {
|
|
248
|
+
return sessionStorage.getItem(STORAGE_KEY_STATE);
|
|
249
|
+
}
|
|
250
|
+
function clearState() {
|
|
251
|
+
sessionStorage.removeItem(STORAGE_KEY_STATE);
|
|
252
|
+
}
|
|
253
|
+
function clearPKCEData() {
|
|
254
|
+
clearCodeVerifier();
|
|
255
|
+
clearState();
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// src/services/keycloakService.ts
|
|
259
|
+
var import_meta2 = {};
|
|
260
|
+
function getEnvConfig() {
|
|
261
|
+
const env = import_meta2.env;
|
|
262
|
+
const config = {
|
|
263
|
+
keycloakUrl: env.VITE_KEYCLOAK_URL || "http://localhost:8080",
|
|
264
|
+
realm: env.VITE_KEYCLOAK_REALM || "cundi",
|
|
265
|
+
clientId: env.VITE_KEYCLOAK_CLIENT_ID || "cundi-web",
|
|
266
|
+
redirectUri: env.VITE_REDIRECT_URI || `${window.location.origin}/auth/callback`
|
|
267
|
+
};
|
|
268
|
+
const missingVars = [];
|
|
269
|
+
if (!env.VITE_KEYCLOAK_URL) missingVars.push("VITE_KEYCLOAK_URL");
|
|
270
|
+
if (!env.VITE_KEYCLOAK_REALM) missingVars.push("VITE_KEYCLOAK_REALM");
|
|
271
|
+
if (!env.VITE_KEYCLOAK_CLIENT_ID) missingVars.push("VITE_KEYCLOAK_CLIENT_ID");
|
|
272
|
+
if (missingVars.length > 0) {
|
|
273
|
+
console.warn(
|
|
274
|
+
`[Keycloak] Missing environment variables: ${missingVars.join(", ")}. Using default values. Please configure these in your .env file for production.`
|
|
275
|
+
);
|
|
276
|
+
}
|
|
277
|
+
return config;
|
|
278
|
+
}
|
|
279
|
+
var keycloakService = {
|
|
280
|
+
/**
|
|
281
|
+
* Start Authorization Code Flow with PKCE
|
|
282
|
+
* Redirects user to Keycloak login page
|
|
283
|
+
*/
|
|
284
|
+
startAuthorizationFlow: async () => {
|
|
285
|
+
const { keycloakUrl, realm, clientId, redirectUri } = getEnvConfig();
|
|
286
|
+
const codeVerifier = generateCodeVerifier();
|
|
287
|
+
const codeChallenge = await generateCodeChallenge(codeVerifier);
|
|
288
|
+
const state = generateState();
|
|
289
|
+
saveCodeVerifier(codeVerifier);
|
|
290
|
+
saveState(state);
|
|
291
|
+
const authUrl = new URL(`${keycloakUrl}/realms/${realm}/protocol/openid-connect/auth`);
|
|
292
|
+
authUrl.searchParams.append("client_id", clientId);
|
|
293
|
+
authUrl.searchParams.append("redirect_uri", redirectUri);
|
|
294
|
+
authUrl.searchParams.append("response_type", "code");
|
|
295
|
+
authUrl.searchParams.append("scope", "openid profile email");
|
|
296
|
+
authUrl.searchParams.append("code_challenge", codeChallenge);
|
|
297
|
+
authUrl.searchParams.append("code_challenge_method", "S256");
|
|
298
|
+
authUrl.searchParams.append("state", state);
|
|
299
|
+
window.location.href = authUrl.toString();
|
|
300
|
+
},
|
|
301
|
+
/**
|
|
302
|
+
* Handle callback from Keycloak
|
|
303
|
+
* Exchange authorization code for access token
|
|
304
|
+
*/
|
|
305
|
+
handleCallback: async (code, state) => {
|
|
306
|
+
const { keycloakUrl, realm, clientId, redirectUri } = getEnvConfig();
|
|
307
|
+
const savedState = getState();
|
|
308
|
+
if (!savedState || savedState !== state) {
|
|
309
|
+
clearPKCEData();
|
|
310
|
+
throw new Error("Invalid state parameter - possible CSRF attack");
|
|
311
|
+
}
|
|
312
|
+
const codeVerifier = getCodeVerifier();
|
|
313
|
+
if (!codeVerifier) {
|
|
314
|
+
throw new Error("Code verifier not found - session may have expired");
|
|
315
|
+
}
|
|
316
|
+
const tokenUrl = `${keycloakUrl}/realms/${realm}/protocol/openid-connect/token`;
|
|
317
|
+
const formData = new URLSearchParams();
|
|
318
|
+
formData.append("grant_type", "authorization_code");
|
|
319
|
+
formData.append("client_id", clientId);
|
|
320
|
+
formData.append("code", code);
|
|
321
|
+
formData.append("redirect_uri", redirectUri);
|
|
322
|
+
formData.append("code_verifier", codeVerifier);
|
|
323
|
+
const response = await fetch(tokenUrl, {
|
|
324
|
+
method: "POST",
|
|
325
|
+
headers: {
|
|
326
|
+
"Content-Type": "application/x-www-form-urlencoded"
|
|
327
|
+
},
|
|
328
|
+
body: formData.toString()
|
|
329
|
+
});
|
|
330
|
+
clearPKCEData();
|
|
331
|
+
if (!response.ok) {
|
|
332
|
+
const error = await response.text();
|
|
333
|
+
throw new Error(`Token exchange failed: ${error}`);
|
|
334
|
+
}
|
|
335
|
+
const data = await response.json();
|
|
336
|
+
return {
|
|
337
|
+
accessToken: data.access_token,
|
|
338
|
+
idToken: data.id_token || data.access_token
|
|
339
|
+
// Fallback to access token if no id_token
|
|
340
|
+
};
|
|
341
|
+
},
|
|
342
|
+
/**
|
|
343
|
+
* Logout from Keycloak
|
|
344
|
+
* Redirects to Keycloak logout endpoint to properly clear the session
|
|
345
|
+
*/
|
|
346
|
+
logout: (idToken) => {
|
|
347
|
+
const { keycloakUrl, realm } = getEnvConfig();
|
|
348
|
+
clearPKCEData();
|
|
349
|
+
const logoutUrl = new URL(`${keycloakUrl}/realms/${realm}/protocol/openid-connect/logout`);
|
|
350
|
+
const appBaseUrl = window.location.origin;
|
|
351
|
+
logoutUrl.searchParams.append("post_logout_redirect_uri", `${appBaseUrl}/login`);
|
|
352
|
+
if (idToken) {
|
|
353
|
+
logoutUrl.searchParams.append("id_token_hint", idToken);
|
|
354
|
+
}
|
|
355
|
+
window.location.href = logoutUrl.toString();
|
|
356
|
+
}
|
|
357
|
+
};
|
|
358
|
+
|
|
179
359
|
// src/authProvider.ts
|
|
180
360
|
var authProvider = {
|
|
181
|
-
login: async ({ username, password }) => {
|
|
361
|
+
login: async ({ username, password, provider, code, state }) => {
|
|
182
362
|
try {
|
|
183
|
-
|
|
363
|
+
let token;
|
|
364
|
+
let idToken;
|
|
365
|
+
if (provider === "keycloak") {
|
|
366
|
+
if (code && state) {
|
|
367
|
+
const result = await keycloakService.handleCallback(code, state);
|
|
368
|
+
token = result.accessToken;
|
|
369
|
+
idToken = result.idToken;
|
|
370
|
+
} else {
|
|
371
|
+
await keycloakService.startAuthorizationFlow();
|
|
372
|
+
return {
|
|
373
|
+
success: false,
|
|
374
|
+
error: {
|
|
375
|
+
message: "Redirecting to Keycloak...",
|
|
376
|
+
name: "Redirect"
|
|
377
|
+
}
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
} else {
|
|
381
|
+
token = await authService.login({ username, password });
|
|
382
|
+
}
|
|
184
383
|
if (token) {
|
|
185
384
|
localStorage.setItem(TOKEN_KEY, token);
|
|
385
|
+
if (idToken) {
|
|
386
|
+
localStorage.setItem("id_token", idToken);
|
|
387
|
+
}
|
|
186
388
|
const claims = parseJwt(token);
|
|
187
389
|
const userId = claims["http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier"] || claims.sub || claims.id || claims.Oid;
|
|
188
|
-
const claimName = claims["http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"] || claims.unique_name || claims.name || username;
|
|
390
|
+
const claimName = claims["http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"] || claims.unique_name || claims.preferred_username || claims.name || username;
|
|
189
391
|
try {
|
|
190
392
|
let user = null;
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
393
|
+
let retries = provider === "keycloak" ? 3 : 1;
|
|
394
|
+
for (let i = 0; i < retries; i++) {
|
|
395
|
+
if (i > 0) {
|
|
396
|
+
await new Promise((resolve) => setTimeout(resolve, 1e3));
|
|
397
|
+
}
|
|
398
|
+
if (provider === "keycloak") {
|
|
399
|
+
user = await authService.getUserByUsername(claimName || username);
|
|
400
|
+
} else if (userId) {
|
|
401
|
+
user = await authService.getUserById(userId);
|
|
402
|
+
} else {
|
|
403
|
+
user = await authService.getUserByUsername(claimName || username);
|
|
404
|
+
}
|
|
405
|
+
if (user && user.Roles && user.Roles.length > 0) {
|
|
406
|
+
break;
|
|
407
|
+
}
|
|
195
408
|
}
|
|
196
409
|
if (user) {
|
|
197
410
|
if (user.Photo) {
|
|
@@ -208,6 +421,7 @@ var authProvider = {
|
|
|
208
421
|
isAdmin = user.Roles.some((r) => r.IsAdministrative);
|
|
209
422
|
}
|
|
210
423
|
localStorage.setItem("user_is_admin", isAdmin ? "true" : "false");
|
|
424
|
+
localStorage.setItem("auth_provider", provider || "local");
|
|
211
425
|
}
|
|
212
426
|
} catch (error) {
|
|
213
427
|
console.error("Failed to fetch user details", error);
|
|
@@ -235,12 +449,22 @@ var authProvider = {
|
|
|
235
449
|
}
|
|
236
450
|
},
|
|
237
451
|
logout: async () => {
|
|
452
|
+
const authProvider2 = localStorage.getItem("auth_provider");
|
|
453
|
+
const idToken = localStorage.getItem("id_token");
|
|
238
454
|
localStorage.removeItem(TOKEN_KEY);
|
|
455
|
+
localStorage.removeItem("id_token");
|
|
239
456
|
localStorage.removeItem("user_photo");
|
|
240
457
|
localStorage.removeItem("user_name");
|
|
241
458
|
localStorage.removeItem("user_id");
|
|
242
459
|
localStorage.removeItem("user_roles");
|
|
243
460
|
localStorage.removeItem("user_is_admin");
|
|
461
|
+
localStorage.removeItem("auth_provider");
|
|
462
|
+
if (authProvider2 === "keycloak") {
|
|
463
|
+
keycloakService.logout(idToken || void 0);
|
|
464
|
+
return {
|
|
465
|
+
success: true
|
|
466
|
+
};
|
|
467
|
+
}
|
|
244
468
|
return {
|
|
245
469
|
success: true,
|
|
246
470
|
redirectTo: "/login"
|
|
@@ -352,7 +576,6 @@ var mapOperator = (operator) => {
|
|
|
352
576
|
return "ge";
|
|
353
577
|
case "in":
|
|
354
578
|
return "in";
|
|
355
|
-
// OData v4.01 usually, or handled manually
|
|
356
579
|
case "contains":
|
|
357
580
|
return "contains";
|
|
358
581
|
case "startswith":
|
|
@@ -535,6 +758,33 @@ var SecurityPermissionState = /* @__PURE__ */ ((SecurityPermissionState2) => {
|
|
|
535
758
|
return SecurityPermissionState2;
|
|
536
759
|
})(SecurityPermissionState || {});
|
|
537
760
|
|
|
761
|
+
// src/utils/passwordUtils.ts
|
|
762
|
+
var generatePassword = (length = 12) => {
|
|
763
|
+
const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+";
|
|
764
|
+
const array = new Uint32Array(length);
|
|
765
|
+
crypto.getRandomValues(array);
|
|
766
|
+
return Array.from(array, (num) => charset[num % charset.length]).join("");
|
|
767
|
+
};
|
|
768
|
+
var validatePasswordStrength = (password) => {
|
|
769
|
+
if (password.length < 8) {
|
|
770
|
+
return { isValid: false, message: "Password must be at least 8 characters long" };
|
|
771
|
+
}
|
|
772
|
+
const hasUpperCase = /[A-Z]/.test(password);
|
|
773
|
+
const hasLowerCase = /[a-z]/.test(password);
|
|
774
|
+
const hasNumbers = /\d/.test(password);
|
|
775
|
+
const hasSpecialChar = /[!@#$%^&*()_+]/.test(password);
|
|
776
|
+
if (!hasUpperCase || !hasLowerCase) {
|
|
777
|
+
return { isValid: false, message: "Password must contain both uppercase and lowercase letters" };
|
|
778
|
+
}
|
|
779
|
+
if (!hasNumbers) {
|
|
780
|
+
return { isValid: false, message: "Password must contain at least one number" };
|
|
781
|
+
}
|
|
782
|
+
if (!hasSpecialChar) {
|
|
783
|
+
return { isValid: false, message: "Password must contain at least one special character" };
|
|
784
|
+
}
|
|
785
|
+
return { isValid: true, message: "Password is strong" };
|
|
786
|
+
};
|
|
787
|
+
|
|
538
788
|
// src/components/Header.tsx
|
|
539
789
|
var import_react3 = __toESM(require("react"));
|
|
540
790
|
var import_core = require("@refinedev/core");
|
|
@@ -624,6 +874,7 @@ var Base64Upload = ({ value, onChange }) => {
|
|
|
624
874
|
};
|
|
625
875
|
|
|
626
876
|
// src/components/Header.tsx
|
|
877
|
+
var import_meta3 = {};
|
|
627
878
|
var { Text } = import_lib3.Typography;
|
|
628
879
|
var { useToken } = import_lib3.theme;
|
|
629
880
|
var Header = () => {
|
|
@@ -633,6 +884,12 @@ var Header = () => {
|
|
|
633
884
|
const { mode, setMode } = useColorMode();
|
|
634
885
|
const { token } = useToken();
|
|
635
886
|
const invalidate = (0, import_core.useInvalidate)();
|
|
887
|
+
const [authProvider2, setAuthProvider] = (0, import_react3.useState)(null);
|
|
888
|
+
(0, import_react3.useEffect)(() => {
|
|
889
|
+
if (user) {
|
|
890
|
+
setAuthProvider(localStorage.getItem("auth_provider"));
|
|
891
|
+
}
|
|
892
|
+
}, [user]);
|
|
636
893
|
const [isPhotoModalOpen, setIsPhotoModalOpen] = (0, import_react3.useState)(false);
|
|
637
894
|
const [isPhotoLoading, setIsPhotoLoading] = (0, import_react3.useState)(false);
|
|
638
895
|
const [photoForm] = import_lib3.Form.useForm();
|
|
@@ -662,14 +919,8 @@ var Header = () => {
|
|
|
662
919
|
setIsPhotoModalOpen(false);
|
|
663
920
|
}
|
|
664
921
|
};
|
|
665
|
-
const
|
|
666
|
-
|
|
667
|
-
const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+";
|
|
668
|
-
let retVal = "";
|
|
669
|
-
for (let i = 0, n = charset.length; i < length; ++i) {
|
|
670
|
-
retVal += charset.charAt(Math.floor(Math.random() * n));
|
|
671
|
-
}
|
|
672
|
-
passwordForm.setFieldsValue({ password: retVal });
|
|
922
|
+
const handleGeneratePassword = () => {
|
|
923
|
+
passwordForm.setFieldsValue({ password: generatePassword() });
|
|
673
924
|
};
|
|
674
925
|
const handlePasswordSubmit = async (values) => {
|
|
675
926
|
setIsPasswordLoading(true);
|
|
@@ -712,11 +963,18 @@ var Header = () => {
|
|
|
712
963
|
},
|
|
713
964
|
{
|
|
714
965
|
key: "change-password",
|
|
715
|
-
label: "Change Password",
|
|
966
|
+
label: authProvider2 === "keycloak" ? "Manage Account in Keycloak" : "Change Password",
|
|
716
967
|
icon: /* @__PURE__ */ import_react3.default.createElement(import_icons.LockOutlined, null),
|
|
717
968
|
onClick: () => {
|
|
718
|
-
|
|
719
|
-
|
|
969
|
+
if (authProvider2 === "keycloak") {
|
|
970
|
+
const env = import_meta3.env;
|
|
971
|
+
const keycloakUrl = env?.VITE_KEYCLOAK_URL || "http://localhost:8080";
|
|
972
|
+
const realm = env?.VITE_KEYCLOAK_REALM || "cundi";
|
|
973
|
+
window.open(`${keycloakUrl}/realms/${realm}/account`, "_blank");
|
|
974
|
+
} else {
|
|
975
|
+
passwordForm.resetFields();
|
|
976
|
+
setIsPasswordModalOpen(true);
|
|
977
|
+
}
|
|
720
978
|
}
|
|
721
979
|
},
|
|
722
980
|
{
|
|
@@ -780,7 +1038,7 @@ var Header = () => {
|
|
|
780
1038
|
rules: [{ required: true, message: "Please input the new password!" }]
|
|
781
1039
|
},
|
|
782
1040
|
/* @__PURE__ */ import_react3.default.createElement(import_lib3.Input.Password, { placeholder: "Enter new password" })
|
|
783
|
-
), /* @__PURE__ */ import_react3.default.createElement(import_lib3.Button, { icon: /* @__PURE__ */ import_react3.default.createElement(import_icons.ThunderboltOutlined, null), onClick:
|
|
1041
|
+
), /* @__PURE__ */ import_react3.default.createElement(import_lib3.Button, { icon: /* @__PURE__ */ import_react3.default.createElement(import_icons.ThunderboltOutlined, null), onClick: handleGeneratePassword })))
|
|
784
1042
|
)
|
|
785
1043
|
);
|
|
786
1044
|
};
|
|
@@ -795,7 +1053,7 @@ var SmartList = ({
|
|
|
795
1053
|
resource,
|
|
796
1054
|
searchFields
|
|
797
1055
|
}) => {
|
|
798
|
-
const { tableProps, searchFormProps,
|
|
1056
|
+
const { tableProps, searchFormProps, tableQuery, setFilters } = (0, import_antd2.useTable)({
|
|
799
1057
|
resource,
|
|
800
1058
|
syncWithLocation: true,
|
|
801
1059
|
onSearch: (params) => {
|
|
@@ -814,17 +1072,25 @@ var SmartList = ({
|
|
|
814
1072
|
return filters;
|
|
815
1073
|
}
|
|
816
1074
|
});
|
|
817
|
-
const columns = import_react4.
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
1075
|
+
const columns = (0, import_react4.useMemo)(
|
|
1076
|
+
() => import_react4.default.Children.toArray(children).map((child) => {
|
|
1077
|
+
const props = child.props || {};
|
|
1078
|
+
return {
|
|
1079
|
+
key: String(props.dataIndex || props.title || "unknown"),
|
|
1080
|
+
title: props.title,
|
|
1081
|
+
dataIndex: props.dataIndex,
|
|
1082
|
+
defaultVisible: props.defaultVisible
|
|
1083
|
+
};
|
|
1084
|
+
}),
|
|
1085
|
+
[children]
|
|
1086
|
+
);
|
|
825
1087
|
const [visibleColumns, setVisibleColumns] = (0, import_react4.useState)([]);
|
|
1088
|
+
const columnKeysString = (0, import_react4.useMemo)(
|
|
1089
|
+
() => columns.map((c) => c.key).join(","),
|
|
1090
|
+
[columns]
|
|
1091
|
+
);
|
|
826
1092
|
(0, import_react4.useEffect)(() => {
|
|
827
|
-
const allKeys = columns.map((c) => c.key
|
|
1093
|
+
const allKeys = columns.map((c) => c.key);
|
|
828
1094
|
const storageKey = `table-columns-${resource}`;
|
|
829
1095
|
const saved = localStorage.getItem(storageKey);
|
|
830
1096
|
if (saved) {
|
|
@@ -839,9 +1105,9 @@ var SmartList = ({
|
|
|
839
1105
|
console.error("Failed to parse saved columns", e);
|
|
840
1106
|
}
|
|
841
1107
|
}
|
|
842
|
-
const defaultVisible = columns.filter((c) => c.defaultVisible || c.dataIndex === "actions").map((c) => c.key
|
|
1108
|
+
const defaultVisible = columns.filter((c) => c.defaultVisible || c.dataIndex === "actions").map((c) => c.key);
|
|
843
1109
|
setVisibleColumns(defaultVisible);
|
|
844
|
-
}, [
|
|
1110
|
+
}, [columnKeysString, resource, columns]);
|
|
845
1111
|
const handleColumnChange = (key, checked) => {
|
|
846
1112
|
let newVisible;
|
|
847
1113
|
if (checked) {
|
|
@@ -907,7 +1173,7 @@ var SmartList = ({
|
|
|
907
1173
|
}
|
|
908
1174
|
}
|
|
909
1175
|
}
|
|
910
|
-
))), /* @__PURE__ */ import_react4.default.createElement(import_lib4.Space, null, /* @__PURE__ */ import_react4.default.createElement(import_lib4.Button, { icon: /* @__PURE__ */ import_react4.default.createElement(import_icons2.ReloadOutlined, null), onClick: () =>
|
|
1176
|
+
))), /* @__PURE__ */ import_react4.default.createElement(import_lib4.Space, null, /* @__PURE__ */ import_react4.default.createElement(import_lib4.Button, { icon: /* @__PURE__ */ import_react4.default.createElement(import_icons2.ReloadOutlined, null), onClick: () => tableQuery?.refetch() }, "Refresh"), /* @__PURE__ */ import_react4.default.createElement(import_lib4.Popover, { content, title: "Columns", trigger: "click", placement: "bottomRight" }, /* @__PURE__ */ import_react4.default.createElement(import_lib4.Button, { icon: /* @__PURE__ */ import_react4.default.createElement(import_icons2.SettingOutlined, null) }, "Columns")))), /* @__PURE__ */ import_react4.default.createElement(import_lib4.Table, { ...tableProps, rowKey: "Oid" }, filteredChildren));
|
|
911
1177
|
};
|
|
912
1178
|
|
|
913
1179
|
// src/components/RelatedList.tsx
|
|
@@ -10548,10 +10814,10 @@ editHandlers.compositionend = (view, event) => {
|
|
|
10548
10814
|
scheduleComposeEnd(view, 20);
|
|
10549
10815
|
}
|
|
10550
10816
|
};
|
|
10551
|
-
function scheduleComposeEnd(view,
|
|
10817
|
+
function scheduleComposeEnd(view, delay2) {
|
|
10552
10818
|
clearTimeout(view.input.composingTimeout);
|
|
10553
|
-
if (
|
|
10554
|
-
view.input.composingTimeout = setTimeout(() => endComposition(view),
|
|
10819
|
+
if (delay2 > -1)
|
|
10820
|
+
view.input.composingTimeout = setTimeout(() => endComposition(view), delay2);
|
|
10555
10821
|
}
|
|
10556
10822
|
function clearComposition(view) {
|
|
10557
10823
|
if (view.composing) {
|
|
@@ -18622,87 +18888,12 @@ var TiptapEditor = ({ value, onChange, disabled }) => {
|
|
|
18622
18888
|
}
|
|
18623
18889
|
))),
|
|
18624
18890
|
/* @__PURE__ */ import_react6.default.createElement("style", null, `
|
|
18625
|
-
|
|
18626
|
-
|
|
18627
|
-
|
|
18628
|
-
|
|
18629
|
-
|
|
18630
|
-
|
|
18631
|
-
}
|
|
18632
|
-
.ProseMirror pre code {
|
|
18633
|
-
color: inherit;
|
|
18634
|
-
padding: 0;
|
|
18635
|
-
background: none;
|
|
18636
|
-
font-size: 0.8rem;
|
|
18637
|
-
}
|
|
18638
|
-
.ProseMirror p {
|
|
18639
|
-
margin-bottom: 0px;
|
|
18640
|
-
}
|
|
18641
|
-
.ProseMirror:focus {
|
|
18642
|
-
outline: none;
|
|
18643
|
-
}
|
|
18644
|
-
.ProseMirror table {
|
|
18645
|
-
border-collapse: collapse;
|
|
18646
|
-
table-layout: fixed;
|
|
18647
|
-
width: 100%;
|
|
18648
|
-
margin: 0;
|
|
18649
|
-
overflow: hidden;
|
|
18650
|
-
}
|
|
18651
|
-
.ProseMirror td, .ProseMirror th {
|
|
18652
|
-
min-width: 1em;
|
|
18653
|
-
border: 2px solid ${token.colorBorder};
|
|
18654
|
-
padding: 3px 5px;
|
|
18655
|
-
vertical-align: top;
|
|
18656
|
-
box-sizing: border-box;
|
|
18657
|
-
position: relative;
|
|
18658
|
-
}
|
|
18659
|
-
.ProseMirror th {
|
|
18660
|
-
font-weight: bold;
|
|
18661
|
-
text-align: left;
|
|
18662
|
-
background-color: ${token.colorFillQuaternary};
|
|
18663
|
-
}
|
|
18664
|
-
.ProseMirror .selectedCell:after {
|
|
18665
|
-
z-index: 2;
|
|
18666
|
-
position: absolute;
|
|
18667
|
-
content: "";
|
|
18668
|
-
left: 0; right: 0; top: 0; bottom: 0;
|
|
18669
|
-
background: rgba(200, 200, 255, 0.4);
|
|
18670
|
-
pointer-events: none;
|
|
18671
|
-
}
|
|
18672
|
-
.ProseMirror .column-resize-handle {
|
|
18673
|
-
position: absolute;
|
|
18674
|
-
right: -2px;
|
|
18675
|
-
top: 0;
|
|
18676
|
-
bottom: -2px;
|
|
18677
|
-
width: 4px;
|
|
18678
|
-
background-color: #adf;
|
|
18679
|
-
pointer-events: none;
|
|
18680
|
-
}
|
|
18681
|
-
ul[data-type="taskList"] {
|
|
18682
|
-
list-style: none;
|
|
18683
|
-
padding: 0;
|
|
18684
|
-
}
|
|
18685
|
-
ul[data-type="taskList"] li {
|
|
18686
|
-
display: flex;
|
|
18687
|
-
align-items: center;
|
|
18688
|
-
}
|
|
18689
|
-
ul[data-type="taskList"] li > label {
|
|
18690
|
-
flex: 0 0 auto;
|
|
18691
|
-
margin-right: 0.5rem;
|
|
18692
|
-
user-select: none;
|
|
18693
|
-
}
|
|
18694
|
-
ul[data-type="taskList"] li > div {
|
|
18695
|
-
flex: 1 1 auto;
|
|
18696
|
-
}
|
|
18697
|
-
ul[data-type="taskList"] input[type="checkbox"] {
|
|
18698
|
-
cursor: pointer;
|
|
18699
|
-
}
|
|
18700
|
-
.ProseMirror p.is-editor-empty:first-child::before {
|
|
18701
|
-
color: ${token.colorTextPlaceholder};
|
|
18702
|
-
content: attr(data-placeholder);
|
|
18703
|
-
float: left;
|
|
18704
|
-
height: 0;
|
|
18705
|
-
pointer-events: none;
|
|
18891
|
+
:root {
|
|
18892
|
+
--tiptap-code-bg: ${token.colorFillTertiary};
|
|
18893
|
+
--tiptap-code-text: ${token.colorText};
|
|
18894
|
+
--tiptap-border: ${token.colorBorder};
|
|
18895
|
+
--tiptap-header-bg: ${token.colorFillQuaternary};
|
|
18896
|
+
--tiptap-placeholder: ${token.colorTextPlaceholder};
|
|
18706
18897
|
}
|
|
18707
18898
|
`),
|
|
18708
18899
|
/* @__PURE__ */ import_react6.default.createElement("div", { style: {
|
|
@@ -18719,6 +18910,7 @@ var import_react8 = __toESM(require("react"));
|
|
|
18719
18910
|
var import_core18 = require("@refinedev/core");
|
|
18720
18911
|
var import_lib7 = require("antd/lib");
|
|
18721
18912
|
var import_antd4 = require("@refinedev/antd");
|
|
18913
|
+
var import_react_router = require("react-router");
|
|
18722
18914
|
var { Title, Link } = import_lib7.Typography;
|
|
18723
18915
|
var LoginPage = () => {
|
|
18724
18916
|
const [form] = import_lib7.Form.useForm();
|
|
@@ -18726,6 +18918,7 @@ var LoginPage = () => {
|
|
|
18726
18918
|
const isLoading = isPending;
|
|
18727
18919
|
const translate = (0, import_core18.useTranslate)();
|
|
18728
18920
|
const { token } = import_lib7.theme.useToken();
|
|
18921
|
+
const navigate = (0, import_react_router.useNavigate)();
|
|
18729
18922
|
const onFinish = async (values) => {
|
|
18730
18923
|
login(values);
|
|
18731
18924
|
};
|
|
@@ -18756,7 +18949,7 @@ var LoginPage = () => {
|
|
|
18756
18949
|
boxShadow: "0 4px 24px -4px rgba(0, 0, 0, 0.1)"
|
|
18757
18950
|
}
|
|
18758
18951
|
},
|
|
18759
|
-
/* @__PURE__ */ import_react8.default.createElement("div", { style: { textAlign: "center", marginBottom: "32px" } }, /* @__PURE__ */ import_react8.default.createElement(Title, { level: 3, style: { color: token.colorPrimary, margin: 0 } }, translate("pages.login.title", "Sign in to your account"))),
|
|
18952
|
+
/* @__PURE__ */ import_react8.default.createElement("div", { style: { textAlign: "center", marginBottom: "32px" } }, /* @__PURE__ */ import_react8.default.createElement(Title, { level: 3, style: { color: token.colorPrimary, margin: 0 } }, translate("pages.login.title", "Sign in to your account")), /* @__PURE__ */ import_react8.default.createElement(import_lib7.Typography.Text, { type: "secondary", style: { fontSize: "14px", marginTop: "8px", display: "block" } }, "Log in using a local account")),
|
|
18760
18953
|
/* @__PURE__ */ import_react8.default.createElement(
|
|
18761
18954
|
import_lib7.Form,
|
|
18762
18955
|
{
|
|
@@ -18831,37 +19024,204 @@ var LoginPage = () => {
|
|
|
18831
19024
|
size: "large"
|
|
18832
19025
|
},
|
|
18833
19026
|
translate("pages.login.signin", "Sign in")
|
|
18834
|
-
))
|
|
19027
|
+
)),
|
|
19028
|
+
/* @__PURE__ */ import_react8.default.createElement(import_lib7.Divider, { plain: true }, "or"),
|
|
19029
|
+
/* @__PURE__ */ import_react8.default.createElement(
|
|
19030
|
+
import_lib7.Button,
|
|
19031
|
+
{
|
|
19032
|
+
block: true,
|
|
19033
|
+
size: "large",
|
|
19034
|
+
onClick: () => navigate("/login")
|
|
19035
|
+
},
|
|
19036
|
+
"Log in using a Keycloak account"
|
|
19037
|
+
)
|
|
18835
19038
|
)
|
|
18836
19039
|
)
|
|
18837
19040
|
);
|
|
18838
19041
|
};
|
|
18839
19042
|
|
|
18840
|
-
// src/pages/
|
|
19043
|
+
// src/pages/login/keycloak.tsx
|
|
18841
19044
|
var import_react9 = __toESM(require("react"));
|
|
18842
19045
|
var import_core19 = require("@refinedev/core");
|
|
18843
|
-
var import_antd5 = require("@refinedev/antd");
|
|
18844
19046
|
var import_lib8 = require("antd/lib");
|
|
19047
|
+
var import_antd5 = require("@refinedev/antd");
|
|
19048
|
+
var import_react_router2 = require("react-router");
|
|
19049
|
+
var { Title: Title2 } = import_lib8.Typography;
|
|
19050
|
+
var KeycloakLoginPage = () => {
|
|
19051
|
+
const { mutate: login, isPending } = (0, import_core19.useLogin)();
|
|
19052
|
+
const isLoading = isPending;
|
|
19053
|
+
const translate = (0, import_core19.useTranslate)();
|
|
19054
|
+
const { token } = import_lib8.theme.useToken();
|
|
19055
|
+
const navigate = (0, import_react_router2.useNavigate)();
|
|
19056
|
+
const handleKeycloakLogin = () => {
|
|
19057
|
+
login({ provider: "keycloak" });
|
|
19058
|
+
};
|
|
19059
|
+
return /* @__PURE__ */ import_react9.default.createElement(
|
|
19060
|
+
import_lib8.Layout,
|
|
19061
|
+
{
|
|
19062
|
+
style: {
|
|
19063
|
+
height: "100vh",
|
|
19064
|
+
justifyContent: "center",
|
|
19065
|
+
alignItems: "center",
|
|
19066
|
+
backgroundColor: token.colorBgContainer
|
|
19067
|
+
}
|
|
19068
|
+
},
|
|
19069
|
+
/* @__PURE__ */ import_react9.default.createElement("div", { style: { marginBottom: "24px" } }, /* @__PURE__ */ import_react9.default.createElement(
|
|
19070
|
+
import_antd5.ThemedTitle,
|
|
19071
|
+
{
|
|
19072
|
+
collapsed: false,
|
|
19073
|
+
wrapperStyles: { fontSize: "22px", justifyContent: "center" }
|
|
19074
|
+
}
|
|
19075
|
+
)),
|
|
19076
|
+
/* @__PURE__ */ import_react9.default.createElement(
|
|
19077
|
+
import_lib8.Card,
|
|
19078
|
+
{
|
|
19079
|
+
style: {
|
|
19080
|
+
width: "100%",
|
|
19081
|
+
maxWidth: "400px",
|
|
19082
|
+
padding: "20px",
|
|
19083
|
+
boxShadow: "0 4px 24px -4px rgba(0, 0, 0, 0.1)"
|
|
19084
|
+
}
|
|
19085
|
+
},
|
|
19086
|
+
/* @__PURE__ */ import_react9.default.createElement("div", { style: { textAlign: "center", marginBottom: "32px" } }, /* @__PURE__ */ import_react9.default.createElement(Title2, { level: 3, style: { color: token.colorPrimary, margin: 0 } }, translate("pages.login.title", "Sign in to your account")), /* @__PURE__ */ import_react9.default.createElement(import_lib8.Typography.Text, { type: "secondary", style: { fontSize: "14px", marginTop: "8px", display: "block" } }, "Choose your authentication method")),
|
|
19087
|
+
/* @__PURE__ */ import_react9.default.createElement(
|
|
19088
|
+
import_lib8.Button,
|
|
19089
|
+
{
|
|
19090
|
+
type: "primary",
|
|
19091
|
+
block: true,
|
|
19092
|
+
size: "large",
|
|
19093
|
+
onClick: handleKeycloakLogin,
|
|
19094
|
+
loading: isLoading,
|
|
19095
|
+
style: { marginBottom: "16px" }
|
|
19096
|
+
},
|
|
19097
|
+
"Sign in with Keycloak"
|
|
19098
|
+
),
|
|
19099
|
+
/* @__PURE__ */ import_react9.default.createElement(import_lib8.Divider, { plain: true }, "or"),
|
|
19100
|
+
/* @__PURE__ */ import_react9.default.createElement(
|
|
19101
|
+
import_lib8.Button,
|
|
19102
|
+
{
|
|
19103
|
+
block: true,
|
|
19104
|
+
size: "large",
|
|
19105
|
+
onClick: () => navigate("/login/api")
|
|
19106
|
+
},
|
|
19107
|
+
"Log in using a local account"
|
|
19108
|
+
)
|
|
19109
|
+
)
|
|
19110
|
+
);
|
|
19111
|
+
};
|
|
19112
|
+
|
|
19113
|
+
// src/pages/auth/AuthCallback.tsx
|
|
19114
|
+
var import_react10 = __toESM(require("react"));
|
|
19115
|
+
var import_core20 = require("@refinedev/core");
|
|
19116
|
+
var import_antd6 = require("antd");
|
|
19117
|
+
var AuthCallback = () => {
|
|
19118
|
+
const { mutate: login } = (0, import_core20.useLogin)();
|
|
19119
|
+
const [error, setError] = (0, import_react10.useState)(null);
|
|
19120
|
+
const [processing, setProcessing] = (0, import_react10.useState)(false);
|
|
19121
|
+
const hasProcessed = (0, import_react10.useRef)(false);
|
|
19122
|
+
(0, import_react10.useEffect)(() => {
|
|
19123
|
+
if (hasProcessed.current || processing) {
|
|
19124
|
+
return;
|
|
19125
|
+
}
|
|
19126
|
+
const handleCallback = async () => {
|
|
19127
|
+
setProcessing(true);
|
|
19128
|
+
hasProcessed.current = true;
|
|
19129
|
+
try {
|
|
19130
|
+
const params = new URLSearchParams(window.location.search);
|
|
19131
|
+
const code = params.get("code");
|
|
19132
|
+
const state = params.get("state");
|
|
19133
|
+
const errorParam = params.get("error");
|
|
19134
|
+
const errorDescription = params.get("error_description");
|
|
19135
|
+
if (errorParam) {
|
|
19136
|
+
setError(errorDescription || errorParam);
|
|
19137
|
+
setProcessing(false);
|
|
19138
|
+
return;
|
|
19139
|
+
}
|
|
19140
|
+
if (!code || !state) {
|
|
19141
|
+
setError("Missing authorization code or state parameter");
|
|
19142
|
+
setProcessing(false);
|
|
19143
|
+
return;
|
|
19144
|
+
}
|
|
19145
|
+
login({
|
|
19146
|
+
code,
|
|
19147
|
+
state,
|
|
19148
|
+
provider: "keycloak"
|
|
19149
|
+
}, {
|
|
19150
|
+
onError: (err) => {
|
|
19151
|
+
console.error("Login failed:", err);
|
|
19152
|
+
setError(err?.message || "Authentication failed. The authorization code may have been used already.");
|
|
19153
|
+
setProcessing(false);
|
|
19154
|
+
}
|
|
19155
|
+
});
|
|
19156
|
+
} catch (err) {
|
|
19157
|
+
console.error("Callback handling error:", err);
|
|
19158
|
+
setError("Failed to process authentication callback");
|
|
19159
|
+
setProcessing(false);
|
|
19160
|
+
}
|
|
19161
|
+
};
|
|
19162
|
+
handleCallback();
|
|
19163
|
+
}, [login, processing]);
|
|
19164
|
+
if (error) {
|
|
19165
|
+
return /* @__PURE__ */ import_react10.default.createElement(
|
|
19166
|
+
import_antd6.Result,
|
|
19167
|
+
{
|
|
19168
|
+
status: "error",
|
|
19169
|
+
title: "Authentication Failed",
|
|
19170
|
+
subTitle: error,
|
|
19171
|
+
extra: /* @__PURE__ */ import_react10.default.createElement(
|
|
19172
|
+
"button",
|
|
19173
|
+
{
|
|
19174
|
+
onClick: () => window.location.href = "/login",
|
|
19175
|
+
style: {
|
|
19176
|
+
padding: "8px 16px",
|
|
19177
|
+
background: "#1890ff",
|
|
19178
|
+
color: "white",
|
|
19179
|
+
border: "none",
|
|
19180
|
+
borderRadius: "4px",
|
|
19181
|
+
cursor: "pointer"
|
|
19182
|
+
}
|
|
19183
|
+
},
|
|
19184
|
+
"Back to Login"
|
|
19185
|
+
)
|
|
19186
|
+
}
|
|
19187
|
+
);
|
|
19188
|
+
}
|
|
19189
|
+
return /* @__PURE__ */ import_react10.default.createElement(
|
|
19190
|
+
"div",
|
|
19191
|
+
{
|
|
19192
|
+
style: {
|
|
19193
|
+
display: "flex",
|
|
19194
|
+
justifyContent: "center",
|
|
19195
|
+
alignItems: "center",
|
|
19196
|
+
height: "100vh",
|
|
19197
|
+
flexDirection: "column",
|
|
19198
|
+
gap: "16px"
|
|
19199
|
+
}
|
|
19200
|
+
},
|
|
19201
|
+
/* @__PURE__ */ import_react10.default.createElement(import_antd6.Spin, { size: "large" }),
|
|
19202
|
+
/* @__PURE__ */ import_react10.default.createElement("p", null, "Completing authentication...")
|
|
19203
|
+
);
|
|
19204
|
+
};
|
|
19205
|
+
|
|
19206
|
+
// src/pages/application-users/list.tsx
|
|
19207
|
+
var import_react11 = __toESM(require("react"));
|
|
19208
|
+
var import_core21 = require("@refinedev/core");
|
|
19209
|
+
var import_antd7 = require("@refinedev/antd");
|
|
19210
|
+
var import_lib9 = require("antd/lib");
|
|
18845
19211
|
var import_icons5 = require("@ant-design/icons");
|
|
18846
19212
|
var ApplicationUserList = () => {
|
|
18847
|
-
const [isModalOpen, setIsModalOpen] = (0,
|
|
18848
|
-
const [selectedUser, setSelectedUser] = (0,
|
|
18849
|
-
const [form] =
|
|
18850
|
-
const { open } = (0,
|
|
18851
|
-
const [isLoading, setIsLoading] = (0,
|
|
19213
|
+
const [isModalOpen, setIsModalOpen] = (0, import_react11.useState)(false);
|
|
19214
|
+
const [selectedUser, setSelectedUser] = (0, import_react11.useState)(null);
|
|
19215
|
+
const [form] = import_lib9.Form.useForm();
|
|
19216
|
+
const { open } = (0, import_core21.useNotification)();
|
|
19217
|
+
const [isLoading, setIsLoading] = (0, import_react11.useState)(false);
|
|
18852
19218
|
const handleResetPasswordClick = (user) => {
|
|
18853
19219
|
setSelectedUser(user);
|
|
18854
19220
|
setIsModalOpen(true);
|
|
18855
19221
|
form.resetFields();
|
|
18856
19222
|
};
|
|
18857
|
-
const
|
|
18858
|
-
|
|
18859
|
-
const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+";
|
|
18860
|
-
let retVal = "";
|
|
18861
|
-
for (let i = 0, n = charset.length; i < length; ++i) {
|
|
18862
|
-
retVal += charset.charAt(Math.floor(Math.random() * n));
|
|
18863
|
-
}
|
|
18864
|
-
form.setFieldsValue({ password: retVal });
|
|
19223
|
+
const handleGeneratePassword = () => {
|
|
19224
|
+
form.setFieldsValue({ password: generatePassword() });
|
|
18865
19225
|
};
|
|
18866
19226
|
const handleResetPasswordSubmit = async (values) => {
|
|
18867
19227
|
if (!selectedUser) return;
|
|
@@ -18884,21 +19244,21 @@ var ApplicationUserList = () => {
|
|
|
18884
19244
|
setIsLoading(false);
|
|
18885
19245
|
}
|
|
18886
19246
|
};
|
|
18887
|
-
return /* @__PURE__ */
|
|
19247
|
+
return /* @__PURE__ */ import_react11.default.createElement(import_react11.default.Fragment, null, /* @__PURE__ */ import_react11.default.createElement(
|
|
18888
19248
|
SmartList,
|
|
18889
19249
|
{
|
|
18890
19250
|
searchFields: ["UserName", "DisplayName", "Email"]
|
|
18891
19251
|
},
|
|
18892
|
-
/* @__PURE__ */
|
|
18893
|
-
|
|
19252
|
+
/* @__PURE__ */ import_react11.default.createElement(
|
|
19253
|
+
import_lib9.Table.Column,
|
|
18894
19254
|
{
|
|
18895
19255
|
dataIndex: "Photo",
|
|
18896
19256
|
title: "Photo",
|
|
18897
|
-
render: (value) => value ? /* @__PURE__ */
|
|
19257
|
+
render: (value) => value ? /* @__PURE__ */ import_react11.default.createElement("img", { src: `data:image/png;base64,${value}`, alt: "User", style: { height: 40, width: 40, objectFit: "cover", borderRadius: "50%" } }) : "-"
|
|
18898
19258
|
}
|
|
18899
19259
|
),
|
|
18900
|
-
/* @__PURE__ */
|
|
18901
|
-
|
|
19260
|
+
/* @__PURE__ */ import_react11.default.createElement(
|
|
19261
|
+
import_lib9.Table.Column,
|
|
18902
19262
|
{
|
|
18903
19263
|
dataIndex: "DisplayName",
|
|
18904
19264
|
title: "Display Name",
|
|
@@ -18907,8 +19267,8 @@ var ApplicationUserList = () => {
|
|
|
18907
19267
|
defaultVisible: true
|
|
18908
19268
|
}
|
|
18909
19269
|
),
|
|
18910
|
-
/* @__PURE__ */
|
|
18911
|
-
|
|
19270
|
+
/* @__PURE__ */ import_react11.default.createElement(
|
|
19271
|
+
import_lib9.Table.Column,
|
|
18912
19272
|
{
|
|
18913
19273
|
dataIndex: "UserName",
|
|
18914
19274
|
title: "User Name",
|
|
@@ -18916,47 +19276,47 @@ var ApplicationUserList = () => {
|
|
|
18916
19276
|
defaultVisible: true
|
|
18917
19277
|
}
|
|
18918
19278
|
),
|
|
18919
|
-
/* @__PURE__ */
|
|
18920
|
-
|
|
19279
|
+
/* @__PURE__ */ import_react11.default.createElement(
|
|
19280
|
+
import_lib9.Table.Column,
|
|
18921
19281
|
{
|
|
18922
19282
|
dataIndex: "Email",
|
|
18923
19283
|
title: "Email",
|
|
18924
19284
|
sorter: true
|
|
18925
19285
|
}
|
|
18926
19286
|
),
|
|
18927
|
-
/* @__PURE__ */
|
|
18928
|
-
|
|
19287
|
+
/* @__PURE__ */ import_react11.default.createElement(
|
|
19288
|
+
import_lib9.Table.Column,
|
|
18929
19289
|
{
|
|
18930
19290
|
dataIndex: "IsActive",
|
|
18931
19291
|
title: "Active",
|
|
18932
|
-
render: (value) => /* @__PURE__ */
|
|
19292
|
+
render: (value) => /* @__PURE__ */ import_react11.default.createElement(import_lib9.Checkbox, { checked: value, disabled: true }),
|
|
18933
19293
|
sorter: true
|
|
18934
19294
|
}
|
|
18935
19295
|
),
|
|
18936
|
-
/* @__PURE__ */
|
|
18937
|
-
|
|
19296
|
+
/* @__PURE__ */ import_react11.default.createElement(
|
|
19297
|
+
import_lib9.Table.Column,
|
|
18938
19298
|
{
|
|
18939
19299
|
dataIndex: "AccessFailedCount",
|
|
18940
19300
|
title: "Access Failed Count"
|
|
18941
19301
|
}
|
|
18942
19302
|
),
|
|
18943
|
-
/* @__PURE__ */
|
|
18944
|
-
|
|
19303
|
+
/* @__PURE__ */ import_react11.default.createElement(
|
|
19304
|
+
import_lib9.Table.Column,
|
|
18945
19305
|
{
|
|
18946
19306
|
title: "Actions",
|
|
18947
19307
|
dataIndex: "actions",
|
|
18948
|
-
render: (_, record) => /* @__PURE__ */
|
|
18949
|
-
|
|
19308
|
+
render: (_, record) => /* @__PURE__ */ import_react11.default.createElement(import_lib9.Space, null, /* @__PURE__ */ import_react11.default.createElement(import_lib9.Tooltip, { title: "Reset Password" }, /* @__PURE__ */ import_react11.default.createElement(
|
|
19309
|
+
import_lib9.Button,
|
|
18950
19310
|
{
|
|
18951
19311
|
size: "small",
|
|
18952
|
-
icon: /* @__PURE__ */
|
|
19312
|
+
icon: /* @__PURE__ */ import_react11.default.createElement(import_icons5.KeyOutlined, null),
|
|
18953
19313
|
onClick: () => handleResetPasswordClick(record)
|
|
18954
19314
|
}
|
|
18955
|
-
)), /* @__PURE__ */
|
|
19315
|
+
)), /* @__PURE__ */ import_react11.default.createElement(import_antd7.EditButton, { hideText: true, size: "small", recordItemId: record.Oid }), /* @__PURE__ */ import_react11.default.createElement(import_antd7.DeleteButton, { hideText: true, size: "small", recordItemId: record.Oid }))
|
|
18956
19316
|
}
|
|
18957
19317
|
)
|
|
18958
|
-
), /* @__PURE__ */
|
|
18959
|
-
|
|
19318
|
+
), /* @__PURE__ */ import_react11.default.createElement(
|
|
19319
|
+
import_lib9.Modal,
|
|
18960
19320
|
{
|
|
18961
19321
|
title: `Reset Password for ${selectedUser?.DisplayName || selectedUser?.UserName}`,
|
|
18962
19322
|
open: isModalOpen,
|
|
@@ -18964,27 +19324,27 @@ var ApplicationUserList = () => {
|
|
|
18964
19324
|
onOk: () => form.submit(),
|
|
18965
19325
|
confirmLoading: isLoading
|
|
18966
19326
|
},
|
|
18967
|
-
/* @__PURE__ */
|
|
18968
|
-
|
|
19327
|
+
/* @__PURE__ */ import_react11.default.createElement(import_lib9.Form, { form, onFinish: handleResetPasswordSubmit, layout: "vertical" }, /* @__PURE__ */ import_react11.default.createElement("div", { style: { display: "flex", gap: 8, alignItems: "flex-end" } }, /* @__PURE__ */ import_react11.default.createElement(
|
|
19328
|
+
import_lib9.Form.Item,
|
|
18969
19329
|
{
|
|
18970
19330
|
name: "password",
|
|
18971
19331
|
label: "New Password",
|
|
18972
19332
|
style: { flex: 1, marginBottom: 0 },
|
|
18973
19333
|
rules: [{ required: true, message: "Please input the new password!" }]
|
|
18974
19334
|
},
|
|
18975
|
-
/* @__PURE__ */
|
|
18976
|
-
), /* @__PURE__ */
|
|
19335
|
+
/* @__PURE__ */ import_react11.default.createElement(import_lib9.Input.Password, { placeholder: "Enter new password" })
|
|
19336
|
+
), /* @__PURE__ */ import_react11.default.createElement(import_lib9.Tooltip, { title: "Generate Complex Password" }, /* @__PURE__ */ import_react11.default.createElement(import_lib9.Button, { icon: /* @__PURE__ */ import_react11.default.createElement(import_icons5.ThunderboltOutlined, null), onClick: handleGeneratePassword }))))
|
|
18977
19337
|
));
|
|
18978
19338
|
};
|
|
18979
19339
|
|
|
18980
19340
|
// src/pages/application-users/create.tsx
|
|
18981
|
-
var
|
|
18982
|
-
var
|
|
18983
|
-
var
|
|
19341
|
+
var import_react12 = __toESM(require("react"));
|
|
19342
|
+
var import_antd8 = require("@refinedev/antd");
|
|
19343
|
+
var import_lib10 = require("antd/lib");
|
|
18984
19344
|
var ApplicationUserCreate = () => {
|
|
18985
|
-
const { formProps, saveButtonProps } = (0,
|
|
18986
|
-
return /* @__PURE__ */
|
|
18987
|
-
|
|
19345
|
+
const { formProps, saveButtonProps } = (0, import_antd8.useForm)();
|
|
19346
|
+
return /* @__PURE__ */ import_react12.default.createElement(import_antd8.Create, { saveButtonProps }, /* @__PURE__ */ import_react12.default.createElement(import_lib10.Form, { ...formProps, layout: "vertical" }, /* @__PURE__ */ import_react12.default.createElement(
|
|
19347
|
+
import_lib10.Form.Item,
|
|
18988
19348
|
{
|
|
18989
19349
|
label: "User Name",
|
|
18990
19350
|
name: "UserName",
|
|
@@ -18994,16 +19354,16 @@ var ApplicationUserCreate = () => {
|
|
|
18994
19354
|
}
|
|
18995
19355
|
]
|
|
18996
19356
|
},
|
|
18997
|
-
/* @__PURE__ */
|
|
18998
|
-
), /* @__PURE__ */
|
|
18999
|
-
|
|
19357
|
+
/* @__PURE__ */ import_react12.default.createElement(import_lib10.Input, null)
|
|
19358
|
+
), /* @__PURE__ */ import_react12.default.createElement(
|
|
19359
|
+
import_lib10.Form.Item,
|
|
19000
19360
|
{
|
|
19001
19361
|
label: "Display Name",
|
|
19002
19362
|
name: "DisplayName"
|
|
19003
19363
|
},
|
|
19004
|
-
/* @__PURE__ */
|
|
19005
|
-
), /* @__PURE__ */
|
|
19006
|
-
|
|
19364
|
+
/* @__PURE__ */ import_react12.default.createElement(import_lib10.Input, null)
|
|
19365
|
+
), /* @__PURE__ */ import_react12.default.createElement(
|
|
19366
|
+
import_lib10.Form.Item,
|
|
19007
19367
|
{
|
|
19008
19368
|
label: "Email",
|
|
19009
19369
|
name: "Email",
|
|
@@ -19013,33 +19373,33 @@ var ApplicationUserCreate = () => {
|
|
|
19013
19373
|
}
|
|
19014
19374
|
]
|
|
19015
19375
|
},
|
|
19016
|
-
/* @__PURE__ */
|
|
19017
|
-
), /* @__PURE__ */
|
|
19018
|
-
|
|
19376
|
+
/* @__PURE__ */ import_react12.default.createElement(import_lib10.Input, null)
|
|
19377
|
+
), /* @__PURE__ */ import_react12.default.createElement(
|
|
19378
|
+
import_lib10.Form.Item,
|
|
19019
19379
|
{
|
|
19020
19380
|
label: "Is Active",
|
|
19021
19381
|
name: "IsActive",
|
|
19022
19382
|
valuePropName: "checked",
|
|
19023
19383
|
initialValue: true
|
|
19024
19384
|
},
|
|
19025
|
-
/* @__PURE__ */
|
|
19026
|
-
), /* @__PURE__ */
|
|
19027
|
-
|
|
19385
|
+
/* @__PURE__ */ import_react12.default.createElement(import_lib10.Checkbox, null, "Active")
|
|
19386
|
+
), /* @__PURE__ */ import_react12.default.createElement(
|
|
19387
|
+
import_lib10.Form.Item,
|
|
19028
19388
|
{
|
|
19029
19389
|
label: "Photo",
|
|
19030
19390
|
name: "Photo"
|
|
19031
19391
|
},
|
|
19032
|
-
/* @__PURE__ */
|
|
19392
|
+
/* @__PURE__ */ import_react12.default.createElement(Base64Upload, null)
|
|
19033
19393
|
)));
|
|
19034
19394
|
};
|
|
19035
19395
|
|
|
19036
19396
|
// src/pages/application-users/edit.tsx
|
|
19037
|
-
var
|
|
19038
|
-
var
|
|
19039
|
-
var
|
|
19397
|
+
var import_react13 = __toESM(require("react"));
|
|
19398
|
+
var import_antd9 = require("@refinedev/antd");
|
|
19399
|
+
var import_lib11 = require("antd/lib");
|
|
19040
19400
|
var ApplicationUserEdit = () => {
|
|
19041
|
-
const { message: message2 } =
|
|
19042
|
-
const { formProps, saveButtonProps, id, form } = (0,
|
|
19401
|
+
const { message: message2 } = import_lib11.App.useApp();
|
|
19402
|
+
const { formProps, saveButtonProps, id, form } = (0, import_antd9.useForm)({
|
|
19043
19403
|
meta: {
|
|
19044
19404
|
expand: ["Roles"]
|
|
19045
19405
|
},
|
|
@@ -19068,7 +19428,7 @@ var ApplicationUserEdit = () => {
|
|
|
19068
19428
|
}
|
|
19069
19429
|
}
|
|
19070
19430
|
});
|
|
19071
|
-
const { selectProps: roleSelectProps } = (0,
|
|
19431
|
+
const { selectProps: roleSelectProps } = (0, import_antd9.useSelect)({
|
|
19072
19432
|
resource: "PermissionPolicyRole",
|
|
19073
19433
|
optionLabel: "Name",
|
|
19074
19434
|
optionValue: "Oid"
|
|
@@ -19077,8 +19437,8 @@ var ApplicationUserEdit = () => {
|
|
|
19077
19437
|
const { Roles, ...userValues } = values;
|
|
19078
19438
|
formProps.onFinish?.(userValues);
|
|
19079
19439
|
};
|
|
19080
|
-
return /* @__PURE__ */
|
|
19081
|
-
|
|
19440
|
+
return /* @__PURE__ */ import_react13.default.createElement(import_antd9.Edit, { saveButtonProps }, /* @__PURE__ */ import_react13.default.createElement(import_lib11.Form, { ...formProps, layout: "vertical", onFinish: handleOnFinish }, /* @__PURE__ */ import_react13.default.createElement(
|
|
19441
|
+
import_lib11.Form.Item,
|
|
19082
19442
|
{
|
|
19083
19443
|
label: "User Name",
|
|
19084
19444
|
name: "UserName",
|
|
@@ -19088,16 +19448,16 @@ var ApplicationUserEdit = () => {
|
|
|
19088
19448
|
}
|
|
19089
19449
|
]
|
|
19090
19450
|
},
|
|
19091
|
-
/* @__PURE__ */
|
|
19092
|
-
), /* @__PURE__ */
|
|
19093
|
-
|
|
19451
|
+
/* @__PURE__ */ import_react13.default.createElement(import_lib11.Input, null)
|
|
19452
|
+
), /* @__PURE__ */ import_react13.default.createElement(
|
|
19453
|
+
import_lib11.Form.Item,
|
|
19094
19454
|
{
|
|
19095
19455
|
label: "Display Name",
|
|
19096
19456
|
name: "DisplayName"
|
|
19097
19457
|
},
|
|
19098
|
-
/* @__PURE__ */
|
|
19099
|
-
), /* @__PURE__ */
|
|
19100
|
-
|
|
19458
|
+
/* @__PURE__ */ import_react13.default.createElement(import_lib11.Input, null)
|
|
19459
|
+
), /* @__PURE__ */ import_react13.default.createElement(
|
|
19460
|
+
import_lib11.Form.Item,
|
|
19101
19461
|
{
|
|
19102
19462
|
label: "Email",
|
|
19103
19463
|
name: "Email",
|
|
@@ -19107,17 +19467,17 @@ var ApplicationUserEdit = () => {
|
|
|
19107
19467
|
}
|
|
19108
19468
|
]
|
|
19109
19469
|
},
|
|
19110
|
-
/* @__PURE__ */
|
|
19111
|
-
), /* @__PURE__ */
|
|
19112
|
-
|
|
19470
|
+
/* @__PURE__ */ import_react13.default.createElement(import_lib11.Input, null)
|
|
19471
|
+
), /* @__PURE__ */ import_react13.default.createElement(
|
|
19472
|
+
import_lib11.Form.Item,
|
|
19113
19473
|
{
|
|
19114
19474
|
label: "Is Active",
|
|
19115
19475
|
name: "IsActive",
|
|
19116
19476
|
valuePropName: "checked"
|
|
19117
19477
|
},
|
|
19118
|
-
/* @__PURE__ */
|
|
19119
|
-
), /* @__PURE__ */
|
|
19120
|
-
|
|
19478
|
+
/* @__PURE__ */ import_react13.default.createElement(import_lib11.Checkbox, null, "Active")
|
|
19479
|
+
), /* @__PURE__ */ import_react13.default.createElement(
|
|
19480
|
+
import_lib11.Form.Item,
|
|
19121
19481
|
{
|
|
19122
19482
|
label: "Roles",
|
|
19123
19483
|
name: "Roles",
|
|
@@ -19135,51 +19495,51 @@ var ApplicationUserEdit = () => {
|
|
|
19135
19495
|
return { value: [] };
|
|
19136
19496
|
}
|
|
19137
19497
|
},
|
|
19138
|
-
/* @__PURE__ */
|
|
19139
|
-
), /* @__PURE__ */
|
|
19140
|
-
|
|
19498
|
+
/* @__PURE__ */ import_react13.default.createElement(import_lib11.Select, { ...roleSelectProps, mode: "multiple" })
|
|
19499
|
+
), /* @__PURE__ */ import_react13.default.createElement(
|
|
19500
|
+
import_lib11.Form.Item,
|
|
19141
19501
|
{
|
|
19142
19502
|
label: "Photo",
|
|
19143
19503
|
name: "Photo"
|
|
19144
19504
|
},
|
|
19145
|
-
/* @__PURE__ */
|
|
19505
|
+
/* @__PURE__ */ import_react13.default.createElement(Base64Upload, null)
|
|
19146
19506
|
)));
|
|
19147
19507
|
};
|
|
19148
19508
|
|
|
19149
19509
|
// src/pages/roles/list.tsx
|
|
19150
|
-
var
|
|
19151
|
-
var
|
|
19152
|
-
var
|
|
19510
|
+
var import_react14 = __toESM(require("react"));
|
|
19511
|
+
var import_antd10 = require("@refinedev/antd");
|
|
19512
|
+
var import_lib12 = require("antd/lib");
|
|
19153
19513
|
var RoleList = () => {
|
|
19154
|
-
const { tableProps } = (0,
|
|
19514
|
+
const { tableProps } = (0, import_antd10.useTable)({
|
|
19155
19515
|
syncWithLocation: true
|
|
19156
19516
|
});
|
|
19157
|
-
return /* @__PURE__ */
|
|
19158
|
-
|
|
19517
|
+
return /* @__PURE__ */ import_react14.default.createElement(import_antd10.List, null, /* @__PURE__ */ import_react14.default.createElement(import_lib12.Table, { ...tableProps, rowKey: "Oid" }, /* @__PURE__ */ import_react14.default.createElement(import_lib12.Table.Column, { dataIndex: "Name", title: "Name" }), /* @__PURE__ */ import_react14.default.createElement(
|
|
19518
|
+
import_lib12.Table.Column,
|
|
19159
19519
|
{
|
|
19160
19520
|
dataIndex: "IsAdministrative",
|
|
19161
19521
|
title: "Is Administrative",
|
|
19162
|
-
render: (value) => /* @__PURE__ */
|
|
19522
|
+
render: (value) => /* @__PURE__ */ import_react14.default.createElement(import_lib12.Checkbox, { checked: value, disabled: true })
|
|
19163
19523
|
}
|
|
19164
|
-
), /* @__PURE__ */
|
|
19165
|
-
|
|
19524
|
+
), /* @__PURE__ */ import_react14.default.createElement(import_lib12.Table.Column, { dataIndex: "PermissionPolicy", title: "Permission Policy" }), /* @__PURE__ */ import_react14.default.createElement(
|
|
19525
|
+
import_lib12.Table.Column,
|
|
19166
19526
|
{
|
|
19167
19527
|
title: "Actions",
|
|
19168
19528
|
dataIndex: "actions",
|
|
19169
|
-
render: (_, record) => /* @__PURE__ */
|
|
19529
|
+
render: (_, record) => /* @__PURE__ */ import_react14.default.createElement(import_lib12.Space, null, /* @__PURE__ */ import_react14.default.createElement(import_antd10.EditButton, { hideText: true, size: "small", recordItemId: record.Oid }), /* @__PURE__ */ import_react14.default.createElement(import_antd10.DeleteButton, { hideText: true, size: "small", recordItemId: record.Oid }))
|
|
19170
19530
|
}
|
|
19171
19531
|
)));
|
|
19172
19532
|
};
|
|
19173
19533
|
|
|
19174
19534
|
// src/pages/roles/create.tsx
|
|
19175
|
-
var
|
|
19176
|
-
var
|
|
19177
|
-
var
|
|
19535
|
+
var import_react16 = __toESM(require("react"));
|
|
19536
|
+
var import_antd12 = require("@refinedev/antd");
|
|
19537
|
+
var import_lib14 = require("antd/lib");
|
|
19178
19538
|
|
|
19179
19539
|
// src/pages/roles/TypePermissionList.tsx
|
|
19180
|
-
var
|
|
19181
|
-
var
|
|
19182
|
-
var
|
|
19540
|
+
var import_react15 = __toESM(require("react"));
|
|
19541
|
+
var import_lib13 = require("antd/lib");
|
|
19542
|
+
var import_antd11 = require("@refinedev/antd");
|
|
19183
19543
|
|
|
19184
19544
|
// src/hooks/useModelTypes.ts
|
|
19185
19545
|
var import_react_query = require("@tanstack/react-query");
|
|
@@ -19206,8 +19566,8 @@ var useModelTypes = () => {
|
|
|
19206
19566
|
};
|
|
19207
19567
|
|
|
19208
19568
|
// src/pages/roles/TypePermissionList.tsx
|
|
19209
|
-
var PermissionSelect = (props) => /* @__PURE__ */
|
|
19210
|
-
|
|
19569
|
+
var PermissionSelect = (props) => /* @__PURE__ */ import_react15.default.createElement(
|
|
19570
|
+
import_lib13.Select,
|
|
19211
19571
|
{
|
|
19212
19572
|
...props,
|
|
19213
19573
|
allowClear: true,
|
|
@@ -19218,26 +19578,26 @@ var PermissionSelect = (props) => /* @__PURE__ */ import_react13.default.createE
|
|
|
19218
19578
|
}
|
|
19219
19579
|
);
|
|
19220
19580
|
var TypePermissionFormFields = ({ typeOptions }) => {
|
|
19221
|
-
return /* @__PURE__ */
|
|
19222
|
-
|
|
19581
|
+
return /* @__PURE__ */ import_react15.default.createElement(import_react15.default.Fragment, null, /* @__PURE__ */ import_react15.default.createElement(
|
|
19582
|
+
import_lib13.Form.Item,
|
|
19223
19583
|
{
|
|
19224
19584
|
label: "Target Type",
|
|
19225
19585
|
name: "TargetTypeFullName",
|
|
19226
19586
|
rules: [{ required: true }]
|
|
19227
19587
|
},
|
|
19228
|
-
/* @__PURE__ */
|
|
19229
|
-
|
|
19588
|
+
/* @__PURE__ */ import_react15.default.createElement(
|
|
19589
|
+
import_lib13.Select,
|
|
19230
19590
|
{
|
|
19231
19591
|
showSearch: true,
|
|
19232
19592
|
options: typeOptions,
|
|
19233
19593
|
filterOption: (input, option) => (option?.label ?? "").toLowerCase().includes(input.toLowerCase())
|
|
19234
19594
|
}
|
|
19235
19595
|
)
|
|
19236
|
-
), /* @__PURE__ */
|
|
19596
|
+
), /* @__PURE__ */ import_react15.default.createElement(import_lib13.Form.Item, { label: "Read State", name: "ReadState" }, /* @__PURE__ */ import_react15.default.createElement(PermissionSelect, null)), /* @__PURE__ */ import_react15.default.createElement(import_lib13.Form.Item, { label: "Write State", name: "WriteState" }, /* @__PURE__ */ import_react15.default.createElement(PermissionSelect, null)), /* @__PURE__ */ import_react15.default.createElement(import_lib13.Form.Item, { label: "Create State", name: "CreateState" }, /* @__PURE__ */ import_react15.default.createElement(PermissionSelect, null)), /* @__PURE__ */ import_react15.default.createElement(import_lib13.Form.Item, { label: "Delete State", name: "DeleteState" }, /* @__PURE__ */ import_react15.default.createElement(PermissionSelect, null)));
|
|
19237
19597
|
};
|
|
19238
19598
|
var TypePermissionList = ({ masterId }) => {
|
|
19239
19599
|
const { data: modelTypes } = useModelTypes();
|
|
19240
|
-
const { tableProps, queryResult } = (0,
|
|
19600
|
+
const { tableProps, queryResult } = (0, import_antd11.useTable)({
|
|
19241
19601
|
resource: "PermissionPolicyTypePermissionObject",
|
|
19242
19602
|
filters: {
|
|
19243
19603
|
permanent: [
|
|
@@ -19253,17 +19613,17 @@ var TypePermissionList = ({ masterId }) => {
|
|
|
19253
19613
|
mode: "off"
|
|
19254
19614
|
}
|
|
19255
19615
|
});
|
|
19256
|
-
const typeOptions =
|
|
19257
|
-
const FormFieldsWrapper =
|
|
19258
|
-
return ({ mode }) => /* @__PURE__ */
|
|
19616
|
+
const typeOptions = import_react15.default.useMemo(() => modelTypes?.filter((t) => t.IsCreatable && !t.IsDeprecated).map((t) => ({ label: t.Caption, value: t.Name })) || [], [modelTypes]);
|
|
19617
|
+
const FormFieldsWrapper = import_react15.default.useMemo(() => {
|
|
19618
|
+
return ({ mode }) => /* @__PURE__ */ import_react15.default.createElement(TypePermissionFormFields, { typeOptions });
|
|
19259
19619
|
}, [typeOptions]);
|
|
19260
|
-
const dataSource =
|
|
19620
|
+
const dataSource = import_react15.default.useMemo(() => {
|
|
19261
19621
|
return (tableProps.dataSource || []).map((p) => ({
|
|
19262
19622
|
...p,
|
|
19263
19623
|
TargetType: p.TargetType || p.TargetTypeFullName || ""
|
|
19264
19624
|
}));
|
|
19265
19625
|
}, [tableProps.dataSource]);
|
|
19266
|
-
return /* @__PURE__ */
|
|
19626
|
+
return /* @__PURE__ */ import_react15.default.createElement(
|
|
19267
19627
|
RelatedList,
|
|
19268
19628
|
{
|
|
19269
19629
|
resource: "PermissionPolicyTypePermissionObject",
|
|
@@ -19274,30 +19634,30 @@ var TypePermissionList = ({ masterId }) => {
|
|
|
19274
19634
|
modalTitle: "Type Permission",
|
|
19275
19635
|
FormFields: FormFieldsWrapper
|
|
19276
19636
|
},
|
|
19277
|
-
/* @__PURE__ */
|
|
19278
|
-
|
|
19637
|
+
/* @__PURE__ */ import_react15.default.createElement(
|
|
19638
|
+
import_lib13.Table.Column,
|
|
19279
19639
|
{
|
|
19280
19640
|
dataIndex: "TargetType",
|
|
19281
19641
|
title: "Target Type",
|
|
19282
19642
|
render: (value) => typeOptions.find((t) => t.value === value)?.label || value
|
|
19283
19643
|
}
|
|
19284
19644
|
),
|
|
19285
|
-
/* @__PURE__ */
|
|
19286
|
-
/* @__PURE__ */
|
|
19287
|
-
/* @__PURE__ */
|
|
19288
|
-
/* @__PURE__ */
|
|
19645
|
+
/* @__PURE__ */ import_react15.default.createElement(import_lib13.Table.Column, { dataIndex: "ReadState", title: "Read" }),
|
|
19646
|
+
/* @__PURE__ */ import_react15.default.createElement(import_lib13.Table.Column, { dataIndex: "WriteState", title: "Write" }),
|
|
19647
|
+
/* @__PURE__ */ import_react15.default.createElement(import_lib13.Table.Column, { dataIndex: "CreateState", title: "Create" }),
|
|
19648
|
+
/* @__PURE__ */ import_react15.default.createElement(import_lib13.Table.Column, { dataIndex: "DeleteState", title: "Delete" })
|
|
19289
19649
|
);
|
|
19290
19650
|
};
|
|
19291
19651
|
|
|
19292
19652
|
// src/pages/roles/create.tsx
|
|
19293
19653
|
var RoleCreate = () => {
|
|
19294
|
-
const [form] =
|
|
19295
|
-
const { formProps, saveButtonProps } = (0,
|
|
19654
|
+
const [form] = import_lib14.Form.useForm();
|
|
19655
|
+
const { formProps, saveButtonProps } = (0, import_antd12.useForm)();
|
|
19296
19656
|
const handleSave = () => {
|
|
19297
19657
|
form.submit();
|
|
19298
19658
|
};
|
|
19299
|
-
return /* @__PURE__ */
|
|
19300
|
-
|
|
19659
|
+
return /* @__PURE__ */ import_react16.default.createElement(import_antd12.Create, { saveButtonProps: { ...saveButtonProps, onClick: handleSave } }, /* @__PURE__ */ import_react16.default.createElement(
|
|
19660
|
+
import_lib14.Form,
|
|
19301
19661
|
{
|
|
19302
19662
|
...formProps,
|
|
19303
19663
|
form,
|
|
@@ -19306,34 +19666,34 @@ var RoleCreate = () => {
|
|
|
19306
19666
|
return formProps.onFinish && formProps.onFinish(values);
|
|
19307
19667
|
}
|
|
19308
19668
|
},
|
|
19309
|
-
/* @__PURE__ */
|
|
19310
|
-
|
|
19669
|
+
/* @__PURE__ */ import_react16.default.createElement(
|
|
19670
|
+
import_lib14.Form.Item,
|
|
19311
19671
|
{
|
|
19312
19672
|
label: "Name",
|
|
19313
19673
|
name: "Name",
|
|
19314
19674
|
rules: [{ required: true }]
|
|
19315
19675
|
},
|
|
19316
|
-
/* @__PURE__ */
|
|
19676
|
+
/* @__PURE__ */ import_react16.default.createElement(import_lib14.Input, null)
|
|
19317
19677
|
),
|
|
19318
|
-
/* @__PURE__ */
|
|
19319
|
-
|
|
19678
|
+
/* @__PURE__ */ import_react16.default.createElement(
|
|
19679
|
+
import_lib14.Form.Item,
|
|
19320
19680
|
{
|
|
19321
19681
|
label: "Is Administrative",
|
|
19322
19682
|
name: "IsAdministrative",
|
|
19323
19683
|
valuePropName: "checked"
|
|
19324
19684
|
},
|
|
19325
|
-
/* @__PURE__ */
|
|
19685
|
+
/* @__PURE__ */ import_react16.default.createElement(import_lib14.Checkbox, null, "Is Administrative")
|
|
19326
19686
|
),
|
|
19327
|
-
/* @__PURE__ */
|
|
19328
|
-
|
|
19687
|
+
/* @__PURE__ */ import_react16.default.createElement(
|
|
19688
|
+
import_lib14.Form.Item,
|
|
19329
19689
|
{
|
|
19330
19690
|
label: "Permission Policy",
|
|
19331
19691
|
name: "PermissionPolicy",
|
|
19332
19692
|
initialValue: "DenyAllByDefault" /* DenyAllByDefault */,
|
|
19333
19693
|
rules: [{ required: true }]
|
|
19334
19694
|
},
|
|
19335
|
-
/* @__PURE__ */
|
|
19336
|
-
|
|
19695
|
+
/* @__PURE__ */ import_react16.default.createElement(
|
|
19696
|
+
import_lib14.Select,
|
|
19337
19697
|
{
|
|
19338
19698
|
options: [
|
|
19339
19699
|
{ label: "Deny All By Default", value: "DenyAllByDefault" /* DenyAllByDefault */ },
|
|
@@ -19343,21 +19703,21 @@ var RoleCreate = () => {
|
|
|
19343
19703
|
}
|
|
19344
19704
|
)
|
|
19345
19705
|
),
|
|
19346
|
-
/* @__PURE__ */
|
|
19706
|
+
/* @__PURE__ */ import_react16.default.createElement(TypePermissionList, null)
|
|
19347
19707
|
));
|
|
19348
19708
|
};
|
|
19349
19709
|
|
|
19350
19710
|
// src/pages/roles/edit.tsx
|
|
19351
|
-
var
|
|
19352
|
-
var
|
|
19353
|
-
var
|
|
19711
|
+
var import_react17 = __toESM(require("react"));
|
|
19712
|
+
var import_antd13 = require("@refinedev/antd");
|
|
19713
|
+
var import_lib15 = require("antd/lib");
|
|
19354
19714
|
var RoleEdit = () => {
|
|
19355
|
-
const { formProps, saveButtonProps, id } = (0,
|
|
19715
|
+
const { formProps, saveButtonProps, id } = (0, import_antd13.useForm)();
|
|
19356
19716
|
const handleSave = () => {
|
|
19357
19717
|
formProps.form?.submit();
|
|
19358
19718
|
};
|
|
19359
|
-
return /* @__PURE__ */
|
|
19360
|
-
|
|
19719
|
+
return /* @__PURE__ */ import_react17.default.createElement(import_antd13.Edit, { saveButtonProps: { ...saveButtonProps, onClick: handleSave } }, /* @__PURE__ */ import_react17.default.createElement(
|
|
19720
|
+
import_lib15.Form,
|
|
19361
19721
|
{
|
|
19362
19722
|
...formProps,
|
|
19363
19723
|
layout: "vertical",
|
|
@@ -19366,33 +19726,33 @@ var RoleEdit = () => {
|
|
|
19366
19726
|
return formProps.onFinish && formProps.onFinish(rest);
|
|
19367
19727
|
}
|
|
19368
19728
|
},
|
|
19369
|
-
/* @__PURE__ */
|
|
19370
|
-
|
|
19729
|
+
/* @__PURE__ */ import_react17.default.createElement(
|
|
19730
|
+
import_lib15.Form.Item,
|
|
19371
19731
|
{
|
|
19372
19732
|
label: "Name",
|
|
19373
19733
|
name: "Name",
|
|
19374
19734
|
rules: [{ required: true }]
|
|
19375
19735
|
},
|
|
19376
|
-
/* @__PURE__ */
|
|
19736
|
+
/* @__PURE__ */ import_react17.default.createElement(import_lib15.Input, null)
|
|
19377
19737
|
),
|
|
19378
|
-
/* @__PURE__ */
|
|
19379
|
-
|
|
19738
|
+
/* @__PURE__ */ import_react17.default.createElement(
|
|
19739
|
+
import_lib15.Form.Item,
|
|
19380
19740
|
{
|
|
19381
19741
|
label: "Is Administrative",
|
|
19382
19742
|
name: "IsAdministrative",
|
|
19383
19743
|
valuePropName: "checked"
|
|
19384
19744
|
},
|
|
19385
|
-
/* @__PURE__ */
|
|
19745
|
+
/* @__PURE__ */ import_react17.default.createElement(import_lib15.Checkbox, null, "Is Administrative")
|
|
19386
19746
|
),
|
|
19387
|
-
/* @__PURE__ */
|
|
19388
|
-
|
|
19747
|
+
/* @__PURE__ */ import_react17.default.createElement(
|
|
19748
|
+
import_lib15.Form.Item,
|
|
19389
19749
|
{
|
|
19390
19750
|
label: "Permission Policy",
|
|
19391
19751
|
name: "PermissionPolicy",
|
|
19392
19752
|
rules: [{ required: true }]
|
|
19393
19753
|
},
|
|
19394
|
-
/* @__PURE__ */
|
|
19395
|
-
|
|
19754
|
+
/* @__PURE__ */ import_react17.default.createElement(
|
|
19755
|
+
import_lib15.Select,
|
|
19396
19756
|
{
|
|
19397
19757
|
options: [
|
|
19398
19758
|
{ label: "Deny All By Default", value: "DenyAllByDefault" /* DenyAllByDefault */ },
|
|
@@ -19402,7 +19762,7 @@ var RoleEdit = () => {
|
|
|
19402
19762
|
}
|
|
19403
19763
|
)
|
|
19404
19764
|
),
|
|
19405
|
-
/* @__PURE__ */
|
|
19765
|
+
/* @__PURE__ */ import_react17.default.createElement(
|
|
19406
19766
|
TypePermissionList,
|
|
19407
19767
|
{
|
|
19408
19768
|
masterId: id?.toString()
|
|
@@ -19415,11 +19775,13 @@ var RoleEdit = () => {
|
|
|
19415
19775
|
ApplicationUserCreate,
|
|
19416
19776
|
ApplicationUserEdit,
|
|
19417
19777
|
ApplicationUserList,
|
|
19778
|
+
AuthCallback,
|
|
19418
19779
|
Base64Upload,
|
|
19419
19780
|
ColorModeContext,
|
|
19420
19781
|
ColorModeContextProvider,
|
|
19421
19782
|
Header,
|
|
19422
19783
|
HttpError,
|
|
19784
|
+
KeycloakLoginPage,
|
|
19423
19785
|
LoginPage,
|
|
19424
19786
|
RelatedList,
|
|
19425
19787
|
RoleCreate,
|
|
@@ -19433,9 +19795,12 @@ var RoleEdit = () => {
|
|
|
19433
19795
|
authProvider,
|
|
19434
19796
|
authService,
|
|
19435
19797
|
dataProvider,
|
|
19798
|
+
generatePassword,
|
|
19436
19799
|
getBaseUrl,
|
|
19437
19800
|
httpClient,
|
|
19801
|
+
keycloakService,
|
|
19438
19802
|
parseJwt,
|
|
19439
19803
|
useColorMode,
|
|
19440
|
-
useModelTypes
|
|
19804
|
+
useModelTypes,
|
|
19805
|
+
validatePasswordStrength
|
|
19441
19806
|
});
|