Skip to content

Commit b7c7bb6

Browse files
committed
address some review comments
1 parent ca02788 commit b7c7bb6

File tree

2 files changed

+38
-44
lines changed

2 files changed

+38
-44
lines changed

src/Frontend/src/components/audit/FiltersPanel.vue

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import DatePickerRange from "@/components/audit/DatePickerRange.vue";
99
const store = useAuditStore();
1010
const { sortBy, messageFilterString, selectedEndpointName, endpoints, itemsPerPage, dateRange } = storeToRefs(store);
1111
const endpointNames = computed(() => {
12-
return [...new Set(endpoints.value.map((endpoint) => endpoint.name))];
12+
return [...new Set(endpoints.value.map((endpoint) => endpoint.name))].sort();
1313
});
1414
const sortByItemsMap = new Map([
1515
["Latest sent", "time_sent,desc"],
@@ -62,7 +62,7 @@ watch(selectedSortByItem, (newValue) => {
6262
<div class="filter-component text-search-container"><FilterInput v-model="messageFilterString" placeholder="Search messages..." aria-label="Search messages" /></div>
6363
</div>
6464
<div class="filter">
65-
<div class="filter-label">Endpoints:</div>
65+
<div class="filter-label">Endpoint:</div>
6666
<div class="filter-component">
6767
<ListFilterSelector :items="endpointNames" instructions="Select an endpoint" v-model="selectedEndpointName" item-name="endpoint" label="Endpoint" default-empty-text="Any" :show-clear="true" :show-filter="true" />
6868
</div>
@@ -76,13 +76,13 @@ watch(selectedSortByItem, (newValue) => {
7676
<div class="filter">
7777
<div class="filter-label">Show:</div>
7878
<div class="filter-component">
79-
<ListFilterSelector :items="numberOfItemsPerPage" instructions="Select how many result to display" v-model="selectedItemsPerPage" item-name="result" default-empty-text="Any" :show-clear="false" :show-filter="false" />
79+
<ListFilterSelector :items="numberOfItemsPerPage" instructions="Select how many result to display" v-model="selectedItemsPerPage" item-name="result" :can-clear="false" :show-clear="false" :show-filter="false" />
8080
</div>
8181
</div>
8282
<div class="filter last-filter">
8383
<div class="filter-label">Sort:</div>
8484
<div class="filter-component">
85-
<ListFilterSelector :items="sortByItems" instructions="" v-model="selectedSortByItem" item-name="result" default-empty-text="Any" :show-clear="false" :show-filter="false" />
85+
<ListFilterSelector :items="sortByItems" instructions="" v-model="selectedSortByItem" item-name="result" :can-clear="false" :show-clear="false" :show-filter="false" />
8686
</div>
8787
</div>
8888
</div>

src/Frontend/src/components/audit/ListFilterSelector.vue

Lines changed: 34 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -3,50 +3,52 @@ import FilterInput from "@/components/FilterInput.vue";
33
import { ref, watch } from "vue";
44
55
const selected = defineModel<string>({ required: true });
6-
const props = defineProps<{ items: string[]; instructions: string; itemName: string; defaultEmptyText: string; showClear: boolean; showFilter: boolean }>();
6+
const props = withDefaults(
7+
defineProps<{
8+
items: string[];
9+
instructions?: string;
10+
itemName: string;
11+
defaultEmptyText?: string;
12+
canClear?: boolean;
13+
showClear: boolean;
14+
showFilter: boolean;
15+
}>(),
16+
{ canClear: true }
17+
);
718
const filter = ref("");
819
const filteredItems = ref(props.items);
920
1021
watch([filter, () => props.items], () => {
11-
if (filter.value !== "" && filter.value !== null && filter.value !== undefined) {
22+
if (filter.value !== "" && filter.value != null) {
1223
filteredItems.value = props.items.filter((item) => item.toLowerCase().includes(filter.value.toLowerCase()));
1324
} else {
1425
filteredItems.value = props.items;
1526
}
1627
});
1728
18-
function onclick(item: string, isSelected: boolean) {
19-
if (isSelected) {
20-
selected.value = "";
21-
} else {
22-
selected.value = item;
23-
}
29+
function setFilter(item: string, isSelected: boolean) {
30+
selected.value = isSelected && props.canClear ? "" : item;
2431
}
2532
</script>
2633

2734
<template>
2835
<div class="dropdown">
2936
<button type="button" aria-label="open dropdown menu" class="btn btn-dropdown dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
30-
<span class="wrap-text">{{ selected ? selected : defaultEmptyText }}</span>
37+
<span class="wrap-text">{{ selected || defaultEmptyText }}</span>
3138
</button>
3239
<div class="dropdown-menu wrapper">
3340
<div class="instructions">{{ instructions }}</div>
3441
<div v-if="showFilter" class="filter-input">
3542
<FilterInput v-model="filter" :placeholder="`Filter ${itemName}s`" />
3643
</div>
3744
<div class="items-container">
38-
<div class="item-container" v-if="showClear && selected">
39-
<svg class="fa-cross" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512">
40-
<!--!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.-->
41-
<path
42-
d="M342.6 150.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L192 210.7 86.6 105.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L146.7 256 41.4 361.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L192 301.3 297.4 406.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L237.3 256 342.6 150.6z"
43-
/>
44-
</svg>
45-
<a class="clear" @click.prevent="() => onclick('', true)"> Clear selected {{ itemName }}</a>
45+
<div class="item-container" v-if="showClear && selected" @click.prevent="() => setFilter('', true)">
46+
<i class="fa fa-times" />
47+
<span class="clear"> Clear selected {{ itemName }}</span>
4648
</div>
47-
<div class="item-container" v-for="item in filteredItems" :key="item">
49+
<div class="item-container" v-for="item in filteredItems" :key="item" @click.prevent="() => setFilter(item, item === selected)">
4850
<i v-if="item === selected" class="fa fa-check" />
49-
<a class="item" :class="{ selected: item === selected }" @click.prevent="() => onclick(item, item === selected)">{{ item }}</a>
51+
<span class="item" :class="{ selected: item === selected }">{{ item }}</span>
5052
</div>
5153
</div>
5254
</div>
@@ -55,61 +57,53 @@ function onclick(item: string, isSelected: boolean) {
5557

5658
<style scoped>
5759
.wrap-text {
58-
max-width: 250px;
60+
max-width: 18em;
5961
word-wrap: break-word;
6062
}
6163
.wrapper {
62-
padding: 0.5em;
63-
min-width: 200px;
64+
padding: 0.5rem;
65+
min-width: 12.5rem;
6466
}
6567
.instructions {
6668
font-weight: bold;
67-
margin-bottom: 0.5em;
69+
margin-bottom: 0.5rem;
6870
}
6971
.items-container {
70-
max-height: 300px;
71-
max-width: 400px;
72+
max-height: 18rem;
73+
max-width: 25rem;
7274
overflow-y: auto;
7375
}
7476
.item {
75-
margin-left: 20px;
76-
font-size: 14px;
77+
font-size: 0.875rem;
78+
margin-left: 1.25rem;
7779
font-weight: 400;
78-
cursor: pointer;
7980
color: #262626;
8081
word-wrap: break-word;
8182
text-decoration: none;
8283
width: 100%;
8384
}
8485
.item-container {
85-
padding: 0.3em 0;
86+
padding: 0.25rem 0;
8687
display: flex;
8788
place-items: center;
89+
cursor: pointer;
8890
}
8991
9092
.item-container:hover {
9193
background-color: #f5f5f5;
9294
}
9395
9496
.filter-input {
95-
margin-bottom: 0.5em;
97+
margin-bottom: 0.5rem;
9698
}
9799
98100
.clear {
99101
color: #262626;
100-
font-size: 14px;
101102
font-weight: 400;
102-
cursor: pointer;
103-
text-decoration: none;
104-
margin-left: 6px;
103+
margin-left: 0.375rem;
105104
}
106105
107106
.selected {
108-
margin-left: 6px;
109-
}
110-
111-
.fa-cross {
112-
width: 14px;
113-
height: 14px;
107+
margin-left: 0.375rem;
114108
}
115109
</style>

0 commit comments

Comments
 (0)