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      let startDateInMs = startDate ? startDate.getTime() : 0;
34      let endDateInMs = endDate ? endDate.getTime() : Number.POSITIVE_INFINITY;
35
36      const isUtcDisplay = this.$store.getters['global/isUtcDisplay'];
37
38      //Offset preference selected
39      if (!isUtcDisplay) {
40        startDateInMs = startDate
41          ? startDate.getTime() + startDate.getTimezoneOffset() * 60000
42          : 0;
43        endDateInMs = endDate
44          ? endDate.getTime() + endDate.getTimezoneOffset() * 60000
45          : Number.POSITIVE_INFINITY;
46      }
47
48      return tableData.filter(row => {
49        const date = row[propertyKey];
50        if (!(date instanceof Date)) return;
51        const dateInMs = date.getTime();
52        if (dateInMs >= startDateInMs && dateInMs <= endDateInMs) return row;
53      });
54    }
55  }
56};
57
58export default TableFilterMixin;
59