Changed the way the table is updated (#2505)
This commit is contained in:
parent
241e97364e
commit
49086653e1
2 changed files with 80 additions and 74 deletions
|
@ -1,6 +1,5 @@
|
||||||
import React, { useEffect, useState } from "react";
|
import React, { useState } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { findIndex } from "lodash-es";
|
|
||||||
import {
|
import {
|
||||||
Badge,
|
Badge,
|
||||||
Button,
|
Button,
|
||||||
|
@ -15,11 +14,11 @@ import {
|
||||||
SelectVariant,
|
SelectVariant,
|
||||||
ToolbarItem,
|
ToolbarItem,
|
||||||
} from "@patternfly/react-core";
|
} from "@patternfly/react-core";
|
||||||
|
import { FilterIcon } from "@patternfly/react-icons";
|
||||||
|
|
||||||
import type ClientRepresentation from "@keycloak/keycloak-admin-client/lib/defs/clientRepresentation";
|
import type ClientRepresentation from "@keycloak/keycloak-admin-client/lib/defs/clientRepresentation";
|
||||||
import { KeycloakDataTable } from "../table-toolbar/KeycloakDataTable";
|
import { KeycloakDataTable } from "../table-toolbar/KeycloakDataTable";
|
||||||
import { useFetch, useAdminClient } from "../../context/auth/AdminClient";
|
import { useFetch, useAdminClient } from "../../context/auth/AdminClient";
|
||||||
import { FilterIcon } from "@patternfly/react-icons";
|
|
||||||
import {
|
import {
|
||||||
castAdminClient,
|
castAdminClient,
|
||||||
mapping,
|
mapping,
|
||||||
|
@ -27,6 +26,7 @@ import {
|
||||||
Row,
|
Row,
|
||||||
ServiceRole,
|
ServiceRole,
|
||||||
} from "./RoleMapping";
|
} from "./RoleMapping";
|
||||||
|
import { KeycloakSpinner } from "../keycloak-spinner/KeycloakSpinner";
|
||||||
|
|
||||||
type AddRoleMappingModalProps = {
|
type AddRoleMappingModalProps = {
|
||||||
id: string;
|
id: string;
|
||||||
|
@ -61,12 +61,11 @@ export const AddRoleMappingModal = ({
|
||||||
const [clients, setClients] = useState<ClientRole[]>([]);
|
const [clients, setClients] = useState<ClientRole[]>([]);
|
||||||
const [searchToggle, setSearchToggle] = useState(false);
|
const [searchToggle, setSearchToggle] = useState(false);
|
||||||
|
|
||||||
const [key, setKey] = useState(0);
|
|
||||||
const refresh = () => setKey(key + 1);
|
|
||||||
|
|
||||||
const [selectedClients, setSelectedClients] = useState<ClientRole[]>([]);
|
const [selectedClients, setSelectedClients] = useState<ClientRole[]>([]);
|
||||||
const [selectedRows, setSelectedRows] = useState<Row[]>([]);
|
const [selectedRows, setSelectedRows] = useState<Row[]>([]);
|
||||||
|
|
||||||
|
const [data, setData] = useState<Row[]>();
|
||||||
|
|
||||||
const mapType = mapping.find((m) => m.resource === type)!;
|
const mapType = mapping.find((m) => m.resource === type)!;
|
||||||
|
|
||||||
useFetch(
|
useFetch(
|
||||||
|
@ -101,27 +100,22 @@ export const AddRoleMappingModal = ({
|
||||||
[]
|
[]
|
||||||
);
|
);
|
||||||
|
|
||||||
useEffect(refresh, [searchToggle]);
|
useFetch(
|
||||||
|
async () => {
|
||||||
const removeClient = (client: ClientRole) => {
|
const realmRolesSelected = selectedClients.some(
|
||||||
setSelectedClients(selectedClients.filter((item) => item.id !== client.id));
|
|
||||||
};
|
|
||||||
|
|
||||||
const loader = async () => {
|
|
||||||
const realmRolesSelected = findIndex(
|
|
||||||
selectedClients,
|
|
||||||
(client) => client.name === "realmRoles"
|
(client) => client.name === "realmRoles"
|
||||||
);
|
);
|
||||||
let selected = selectedClients;
|
let selected = selectedClients;
|
||||||
if (realmRolesSelected !== -1) {
|
if (realmRolesSelected) {
|
||||||
selected = selectedClients.filter(
|
selected = selectedClients.filter(
|
||||||
(client) => client.name !== "realmRoles"
|
(client) => client.name !== "realmRoles"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const availableRoles = await castAdminClient(adminClient, mapType.resource)[
|
const availableRoles = await castAdminClient(
|
||||||
mapType.functions.list[1]
|
adminClient,
|
||||||
]({
|
mapType.resource
|
||||||
|
)[mapType.functions.list[1]]({
|
||||||
id,
|
id,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -162,11 +156,22 @@ export const AddRoleMappingModal = ({
|
||||||
).flat();
|
).flat();
|
||||||
|
|
||||||
return [
|
return [
|
||||||
...(realmRolesSelected !== -1 || selected.length === 0 ? realmRoles : []),
|
...(realmRolesSelected || selected.length === 0 ? realmRoles : []),
|
||||||
...roles,
|
...roles,
|
||||||
];
|
];
|
||||||
|
},
|
||||||
|
setData,
|
||||||
|
[selectedClients]
|
||||||
|
);
|
||||||
|
|
||||||
|
const removeClient = (client: ClientRole) => {
|
||||||
|
setSelectedClients(selectedClients.filter((item) => item.id !== client.id));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
return <KeycloakSpinner />;
|
||||||
|
}
|
||||||
|
|
||||||
const createSelectGroup = (clients: ClientRepresentation[]) => [
|
const createSelectGroup = (clients: ClientRepresentation[]) => [
|
||||||
<SelectGroup key="role" label={t("realmRoles")}>
|
<SelectGroup key="role" label={t("realmRoles")}>
|
||||||
<SelectOption key="realmRoles" value={realmRole}>
|
<SelectOption key="realmRoles" value={realmRole}>
|
||||||
|
@ -215,14 +220,13 @@ export const AddRoleMappingModal = ({
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
<KeycloakDataTable
|
<KeycloakDataTable
|
||||||
key={key}
|
|
||||||
onSelect={(rows) => setSelectedRows([...rows])}
|
onSelect={(rows) => setSelectedRows([...rows])}
|
||||||
searchPlaceholderKey="clients:searchByRoleName"
|
searchPlaceholderKey="clients:searchByRoleName"
|
||||||
searchTypeComponent={
|
searchTypeComponent={
|
||||||
<ToolbarItem>
|
<ToolbarItem>
|
||||||
<Select
|
<Select
|
||||||
toggleId="role"
|
toggleId="role"
|
||||||
onToggle={() => setSearchToggle(!searchToggle)}
|
onToggle={setSearchToggle}
|
||||||
isOpen={searchToggle}
|
isOpen={searchToggle}
|
||||||
variant={isRadio ? SelectVariant.single : SelectVariant.checkbox}
|
variant={isRadio ? SelectVariant.single : SelectVariant.checkbox}
|
||||||
hasInlineFilter
|
hasInlineFilter
|
||||||
|
@ -232,6 +236,7 @@ export const AddRoleMappingModal = ({
|
||||||
</>
|
</>
|
||||||
}
|
}
|
||||||
isGrouped
|
isGrouped
|
||||||
|
isCheckboxSelectionBadgeHidden
|
||||||
onFilter={(evt) => {
|
onFilter={(evt) => {
|
||||||
const value = evt?.target.value || "";
|
const value = evt?.target.value || "";
|
||||||
return createSelectGroup(
|
return createSelectGroup(
|
||||||
|
@ -259,10 +264,7 @@ export const AddRoleMappingModal = ({
|
||||||
{selectedClients.map((client) => (
|
{selectedClients.map((client) => (
|
||||||
<Chip
|
<Chip
|
||||||
key={`chip-${client.id}`}
|
key={`chip-${client.id}`}
|
||||||
onClick={() => {
|
onClick={() => removeClient(client)}
|
||||||
removeClient(client);
|
|
||||||
refresh();
|
|
||||||
}}
|
|
||||||
>
|
>
|
||||||
{client.clientId || t("realmRoles")}
|
{client.clientId || t("realmRoles")}
|
||||||
<Badge isRead={true}>{client.numberOfRoles}</Badge>
|
<Badge isRead={true}>{client.numberOfRoles}</Badge>
|
||||||
|
@ -273,7 +275,7 @@ export const AddRoleMappingModal = ({
|
||||||
}
|
}
|
||||||
canSelectAll
|
canSelectAll
|
||||||
isRadio={isRadio}
|
isRadio={isRadio}
|
||||||
loader={loader}
|
loader={data}
|
||||||
ariaLabelKey="clients:roles"
|
ariaLabelKey="clients:roles"
|
||||||
columns={[
|
columns={[
|
||||||
{
|
{
|
||||||
|
|
|
@ -303,7 +303,11 @@ export function KeycloakDataTable<T>({
|
||||||
(data) => {
|
(data) => {
|
||||||
if (!isPaginated) {
|
if (!isPaginated) {
|
||||||
setUnPaginatedData(data);
|
setUnPaginatedData(data);
|
||||||
|
if (data.length > first) {
|
||||||
data = data.slice(first, first + max + 1);
|
data = data.slice(first, first + max + 1);
|
||||||
|
} else {
|
||||||
|
setFirst(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = convertToColumns(data);
|
const result = convertToColumns(data);
|
||||||
|
|
Loading…
Reference in a new issue