@keycloakify/keycloak-admin-ui
Version:
Repackaged Keycloak Admin UI
62 lines • 2.51 kB
JavaScript
import { jsx as _jsx } from "react/jsx-runtime";
import { useEffect, useState } from "react";
import { TreeView } from "@patternfly/react-core";
export const CheckableTreeView = ({ data, onSelect, }) => {
const [state, setState] = useState({ options: [], checkedItems: [] });
useEffect(() => {
onSelect(state.checkedItems.filter((i) => { var _a; return ((_a = i.checkProps) === null || _a === void 0 ? void 0 : _a.checked) === true; }));
}, [state]);
useEffect(() => {
setState({ options: data, checkedItems: [] });
}, [data]);
const flattenTree = (tree) => {
let result = [];
tree.forEach((item) => {
result.push(item);
if (item.children) {
result = result.concat(flattenTree(item.children));
}
});
return result;
};
const onCheck = (evt, treeViewItem) => {
const checked = evt.target.checked;
const flatCheckedItems = flattenTree([treeViewItem]);
setState((prevState) => {
return {
options: prevState.options,
checkedItems: checked
? prevState.checkedItems.concat(flatCheckedItems.filter((item) => !prevState.checkedItems.some((i) => i.id === item.id)))
: prevState.checkedItems.filter((item) => !flatCheckedItems.some((i) => i.id === item.id)),
};
});
};
const isChecked = (item) => state.checkedItems.some((i) => i.id === item.id);
const areSomeDescendantsChecked = (dataItem) => dataItem.children
? dataItem.children.some((child) => areSomeDescendantsChecked(child))
: isChecked(dataItem);
const mapTree = (item) => {
const hasCheck = isChecked(item);
// Reset checked properties to be updated
item.checkProps.checked = false;
if (hasCheck) {
item.checkProps.checked = true;
}
else {
const hasPartialCheck = areSomeDescendantsChecked(item);
if (hasPartialCheck) {
item.checkProps.checked = null;
}
}
if (item.children) {
return {
...item,
children: item.children.map((child) => mapTree(child)),
};
}
return item;
};
const mapped = state.options.map((item) => mapTree(item));
return _jsx(TreeView, { data: mapped, onCheck: onCheck, hasCheckboxes: true });
};
//# sourceMappingURL=CheckableTreeView.js.map