MultiFilters.js 1.37 KB
Newer Older
krlsnvz93's avatar
krlsnvz93 committed
1 2 3 4
/**
 * Enabled v-data-table to have moire than one filter.
 */
class MultiFilters {
krlsnvz93's avatar
krlsnvz93 committed
5

krlsnvz93's avatar
krlsnvz93 committed
6 7 8 9 10 11 12 13
  /**
   * Constructor.
   *
   * @param items
   * @param filters
   * @param filter
   * @param headers
   */
krlsnvz93's avatar
krlsnvz93 committed
14 15 16 17 18 19
  constructor(items, filters, filter, headers) {
    this.items = items;
    this.filter = filter;
    this.headers = headers;
    this.filters = filters;
    this.filterCallbacks = {};
krlsnvz93's avatar
krlsnvz93 committed
20 21 22 23 24 25 26 27
  }

  /**
   * Updates filter values.
   * @param filters filter´s object
   * @param val JSON chunk to be updated.
   * @returns {*}
   */
krlsnvz93's avatar
krlsnvz93 committed
28 29
  static updateFilters(filters, val) {
    return Object.assign({}, filters, val);
krlsnvz93's avatar
krlsnvz93 committed
30 31 32 33 34 35 36
  }

  /**
   * Adds a new filter
   * @param filterName The name of the filter from which the information will be extracted
   * @param filterCallback The callback that will apply the filter.
   */
krlsnvz93's avatar
krlsnvz93 committed
37 38
  registerFilter(filterName, filterCallback) {
    this.filterCallbacks[filterName] = filterCallback;
krlsnvz93's avatar
krlsnvz93 committed
39 40 41 42 43 44
  }

  /**
   * Run all filters.
   * @returns {*}
   */
krlsnvz93's avatar
krlsnvz93 committed
45 46 47
  runFilters() {
    const self = this;
    let filteredItems = self.items;
krlsnvz93's avatar
krlsnvz93 committed
48 49 50

    Object.entries(this.filterCallbacks)
      .forEach(([entity, cb]) => {
krlsnvz93's avatar
krlsnvz93 committed
51 52
        filteredItems = cb.call(self, self.filters[entity], filteredItems);
      });
krlsnvz93's avatar
krlsnvz93 committed
53

krlsnvz93's avatar
krlsnvz93 committed
54
    return filteredItems;
krlsnvz93's avatar
krlsnvz93 committed
55 56 57 58
  }
}
// Vue plugin.
const MultiFiltersPlugin = {
krlsnvz93's avatar
krlsnvz93 committed
59 60 61 62
  install(Vue, options) {
    Vue.prototype.$MultiFilters = MultiFilters;
  }
};
krlsnvz93's avatar
krlsnvz93 committed
63

krlsnvz93's avatar
krlsnvz93 committed
64
export default MultiFiltersPlugin;