182cca545SYoshie Muranaka<template> 282cca545SYoshie Muranaka <div class="table-filter d-inline-block"> 382cca545SYoshie Muranaka <p class="d-inline-block mb-0"> 482cca545SYoshie Muranaka <b-badge v-for="(tag, index) in tags" :key="index" pill> 582cca545SYoshie Muranaka {{ tag }} 682cca545SYoshie Muranaka <b-button-close 782cca545SYoshie Muranaka :disabled="dropdownVisible" 882cca545SYoshie Muranaka :aria-hidden="true" 90045400cSYoshie Muranaka @click="removeTag(tag)" 1082cca545SYoshie Muranaka /> 1182cca545SYoshie Muranaka </b-badge> 1282cca545SYoshie Muranaka </p> 1382cca545SYoshie Muranaka <b-dropdown 1482cca545SYoshie Muranaka variant="link" 1582cca545SYoshie Muranaka no-caret 1682cca545SYoshie Muranaka right 1760482ab6SYoshie Muranaka data-test-id="tableFilter-dropdown-options" 1882cca545SYoshie Muranaka @hide="dropdownVisible = false" 1982cca545SYoshie Muranaka @show="dropdownVisible = true" 2082cca545SYoshie Muranaka > 21602e98aaSDerick Montague <template #button-content> 2282cca545SYoshie Muranaka <icon-filter /> 2382cca545SYoshie Muranaka {{ $t('global.action.filter') }} 2482cca545SYoshie Muranaka </template> 250045400cSYoshie Muranaka <b-dropdown-form> 2682cca545SYoshie Muranaka <b-form-group 2782cca545SYoshie Muranaka v-for="(filter, index) of filters" 2882cca545SYoshie Muranaka :key="index" 2982cca545SYoshie Muranaka :label="filter.label" 3082cca545SYoshie Muranaka > 310045400cSYoshie Muranaka <b-form-checkbox-group v-model="tags"> 320045400cSYoshie Muranaka <b-form-checkbox 330045400cSYoshie Muranaka v-for="value in filter.values" 340045400cSYoshie Muranaka :key="value" 350045400cSYoshie Muranaka :value="value" 3660482ab6SYoshie Muranaka :data-test-id="`tableFilter-checkbox-${value}`" 370045400cSYoshie Muranaka > 383aecc07dSSandeepa Singh <b-dropdown-item> 390045400cSYoshie Muranaka {{ value }} 403aecc07dSSandeepa Singh </b-dropdown-item> 410045400cSYoshie Muranaka </b-form-checkbox> 4282cca545SYoshie Muranaka </b-form-checkbox-group> 4382cca545SYoshie Muranaka </b-form-group> 4482cca545SYoshie Muranaka </b-dropdown-form> 4560482ab6SYoshie Muranaka <b-dropdown-item-button 4660482ab6SYoshie Muranaka variant="primary" 4760482ab6SYoshie Muranaka data-test-id="tableFilter-button-clearAll" 4860482ab6SYoshie Muranaka @click="clearAllTags" 4960482ab6SYoshie Muranaka > 5082cca545SYoshie Muranaka {{ $t('global.action.clearAll') }} 5182cca545SYoshie Muranaka </b-dropdown-item-button> 5282cca545SYoshie Muranaka </b-dropdown> 5382cca545SYoshie Muranaka </div> 5482cca545SYoshie Muranaka</template> 5582cca545SYoshie Muranaka 5682cca545SYoshie Muranaka<script> 5782cca545SYoshie Muranakaimport IconFilter from '@carbon/icons-vue/es/settings--adjust/20'; 5882cca545SYoshie Muranaka 5982cca545SYoshie Muranakaexport default { 6082cca545SYoshie Muranaka name: 'TableFilter', 6182cca545SYoshie Muranaka components: { IconFilter }, 6282cca545SYoshie Muranaka props: { 6382cca545SYoshie Muranaka filters: { 6482cca545SYoshie Muranaka type: Array, 6582cca545SYoshie Muranaka default: () => [], 66602e98aaSDerick Montague validator: (prop) => { 6782cca545SYoshie Muranaka return prop.every( 68*8132399cSEd Tanous (filter) => 69*8132399cSEd Tanous 'label' in filter && 'values' in filter && 'key' in filter, 7082cca545SYoshie Muranaka ); 71602e98aaSDerick Montague }, 72602e98aaSDerick Montague }, 7382cca545SYoshie Muranaka }, 7482cca545SYoshie Muranaka data() { 7582cca545SYoshie Muranaka return { 760045400cSYoshie Muranaka dropdownVisible: false, 778a8b3e70SYoshie Muranaka tags: [], 7882cca545SYoshie Muranaka }; 7982cca545SYoshie Muranaka }, 808a8b3e70SYoshie Muranaka watch: { 810045400cSYoshie Muranaka tags: { 828a8b3e70SYoshie Muranaka handler() { 838a8b3e70SYoshie Muranaka this.emitChange(); 840045400cSYoshie Muranaka }, 858a8b3e70SYoshie Muranaka deep: true, 86602e98aaSDerick Montague }, 870045400cSYoshie Muranaka }, 8882cca545SYoshie Muranaka methods: { 898a8b3e70SYoshie Muranaka removeTag(removedTag) { 908a8b3e70SYoshie Muranaka this.tags = this.tags.filter((tag) => tag !== removedTag); 9182cca545SYoshie Muranaka }, 9282cca545SYoshie Muranaka clearAllTags() { 938a8b3e70SYoshie Muranaka this.tags = []; 9482cca545SYoshie Muranaka }, 9582cca545SYoshie Muranaka emitChange() { 968a8b3e70SYoshie Muranaka const activeFilters = this.filters.map(({ key, values }) => { 978a8b3e70SYoshie Muranaka const activeValues = values.filter( 98*8132399cSEd Tanous (value) => this.tags.indexOf(value) !== -1, 998a8b3e70SYoshie Muranaka ); 1008a8b3e70SYoshie Muranaka return { 1018a8b3e70SYoshie Muranaka key, 1028a8b3e70SYoshie Muranaka values: activeValues, 1038a8b3e70SYoshie Muranaka }; 10482cca545SYoshie Muranaka }); 1058a8b3e70SYoshie Muranaka this.$emit('filter-change', { activeFilters }); 106602e98aaSDerick Montague }, 107602e98aaSDerick Montague }, 10882cca545SYoshie Muranaka}; 10982cca545SYoshie Muranaka</script> 11082cca545SYoshie Muranaka 11182cca545SYoshie Muranaka<style lang="scss" scoped> 11282cca545SYoshie Muranaka.badge { 11382cca545SYoshie Muranaka margin-right: $spacer / 2; 11482cca545SYoshie Muranaka} 11582cca545SYoshie Muranaka</style> 116