2023-03-14 13:18:55 +00:00
|
|
|
/**
|
|
|
|
* Copyright (c) HashiCorp, Inc.
|
2023-08-11 13:12:13 +00:00
|
|
|
* SPDX-License-Identifier: BUSL-1.1
|
2023-03-14 13:18:55 +00:00
|
|
|
*/
|
|
|
|
|
2021-01-25 18:13:54 +00:00
|
|
|
export const diff = (a, b) => {
|
2022-09-15 08:43:17 +00:00
|
|
|
return a.filter((item) => !b.includes(item));
|
2021-01-25 18:13:54 +00:00
|
|
|
};
|
|
|
|
/**
|
|
|
|
* filters accepts the args.filter @attribute which is shaped like
|
|
|
|
* {filterName: {default: ['Node', 'Address'], value: ['Address']}, ...}
|
|
|
|
* It will turn this into an array of 'filters' shaped like
|
|
|
|
* [{key: 'filterName', value: 'Address', selected: ["Node"]}]
|
|
|
|
* importantly 'selected' isn't what is currently 'selected' it is what selected
|
|
|
|
* will be once you remove this filter
|
|
|
|
* There is more explanation in the unit tests for this function so thats worthwhile
|
|
|
|
* checking if you are in amongst this
|
|
|
|
*/
|
2022-09-15 08:43:17 +00:00
|
|
|
export const filters = (filters) => {
|
2021-01-25 18:13:54 +00:00
|
|
|
return Object.entries(filters)
|
|
|
|
.filter(([key, value]) => {
|
|
|
|
if (key === 'searchproperty') {
|
|
|
|
return diff(value.default, value.value).length > 0;
|
|
|
|
}
|
|
|
|
return (value.value || []).length > 0;
|
|
|
|
})
|
|
|
|
.reduce((prev, [key, value]) => {
|
|
|
|
return prev.concat(
|
2022-09-15 08:43:17 +00:00
|
|
|
value.value.map((item) => {
|
2021-01-25 18:13:54 +00:00
|
|
|
const obj = {
|
|
|
|
key: key,
|
|
|
|
value: item,
|
|
|
|
};
|
|
|
|
if (key !== 'searchproperty') {
|
|
|
|
obj.selected = diff(value.value, [item]);
|
|
|
|
} else {
|
|
|
|
obj.selected = value.value.length === 1 ? value.default : diff(value.value, [item]);
|
|
|
|
}
|
|
|
|
return obj;
|
|
|
|
})
|
|
|
|
);
|
|
|
|
}, []);
|
|
|
|
};
|