11<template >
2- <GTable :items :columns sortColumn =" count" >
2+ <GTable :items = " filteredItems " :columns sortColumn =" count" >
33 <template #title >Entities</template >
44 <template #help >
55 Here you can view all the entities in the selected document.
66 </template >
7+ <template #header >
8+ <form class =" filter" @submit.prevent >
9+ <fieldset >
10+ <label for =" entities-select" >Entities</label >
11+ <MultiSelect id =" entities-select" v-model =" selectedEntities" :options =" entityOptions"
12+ placeholder =" Select entities" :maxSelectedLabels =" 3" />
13+ </fieldset >
14+ <fieldset >
15+ <label for =" jobs-select" >Jobs</label >
16+ <MultiSelect id =" jobs-select" v-model =" selectedJobs" :options =" jobOptions" placeholder =" Select jobs"
17+ :maxSelectedLabels =" 3" />
18+ </fieldset >
19+ </form >
20+ </template >
721 <template #table-empty >
8- No entities found in this document .
22+ No entities found.
923 </template >
1024 </GTable >
1125</template >
1428<script setup lang="ts">
1529import type { Entity } from " @/types/evaluation/entities"
1630import type { Column } from " @/types/ui/table"
31+ import MultiSelect from " primevue/multiselect"
1732
18- const { entities, filter } = defineProps <{
33+ const { entities } = defineProps <{
1934 entities: Entity []
2035 filter? : string
2136}>()
2237
38+ const jobOptions = computed <string []>(() => Array .from (new Set (items .value .map (entity => entity .job ))))
39+ const entityOptions = computed <string []>(() => Array .from (new Set (items .value .map (entity => entity .label ))))
40+ const selectedEntities = ref <string []>([])
41+ const selectedJobs = ref <string []>([])
42+
43+ const filteredItems = computed (() => {
44+ return items .value .filter (filter )
45+ })
46+
2347const items = computed (() =>
2448 // entities is in the form: { job1: Entity[], job2: Entity[], ... }
2549 // We are going to expand it to a flat array of entities, with an extra property 'job'
@@ -33,4 +57,27 @@ const columns = ref<Column[]>([
3357 { key: " count" , sortOn : i => i .count },
3458 { key: " job" , sortOn : i => i .job }
3559])
60+
61+ function filter(entity : Entity ): boolean {
62+ if (selectedEntities .value .length === 0 && selectedJobs .value .length === 0 ) return true
63+ // only one active
64+ if (selectedEntities .value .length === 0 ) return selectedJobs .value .includes (entity .job )
65+ if (selectedJobs .value .length === 0 ) return selectedEntities .value .includes (entity .label )
66+
67+ return selectedEntities .value .includes (entity .label ) && selectedJobs .value .includes (entity .job )
68+ }
3669 </script >
70+
71+ <style scoped lang="scss">
72+ .filter {
73+ display : flex ;
74+ flex-wrap : wrap ;
75+ gap : 1rem ;
76+
77+ fieldset {
78+ display : flex ;
79+ flex-direction : column ;
80+ align-items : center ;
81+ }
82+ }
83+ </style >
0 commit comments