@rh-support/cases 2.6.7 → 2.6.9
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/lib/esm/components/case-list/CaseList.d.ts.map +1 -1
- package/lib/esm/components/case-list/CaseList.js +5 -10
- package/lib/esm/components/case-list/case-list-filters/AccountsBookmarkedGroupFilter.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/AccountsBookmarkedGroupFilter.js +34 -34
- package/lib/esm/components/case-list/case-list-filters/CaseListFilterChips.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/CaseListFilterChips.js +3 -3
- package/lib/esm/components/case-list/case-list-filters/CreatorSsoNameFilter.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/CreatorSsoNameFilter.js +4 -4
- package/lib/esm/components/case-list/case-list-filters/CreatorSsoNameFilterChip.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/CreatorSsoNameFilterChip.js +5 -5
- package/lib/esm/components/case-list/case-list-filters/GroupsFilter.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/GroupsFilter.js +4 -5
- package/lib/esm/components/case-list/case-list-filters/InternalSsoNameFilter.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/InternalSsoNameFilter.js +6 -6
- package/lib/esm/components/case-list/case-list-filters/ProductFilterChip.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/ProductFilterChip.js +4 -5
- package/lib/esm/components/case-list/case-list-filters/ProductsFilter.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/ProductsFilter.js +124 -32
- package/lib/esm/components/case-list/case-list-filters/SeverityFilter.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/SeverityFilter.js +91 -20
- package/lib/esm/components/case-list/case-list-filters/StatusFilter.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/StatusFilter.js +90 -18
- package/lib/esm/components/case-list/case-list-filters/TypeFilter.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/TypeFilter.js +67 -16
- package/lib/esm/components/case-list/case-list-filters/VersionsFilter.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/VersionsFilter.js +112 -15
- package/lib/esm/components/case-list/case-list-table/CaseListTable.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-table/CaseListTable.js +15 -16
- package/lib/esm/components/case-list/case-list-table/DownloadCSVFileModal.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-table/DownloadCSVFileModal.js +7 -7
- package/lib/esm/components/case-list/case-list-table/ExportCaseListCSV.js +1 -1
- package/lib/esm/components/case-list/case-list-table/SeverityLabel.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-table/SeverityLabel.js +6 -5
- package/lib/esm/components/case-list/case-list-table/TableActionsDropdown.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-table/TableActionsDropdown.js +5 -7
- package/lib/esm/components/case-list/case-list-table/table-column-selector/TableColumnSelector.js +1 -1
- package/lib/esm/components/case-list/case-search/AdvanceSearch.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-search/AdvanceSearch.js +13 -14
- package/lib/esm/components/case-list/case-search/BookmarkedSearchesSelector.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-search/BookmarkedSearchesSelector.js +21 -15
- package/lib/esm/components/case-list/case-search/CaseSearch.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-search/CaseSearch.js +2 -2
- package/lib/esm/components/case-list/case-search/SaveCaseSearchModal.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-search/SaveCaseSearchModal.js +16 -17
- package/lib/esm/css/caseList.css +89 -56
- package/lib/esm/css/caseSearch.css +13 -2
- package/lib/esm/css/escalation.css +4 -4
- package/lib/esm/scss/_main.scss +15 -11
- package/lib/esm/scss/_pf-overrides.scss +25 -12
- package/package.json +12 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SeverityFilter.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-filters/SeverityFilter.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SeverityFilter.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-filters/SeverityFilter.tsx"],"names":[],"mappings":"AAUA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG1D,OAAO,KAA0C,MAAM,OAAO,CAAC;AAQ/D,UAAU,MAAM;IACZ,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,gBAAgB,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,qBAoL3C"}
|
|
@@ -1,33 +1,104 @@
|
|
|
1
|
-
import { Select, SelectOption,
|
|
1
|
+
import { Button, MenuToggle, Select, SelectList, SelectOption, } from '@patternfly/react-core';
|
|
2
|
+
import { SingleSelectDropdown, useSelectKeyboardNavigator } from '@rh-support/components';
|
|
2
3
|
import { getDropdownBtnPlaceholder } from '@rh-support/utils';
|
|
3
|
-
import
|
|
4
|
+
import isEmpty from 'lodash/isEmpty';
|
|
5
|
+
import React, { useContext, useEffect, useState } from 'react';
|
|
4
6
|
import { useTranslation } from 'react-i18next';
|
|
5
7
|
import { SolrKeys } from '../../../enums/filters';
|
|
6
8
|
import { filterNamesMap } from '../../../utils/constants';
|
|
7
9
|
import { CaseListFilterDispatchContext, CaseListFilterStateContext } from '../CaseListFilterContext';
|
|
8
10
|
import { updateFilter } from '../CaseListFilterReducer';
|
|
9
11
|
export function SeverityFilter(props) {
|
|
12
|
+
var _a;
|
|
10
13
|
const { t } = useTranslation();
|
|
11
|
-
const dispatch = useContext(CaseListFilterDispatchContext);
|
|
12
14
|
const { filterInfo } = useContext(CaseListFilterStateContext);
|
|
15
|
+
const dispatch = useContext(CaseListFilterDispatchContext);
|
|
13
16
|
const [isOpen, setIsOpen] = useState(false);
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
const [selectedItems, setSelectedItems] = useState({});
|
|
18
|
+
const list = props.isSolrSearchDown
|
|
19
|
+
? props.allCaseSeverities.map((severity) => ({ value: severity, key: severity }))
|
|
20
|
+
: props.filterValues.map((filterValue) => ({ value: filterValue.value, key: filterValue.value }));
|
|
21
|
+
const singleSelectOptions = list.map((item) => ({
|
|
22
|
+
value: item.value,
|
|
23
|
+
label: item.value,
|
|
24
|
+
}));
|
|
25
|
+
const selectedSeverity = ((_a = filterInfo[SolrKeys.severity]) === null || _a === void 0 ? void 0 : _a[0]) || '';
|
|
26
|
+
const selectedOption = {
|
|
27
|
+
value: selectedSeverity,
|
|
28
|
+
label: selectedSeverity,
|
|
29
|
+
};
|
|
30
|
+
const onToggleClick = (e) => {
|
|
31
|
+
e.stopPropagation();
|
|
32
|
+
setIsOpen(!isOpen);
|
|
33
|
+
};
|
|
34
|
+
const onSelect = (option) => {
|
|
35
|
+
if (props.isSolrSearchDown) {
|
|
36
|
+
updateFilter(dispatch, {
|
|
37
|
+
filterKey: SolrKeys.severity,
|
|
38
|
+
values: [option.value],
|
|
39
|
+
});
|
|
40
|
+
setIsOpen(false);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const prevSelectedSeverities = Object.keys(selectedItems).filter((item) => selectedItems[item] && item);
|
|
44
|
+
if (selectedItems[option.value]) {
|
|
45
|
+
setSelectedItems((prevData) => (Object.assign(Object.assign({}, prevData), { [option.value]: false })));
|
|
46
|
+
const index = prevSelectedSeverities.indexOf(option.value);
|
|
47
|
+
prevSelectedSeverities.splice(index, 1);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
setSelectedItems((prevData) => (Object.assign(Object.assign({}, prevData), { [option.value]: true })));
|
|
51
|
+
prevSelectedSeverities.push(option.value);
|
|
52
|
+
}
|
|
53
|
+
updateFilter(dispatch, {
|
|
54
|
+
filterKey: SolrKeys.severity,
|
|
55
|
+
values: prevSelectedSeverities,
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
// Use the keyboard navigator hook
|
|
59
|
+
const { focusedItemIndex, onInputKeyDown } = useSelectKeyboardNavigator({
|
|
60
|
+
list,
|
|
61
|
+
isOpen,
|
|
62
|
+
resetIndexOnClose: true,
|
|
63
|
+
setIsOpen,
|
|
64
|
+
onSelect,
|
|
65
|
+
});
|
|
66
|
+
const onClick = () => {
|
|
67
|
+
setSelectedItems({});
|
|
68
|
+
updateFilter(dispatch, {
|
|
69
|
+
filterKey: SolrKeys.severity,
|
|
70
|
+
values: [],
|
|
71
|
+
});
|
|
20
72
|
};
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
73
|
+
const placeholder = props.isSolrSearchDown
|
|
74
|
+
? t('Select a severity')
|
|
75
|
+
: getDropdownBtnPlaceholder(t('Select a severity'), filterInfo[SolrKeys.severity], ' ', list.length, t('All selected'));
|
|
76
|
+
const toggle = (toggleRef) => (React.createElement(MenuToggle, { variant: "default", onClick: onToggleClick, innerRef: toggleRef, isExpanded: isOpen, isFullWidth: true, onKeyDown: onInputKeyDown },
|
|
77
|
+
placeholder,
|
|
78
|
+
Object.keys(selectedItems).filter((key) => selectedItems[key] === true).length > 0 && (React.createElement(Button, { icon: "", variant: "plain", onClick: onClick, "aria-label": "Clear selection", className: "pf-v6-c-select__toggle-clear" }))));
|
|
79
|
+
const dropdownOptions = list.map((option, index) => !isEmpty(option.value) && (React.createElement(SelectOption, { key: option.key, value: option, hasCheckbox: !props.isSolrSearchDown, isSelected: selectedItems[option.value], isFocused: focusedItemIndex !== null && focusedItemIndex === index, id: `select-severity-${option.value.replace(' ', '-')}` }, option.value)));
|
|
80
|
+
const onSingleSelectChange = (option) => {
|
|
81
|
+
updateFilter(dispatch, {
|
|
82
|
+
filterKey: SolrKeys.severity,
|
|
83
|
+
values: [option.value],
|
|
84
|
+
});
|
|
24
85
|
};
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
86
|
+
useEffect(() => {
|
|
87
|
+
var _a;
|
|
88
|
+
if (isEmpty(filterInfo[SolrKeys.severity])) {
|
|
89
|
+
setSelectedItems({});
|
|
90
|
+
}
|
|
91
|
+
else if (!props.isSolrSearchDown) {
|
|
92
|
+
const selectedSeverities = (_a = filterInfo[SolrKeys.severity]) === null || _a === void 0 ? void 0 : _a.reduce((selection, severity) => {
|
|
93
|
+
selection[severity] = true;
|
|
94
|
+
return selection;
|
|
95
|
+
}, {});
|
|
96
|
+
setSelectedItems(selectedSeverities);
|
|
97
|
+
}
|
|
98
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
99
|
+
}, [filterInfo[SolrKeys.severity], props.isSolrSearchDown]);
|
|
100
|
+
return (React.createElement("div", { className: "severity-filter" },
|
|
101
|
+
React.createElement("label", { htmlFor: "case-list-severity-filter", className: "pf-v6-u-mb-sm severity-filter-label" }, t(filterNamesMap[SolrKeys.severity])),
|
|
102
|
+
props.isSolrSearchDown ? (React.createElement(SingleSelectDropdown, { id: "case-list-severity-filter", selected: selectedOption, options: singleSelectOptions, placeholder: t('Select a severity'), onSelect: onSingleSelectChange, dataTrackingId: "severity-filter", isScrollable: true })) : (React.createElement(Select, { role: "menu", id: "case-list-severity-filter", "data-tracking-id": "severity-filter", isOpen: isOpen, selected: selectedItems, onSelect: (_e, v) => onSelect(v), onOpenChange: (nextOpen) => setIsOpen(nextOpen), toggle: toggle, isScrollable: true, popperProps: { direction: 'down', enableFlip: false } },
|
|
103
|
+
React.createElement(SelectList, null, dropdownOptions)))));
|
|
33
104
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatusFilter.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-filters/StatusFilter.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"StatusFilter.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-filters/StatusFilter.tsx"],"names":[],"mappings":"AAUA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,KAA0C,MAAM,OAAO,CAAC;AAO/D,UAAU,MAAM;IACZ,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAoB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,qBAkNzC"}
|
|
@@ -1,25 +1,73 @@
|
|
|
1
|
-
import { Select, SelectOption,
|
|
2
|
-
import
|
|
1
|
+
import { Button, MenuToggle, Select, SelectList, SelectOption, } from '@patternfly/react-core';
|
|
2
|
+
import { SingleSelectDropdown, useSelectKeyboardNavigator } from '@rh-support/components';
|
|
3
|
+
import isEmpty from 'lodash/isEmpty';
|
|
4
|
+
import React, { useContext, useEffect, useState } from 'react';
|
|
3
5
|
import { useTranslation } from 'react-i18next';
|
|
4
6
|
import { SolrKeys } from '../../../enums/filters';
|
|
5
7
|
import { filterNamesMap } from '../../../utils/constants';
|
|
6
8
|
import { CaseListFilterDispatchContext, CaseListFilterStateContext } from '../CaseListFilterContext';
|
|
7
9
|
import { updateFilter } from '../CaseListFilterReducer';
|
|
8
10
|
export function StatusFilter(props) {
|
|
11
|
+
var _a;
|
|
9
12
|
const dispatch = useContext(CaseListFilterDispatchContext);
|
|
10
13
|
const { t } = useTranslation();
|
|
11
14
|
const { filterInfo } = useContext(CaseListFilterStateContext);
|
|
12
15
|
const [isOpen, setIsOpen] = useState(false);
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
const [selectedItems, setSelectedItems] = useState({});
|
|
17
|
+
const list = props.isSolrSearchDown
|
|
18
|
+
? props.allCaseStatuses.map((status) => ({ value: status, key: status }))
|
|
19
|
+
: props.filterValues.map((filterValue) => ({ value: filterValue.value, key: filterValue.value }));
|
|
20
|
+
const singleSelectOptions = list.map((item) => ({
|
|
21
|
+
value: item.value,
|
|
22
|
+
label: item.value,
|
|
23
|
+
}));
|
|
24
|
+
const selectedStatus = ((_a = filterInfo === null || filterInfo === void 0 ? void 0 : filterInfo[SolrKeys.status]) === null || _a === void 0 ? void 0 : _a[0]) || '';
|
|
25
|
+
const selectedOption = {
|
|
26
|
+
value: selectedStatus,
|
|
27
|
+
label: selectedStatus,
|
|
19
28
|
};
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
setIsOpen(
|
|
29
|
+
const onToggleClick = (e) => {
|
|
30
|
+
e.stopPropagation();
|
|
31
|
+
setIsOpen(!isOpen);
|
|
32
|
+
};
|
|
33
|
+
const onSelect = (option) => {
|
|
34
|
+
if (props.isSolrSearchDown) {
|
|
35
|
+
updateFilter(dispatch, {
|
|
36
|
+
filterKey: SolrKeys.status,
|
|
37
|
+
values: [option.value],
|
|
38
|
+
});
|
|
39
|
+
setIsOpen(false);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const prevSelectedStatuses = Object.keys(selectedItems).filter((item) => selectedItems[item] && item);
|
|
43
|
+
if (selectedItems[option.value]) {
|
|
44
|
+
setSelectedItems((prevData) => (Object.assign(Object.assign({}, prevData), { [option.value]: false })));
|
|
45
|
+
const index = prevSelectedStatuses.indexOf(option.value);
|
|
46
|
+
prevSelectedStatuses.splice(index, 1);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
setSelectedItems((prevData) => (Object.assign(Object.assign({}, prevData), { [option.value]: true })));
|
|
50
|
+
prevSelectedStatuses.push(option.value);
|
|
51
|
+
}
|
|
52
|
+
updateFilter(dispatch, {
|
|
53
|
+
filterKey: SolrKeys.status,
|
|
54
|
+
values: prevSelectedStatuses,
|
|
55
|
+
});
|
|
56
|
+
};
|
|
57
|
+
// Use the keyboard navigator hook
|
|
58
|
+
const { focusedItemIndex, onInputKeyDown } = useSelectKeyboardNavigator({
|
|
59
|
+
list,
|
|
60
|
+
isOpen,
|
|
61
|
+
resetIndexOnClose: true,
|
|
62
|
+
setIsOpen,
|
|
63
|
+
onSelect,
|
|
64
|
+
});
|
|
65
|
+
const onClick = () => {
|
|
66
|
+
setSelectedItems({});
|
|
67
|
+
updateFilter(dispatch, {
|
|
68
|
+
filterKey: SolrKeys.status,
|
|
69
|
+
values: [],
|
|
70
|
+
});
|
|
23
71
|
};
|
|
24
72
|
const getBtnPlaceholder = (btnPlaceholder, selectedValues, type, totalLength, totalLengthString) => {
|
|
25
73
|
if (!selectedValues || (selectedValues && selectedValues.length === 0)) {
|
|
@@ -45,12 +93,36 @@ export function StatusFilter(props) {
|
|
|
45
93
|
}
|
|
46
94
|
}
|
|
47
95
|
};
|
|
96
|
+
const placeholder = props.isSolrSearchDown
|
|
97
|
+
? t('Select a status')
|
|
98
|
+
: getBtnPlaceholder(t('Select a status'), (filterInfo === null || filterInfo === void 0 ? void 0 : filterInfo[SolrKeys.status]) || [], ' ', list.length, t('All selected'));
|
|
99
|
+
const toggle = (toggleRef) => (React.createElement(MenuToggle, { variant: "default", onClick: onToggleClick, innerRef: toggleRef, isExpanded: isOpen, isFullWidth: true, onKeyDown: onInputKeyDown },
|
|
100
|
+
placeholder,
|
|
101
|
+
Object.keys(selectedItems).filter((key) => selectedItems[key] === true).length > 0 && (React.createElement(Button, { icon: "", variant: "plain", onClick: onClick, "aria-label": "Clear selection", className: "pf-v6-c-select__toggle-clear" }))));
|
|
102
|
+
const dropdownOptions = list.map((option, index) => !isEmpty(option.value) && (React.createElement(SelectOption, { key: option.key, value: option, hasCheckbox: !props.isSolrSearchDown, isSelected: selectedItems[option.value], isFocused: focusedItemIndex !== null && focusedItemIndex === index, id: `select-status-${option.value.replace(' ', '-')}` }, option.value)));
|
|
103
|
+
const onSingleSelectChange = (option) => {
|
|
104
|
+
updateFilter(dispatch, {
|
|
105
|
+
filterKey: SolrKeys.status,
|
|
106
|
+
values: [option.value],
|
|
107
|
+
});
|
|
108
|
+
};
|
|
109
|
+
useEffect(() => {
|
|
110
|
+
var _a;
|
|
111
|
+
if (isEmpty(filterInfo === null || filterInfo === void 0 ? void 0 : filterInfo[SolrKeys.status])) {
|
|
112
|
+
setSelectedItems({});
|
|
113
|
+
}
|
|
114
|
+
else if (!props.isSolrSearchDown) {
|
|
115
|
+
const selectedStatuses = (_a = filterInfo === null || filterInfo === void 0 ? void 0 : filterInfo[SolrKeys.status]) === null || _a === void 0 ? void 0 : _a.reduce((selection, status) => {
|
|
116
|
+
selection[status] = true;
|
|
117
|
+
return selection;
|
|
118
|
+
}, {});
|
|
119
|
+
setSelectedItems(selectedStatuses || {});
|
|
120
|
+
}
|
|
121
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
122
|
+
}, [filterInfo === null || filterInfo === void 0 ? void 0 : filterInfo[SolrKeys.status], props.isSolrSearchDown]);
|
|
48
123
|
const titleId = 'case-list-status-filter';
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
return (React.createElement("div", { className: "pf-v5-c-select" },
|
|
54
|
-
React.createElement("label", { htmlFor: titleId }, t(filterNamesMap[SolrKeys.status])),
|
|
55
|
-
props.isSolrSearchDown ? singleSelectSolrIsDown() : multiSelect()));
|
|
124
|
+
return (React.createElement("div", { className: "status-filter" },
|
|
125
|
+
React.createElement("label", { htmlFor: titleId, className: "pf-v6-u-mb-sm status-filter-label" }, t(filterNamesMap[SolrKeys.status])),
|
|
126
|
+
props.isSolrSearchDown ? (React.createElement(SingleSelectDropdown, { id: titleId, selected: selectedOption, options: singleSelectOptions, placeholder: t('Select a status'), onSelect: onSingleSelectChange, dataTrackingId: "status-filter", isScrollable: true })) : (React.createElement(Select, { role: "menu", id: titleId, "data-tracking-id": "status-filter", isOpen: isOpen, selected: selectedItems, onSelect: (_e, v) => onSelect(v), onOpenChange: (nextOpen) => setIsOpen(nextOpen), toggle: toggle, isScrollable: true, popperProps: { direction: 'down', enableFlip: false } },
|
|
127
|
+
React.createElement(SelectList, null, dropdownOptions)))));
|
|
56
128
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TypeFilter.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-filters/TypeFilter.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TypeFilter.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-filters/TypeFilter.tsx"],"names":[],"mappings":"AAYA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAQ/D,UAAU,MAAM;IACZ,YAAY,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,qBAkJvC"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { Select, SelectOption,
|
|
1
|
+
import { Button, MenuToggle, Select, SelectList, SelectOption, } from '@patternfly/react-core';
|
|
2
|
+
import { useSelectKeyboardNavigator } from '@rh-support/components';
|
|
2
3
|
import { getDropdownBtnPlaceholder, toNewCaseTypeMapper, toOldCaseTypeSwitcher } from '@rh-support/utils';
|
|
3
|
-
import
|
|
4
|
+
import isEmpty from 'lodash/isEmpty';
|
|
5
|
+
import React, { useContext, useEffect, useState } from 'react';
|
|
4
6
|
import { useTranslation } from 'react-i18next';
|
|
5
7
|
import { SolrKeys } from '../../../enums/filters';
|
|
6
8
|
import { filterNamesMap } from '../../../utils/constants';
|
|
@@ -8,26 +10,75 @@ import { CaseListFilterDispatchContext, CaseListFilterStateContext } from '../Ca
|
|
|
8
10
|
import { updateFilter } from '../CaseListFilterReducer';
|
|
9
11
|
export function TypeFilter(props) {
|
|
10
12
|
const { t } = useTranslation();
|
|
11
|
-
const dispatch = useContext(CaseListFilterDispatchContext);
|
|
12
13
|
const { filterInfo } = useContext(CaseListFilterStateContext);
|
|
14
|
+
const dispatch = useContext(CaseListFilterDispatchContext);
|
|
13
15
|
const [isOpen, setIsOpen] = useState(false);
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
16
|
+
const [selectedItems, setSelectedItems] = useState({});
|
|
17
|
+
// Convert case types to new format
|
|
18
|
+
const newCaseTypesArray = toNewCaseTypeMapper(props.allCaseTypes).sort();
|
|
19
|
+
const list = newCaseTypesArray.map((type) => ({
|
|
20
|
+
value: type,
|
|
21
|
+
key: type,
|
|
22
|
+
}));
|
|
23
|
+
const onSelectHandler = (option) => {
|
|
24
|
+
const convertedSelectedType = toOldCaseTypeSwitcher([option.value]);
|
|
25
|
+
const prevSelectedTypes = Object.keys(selectedItems).filter((item) => selectedItems[item] && item);
|
|
26
|
+
if (selectedItems[option.value]) {
|
|
27
|
+
setSelectedItems((prevData) => (Object.assign(Object.assign({}, prevData), { [option.value]: false })));
|
|
28
|
+
const index = prevSelectedTypes.indexOf(option.value);
|
|
29
|
+
prevSelectedTypes.splice(index, 1);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
setSelectedItems((prevData) => (Object.assign(Object.assign({}, prevData), { [option.value]: true })));
|
|
33
|
+
prevSelectedTypes.push(option.value);
|
|
34
|
+
}
|
|
35
|
+
const newState = filterInfo[SolrKeys.type].includes(convertedSelectedType[0])
|
|
36
|
+
? filterInfo[SolrKeys.type].filter((item) => item !== convertedSelectedType[0])
|
|
37
|
+
: [...filterInfo[SolrKeys.type], convertedSelectedType[0]];
|
|
21
38
|
updateFilter(dispatch, {
|
|
22
39
|
filterKey: SolrKeys.type,
|
|
23
40
|
values: newState,
|
|
24
41
|
});
|
|
25
42
|
};
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
43
|
+
const { focusedItemIndex, onInputKeyDown } = useSelectKeyboardNavigator({
|
|
44
|
+
list,
|
|
45
|
+
isOpen,
|
|
46
|
+
setIsOpen,
|
|
47
|
+
onSelect: onSelectHandler,
|
|
48
|
+
});
|
|
49
|
+
const onToggleClick = (e) => {
|
|
50
|
+
e.stopPropagation();
|
|
51
|
+
setIsOpen(!isOpen);
|
|
52
|
+
};
|
|
53
|
+
const onClick = () => {
|
|
54
|
+
setSelectedItems({});
|
|
55
|
+
updateFilter(dispatch, {
|
|
56
|
+
filterKey: SolrKeys.type,
|
|
57
|
+
values: [],
|
|
58
|
+
});
|
|
59
|
+
};
|
|
29
60
|
const toNewCaseTypesFilter = toNewCaseTypeMapper(filterInfo[SolrKeys.type]);
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
61
|
+
const placeholder = getDropdownBtnPlaceholder(t('Select a support type'), toNewCaseTypesFilter, ' ', props.allCaseTypes.length, t('All selected'));
|
|
62
|
+
const toggle = (toggleRef) => (React.createElement(MenuToggle, { variant: "default", onClick: onToggleClick, innerRef: toggleRef, isExpanded: isOpen, isFullWidth: true, onKeyDown: onInputKeyDown },
|
|
63
|
+
placeholder,
|
|
64
|
+
Object.keys(selectedItems).filter((key) => selectedItems[key] === true).length > 0 && (React.createElement(Button, { icon: "", variant: "plain", onClick: onClick, "aria-label": "Clear selection", className: "pf-v6-c-select__toggle-clear" }))));
|
|
65
|
+
const dropdownOptions = list.map((option, index) => !isEmpty(option.value) && (React.createElement(SelectOption, { key: option.key, value: option, hasCheckbox: true, isSelected: selectedItems[option.value], isFocused: focusedItemIndex !== null && focusedItemIndex === index, id: `select-type-${option.value.replace(' ', '-')}` }, option.value)));
|
|
66
|
+
useEffect(() => {
|
|
67
|
+
var _a;
|
|
68
|
+
if (isEmpty(filterInfo[SolrKeys.type])) {
|
|
69
|
+
setSelectedItems({});
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
const selectedTypes = (_a = toNewCaseTypeMapper(filterInfo[SolrKeys.type])) === null || _a === void 0 ? void 0 : _a.reduce((selection, type) => {
|
|
73
|
+
selection[type] = true;
|
|
74
|
+
return selection;
|
|
75
|
+
}, {});
|
|
76
|
+
setSelectedItems(selectedTypes);
|
|
77
|
+
}
|
|
78
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
79
|
+
}, [filterInfo[SolrKeys.type]]);
|
|
80
|
+
return (React.createElement("div", { className: "type-filter" },
|
|
81
|
+
React.createElement("label", { htmlFor: "case-list-type-filter", className: "pf-v6-u-mb-sm case-list-type-filter-label" }, t(filterNamesMap[SolrKeys.type])),
|
|
82
|
+
React.createElement(Select, { role: "menu", id: "case-list-type-filter", "data-tracking-id": "type-filter", isOpen: isOpen, selected: selectedItems, onSelect: (_e, v) => onSelectHandler(v), onOpenChange: (nextOpen) => setIsOpen(nextOpen), toggle: toggle, isScrollable: true, popperProps: { direction: 'down', enableFlip: false } },
|
|
83
|
+
React.createElement(SelectList, null, dropdownOptions))));
|
|
33
84
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VersionsFilter.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-filters/VersionsFilter.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"VersionsFilter.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-filters/VersionsFilter.tsx"],"names":[],"mappings":"AAeA,OAAO,KAA2D,MAAM,OAAO,CAAC;AAIhF,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAE,cAAc,EAAgB,MAAM,0BAA0B,CAAC;AAoCxE,UAAU,MAAM;IACZ,WAAW,EAAE,cAAc,CAAC;IAC5B,mBAAmB,EAAE,uBAAuB,EAAE,CAAC;CAClD;AAED,wBAAgB,cAAc,CAAC,EAAE,WAAW,EAAE,mBAAmB,EAAE,EAAE,MAAM,qBAkO1E"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { Select, SelectOption,
|
|
1
|
+
import { Button, MenuToggle, Select, SelectList, SelectOption, TextInputGroup, TextInputGroupMain, TextInputGroupUtilities, } from '@patternfly/react-core';
|
|
2
|
+
import TimesIcon from '@patternfly/react-icons/dist/js/icons/times-icon';
|
|
3
|
+
import { useSelectKeyboardNavigator } from '@rh-support/components';
|
|
2
4
|
import isEmpty from 'lodash/isEmpty';
|
|
3
|
-
import React, { useContext, useMemo, useState } from 'react';
|
|
5
|
+
import React, { useContext, useEffect, useMemo, useRef, useState } from 'react';
|
|
4
6
|
import { useTranslation } from 'react-i18next';
|
|
5
7
|
import { SolrKeys, SolrPivotKeys } from '../../../enums/filters';
|
|
6
8
|
import { CaseListFilterDispatchContext, CaseListFilterStateContext } from '../CaseListFilterContext';
|
|
@@ -40,29 +42,124 @@ export function VersionsFilter({ productInfo, productVersionPivot }) {
|
|
|
40
42
|
const { t } = useTranslation();
|
|
41
43
|
const { filterInfo } = useContext(CaseListFilterStateContext);
|
|
42
44
|
const dispatch = useContext(CaseListFilterDispatchContext);
|
|
45
|
+
const [inputValue, setInputValue] = useState('');
|
|
46
|
+
const [activeItem, setActiveItem] = useState(null);
|
|
43
47
|
const [isOpen, setIsOpen] = useState(false);
|
|
44
|
-
const
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
const [selectedItems, setSelectedItems] = useState({});
|
|
49
|
+
const textInputRef = useRef();
|
|
50
|
+
// Memoize versions to prevent unnecessary recalculations
|
|
51
|
+
const versions = useMemo(() => {
|
|
52
|
+
const versionValues = getVersionValuesForProduct(productVersionPivot, productInfo.value);
|
|
53
|
+
return versionValues === null || versionValues === void 0 ? void 0 : versionValues.sort((a, b) => compareVersions(a.value, b.value));
|
|
54
|
+
}, [productVersionPivot, productInfo.value]);
|
|
55
|
+
// Memoize list to prevent unnecessary recreations
|
|
56
|
+
const list = useMemo(() => (versions === null || versions === void 0 ? void 0 : versions.map((version) => ({
|
|
57
|
+
value: version.value,
|
|
58
|
+
key: version.value,
|
|
59
|
+
}))) || [], [versions]);
|
|
60
|
+
const [selectOptions, setSelectOptions] = useState(list);
|
|
61
|
+
const onToggleClick = (e) => {
|
|
62
|
+
e.stopPropagation();
|
|
63
|
+
setIsOpen(!isOpen);
|
|
64
|
+
};
|
|
65
|
+
const onSelect = (option) => {
|
|
66
|
+
const prevSelectedVersions = Object.keys(selectedItems).filter((item) => selectedItems[item] && item);
|
|
67
|
+
if (selectedItems[option.value]) {
|
|
68
|
+
setSelectedItems((prevData) => (Object.assign(Object.assign({}, prevData), { [option.value]: !prevData[option.value] })));
|
|
69
|
+
const indexOfVersion = prevSelectedVersions.indexOf(option.value);
|
|
70
|
+
prevSelectedVersions.splice(indexOfVersion, 1);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
setSelectedItems((prevData) => (Object.assign(Object.assign({}, prevData), { [option.value]: true })));
|
|
74
|
+
prevSelectedVersions.push(option.value);
|
|
75
|
+
}
|
|
76
|
+
const newVersionState = prevSelectedVersions.map((version) => ({
|
|
77
|
+
field: SolrKeys.version,
|
|
78
|
+
value: version,
|
|
79
|
+
}));
|
|
50
80
|
const productNewState = [...filterInfo[SolrPivotKeys.product_version]];
|
|
51
81
|
const objIndex = productNewState.findIndex((item) => item.value === productInfo.value);
|
|
52
82
|
// replace product with updated versions
|
|
53
83
|
productNewState[objIndex] = {
|
|
54
84
|
field: SolrKeys.product,
|
|
55
85
|
value: productInfo.value,
|
|
56
|
-
[SolrKeys.version]:
|
|
86
|
+
[SolrKeys.version]: newVersionState,
|
|
57
87
|
};
|
|
58
88
|
updateFilter(dispatch, { filterKey: SolrPivotKeys.product_version, values: productNewState });
|
|
59
89
|
};
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
90
|
+
// Use the keyboard navigator hook
|
|
91
|
+
const { focusedItemIndex, onInputKeyDown } = useSelectKeyboardNavigator({
|
|
92
|
+
list,
|
|
93
|
+
isOpen,
|
|
94
|
+
ignoreResetOnListChange: false,
|
|
95
|
+
resetIndexOnClose: true,
|
|
96
|
+
isDisabled: false,
|
|
97
|
+
setIsOpen,
|
|
98
|
+
onSelect,
|
|
99
|
+
});
|
|
100
|
+
const onTextInputChange = (_event, value) => {
|
|
101
|
+
setInputValue(value);
|
|
102
|
+
};
|
|
103
|
+
const onClick = () => {
|
|
104
|
+
var _a;
|
|
105
|
+
setInputValue('');
|
|
106
|
+
setSelectedItems({});
|
|
107
|
+
const productNewState = [...filterInfo[SolrPivotKeys.product_version]];
|
|
108
|
+
const objIndex = productNewState.findIndex((item) => item.value === productInfo.value);
|
|
109
|
+
productNewState[objIndex] = {
|
|
110
|
+
field: SolrKeys.product,
|
|
111
|
+
value: productInfo.value,
|
|
112
|
+
[SolrKeys.version]: [],
|
|
113
|
+
};
|
|
114
|
+
updateFilter(dispatch, { filterKey: SolrPivotKeys.product_version, values: productNewState });
|
|
115
|
+
(_a = textInputRef === null || textInputRef === void 0 ? void 0 : textInputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
116
|
+
};
|
|
117
|
+
// Update activeItem when focusedItemIndex changes
|
|
118
|
+
useEffect(() => {
|
|
119
|
+
if (focusedItemIndex !== null && list[focusedItemIndex]) {
|
|
120
|
+
const focusedItem = list[focusedItemIndex];
|
|
121
|
+
setActiveItem(`select-multi-typeahead-checkbox-${focusedItem === null || focusedItem === void 0 ? void 0 : focusedItem.value.replace(' ', '-')}`);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
setActiveItem(null);
|
|
125
|
+
}
|
|
126
|
+
}, [focusedItemIndex, list]);
|
|
127
|
+
const toggle = (toggleRef) => (React.createElement(MenuToggle, { variant: "typeahead", onClick: onToggleClick, innerRef: toggleRef, isExpanded: isOpen, isFullWidth: true },
|
|
128
|
+
React.createElement(TextInputGroup, { isPlain: true },
|
|
129
|
+
React.createElement(TextInputGroupMain, Object.assign({ value: inputValue, onClick: onToggleClick, onChange: onTextInputChange, onKeyDown: onInputKeyDown, id: "version-typeahead-select-input", autoComplete: "off", innerRef: textInputRef, placeholder: t('Version') }, (activeItem && { 'aria-activedescendant': activeItem }), { role: "combobox", isExpanded: isOpen, "aria-controls": "version-typeahead-listbox" })),
|
|
130
|
+
Object.keys(selectedItems).filter((key) => selectedItems[key] === true).length > 0 && (React.createElement(TextInputGroupUtilities, null,
|
|
131
|
+
React.createElement(Button, { icon: React.createElement(TimesIcon, { "aria-hidden": true }), variant: "plain", onClick: onClick, "aria-label": "Clear input value" }))))));
|
|
132
|
+
// Memoize dropdownOptions to prevent unnecessary rerenders
|
|
133
|
+
const dropdownOptions = useMemo(() => {
|
|
134
|
+
const optionsToRender = !isEmpty(selectOptions) ? selectOptions : list;
|
|
135
|
+
return optionsToRender.map((option, index) => option.value && (React.createElement(SelectOption, { key: option.key, value: option, hasCheckbox: true, isSelected: selectedItems[option.value], isFocused: focusedItemIndex !== null && focusedItemIndex === index, id: `select-multi-typeahead-${option.value.replace(' ', '-')}` }, option.value)));
|
|
136
|
+
}, [selectOptions, list, selectedItems, focusedItemIndex]);
|
|
137
|
+
// Update selectOptions when input value changes
|
|
138
|
+
useEffect(() => {
|
|
139
|
+
if (!inputValue) {
|
|
140
|
+
setSelectOptions(list);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
const newSelectOptions = list.filter((option) => String(option === null || option === void 0 ? void 0 : option.value).toLowerCase().startsWith(inputValue.toLowerCase()));
|
|
144
|
+
setSelectOptions(newSelectOptions.length ? newSelectOptions : [{ isDisabled: false, children: `No results found` }]);
|
|
145
|
+
if (!isOpen) {
|
|
146
|
+
setIsOpen(true);
|
|
147
|
+
}
|
|
148
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
149
|
+
}, [inputValue, list]);
|
|
150
|
+
// Update selectedItems when case_version changes
|
|
151
|
+
useEffect(() => {
|
|
152
|
+
const currentVersions = productInfo.case_version || [];
|
|
153
|
+
const selectedVersions = currentVersions.reduce((selection, version) => {
|
|
154
|
+
selection[version.value] = true;
|
|
155
|
+
return selection;
|
|
156
|
+
}, {});
|
|
157
|
+
setSelectedItems(selectedVersions);
|
|
158
|
+
}, [productInfo.case_version]);
|
|
64
159
|
const titleId = 'case-list-versions-filter';
|
|
65
|
-
return (React.createElement(React.Fragment, null, !isEmpty(versions) && (React.createElement(
|
|
160
|
+
return (React.createElement(React.Fragment, null, !isEmpty(versions) && (React.createElement("div", { className: "version-filter-chip" },
|
|
66
161
|
React.createElement("label", { hidden: true, htmlFor: titleId }, t('Open versions dropdown')),
|
|
67
|
-
React.createElement(
|
|
162
|
+
React.createElement("div", { className: "pf-v6-c-select" },
|
|
163
|
+
React.createElement(Select, { role: "menu", "data-tracking-id": "versions-filter", id: titleId, title: t('Version'), isOpen: isOpen, selected: selectedItems, onSelect: (_e, v) => onSelect(v), onOpenChange: (nextOpen) => setIsOpen(nextOpen), popperProps: { direction: 'down', enableFlip: false }, toggle: toggle, isScrollable: true },
|
|
164
|
+
React.createElement(SelectList, null, dropdownOptions)))))));
|
|
68
165
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CaseListTable.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-table/CaseListTable.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,+CAA+C,CAAC;
|
|
1
|
+
{"version":3,"file":"CaseListTable.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-table/CaseListTable.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,+CAA+C,CAAC;AAqB3E,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAQxD,OAAO,KAAkD,MAAM,OAAO,CAAC;AAKvE,OAAO,EAAE,iBAAiB,EAAyB,MAAM,0BAA0B,CAAC;AAEpF,OAAO,EAEH,eAAe,EACf,SAAS,EAIZ,MAAM,0BAA0B,CAAC;AA4BlC,UAAU,MAAM;IACZ,QAAQ,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;IAC3C,UAAU,EAAE,UAAU,EAAE,CAAC;IACzB,kBAAkB,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,cAAc,CAAC,EAAE,eAAe,CAAC;IACjC,qBAAqB,EAAE,OAAO,CAAC;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;CACxB;AAsBD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,qBA+kB1C"}
|