1import { includes } from 'lodash';
2
3const TableFilterMixin = {
4  methods: {
5    getFilteredTableData(tableData = [], filters = []) {
6      const filterItems = filters.reduce((arr, filter) => {
7        return [...arr, ...filter.values];
8      }, []);
9      // If no filters are active, then return all table data
10      if (filterItems.length === 0) return tableData;
11
12      // Check if row property value is included in list of
13      // active filters
14      return tableData.filter(row => {
15        let returnRow = false;
16        for (const { key, values } of filters) {
17          const rowProperty = row[key];
18          if (rowProperty && includes(values, rowProperty)) {
19            returnRow = true;
20            break;
21          }
22        }
23        return returnRow;
24      });
25    },
26    getFilteredTableDataByDate(
27      tableData = [],
28      startDate,
29      endDate,
30      propertyKey = 'date'
31    ) {
32      if (!startDate && !endDate) return tableData;
33      const startDateInMs = startDate ? startDate.getTime() : 0;
34      const endDateInMs = endDate
35        ? endDate.getTime()
36        : Number.POSITIVE_INFINITY;
37      return tableData.filter(row => {
38        const date = row[propertyKey];
39        if (!(date instanceof Date)) return;
40
41        const dateInMs = date.getTime();
42        if (dateInMs >= startDateInMs && dateInMs <= endDateInMs) return row;
43      });
44    }
45  }
46};
47
48export default TableFilterMixin;
49