@keycloakify/keycloak-account-ui 25.0.4-rc.7 → 26.0.0-rc.0
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/KcAccountUiLoader.d.ts +1 -0
- package/KcAccountUiLoader.js +2 -1
- package/KcAccountUiLoader.js.map +1 -1
- package/README.md +19 -19
- package/account-security/AccountRow.js +5 -4
- package/account-security/AccountRow.js.map +1 -1
- package/account-security/DeviceActivity.js +5 -4
- package/account-security/DeviceActivity.js.map +1 -1
- package/account-security/LinkedAccounts.js +24 -9
- package/account-security/LinkedAccounts.js.map +1 -1
- package/account-security/LinkedAccountsToolbar.d.ts +12 -0
- package/account-security/LinkedAccountsToolbar.js +24 -0
- package/account-security/LinkedAccountsToolbar.js.map +1 -0
- package/account-security/SigningIn.js +1 -1
- package/account-security/SigningIn.js.map +1 -1
- package/api/methods.d.ts +7 -1
- package/api/methods.js +9 -2
- package/api/methods.js.map +1 -1
- package/api/parse-links.js +3 -3
- package/api/parse-links.js.map +1 -1
- package/api/parse-response.d.ts +2 -0
- package/api/parse-response.js +11 -15
- package/api/parse-response.js.map +1 -1
- package/api/request.js +1 -1
- package/api/request.js.map +1 -1
- package/api.js +1 -7
- package/api.js.map +1 -1
- package/applications/Applications.js +5 -4
- package/applications/Applications.js.map +1 -1
- package/environment.d.ts +1 -0
- package/environment.js.map +1 -1
- package/messages/messages_ca.properties +105 -12
- package/messages/messages_de.properties +23 -1
- package/messages/messages_en.properties +16 -1
- package/messages/messages_es.properties +1 -1
- package/messages/messages_fr.properties +64 -19
- package/messages/messages_it.properties +3 -0
- package/messages/messages_ka.properties +15 -0
- package/messages/messages_nl.properties +2 -0
- package/organizations/Organizations.d.ts +2 -0
- package/organizations/Organizations.js +19 -0
- package/organizations/Organizations.js.map +1 -0
- package/package.json +89 -29
- package/personal-info/PersonalInfo.js +11 -9
- package/personal-info/PersonalInfo.js.map +1 -1
- package/public/content.d.ts +4 -0
- package/public/content.js +5 -0
- package/public/content.js.map +1 -1
- package/resources/EditTheResource.js +4 -3
- package/resources/EditTheResource.js.map +1 -1
- package/resources/PermissionRequest.js +4 -3
- package/resources/PermissionRequest.js.map +1 -1
- package/resources/ResourcesTab.js +4 -3
- package/resources/ResourcesTab.js.map +1 -1
- package/resources/ShareTheResource.js +4 -3
- package/resources/ShareTheResource.js.map +1 -1
- package/root/Header.js +1 -1
- package/root/Header.js.map +1 -1
- package/root/PageNav.js +1 -1
- package/root/PageNav.js.map +1 -1
- package/routes.d.ts +1 -0
- package/routes.js +6 -0
- package/routes.js.map +1 -1
- package/src/KcAccountUiLoader.tsx +2 -0
- package/src/account-security/AccountRow.tsx +6 -8
- package/src/account-security/DeviceActivity.tsx +10 -9
- package/src/account-security/LinkedAccounts.tsx +107 -30
- package/src/account-security/LinkedAccountsToolbar.tsx +88 -0
- package/src/account-security/SigningIn.tsx +1 -1
- package/src/api/methods.ts +22 -2
- package/src/api/parse-links.ts +3 -3
- package/src/api/parse-response.ts +22 -23
- package/src/api/request.ts +1 -1
- package/src/api.ts +1 -7
- package/src/applications/Applications.tsx +19 -11
- package/src/environment.ts +1 -0
- package/src/organizations/Organizations.tsx +48 -0
- package/src/personal-info/PersonalInfo.tsx +10 -8
- package/src/public/content.ts +5 -0
- package/src/resources/EditTheResource.tsx +8 -7
- package/src/resources/PermissionRequest.tsx +5 -3
- package/src/resources/ResourcesTab.tsx +8 -7
- package/src/resources/ShareTheResource.tsx +9 -8
- package/src/root/Header.tsx +0 -1
- package/src/root/PageNav.tsx +1 -1
- package/src/routes.tsx +7 -0
- package/src/ui-shared/alerts/AlertPanel.tsx +43 -0
- package/src/ui-shared/alerts/Alerts.tsx +48 -52
- package/src/ui-shared/context/environment.ts +1 -1
- package/src/ui-shared/controls/KeycloakSpinner.tsx +12 -0
- package/src/ui-shared/controls/OrganizationTable.tsx +122 -0
- package/src/ui-shared/controls/select-control/SingleSelectControl.tsx +3 -1
- package/src/ui-shared/controls/select-control/TypeaheadSelectControl.tsx +5 -3
- package/src/ui-shared/controls/table/KeycloakDataTable.tsx +597 -0
- package/src/ui-shared/controls/table/ListEmptyState.tsx +86 -0
- package/src/ui-shared/controls/table/PaginatingTableToolbar.tsx +106 -0
- package/src/ui-shared/controls/table/TableToolbar.tsx +92 -0
- package/src/ui-shared/main.ts +35 -1
- package/src/ui-shared/masthead/Masthead.tsx +64 -48
- package/src/ui-shared/select/SingleSelect.tsx +2 -0
- package/src/ui-shared/select/TypeaheadSelect.tsx +2 -0
- package/src/ui-shared/user-profile/LocaleSelector.tsx +1 -1
- package/src/ui-shared/user-profile/UserProfileFields.tsx +18 -21
- package/src/ui-shared/user-profile/UserProfileGroup.tsx +3 -2
- package/src/ui-shared/user-profile/utils.ts +12 -6
- package/src/ui-shared/utils/ErrorBoundary.tsx +77 -0
- package/src/ui-shared/utils/darkMode.ts +19 -0
- package/src/ui-shared/utils/errors.ts +55 -0
- package/src/ui-shared/utils/generateId.ts +1 -0
- package/src/ui-shared/utils/useFetch.ts +44 -0
- package/src/ui-shared/utils/useSetTimeout.ts +40 -0
- package/src/utils/useAccountAlerts.ts +28 -0
- package/src/utils/usePromise.ts +8 -3
- package/src/zKcContextLike.ts +1 -0
- package/ui-shared/alerts/AlertPanel.d.ts +6 -0
- package/ui-shared/alerts/AlertPanel.js +6 -0
- package/ui-shared/alerts/AlertPanel.js.map +1 -0
- package/ui-shared/alerts/Alerts.d.ts +2 -3
- package/ui-shared/alerts/Alerts.js +32 -22
- package/ui-shared/alerts/Alerts.js.map +1 -1
- package/ui-shared/context/environment.js +1 -1
- package/ui-shared/context/environment.js.map +1 -1
- package/ui-shared/controls/KeycloakSpinner.d.ts +1 -0
- package/ui-shared/controls/KeycloakSpinner.js +8 -0
- package/ui-shared/controls/KeycloakSpinner.js.map +1 -0
- package/ui-shared/controls/OrganizationTable.d.ts +16 -0
- package/ui-shared/controls/OrganizationTable.js +45 -0
- package/ui-shared/controls/OrganizationTable.js.map +1 -0
- package/ui-shared/controls/select-control/SingleSelectControl.js +3 -1
- package/ui-shared/controls/select-control/SingleSelectControl.js.map +1 -1
- package/ui-shared/controls/select-control/TypeaheadSelectControl.js +5 -3
- package/ui-shared/controls/select-control/TypeaheadSelectControl.js.map +1 -1
- package/ui-shared/controls/table/KeycloakDataTable.d.ts +64 -0
- package/ui-shared/controls/table/KeycloakDataTable.js +279 -0
- package/ui-shared/controls/table/KeycloakDataTable.js.map +1 -0
- package/ui-shared/controls/table/ListEmptyState.d.ts +20 -0
- package/ui-shared/controls/table/ListEmptyState.js +11 -0
- package/ui-shared/controls/table/ListEmptyState.js.map +1 -0
- package/ui-shared/controls/table/PaginatingTableToolbar.d.ts +21 -0
- package/ui-shared/controls/table/PaginatingTableToolbar.js +27 -0
- package/ui-shared/controls/table/PaginatingTableToolbar.js.map +1 -0
- package/ui-shared/controls/table/TableToolbar.d.ts +12 -0
- package/ui-shared/controls/table/TableToolbar.js +30 -0
- package/ui-shared/controls/table/TableToolbar.js.map +1 -0
- package/ui-shared/main.d.ts +15 -1
- package/ui-shared/main.js +13 -1
- package/ui-shared/main.js.map +1 -1
- package/ui-shared/masthead/Masthead.d.ts +4 -7
- package/ui-shared/masthead/Masthead.js +14 -14
- package/ui-shared/masthead/Masthead.js.map +1 -1
- package/ui-shared/select/SingleSelect.d.ts +1 -1
- package/ui-shared/select/SingleSelect.js +2 -2
- package/ui-shared/select/SingleSelect.js.map +1 -1
- package/ui-shared/select/TypeaheadSelect.d.ts +1 -1
- package/ui-shared/select/TypeaheadSelect.js +2 -2
- package/ui-shared/select/TypeaheadSelect.js.map +1 -1
- package/ui-shared/user-profile/LocaleSelector.js +1 -1
- package/ui-shared/user-profile/LocaleSelector.js.map +1 -1
- package/ui-shared/user-profile/UserProfileFields.d.ts +2 -4
- package/ui-shared/user-profile/UserProfileFields.js +0 -18
- package/ui-shared/user-profile/UserProfileFields.js.map +1 -1
- package/ui-shared/user-profile/UserProfileGroup.js.map +1 -1
- package/ui-shared/user-profile/utils.js +2 -2
- package/ui-shared/user-profile/utils.js.map +1 -1
- package/ui-shared/utils/ErrorBoundary.d.ts +26 -0
- package/ui-shared/utils/ErrorBoundary.js +29 -0
- package/ui-shared/utils/ErrorBoundary.js.map +1 -0
- package/ui-shared/utils/darkMode.d.ts +1 -0
- package/ui-shared/utils/darkMode.js +16 -0
- package/ui-shared/utils/darkMode.js.map +1 -0
- package/ui-shared/utils/errors.d.ts +4 -0
- package/ui-shared/utils/errors.js +42 -0
- package/ui-shared/utils/errors.js.map +1 -0
- package/ui-shared/utils/generateId.d.ts +1 -0
- package/ui-shared/utils/generateId.js +2 -0
- package/ui-shared/utils/generateId.js.map +1 -0
- package/ui-shared/utils/useFetch.d.ts +17 -0
- package/ui-shared/utils/useFetch.js +38 -0
- package/ui-shared/utils/useFetch.js.map +1 -0
- package/ui-shared/utils/useSetTimeout.d.ts +1 -0
- package/ui-shared/utils/useSetTimeout.js +32 -0
- package/ui-shared/utils/useSetTimeout.js.map +1 -0
- package/utils/useAccountAlerts.d.ts +4 -0
- package/utils/useAccountAlerts.js +19 -0
- package/utils/useAccountAlerts.js.map +1 -0
- package/utils/usePromise.js +7 -3
- package/utils/usePromise.js.map +1 -1
- package/zKcContextLike.js +1 -0
- package/zKcContextLike.js.map +1 -1
- package/src/utils/isRecord.ts +0 -2
- package/utils/isRecord.d.ts +0 -1
- package/utils/isRecord.js +0 -2
- package/utils/isRecord.js.map +0 -1
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { NetworkError } from "@keycloak/keycloak-admin-client";
|
|
2
|
+
|
|
3
|
+
const ERROR_FIELDS = ["error", "errorMessage"];
|
|
4
|
+
const ERROR_DESCRIPTION_FIELD = "error_description";
|
|
5
|
+
|
|
6
|
+
export function getErrorMessage(error: unknown) {
|
|
7
|
+
if (typeof error === "string") {
|
|
8
|
+
return error;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
if (error instanceof NetworkError) {
|
|
12
|
+
return getNetworkErrorMessage(error.responseData);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
if (error instanceof Error) {
|
|
16
|
+
return error.message;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
throw new Error("Unable to determine error message.");
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function getErrorDescription(error: unknown) {
|
|
23
|
+
if (!(error instanceof NetworkError)) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const data = error.responseData;
|
|
28
|
+
|
|
29
|
+
return getNetworkErrorDescription(data);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function getNetworkErrorDescription(data: unknown) {
|
|
33
|
+
if (
|
|
34
|
+
typeof data === "object" &&
|
|
35
|
+
data !== null &&
|
|
36
|
+
ERROR_DESCRIPTION_FIELD in data &&
|
|
37
|
+
typeof data[ERROR_DESCRIPTION_FIELD] === "string"
|
|
38
|
+
) {
|
|
39
|
+
return data[ERROR_DESCRIPTION_FIELD];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function getNetworkErrorMessage(data: unknown) {
|
|
44
|
+
if (typeof data !== "object" || data === null) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
for (const key of ERROR_FIELDS) {
|
|
49
|
+
const value = (data as Record<string, unknown>)[key];
|
|
50
|
+
|
|
51
|
+
if (typeof value === "string") {
|
|
52
|
+
return value;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const generateId = () => Math.floor(Math.random() * 1000);
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { DependencyList, useEffect } from "react";
|
|
2
|
+
import { useErrorBoundary } from "@keycloakify/keycloak-account-ui/ui-shared/utils/ErrorBoundary";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Util function to only set the state when the component is still mounted.
|
|
6
|
+
*
|
|
7
|
+
* It takes 2 functions one you do your adminClient call in and the other to set your state
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* useFetch(
|
|
11
|
+
* () => adminClient.components.findOne({ id }),
|
|
12
|
+
* (component) => setupForm(component),
|
|
13
|
+
* []
|
|
14
|
+
* );
|
|
15
|
+
*
|
|
16
|
+
* @param adminClientCall use this to do your adminClient call
|
|
17
|
+
* @param callback when the data is fetched this is where you set your state
|
|
18
|
+
*/
|
|
19
|
+
export function useFetch<T>(
|
|
20
|
+
adminClientCall: () => Promise<T>,
|
|
21
|
+
callback: (param: T) => void,
|
|
22
|
+
deps?: DependencyList,
|
|
23
|
+
) {
|
|
24
|
+
const { showBoundary } = useErrorBoundary();
|
|
25
|
+
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
const controller = new AbortController();
|
|
28
|
+
const { signal } = controller;
|
|
29
|
+
adminClientCall()
|
|
30
|
+
.then((result) => {
|
|
31
|
+
if (!signal.aborted) {
|
|
32
|
+
callback(result);
|
|
33
|
+
}
|
|
34
|
+
})
|
|
35
|
+
.catch((error) => {
|
|
36
|
+
console.error(error);
|
|
37
|
+
if (!signal.aborted) {
|
|
38
|
+
showBoundary(error);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
return () => controller.abort();
|
|
43
|
+
}, deps);
|
|
44
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { useEffect, useRef, useCallback } from "react";
|
|
2
|
+
|
|
3
|
+
export function useSetTimeout() {
|
|
4
|
+
const didUnmountRef = useRef(false);
|
|
5
|
+
const scheduledTimersRef = useRef(new Set<number>());
|
|
6
|
+
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
didUnmountRef.current = false;
|
|
9
|
+
|
|
10
|
+
return () => {
|
|
11
|
+
didUnmountRef.current = true;
|
|
12
|
+
clearAll();
|
|
13
|
+
};
|
|
14
|
+
}, []);
|
|
15
|
+
|
|
16
|
+
function clearAll() {
|
|
17
|
+
scheduledTimersRef.current.forEach((timer) => clearTimeout(timer));
|
|
18
|
+
scheduledTimersRef.current.clear();
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return useCallback((callback: () => void, delay: number) => {
|
|
22
|
+
if (didUnmountRef.current) {
|
|
23
|
+
throw new Error("Can't schedule a timeout on an unmounted component.");
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const timer = Number(setTimeout(handleCallback, delay));
|
|
27
|
+
|
|
28
|
+
scheduledTimersRef.current.add(timer);
|
|
29
|
+
|
|
30
|
+
function handleCallback() {
|
|
31
|
+
scheduledTimersRef.current.delete(timer);
|
|
32
|
+
callback();
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return function cancelTimeout() {
|
|
36
|
+
clearTimeout(timer);
|
|
37
|
+
scheduledTimersRef.current.delete(timer);
|
|
38
|
+
};
|
|
39
|
+
}, []);
|
|
40
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { useAlerts } from "@keycloakify/keycloak-account-ui/ui-shared";
|
|
2
|
+
import { AlertVariant } from "@patternfly/react-core";
|
|
3
|
+
import { useCallback, useMemo } from "react";
|
|
4
|
+
import { useTranslation } from "react-i18next";
|
|
5
|
+
|
|
6
|
+
import { ApiError } from "@keycloakify/keycloak-account-ui/api/parse-response";
|
|
7
|
+
|
|
8
|
+
export function useAccountAlerts() {
|
|
9
|
+
const { t } = useTranslation();
|
|
10
|
+
const { addAlert, addError } = useAlerts();
|
|
11
|
+
const addAccountError = useCallback(
|
|
12
|
+
(messageKey: string, error: unknown) => {
|
|
13
|
+
if (!(error instanceof ApiError)) {
|
|
14
|
+
addError(messageKey, error);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const message = t(messageKey, { error: error.message });
|
|
19
|
+
addAlert(message, AlertVariant.danger, error.description);
|
|
20
|
+
},
|
|
21
|
+
[addAlert, addError, t],
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
return useMemo(
|
|
25
|
+
() => ({ addAlert, addError: addAccountError }),
|
|
26
|
+
[addAccountError, addAlert],
|
|
27
|
+
);
|
|
28
|
+
}
|
package/src/utils/usePromise.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { DependencyList } from "react";
|
|
2
|
-
import { useEffect } from "react";
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Function that creates a Promise. Receives an [AbortSignal](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal)
|
|
@@ -47,6 +47,7 @@ export function usePromise<T>(
|
|
|
47
47
|
callback: PromiseResolvedFn<T>,
|
|
48
48
|
deps: DependencyList = [],
|
|
49
49
|
) {
|
|
50
|
+
const [error, setError] = useState<unknown>();
|
|
50
51
|
useEffect(() => {
|
|
51
52
|
const controller = new AbortController();
|
|
52
53
|
const { signal } = controller;
|
|
@@ -61,8 +62,7 @@ export function usePromise<T>(
|
|
|
61
62
|
return;
|
|
62
63
|
}
|
|
63
64
|
|
|
64
|
-
|
|
65
|
-
throw error;
|
|
65
|
+
setError(error);
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
|
|
@@ -71,4 +71,9 @@ export function usePromise<T>(
|
|
|
71
71
|
// Abort the Promise when the component unmounts, or the dependencies change.
|
|
72
72
|
return () => controller.abort();
|
|
73
73
|
}, deps);
|
|
74
|
+
|
|
75
|
+
// Rethrow other errors.
|
|
76
|
+
if (error) {
|
|
77
|
+
throw error;
|
|
78
|
+
}
|
|
74
79
|
}
|
package/src/zKcContextLike.ts
CHANGED
|
@@ -28,6 +28,7 @@ const zKcContextLikeCommon = (() => {
|
|
|
28
28
|
deleteAccountAllowed: z.boolean(),
|
|
29
29
|
updateEmailFeatureEnabled: z.boolean(),
|
|
30
30
|
updateEmailActionEnabled: z.boolean(),
|
|
31
|
+
isViewOrganizationsEnabled: z.boolean().optional(),
|
|
31
32
|
});
|
|
32
33
|
|
|
33
34
|
assert<Equals<z.infer<typeof zTargetType>, TargetType>>();
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { AlertEntry } from "../../ui-shared/alerts/Alerts";
|
|
2
|
+
export type AlertPanelProps = {
|
|
3
|
+
alerts: AlertEntry[];
|
|
4
|
+
onCloseAlert: (id: number) => void;
|
|
5
|
+
};
|
|
6
|
+
export declare function AlertPanel({ alerts, onCloseAlert }: AlertPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { AlertGroup, Alert, AlertActionCloseButton, AlertVariant, } from "@patternfly/react-core";
|
|
3
|
+
export function AlertPanel({ alerts, onCloseAlert }) {
|
|
4
|
+
return (_jsx(AlertGroup, { "data-testid": "global-alerts", isToast: true, style: { whiteSpace: "pre-wrap" }, children: alerts.map(({ id, variant, message, description }, index) => (_jsx(Alert, { "data-testid": index === 0 ? "last-alert" : undefined, isLiveRegion: true, variant: AlertVariant[variant], component: "p", variantLabel: "", title: message, actionClose: _jsx(AlertActionCloseButton, { title: message, onClose: () => onCloseAlert(id) }), children: description && _jsx("p", { children: description }) }, id))) }));
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=AlertPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AlertPanel.js","sourceRoot":"","sources":["../../src/ui-shared/alerts/AlertPanel.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,UAAU,EACV,KAAK,EACL,sBAAsB,EACtB,YAAY,GACb,MAAM,wBAAwB,CAAC;AAShC,MAAM,UAAU,UAAU,CAAC,EAAE,MAAM,EAAE,YAAY,EAAmB;IAClE,OAAO,CACL,KAAC,UAAU,mBACG,eAAe,EAC3B,OAAO,QACP,KAAK,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,YAEhC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAC5D,KAAC,KAAK,mBAES,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,EACnD,YAAY,QACZ,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,EAC9B,SAAS,EAAC,GAAG,EACb,YAAY,EAAC,EAAE,EACf,KAAK,EAAE,OAAO,EACd,WAAW,EACT,KAAC,sBAAsB,IACrB,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,GAC/B,YAGH,WAAW,IAAI,sBAAI,WAAW,GAAK,IAd/B,EAAE,CAeD,CACT,CAAC,GACS,CACd,CAAC;AACJ,CAAC"}
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import { AlertVariant } from "@patternfly/react-core";
|
|
2
2
|
import { PropsWithChildren } from "react";
|
|
3
3
|
export type AddAlertFunction = (message: string, variant?: AlertVariant, description?: string) => void;
|
|
4
|
-
export type AddErrorFunction = (
|
|
4
|
+
export type AddErrorFunction = (messageKey: string, error: unknown) => void;
|
|
5
5
|
export type AlertProps = {
|
|
6
6
|
addAlert: AddAlertFunction;
|
|
7
7
|
addError: AddErrorFunction;
|
|
8
8
|
};
|
|
9
|
-
export declare const AlertContext: import("react").Context<AlertProps | undefined>;
|
|
10
9
|
export declare const useAlerts: () => AlertProps;
|
|
11
|
-
export type
|
|
10
|
+
export type AlertEntry = {
|
|
12
11
|
id: number;
|
|
13
12
|
message: string;
|
|
14
13
|
variant: AlertVariant;
|
|
@@ -1,27 +1,37 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
import { AlertVariant } from "@patternfly/react-core";
|
|
3
|
+
import { useCallback, useMemo, useState } from "react";
|
|
4
|
+
import { useTranslation } from "react-i18next";
|
|
5
|
+
import { createNamedContext } from "../../ui-shared/utils/createNamedContext";
|
|
6
|
+
import { getErrorDescription, getErrorMessage } from "../../ui-shared/utils/errors";
|
|
7
|
+
import { generateId } from "../../ui-shared/utils/generateId";
|
|
8
|
+
import { useRequiredContext } from "../../ui-shared/utils/useRequiredContext";
|
|
9
|
+
import { useSetTimeout } from "../../ui-shared/utils/useSetTimeout";
|
|
10
|
+
import { AlertPanel } from "../../ui-shared/alerts/AlertPanel";
|
|
11
|
+
const ALERT_TIMEOUT = 8000;
|
|
12
|
+
const AlertContext = createNamedContext("AlertContext", undefined);
|
|
13
|
+
export const useAlerts = () => useRequiredContext(AlertContext);
|
|
6
14
|
export const AlertProvider = ({ children }) => {
|
|
15
|
+
const { t } = useTranslation();
|
|
16
|
+
const setTimeout = useSetTimeout();
|
|
7
17
|
const [alerts, setAlerts] = useState([]);
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
25
|
-
return (_jsxs(AlertContext.Provider, { value:
|
|
18
|
+
const removeAlert = (id) => setAlerts((alerts) => alerts.filter((alert) => alert.id !== id));
|
|
19
|
+
const addAlert = useCallback((message, variant = AlertVariant.success, description) => {
|
|
20
|
+
const alert = {
|
|
21
|
+
id: generateId(),
|
|
22
|
+
message,
|
|
23
|
+
variant,
|
|
24
|
+
description,
|
|
25
|
+
};
|
|
26
|
+
setAlerts((alerts) => [alert, ...alerts]);
|
|
27
|
+
setTimeout(() => removeAlert(alert.id), ALERT_TIMEOUT);
|
|
28
|
+
}, [setTimeout]);
|
|
29
|
+
const addError = useCallback((messageKey, error) => {
|
|
30
|
+
const message = t(messageKey, { error: getErrorMessage(error) });
|
|
31
|
+
const description = getErrorDescription(error);
|
|
32
|
+
addAlert(message, AlertVariant.danger, description);
|
|
33
|
+
}, [addAlert, t]);
|
|
34
|
+
const value = useMemo(() => ({ addAlert, addError }), [addAlert, addError]);
|
|
35
|
+
return (_jsxs(AlertContext.Provider, { value: value, children: [_jsx(AlertPanel, { alerts: alerts, onCloseAlert: removeAlert }), children] }));
|
|
26
36
|
};
|
|
27
37
|
//# sourceMappingURL=Alerts.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Alerts.js","sourceRoot":"","sources":["../../src/ui-shared/alerts/Alerts.tsx"],"names":[],"mappings":";AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"Alerts.js","sourceRoot":"","sources":["../../src/ui-shared/alerts/Alerts.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAqB,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qEAAqE,CAAC;AACzG,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,yDAAyD,CAAC;AAC/G,OAAO,EAAE,UAAU,EAAE,MAAM,6DAA6D,CAAC;AACzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,qEAAqE,CAAC;AACzG,OAAO,EAAE,aAAa,EAAE,MAAM,gEAAgE,CAAC;AAC/F,OAAO,EAAE,UAAU,EAAE,MAAM,8DAA8D,CAAC;AAE1F,MAAM,aAAa,GAAG,IAAI,CAAC;AAe3B,MAAM,YAAY,GAAG,kBAAkB,CACrC,cAAc,EACd,SAAS,CACV,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;AAShE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAAE,QAAQ,EAAqB,EAAE,EAAE;IAC/D,MAAM,EAAE,CAAC,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAe,EAAE,CAAC,CAAC;IAEvD,MAAM,WAAW,GAAG,CAAC,EAAU,EAAE,EAAE,CACjC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAEnE,MAAM,QAAQ,GAAG,WAAW,CAC1B,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE;QACvD,MAAM,KAAK,GAAe;YACxB,EAAE,EAAE,UAAU,EAAE;YAChB,OAAO;YACP,OAAO;YACP,WAAW;SACZ,CAAC;QAEF,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;QAC1C,UAAU,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC;IACzD,CAAC,EACD,CAAC,UAAU,CAAC,CACb,CAAC;IAEF,MAAM,QAAQ,GAAG,WAAW,CAC1B,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE;QACpB,MAAM,OAAO,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjE,MAAM,WAAW,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAE/C,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACtD,CAAC,EACD,CAAC,QAAQ,EAAE,CAAC,CAAC,CACd,CAAC;IAEF,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE5E,OAAO,CACL,MAAC,YAAY,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,aACjC,KAAC,UAAU,IAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,GAAI,EACxD,QAAQ,IACa,CACzB,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/ui-shared/context/environment.ts"],"names":[],"mappings":"AAuBA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,sBAAsB;IACpC,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,CAAC;IAEtC,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAAC,
|
|
1
|
+
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/ui-shared/context/environment.ts"],"names":[],"mappings":"AAuBA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,sBAAsB;IACpC,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,CAAC;IAEtC,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAAC,WAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const KeycloakSpinner: () => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Bullseye, Spinner } from "@patternfly/react-core";
|
|
3
|
+
import { useTranslation } from "react-i18next";
|
|
4
|
+
export const KeycloakSpinner = () => {
|
|
5
|
+
const { t } = useTranslation();
|
|
6
|
+
return (_jsx(Bullseye, { children: _jsx(Spinner, { "aria-label": t("spinnerLoading") }) }));
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=KeycloakSpinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KeycloakSpinner.js","sourceRoot":"","sources":["../../src/ui-shared/controls/KeycloakSpinner.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,EAAE;IAClC,MAAM,EAAE,CAAC,EAAE,GAAG,cAAc,EAAE,CAAC;IAE/B,OAAO,CACL,KAAC,QAAQ,cACP,KAAC,OAAO,kBAAa,CAAC,CAAC,gBAAgB,CAAC,GAAI,GACnC,CACZ,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import OrganizationRepresentation from "@keycloak/keycloak-admin-client/lib/defs/organizationRepresentation";
|
|
2
|
+
import { FunctionComponent, PropsWithChildren, ReactNode } from "react";
|
|
3
|
+
import { LoaderFunction } from "../../ui-shared/controls/table/KeycloakDataTable";
|
|
4
|
+
type OrganizationTableProps = PropsWithChildren & {
|
|
5
|
+
loader: LoaderFunction<OrganizationRepresentation> | OrganizationRepresentation[];
|
|
6
|
+
link: FunctionComponent<PropsWithChildren<{
|
|
7
|
+
organization: OrganizationRepresentation;
|
|
8
|
+
}>>;
|
|
9
|
+
toolbarItem?: ReactNode;
|
|
10
|
+
isPaginated?: boolean;
|
|
11
|
+
onSelect?: (orgs: OrganizationRepresentation[]) => void;
|
|
12
|
+
onDelete?: (org: OrganizationRepresentation) => void;
|
|
13
|
+
deleteLabel?: string;
|
|
14
|
+
};
|
|
15
|
+
export declare const OrganizationTable: ({ loader, toolbarItem, isPaginated, onSelect, onDelete, deleteLabel, link, children, }: OrganizationTableProps) => import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Badge, Chip, ChipGroup } from "@patternfly/react-core";
|
|
3
|
+
import { TableText } from "@patternfly/react-table";
|
|
4
|
+
import { useTranslation } from "react-i18next";
|
|
5
|
+
import { KeycloakDataTable } from "../../ui-shared/controls/table/KeycloakDataTable";
|
|
6
|
+
const OrgDetailLink = ({ link, organization }) => {
|
|
7
|
+
const { t } = useTranslation();
|
|
8
|
+
const Component = link;
|
|
9
|
+
return (_jsx(TableText, { wrapModifier: "truncate", children: _jsxs(Component, { organization: organization, children: [organization.name, !organization.enabled && (_jsx(Badge, { isRead: true, className: "pf-v5-u-ml-sm", children: t("disabled") }, `${organization.id}-disabled`))] }) }));
|
|
10
|
+
};
|
|
11
|
+
const Domains = (org) => {
|
|
12
|
+
var _a;
|
|
13
|
+
const { t } = useTranslation();
|
|
14
|
+
return (_jsx(ChipGroup, { numChips: 2, expandedText: t("hide"), collapsedText: t("showRemaining"), children: (_a = org.domains) === null || _a === void 0 ? void 0 : _a.map((dn) => {
|
|
15
|
+
const name = typeof dn === "string" ? dn : dn.name;
|
|
16
|
+
return (_jsx(Chip, { isReadOnly: true, children: name }, name));
|
|
17
|
+
}) }));
|
|
18
|
+
};
|
|
19
|
+
export const OrganizationTable = ({ loader, toolbarItem, isPaginated = false, onSelect, onDelete, deleteLabel = "delete", link, children, }) => {
|
|
20
|
+
const { t } = useTranslation();
|
|
21
|
+
return (_jsx(KeycloakDataTable, { loader: loader, isPaginated: isPaginated, ariaLabelKey: "organizationList", searchPlaceholderKey: "searchOrganization", toolbarItem: toolbarItem, onSelect: onSelect, canSelectAll: onSelect !== undefined, actions: onDelete
|
|
22
|
+
? [
|
|
23
|
+
{
|
|
24
|
+
title: t(deleteLabel),
|
|
25
|
+
onRowClick: onDelete,
|
|
26
|
+
},
|
|
27
|
+
]
|
|
28
|
+
: undefined, columns: [
|
|
29
|
+
{
|
|
30
|
+
name: "name",
|
|
31
|
+
displayKey: "name",
|
|
32
|
+
cellRenderer: (row) => (_jsx(OrgDetailLink, { link: link, organization: row })),
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: "domains",
|
|
36
|
+
displayKey: "domains",
|
|
37
|
+
cellRenderer: Domains,
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: "description",
|
|
41
|
+
displayKey: "description",
|
|
42
|
+
},
|
|
43
|
+
], emptyState: children }));
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=OrganizationTable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrganizationTable.js","sourceRoot":"","sources":["../../src/ui-shared/controls/OrganizationTable.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAkB,MAAM,6EAA6E,CAAC;AAShI,MAAM,aAAa,GAAG,CAAC,EAAE,IAAI,EAAE,YAAY,EAAsB,EAAE,EAAE;IACnE,MAAM,EAAE,CAAC,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAG,IAAI,CAAC;IACvB,OAAO,CACL,KAAC,SAAS,IAAC,YAAY,EAAC,UAAU,YAChC,MAAC,SAAS,IAAC,YAAY,EAAE,YAAY,aAClC,YAAY,CAAC,IAAI,EACjB,CAAC,YAAY,CAAC,OAAO,IAAI,CACxB,KAAC,KAAK,IAEJ,MAAM,QACN,SAAS,EAAC,eAAe,YAExB,CAAC,CAAC,UAAU,CAAC,IAJT,GAAG,YAAY,CAAC,EAAE,WAAW,CAK5B,CACT,IACS,GACF,CACb,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,GAA+B,EAAE,EAAE;;IAClD,MAAM,EAAE,CAAC,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,OAAO,CACL,KAAC,SAAS,IACR,QAAQ,EAAE,CAAC,EACX,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,EACvB,aAAa,EAAE,CAAC,CAAC,eAAe,CAAC,YAEhC,MAAA,GAAG,CAAC,OAAO,0CAAE,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;YACvB,MAAM,IAAI,GAAG,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;YACnD,OAAO,CACL,KAAC,IAAI,IAAY,UAAU,kBACxB,IAAI,IADI,IAAI,CAER,CACR,CAAC;QACJ,CAAC,CAAC,GACQ,CACb,CAAC;AACJ,CAAC,CAAC;AAgBF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAChC,MAAM,EACN,WAAW,EACX,WAAW,GAAG,KAAK,EACnB,QAAQ,EACR,QAAQ,EACR,WAAW,GAAG,QAAQ,EACtB,IAAI,EACJ,QAAQ,GACe,EAAE,EAAE;IAC3B,MAAM,EAAE,CAAC,EAAE,GAAG,cAAc,EAAE,CAAC;IAE/B,OAAO,CACL,KAAC,iBAAiB,IAChB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,EACxB,YAAY,EAAC,kBAAkB,EAC/B,oBAAoB,EAAC,oBAAoB,EACzC,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,QAAQ,KAAK,SAAS,EACpC,OAAO,EACL,QAAQ;YACN,CAAC,CAAC;gBACE;oBACE,KAAK,EAAE,CAAC,CAAC,WAAW,CAAC;oBACrB,UAAU,EAAE,QAAQ;iBACrB;aACF;YACH,CAAC,CAAC,SAAS,EAEf,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,UAAU,EAAE,MAAM;gBAClB,YAAY,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CACrB,KAAC,aAAa,IAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,GAAI,CACjD;aACF;YACD;gBACE,IAAI,EAAE,SAAS;gBACf,UAAU,EAAE,SAAS;gBACrB,YAAY,EAAE,OAAO;aACtB;YACD;gBACE,IAAI,EAAE,aAAa;gBACnB,UAAU,EAAE,aAAa;aAC1B;SACF,EACD,UAAU,EAAE,QAAQ,GACpB,CACH,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -14,6 +14,7 @@ import { MenuToggle, MenuToggleStatus, Select, SelectList, SelectOption, } from
|
|
|
14
14
|
import { get } from "lodash-es";
|
|
15
15
|
import { useState } from "react";
|
|
16
16
|
import { Controller, useFormContext, } from "react-hook-form";
|
|
17
|
+
import { getRuleValue } from "../../../ui-shared/utils/getRuleValue";
|
|
17
18
|
import { FormLabel } from "../../../ui-shared/controls/FormLabel";
|
|
18
19
|
import { isSelectBasedOptions, isString, key, } from "../../../ui-shared/controls/select-control/SelectControl";
|
|
19
20
|
export const SingleSelectControl = (_a) => {
|
|
@@ -21,7 +22,8 @@ export const SingleSelectControl = (_a) => {
|
|
|
21
22
|
var { id, name, label, options, controller, labelIcon } = _a, rest = __rest(_a, ["id", "name", "label", "options", "controller", "labelIcon"]);
|
|
22
23
|
const { control, formState: { errors }, } = useFormContext();
|
|
23
24
|
const [open, setOpen] = useState(false);
|
|
24
|
-
|
|
25
|
+
const required = getRuleValue((_b = controller.rules) === null || _b === void 0 ? void 0 : _b.required) === true;
|
|
26
|
+
return (_jsx(FormLabel, { name: name, label: label, isRequired: required, error: get(errors, name), labelIcon: labelIcon, children: _jsx(Controller, Object.assign({}, controller, { name: name, control: control, render: ({ field: { onChange, value } }) => (_jsx(Select, Object.assign({}, rest, { onClick: () => setOpen(!open), onOpenChange: () => setOpen(false), selected: isSelectBasedOptions(options)
|
|
25
27
|
? options
|
|
26
28
|
.filter((o) => Array.isArray(value)
|
|
27
29
|
? value.includes(o.key)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SingleSelectControl.js","sourceRoot":"","sources":["../../../src/ui-shared/controls/select-control/SingleSelectControl.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,MAAM,EACN,UAAU,EACV,YAAY,GACb,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EACL,UAAU,EAGV,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,+DAA+D,CAAC;AAC1F,OAAO,EAEL,oBAAoB,EACpB,QAAQ,EACR,GAAG,GACJ,MAAM,kFAAkF,CAAC;AAE1F,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAGjC,EAQyB,EAAE,EAAE;;QAR7B,EACA,EAAE,EACF,IAAI,EACJ,KAAK,EACL,OAAO,EACP,UAAU,EACV,SAAS,OAEgB,EADtB,IAAI,cAPP,6DAQD,CADQ;IAEP,MAAM,EACJ,OAAO,EACP,SAAS,EAAE,EAAE,MAAM,EAAE,GACtB,GAAG,cAAc,EAAE,CAAC;IACrB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"SingleSelectControl.js","sourceRoot":"","sources":["../../../src/ui-shared/controls/select-control/SingleSelectControl.tsx"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ import { TimesIcon } from "@patternfly/react-icons";
|
|
|
15
15
|
import { get } from "lodash-es";
|
|
16
16
|
import { useMemo, useRef, useState } from "react";
|
|
17
17
|
import { Controller, useFormContext, } from "react-hook-form";
|
|
18
|
+
import { getRuleValue } from "../../../ui-shared/utils/getRuleValue";
|
|
18
19
|
import { FormLabel } from "../../../ui-shared/controls/FormLabel";
|
|
19
20
|
import { SelectVariant, isSelectBasedOptions, isString, key, } from "../../../ui-shared/controls/select-control/SelectControl";
|
|
20
21
|
const getValue = (option) => isString(option) ? option : option.value;
|
|
@@ -26,6 +27,7 @@ export const TypeaheadSelectControl = (_a) => {
|
|
|
26
27
|
const [filterValue, setFilterValue] = useState("");
|
|
27
28
|
const [focusedItemIndex, setFocusedItemIndex] = useState(0);
|
|
28
29
|
const textInputRef = useRef();
|
|
30
|
+
const required = getRuleValue((_b = controller.rules) === null || _b === void 0 ? void 0 : _b.required) === true;
|
|
29
31
|
const filteredOptions = options.filter((option) => getValue(option).toLowerCase().startsWith(filterValue.toLowerCase()));
|
|
30
32
|
const convert = useMemo(() => filteredOptions.map((option, index) => (_jsx(SelectOption, { value: key(option), isFocused: focusedItemIndex === index, children: getValue(option) }, key(option)))), [focusedItemIndex, filteredOptions]);
|
|
31
33
|
const onInputKeyDown = (event, field) => {
|
|
@@ -84,7 +86,7 @@ export const TypeaheadSelectControl = (_a) => {
|
|
|
84
86
|
}
|
|
85
87
|
}
|
|
86
88
|
};
|
|
87
|
-
return (_jsx(FormLabel, { name: name, label: label, isRequired:
|
|
89
|
+
return (_jsx(FormLabel, { name: name, label: label, isRequired: required, error: get(errors, name), labelIcon: labelIcon, children: _jsx(Controller, Object.assign({}, controller, { name: name, control: control, render: ({ field }) => (_jsx(Select, Object.assign({}, rest, { onClick: () => setOpen(!open), onOpenChange: () => setOpen(false), selected: isSelectBasedOptions(options)
|
|
88
90
|
? options
|
|
89
91
|
.filter((o) => Array.isArray(field.value)
|
|
90
92
|
? field.value.includes(o.key)
|
|
@@ -111,10 +113,10 @@ export const TypeaheadSelectControl = (_a) => {
|
|
|
111
113
|
}, children: isSelectBasedOptions(options)
|
|
112
114
|
? (_a = options.find((o) => selection === o.key)) === null || _a === void 0 ? void 0 : _a.value
|
|
113
115
|
: getValue(selection) }, index));
|
|
114
|
-
}) })) }), _jsx(TextInputGroupUtilities, { children: !!filterValue && (_jsx(Button, { variant: "plain", onClick: () => {
|
|
116
|
+
}) })) }), _jsx(TextInputGroupUtilities, { children: (!!filterValue || field.value) && (_jsx(Button, { variant: "plain", onClick: () => {
|
|
115
117
|
var _a;
|
|
116
|
-
field.onChange(undefined);
|
|
117
118
|
setFilterValue("");
|
|
119
|
+
field.onChange("");
|
|
118
120
|
(_a = textInputRef === null || textInputRef === void 0 ? void 0 : textInputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
119
121
|
}, "aria-label": "Clear input value", children: _jsx(TimesIcon, { "aria-hidden": true }) })) })] }) }));
|
|
120
122
|
}, onSelect: (event, v) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TypeaheadSelectControl.js","sourceRoot":"","sources":["../../../src/ui-shared/controls/select-control/TypeaheadSelectControl.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EACL,MAAM,EACN,IAAI,EACJ,SAAS,EACT,UAAU,EACV,gBAAgB,EAChB,MAAM,EACN,UAAU,EACV,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAClD,OAAO,EACL,UAAU,EAIV,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,+DAA+D,CAAC;AAC1F,OAAO,EAGL,aAAa,EACb,oBAAoB,EACpB,QAAQ,EACR,GAAG,GACJ,MAAM,kFAAkF,CAAC;AAE1F,MAAM,QAAQ,GAAG,CAAC,MAAoC,EAAE,EAAE,CACxD,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;AAE3C,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAGpC,EAWyB,EAAE,EAAE;;QAX7B,EACA,EAAE,EACF,IAAI,EACJ,KAAK,EACL,OAAO,EACP,UAAU,EACV,SAAS,EACT,eAAe,EACf,QAAQ,EACR,OAAO,OAEkB,EADtB,IAAI,cAVP,uGAWD,CADQ;IAEP,MAAM,EACJ,OAAO,EACP,SAAS,EAAE,EAAE,MAAM,EAAE,GACtB,GAAG,cAAc,EAAE,CAAC;IACrB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACnD,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAS,CAAC,CAAC,CAAC;IACpE,MAAM,YAAY,GAAG,MAAM,EAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"TypeaheadSelectControl.js","sourceRoot":"","sources":["../../../src/ui-shared/controls/select-control/TypeaheadSelectControl.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { SVGIconProps } from "@patternfly/react-icons/dist/js/createIcon";
|
|
2
|
+
import { IAction, IActionsResolver, IFormatter, ITransform, TableProps } from "@patternfly/react-table";
|
|
3
|
+
import { ComponentClass, ReactNode, type JSX } from "react";
|
|
4
|
+
export type Field<T> = {
|
|
5
|
+
name: string;
|
|
6
|
+
displayKey?: string;
|
|
7
|
+
cellFormatters?: IFormatter[];
|
|
8
|
+
transforms?: ITransform[];
|
|
9
|
+
cellRenderer?: (row: T) => JSX.Element | string;
|
|
10
|
+
};
|
|
11
|
+
export type DetailField<T> = {
|
|
12
|
+
name: string;
|
|
13
|
+
enabled?: (row: T) => boolean;
|
|
14
|
+
cellRenderer?: (row: T) => JSX.Element | string;
|
|
15
|
+
};
|
|
16
|
+
export type Action<T> = IAction & {
|
|
17
|
+
onRowClick?: (row: T) => Promise<boolean | void> | void;
|
|
18
|
+
};
|
|
19
|
+
export type LoaderFunction<T> = (first?: number, max?: number, search?: string) => Promise<T[]>;
|
|
20
|
+
export type DataListProps<T> = Omit<TableProps, "rows" | "cells" | "onSelect"> & {
|
|
21
|
+
loader: T[] | LoaderFunction<T>;
|
|
22
|
+
onSelect?: (value: T[]) => void;
|
|
23
|
+
canSelectAll?: boolean;
|
|
24
|
+
detailColumns?: DetailField<T>[];
|
|
25
|
+
isRowDisabled?: (value: T) => boolean;
|
|
26
|
+
isPaginated?: boolean;
|
|
27
|
+
ariaLabelKey: string;
|
|
28
|
+
searchPlaceholderKey?: string;
|
|
29
|
+
columns: Field<T>[];
|
|
30
|
+
actions?: Action<T>[];
|
|
31
|
+
actionResolver?: IActionsResolver;
|
|
32
|
+
searchTypeComponent?: ReactNode;
|
|
33
|
+
toolbarItem?: ReactNode;
|
|
34
|
+
subToolbar?: ReactNode;
|
|
35
|
+
emptyState?: ReactNode;
|
|
36
|
+
icon?: ComponentClass<SVGIconProps>;
|
|
37
|
+
isNotCompact?: boolean;
|
|
38
|
+
isRadio?: boolean;
|
|
39
|
+
isSearching?: boolean;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* A generic component that can be used to show the initial list most sections have. Takes care of the loading of the date and filtering.
|
|
43
|
+
* All you have to define is how the columns are displayed.
|
|
44
|
+
* @example
|
|
45
|
+
* <KeycloakDataTable columns={[
|
|
46
|
+
* {
|
|
47
|
+
* name: "clientId", //name of the field from the array of object the loader returns to display in this column
|
|
48
|
+
* displayKey: "clientId", //i18n key to use to lookup the name of the column header
|
|
49
|
+
* cellRenderer: ClientDetailLink, //optionally you can use a component to render the column when you don't want just the content of the field, the whole row / entire object is passed in.
|
|
50
|
+
* }
|
|
51
|
+
* ]}
|
|
52
|
+
* @param {DataListProps} props - The properties.
|
|
53
|
+
* @param {string} props.ariaLabelKey - The aria label key i18n key to lookup the label
|
|
54
|
+
* @param {string} props.searchPlaceholderKey - The i18n key to lookup the placeholder for the search box
|
|
55
|
+
* @param {boolean} props.isPaginated - if true the the loader will be called with first, max and search and a pager will be added in the header
|
|
56
|
+
* @param {(first?: number, max?: number, search?: string) => Promise<T[]>} props.loader - loader function that will fetch the data to display first, max and search are only applicable when isPaginated = true
|
|
57
|
+
* @param {Field<T>} props.columns - definition of the columns
|
|
58
|
+
* @param {Field<T>} props.detailColumns - definition of the columns expandable columns
|
|
59
|
+
* @param {Action[]} props.actions - the actions that appear on the row
|
|
60
|
+
* @param {IActionsResolver} props.actionResolver Resolver for the given action
|
|
61
|
+
* @param {ReactNode} props.toolbarItem - Toolbar items that appear on the top of the table {@link toolbarItem}
|
|
62
|
+
* @param {ReactNode} props.emptyState - ReactNode show when the list is empty could be any component but best to use {@link ListEmptyState}
|
|
63
|
+
*/
|
|
64
|
+
export declare function KeycloakDataTable<T>({ ariaLabelKey, searchPlaceholderKey, isPaginated, onSelect, canSelectAll, isNotCompact, isRadio, detailColumns, isRowDisabled, loader, columns, actions, actionResolver, searchTypeComponent, toolbarItem, subToolbar, emptyState, icon, isSearching, ...props }: DataListProps<T>): import("react/jsx-runtime").JSX.Element;
|