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