Filtering

Use filter-options prop to filter items in vue3-easy-data-table.

Filter comparisons:

ValueDescription
betweenBetween
inIn
=Equals
!=Does not equal
>Greater than
>=Greater than or equal to
<Less than
<=Less than or equal to

Type definition

type FilterOption = {
  field: string,
  comparison: 'between',
  criteria: [number, number],
} | {
  field: string,
  comparison: '=' | '!=',
  criteria: number | string,
} | {
  field: string,
  comparison: '>' | '>=' | '<' | '<=',
  criteria: number,
} | {
  field: string,
  comparison: (value: any, criteria: string) => boolean,
  criteria: string,
} | {
  field: string
  comparison: 'in'
  criteria: number[] | string[]
}

Example

For now, you can customize filter menu by using header slotopen in new window feature, here is an example:

<template>
  <EasyDataTable
    :headers="headers"
    :items="items"
    :filter-options="filterOptions"
  >
    <template #header-name="header">
      <div class="filter-column">
        <img src="../images/eglass-filter.png" class="filter-icon" @click.stop="showNameFilter=!showNameFilter">
        {{ header.text }}
        <div class="filter-menu" v-if="showNameFilter">
          <input v-model="nameCriteria"/>
        </div>
      </div>
    </template>
    <template #header-age="header">
      <div class="filter-column">
        <img src="../images/eglass-filter.png" class="filter-icon" @click.stop="showAgeFilter=!showAgeFilter">
        {{ header.text }}
        <div class="filter-menu filter-age-menu" v-if="showAgeFilter">
          <Slider v-model="ageCriteria" class="slider"/>
        </div>
      </div>
    </template>
    <template #header-favouriteSport="header">
      <div class="filter-column">
        <img src="../images/eglass-filter.png" class="filter-icon" @click.stop="showFavouriteSportFilter=!showFavouriteSportFilter">
        {{ header.text }}
        <div class="filter-menu filter-sport-menu" v-if="showFavouriteSportFilter">
          <select
            class="favouriteSport-selector"
            v-model="favouriteSportCriteria"
            name="favouriteSport"
          >
            <option value="swimming">
              swimming
            </option>
            <option value="basketball">
              basketball
            </option>
            <option value="running">
              running
            </option>
            <option value="football">
              football
            </option>
            <option value="all">
              all
            </option>
          </select>
        </div>
      </div>
    </template>
  </EasyDataTable>
</template>

<script lang="ts" setup>
import { ref, computed } from "vue";
import type { Header, Item, FilterOption } from "vue3-easy-data-table";
import { mockClientItems } from "../mock";

const ageCriteria = ref<[number, number]>([1, 15]);
const favouriteSportCriteria = ref('swimming');
const nameCriteria = ref('');

const filterOptions = computed((): FilterOption[] => {
  const filterOptionsArray: FilterOption[] = [];
  if (favouriteSportCriteria.value !== 'all') {
    filterOptionsArray.push({
      field: 'favouriteSport',
      comparison: '=',
      criteria: favouriteSportCriteria.value,
    });
  }
  filterOptionsArray.push({
    field: 'age',
    comparison: 'between',
    criteria: ageCriteria.value,
  });
  filterOptionsArray.push({
    field: 'name',
    criteria: nameCriteria.value,
    comparison: (value, criteria): boolean => (value != null && criteria != null &&
      typeof value === 'string' && value.includes(`name-${criteria}`)),
  });
  return filterOptionsArray;
});

const showAgeFilter = ref(false);
const showFavouriteSportFilter = ref(false);
const showNameFilter = ref(false);

const items = ref<Item[]>(mockClientItems(100));
const headers: Header[] = [
  { text: "Name", value: "name" },
  { text: "Address", value: "address" },
  { text: "Height", value: "height", sortable: true },
  { text: "Weight", value: "weight", sortable: true },
  { text: "Age", value: "age", sortable: true },
  { text: "Favourite sport", value: "favouriteSport" },
  { text: "Favourite fruits", value: "favouriteFruits" },
];
</script>

<style>
// omit
...
</style>

Edit on CodeSandboxopen in new window

#
Name
AddressHeightWeight
Age
Favourite sport
Favourite fruits
1name-3address-3333swimmingpeach
2name-7address-7777swimmingpeach
3name-11address-11111111swimmingpeach
4name-15address-15151515swimmingpeach