UNPKG

@openshift-assisted/ui-lib

Version:

React component library for the Assisted Installer UI

152 lines 10.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getInitialClusterEventsFilters = void 0; const tslib_1 = require("tslib"); const react_1 = tslib_1.__importDefault(require("react")); const capitalize_js_1 = tslib_1.__importDefault(require("lodash-es/capitalize.js")); const react_core_1 = require("@patternfly/react-core"); const search_icon_1 = require("@patternfly/react-icons/dist/js/icons/search-icon"); const filter_icon_1 = require("@patternfly/react-icons/dist/js/icons/filter-icon"); const config_1 = require("../../config"); const use_translation_wrapper_1 = require("../../hooks/use-translation-wrapper"); const utils_1 = require("./utils"); const utils_2 = require("../../utils"); const CustomToolbarFilter_1 = require("./CustomToolbarFilter"); const CLUSTER_LEVEL = 'cluster-level-action'; const DELETED_HOSTS = 'deleted-hosts-action'; const Placeholder = ({ text }) => (react_1.default.createElement(react_1.default.Fragment, null, react_1.default.createElement(filter_icon_1.FilterIcon, null), " ", text)); const mapHosts = (hosts) => (hosts || []).map((host) => { const inventory = (0, utils_2.stringToJSON)(host.inventory) || {}; let hostname = host.requestedHostname; if (inventory.hostname !== host.requestedHostname) { hostname += ` (${inventory.hostname || ''})`; } return { hostname, id: host.id, }; }); const getInitialClusterEventsFilters = (entityKind, hostId) => ({ message: '', hostIds: entityKind === 'host' && hostId ? [hostId] : [], severities: [], clusterLevel: false, deletedHosts: false, }); exports.getInitialClusterEventsFilters = getInitialClusterEventsFilters; const mapHostsChips = (t, filters, hosts) => { const chips = [ filters.deletedHosts && { key: DELETED_HOSTS, node: t('ai:Deleted hosts') }, filters.clusterLevel && { key: CLUSTER_LEVEL, node: t('ai:Cluster-level events') }, ...(hosts || []) .filter((host) => { var _a; return (_a = filters.hostIds) === null || _a === void 0 ? void 0 : _a.includes(host.id); }) .map((host) => ({ key: host.id, node: host.hostname })), ]; return chips.filter(Boolean); }; const ClusterEventsToolbar = ({ filters, setFilters, cluster, hostId, entityKind, severityCounts, }) => { var _a; const { t } = (0, use_translation_wrapper_1.useTranslation)(); const [isHostExpanded, setHostExpanded] = react_1.default.useState(false); const [isSeverityExpanded, setSeverityExpanded] = react_1.default.useState(false); const [timer, setTimer] = react_1.default.useState(); const [messageValue, setMessageValue] = react_1.default.useState(filters.message); const allHosts = react_1.default.useMemo(() => mapHosts(cluster.hosts), [cluster.hosts]); const onClearAllFilters = () => { setFilters((0, exports.getInitialClusterEventsFilters)(entityKind, hostId)); setMessageValue(''); }; const onSelect = (type, isChecked, value) => { const setNextSelectedValues = (type, isChecked, value, filters) => { var _a; return (Object.assign(Object.assign({}, filters), { [type]: isChecked ? [...(filters[type] || []), value] : (_a = filters[type]) === null || _a === void 0 ? void 0 : _a.filter((val) => val !== value) })); }; const nextFilters = setNextSelectedValues(type, isChecked, value, filters); setFilters(nextFilters); }; const onHostToggle = () => setHostExpanded(!isHostExpanded); const onHostSelect = (value, isChecked) => { switch (value) { case DELETED_HOSTS: setFilters(Object.assign(Object.assign({}, filters), { deletedHosts: isChecked })); break; case CLUSTER_LEVEL: setFilters(Object.assign(Object.assign({}, filters), { clusterLevel: isChecked })); break; default: onSelect('hostIds', isChecked, value); } }; const onSeverityToggle = () => setSeverityExpanded(!isSeverityExpanded); const onSeveritySelect = (value, isChecked) => { onSelect('severities', isChecked, value); }; const onMessageChange = (_event, message) => { setMessageValue(message); clearTimeout(timer); const newTimer = setTimeout(() => { setMessageValue(message); setFilters(Object.assign(Object.assign({}, filters), { message })); }, 500); setTimer(newTimer); }; const onDeleteChipGroup = (type) => { if (type === 'Severity') { setFilters(Object.assign(Object.assign({}, filters), { severities: [] })); } else { setFilters(Object.assign(Object.assign({}, filters), { deletedHosts: false, clusterLevel: false, hostIds: [] })); } }; const getSelections = () => { const selections = [...(filters.hostIds || [])]; if (filters.clusterLevel) { selections.push(CLUSTER_LEVEL); } if (filters.deletedHosts) { selections.push(DELETED_HOSTS); } return selections; }; const sortedHosts = allHosts.sort((a, b) => a.hostname && b.hostname && a.hostname < b.hostname ? -1 : 1); const hostChips = mapHostsChips(t, filters, sortedHosts); return (react_1.default.createElement(react_core_1.Toolbar, { id: "clusters-events-toolbar", className: "pf-m-toggle-group-container", collapseListedFiltersBreakpoint: "xl", clearAllFilters: onClearAllFilters, numberOfFiltersText: (numberOfFilters) => t('ai:{{count}} filter applied', { count: numberOfFilters }) }, react_1.default.createElement(react_core_1.ToolbarContent, null, entityKind === 'cluster' && (react_1.default.createElement(CustomToolbarFilter_1.CustomToolbarFilter, { categoryName: "Hosts", chips: hostChips, deleteChip: (_, chip) => onHostSelect(typeof chip === 'string' ? chip : chip.key, false), deleteChipGroup: onDeleteChipGroup }, react_1.default.createElement(react_core_1.Dropdown, { isOpen: isHostExpanded, onSelect: (e, value) => onHostSelect(value, (0, utils_1.isSelectEventChecked)(e)), onOpenChange: onHostToggle, isScrollable: true, toggle: (toggleRef) => (react_1.default.createElement(react_core_1.MenuToggle, { id: "cluster-events-hosts-dropdown-button", ref: toggleRef, isFullWidth: true, onClick: onHostToggle, isExpanded: isHostExpanded, badge: hostChips.length && react_1.default.createElement(react_core_1.Badge, { isRead: true }, hostChips.length), "data-testid": "cluster-events-hosts-dropdown-button" }, react_1.default.createElement(Placeholder, { text: "Hosts" }))), shouldFocusToggleOnSelect: true }, react_1.default.createElement(react_core_1.DropdownList, null, react_1.default.createElement(react_core_1.DropdownItem, { id: `checkbox-${CLUSTER_LEVEL}`, "data-testid": "cluster-level-events-filter-option", hasCheckbox: true, isSelected: getSelections().includes(CLUSTER_LEVEL), key: CLUSTER_LEVEL, value: CLUSTER_LEVEL }, t('ai:Cluster-level events')), react_1.default.createElement(react_core_1.DropdownItem, { id: `checkbox-${DELETED_HOSTS}`, "data-testid": "deleted-hosts-filter-option", hasCheckbox: true, isSelected: getSelections().includes(DELETED_HOSTS), key: DELETED_HOSTS, value: DELETED_HOSTS }, t('ai:Deleted hosts')), ...sortedHosts.map((host) => (react_1.default.createElement(react_core_1.DropdownItem, { id: `checkbox-${host.id}`, "data-testid": `host-${host.id}-filter-option`, hasCheckbox: true, isSelected: getSelections().includes(host.id), key: host.id, value: host.id }, host.hostname))))))), react_1.default.createElement(react_core_1.ToolbarFilter, { chips: (_a = filters.severities) === null || _a === void 0 ? void 0 : _a.map((severity) => ({ key: severity, node: (0, capitalize_js_1.default)(severity), })), deleteChip: (_, chip) => onSeveritySelect(typeof chip === 'string' ? chip : chip.key, false), deleteChipGroup: onDeleteChipGroup, categoryName: "Severity" }, react_1.default.createElement(react_core_1.Dropdown, { isOpen: isSeverityExpanded, onSelect: (event, value) => onSeveritySelect(value, (0, utils_1.isSelectEventChecked)(event)), onOpenChange: onSeverityToggle, toggle: (toggleRef) => { var _a; return (react_1.default.createElement(react_core_1.MenuToggle, { id: "cluster-events-severity-dropdown-button", ref: toggleRef, isFullWidth: true, onClick: onSeverityToggle, isExpanded: isSeverityExpanded, badge: ((_a = filters.severities) === null || _a === void 0 ? void 0 : _a.length) && react_1.default.createElement(react_core_1.Badge, { isRead: true }, filters.severities.length), "data-testid": "cluster-events-severity-dropdown-button" }, react_1.default.createElement(Placeholder, { text: "Severity" }))); }, shouldFocusToggleOnSelect: true }, react_1.default.createElement(react_core_1.DropdownList, null, config_1.EVENT_SEVERITIES.map((severity) => { var _a; return (react_1.default.createElement(react_core_1.DropdownItem, { "data-testid": `${severity}-filter-option`, hasCheckbox: true, isSelected: (_a = filters.severities) === null || _a === void 0 ? void 0 : _a.includes(severity), key: severity, value: severity }, (0, capitalize_js_1.default)(severity), " ", react_1.default.createElement(react_core_1.Badge, { isRead: true }, severityCounts[severity]))); })))), react_1.default.createElement(react_core_1.ToolbarItem, null, react_1.default.createElement(react_core_1.InputGroup, null, react_1.default.createElement(react_core_1.InputGroupItem, { isFill: true }, react_1.default.createElement(react_core_1.TextInput, { name: "search-text", id: "search-text", type: react_core_1.TextInputTypes.search, "aria-label": "text to be searched", onChange: onMessageChange, value: messageValue, placeholder: t('ai:Filter by text') })), react_1.default.createElement(react_core_1.InputGroupItem, null, react_1.default.createElement(react_core_1.Button, { variant: react_core_1.ButtonVariant.control, "aria-label": "search text button" }, react_1.default.createElement(search_icon_1.SearchIcon, null)))))))); }; exports.default = ClusterEventsToolbar; //# sourceMappingURL=ClusterEventsToolbar.js.map