@pantheon-systems/design-toolkit-react
Version:
Pantheon's React Design Toolkit
136 lines (130 loc) • 5.5 kB
JavaScript
import _defineProperty from '@babel/runtime/helpers/defineProperty';
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
import PropTypes from 'prop-types';
import { useState } from 'react';
import ContainerFlex from '../Containers/ContainerFlex.js';
import { jsxs, jsx } from 'react/jsx-runtime';
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
var ALL = 'ALL';
var TableFilters = function TableFilters(_ref) {
var data = _ref.data,
filters = _ref.filters,
label = _ref.label,
setFilteredData = _ref.setFilteredData;
/* Help function:
Filter data by filter values */
var filterData = function filterData(filterValues) {
var filteredData = _toConsumableArray(data);
filters.forEach(function (filter) {
var getValuePath = filter.getValuePath,
id = filter.id;
if (filterValues[id] !== ALL) {
filteredData = filteredData.filter(function (item) {
return getValuePath(item) === filterValues[id];
});
}
});
return filteredData;
};
/* Help function:
Set all filters' initial value to ALL.
Generate each filter's all unique values from the data; each key is the filter id.
Example result:
{
defaultFilterValues : {
people: ALL,
status: ALL,
},
filterOptionValues: {
people: [ 'User 1', 'User 2', 'User 3'],
status: [ 'BUILDING', 'CANCELED', 'FAILED', 'SUCCESS'],
},
} */
var getFilterOptionsAndValues = function getFilterOptionsAndValues() {
var defaultFilterValues = {};
var filterOptionValues = {};
filters.forEach(function (filter) {
var getValuePath = filter.getValuePath,
id = filter.id;
var uniqueValuesSet = new Set();
data.forEach(function (item) {
uniqueValuesSet.add(getValuePath(item));
});
filterOptionValues[id] = Array.from(uniqueValuesSet);
defaultFilterValues[id] = ALL;
});
return {
defaultFilterValues: defaultFilterValues,
filterOptionValues: filterOptionValues
};
};
// End of help functions
var _getFilterOptionsAndV = getFilterOptionsAndValues(),
defaultFilterValues = _getFilterOptionsAndV.defaultFilterValues,
filterOptionValues = _getFilterOptionsAndV.filterOptionValues;
var _useState = useState(defaultFilterValues),
_useState2 = _slicedToArray(_useState, 2),
filterValues = _useState2[0],
setFilterValues = _useState2[1];
var handleChange = function handleChange(event) {
var _event$target = event.target,
id = _event$target.id,
value = _event$target.value;
// Only re-filter if the filter value has changed
if (filterValues[id] !== value) {
var newFilterValues = _objectSpread(_objectSpread({}, filterValues), {}, _defineProperty({}, id, value));
setFilterValues(newFilterValues);
setFilteredData(filterData(newFilterValues));
}
};
return /*#__PURE__*/jsxs(ContainerFlex, {
children: [label ? /*#__PURE__*/jsx("legend", {
className: "py-2 pl-0 pr-4 font-semibold",
children: label
}) : null, filters.map(function (filter) {
return /*#__PURE__*/jsxs("div", {
className: "w-40 pr-4 mb-4",
children: [/*#__PURE__*/jsx("label", {
className: "sr-only",
htmlFor: filter.id,
children: filter.ariaLabel
}), /*#__PURE__*/jsxs("select", {
id: filter.id,
name: filter.id,
onBlur: handleChange,
onChange: handleChange,
children: [/*#__PURE__*/jsx("option", {
value: ALL,
children: filter.optionAllText
}), filterOptionValues[filter.id].map(function (value) {
return /*#__PURE__*/jsx("option", {
value: value,
children: filter.optionValueToText ? filter.optionValueToText(value) : value
}, value);
})]
})]
}, filter.id);
})]
});
};
TableFilters.defaultProps = {
label: ''
};
TableFilters.propTypes = {
data: PropTypes.arrayOf(PropTypes.object.isRequired).isRequired,
filters: PropTypes.arrayOf(PropTypes.shape({
ariaLabel: PropTypes.string.isRequired,
getValuePath: PropTypes.func.isRequired,
// The path to get the value from data
id: PropTypes.string.isRequired,
optionAllText: PropTypes.string.isRequired,
optionValueToText: PropTypes.func // If not present, use the value for option text
}).isRequired).isRequired,
label: PropTypes.string,
setFilteredData: PropTypes.func.isRequired
};
var TableFilters$1 = TableFilters;
export { TableFilters$1 as default };
//# sourceMappingURL=TableFilters.js.map