@keycloakify/keycloak-admin-ui
Version:
Repackaged Keycloak Admin UI
89 lines • 6.05 kB
JavaScript
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
import { AlertVariant, Button, ButtonVariant, ExpandableSection, FormGroup, Split, SplitItem, ToolbarItem, } from "@patternfly/react-core";
import { useState } from "react";
import { useTranslation } from "react-i18next";
import { HelpItem } from "../../ui-shared";
import { useAdminClient } from "../../admin-client";
import { useAlerts } from "../../ui-shared";
import { useConfirmDialog } from "../../components/confirm-dialog/ConfirmDialog";
import { FormAccess } from "../../components/form/FormAccess";
import { ListEmptyState } from "../../ui-shared";
import { KeycloakDataTable } from "../../ui-shared";
import { TimeSelectorForm } from "../../components/time-selector/TimeSelectorForm";
import useFormatDate, { FORMAT_DATE_AND_TIME } from "../../utils/useFormatDate";
import { AddHostDialog } from "../../clients/advanced/AddHostDialog";
import { parseResult } from "../../clients/AdvancedTab";
export const ClusteringPanel = ({ save, client: { id, registeredNodes, access }, }) => {
const { adminClient } = useAdminClient();
const { t } = useTranslation();
const { addAlert, addError } = useAlerts();
const formatDate = useFormatDate();
const [nodes, setNodes] = useState(registeredNodes || {});
const [expanded, setExpanded] = useState(false);
const [selectedNode, setSelectedNode] = useState("");
const [addNodeOpen, setAddNodeOpen] = useState(false);
const [key, setKey] = useState(0);
const refresh = () => setKey(new Date().getTime());
const testCluster = async () => {
const result = await adminClient.clients.testNodesAvailable({ id: id });
parseResult(result, "testCluster", addAlert, t);
};
const [toggleDeleteNodeConfirm, DeleteNodeConfirm] = useConfirmDialog({
titleKey: "deleteNode",
messageKey: t("deleteNodeBody", {
node: selectedNode,
}),
continueButtonLabel: "delete",
continueButtonVariant: ButtonVariant.danger,
onConfirm: async () => {
try {
await adminClient.clients.deleteClusterNode({
id: id,
node: selectedNode,
});
setNodes({
...Object.keys(nodes).reduce((object, key) => {
if (key !== selectedNode) {
object[key] = nodes[key];
}
return object;
}, {}),
});
refresh();
addAlert(t("deleteNodeSuccess"), AlertVariant.success);
}
catch (error) {
addError("deleteNodeFail", error);
}
},
});
return (_jsxs(_Fragment, { children: [_jsx(FormAccess, { role: "manage-clients", fineGrainedAccess: access === null || access === void 0 ? void 0 : access.configure, isHorizontal: true, children: _jsx(FormGroup, { label: t("nodeReRegistrationTimeout"), fieldId: "kc-node-reregistration-timeout", labelIcon: _jsx(HelpItem, { helpText: t("nodeReRegistrationTimeoutHelp"), fieldLabelId: "nodeReRegistrationTimeout" }), children: _jsxs(Split, { hasGutter: true, children: [_jsx(SplitItem, { children: _jsx(TimeSelectorForm, { name: "nodeReRegistrationTimeout" }) }), _jsx(SplitItem, { children: _jsx(Button, { variant: ButtonVariant.secondary, onClick: () => save(), children: t("save") }) })] }) }) }), _jsxs(_Fragment, { children: [_jsx(DeleteNodeConfirm, {}), _jsx(AddHostDialog, { clientId: id, isOpen: addNodeOpen, onAdded: (node) => {
nodes[node] = Date.now() / 1000;
refresh();
}, onClose: () => setAddNodeOpen(false) }), _jsx(ExpandableSection, { toggleText: t("registeredClusterNodes"), onToggle: (_event, val) => setExpanded(val), isExpanded: expanded, children: _jsx(KeycloakDataTable, { ariaLabelKey: "registeredClusterNodes", loader: () => Promise.resolve(Object.entries(nodes || {}).map((entry) => {
return { host: entry[0], registration: entry[1] };
})), toolbarItem: _jsxs(_Fragment, { children: [_jsx(ToolbarItem, { children: _jsx(Button, { id: "testClusterAvailability", onClick: testCluster, variant: ButtonVariant.secondary, isDisabled: Object.keys(nodes).length === 0, children: t("testClusterAvailability") }) }), _jsx(ToolbarItem, { children: _jsx(Button, { id: "registerNodeManually", onClick: () => setAddNodeOpen(true), variant: ButtonVariant.tertiary, children: t("registerNodeManually") }) })] }), actions: [
{
title: t("delete"),
onRowClick: (node) => {
setSelectedNode(node.host);
toggleDeleteNodeConfirm();
},
},
], columns: [
{
name: "host",
displayKey: "nodeHost",
},
{
name: "registration",
displayKey: "lastRegistration",
cellFormatters: [
(value) => value
? formatDate(new Date(parseInt(value.toString()) * 1000), FORMAT_DATE_AND_TIME)
: "",
],
},
], emptyState: _jsx(ListEmptyState, { message: t("noNodes"), instructions: t("noNodesInstructions"), primaryActionText: t("registerNodeManually"), onPrimaryAction: () => setAddNodeOpen(true) }) }, key) })] })] }));
};
//# sourceMappingURL=ClusteringPanel.js.map