Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(VDataTable): make it easier to use custom-filter #7885

Merged
merged 1 commit into from
Jul 20, 2019

Conversation

nekosaur
Copy link
Member

Description

change custom-filter signature, added example of custom-filter prop usage and filtering on specific columns.

new signature is (value: any, search: string | null, item: any): boolean

Motivation and Context

early on in the data-table refactor I combined it and filter to make things a bit more straightforward. but I see now that the resulting customFilter function went the wrong way. Replacing it right now is not very straightforward (with a signature of (items: any[], search: string | null, headersWithCustomFilters: TableHeader[], headersWithoutCustomFilters: TableHeader[]))

How Has This Been Tested?

playground, doc example

Markup:

<template>
  <div>
    <v-data-table
      :headers="headers"
      :items="desserts"
      item-key="name"
      class="elevation-1"
      :search="search"
      :custom-filter="filterOnlyCapsText"
    >
      <template v-slot:top>
        <v-text-field v-model="search" label="Search (UPPER CASE ONLY)" class="mx-4"></v-text-field>
      </template>
      <template v-slot:body.append>
        <tr>
          <td></td>
          <td>
            <v-text-field v-model="calories" type="number" label="Less than"></v-text-field>
          </td>
          <td colspan="4"></td>
        </tr>
      </template>
    </v-data-table>
  </div>
</template>

<script>
  export default {
    data () {
      return {
        search: '',
        calories: '',
        desserts: [
          {
            name: 'Frozen Yogurt',
            calories: 159,
            fat: 6.0,
            carbs: 24,
            protein: 4.0,
            iron: '1%',
          },
          {
            name: 'Ice cream sandwich',
            calories: 237,
            fat: 9.0,
            carbs: 37,
            protein: 4.3,
            iron: '1%',
          },
          {
            name: 'Eclair',
            calories: 262,
            fat: 16.0,
            carbs: 23,
            protein: 6.0,
            iron: '7%',
          },
          {
            name: 'Cupcake',
            calories: 305,
            fat: 3.7,
            carbs: 67,
            protein: 4.3,
            iron: '8%',
          },
          {
            name: 'Gingerbread',
            calories: 356,
            fat: 16.0,
            carbs: 49,
            protein: 3.9,
            iron: '16%',
          },
          {
            name: 'Jelly bean',
            calories: 375,
            fat: 0.0,
            carbs: 94,
            protein: 0.0,
            iron: '0%',
          },
          {
            name: 'Lollipop',
            calories: 392,
            fat: 0.2,
            carbs: 98,
            protein: 0,
            iron: '2%',
          },
          {
            name: 'Honeycomb',
            calories: 408,
            fat: 3.2,
            carbs: 87,
            protein: 6.5,
            iron: '45%',
          },
          {
            name: 'Donut',
            calories: 452,
            fat: 25.0,
            carbs: 51,
            protein: 4.9,
            iron: '22%',
          },
          {
            name: 'KitKat',
            calories: 518,
            fat: 26.0,
            carbs: 65,
            protein: 7,
            iron: '6%',
          },
        ],
      }
    },
    computed: {
      headers () {
        return [
          {
            text: 'Dessert (100g serving)',
            align: 'left',
            sortable: false,
            value: 'name',
          },
          {
            text: 'Calories',
            value: 'calories',
            filter: value => {
              if (!this.calories) return true

              return value < parseInt(this.calories)
            },
          },
          { text: 'Fat (g)', value: 'fat' },
          { text: 'Carbs (g)', value: 'carbs' },
          { text: 'Protein (g)', value: 'protein' },
          { text: 'Iron (%)', value: 'iron' },
        ]
      },
    },
    methods: {
      filterOnlyCapsText (value, search, item) {
        return value != null &&
          search != null &&
          typeof value === 'string' &&
          value.toString().toLocaleUpperCase().indexOf(search) !== -1
      },
    },
  }
</script>

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Improvement/refactoring (non-breaking change that doesn't add any features but makes things better)

Checklist:

  • The PR title is no longer than 64 characters.
  • The PR is submitted to the correct branch (master for bug fixes and documentation updates, dev for new features and breaking changes).
  • My code follows the code style of this project.
  • I've added relevant changes to the documentation (applies to new features and breaking changes in core library)

@codecov
Copy link

codecov bot commented Jul 20, 2019

Codecov Report

Merging #7885 into next will decrease coverage by <.01%.
The diff coverage is 70%.

Impacted file tree graph

@@            Coverage Diff             @@
##             next    #7885      +/-   ##
==========================================
- Coverage   85.66%   85.66%   -0.01%     
==========================================
  Files         333      333              
  Lines        9091     9090       -1     
  Branches     2413     2413              
==========================================
- Hits         7788     7787       -1     
  Misses       1208     1208              
  Partials       95       95
Impacted Files Coverage Δ
...vuetify/src/components/VDataTable/mixins/header.ts 100% <ø> (ø) ⬆️
packages/vuetify/src/util/helpers.ts 92.27% <100%> (ø) ⬆️
...es/vuetify/src/components/VDataTable/VDataTable.ts 83.23% <62.5%> (-1.01%) ⬇️
packages/vuetify/src/components/VTabs/VTabs.ts 83.75% <0%> (ø) ⬆️
packages/vuetify/src/components/VSelect/VSelect.ts 94.13% <0%> (+0.36%) ⬆️
...ages/vuetify/src/components/VSnackbar/VSnackbar.ts 94.73% <0%> (+3.82%) ⬆️

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 9f12df7...ca7e33c. Read the comment docs.

@nekosaur nekosaur requested a review from johnleider July 20, 2019 13:28
@nekosaur nekosaur added this to the v2.0.0 milestone Jul 20, 2019
also added docs example of custom-filter and header filtering
@johnleider johnleider merged commit 132ac8e into next Jul 20, 2019
@johnleider johnleider deleted the fix/data-table-custom-filter branch July 20, 2019 16:35
@lock lock bot locked as resolved and limited conversation to collaborators Aug 19, 2019
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants