Skip to content

Commit a59f6b4

Browse files
committed
Bucket list filter changes: Show All, Needs triage, Logged, Triaged buttons and filter by triage status, change url hash from query string to a different format, separate Advance query mode
1 parent 07f2e30 commit a59f6b4

9 files changed

Lines changed: 599 additions & 658 deletions

File tree

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
<template>
2+
<div>
3+
<div class="btn-group" role="group" aria-label="Bucket status filter">
4+
<button
5+
v-for="tab in bucketStates"
6+
:key="tab.key"
7+
type="button"
8+
:class="[
9+
'btn',
10+
activeState === tab.key ? 'btn-primary' : 'btn-default',
11+
]"
12+
:disabled="disabled"
13+
@click="setStatus(tab.key)"
14+
>
15+
{{ tab.label }}
16+
</button>
17+
</div>
18+
19+
<div class="filter-row">
20+
<div class="input-group input-group-sm domain-input">
21+
<span class="input-group-addon"><i class="bi bi-globe2"></i></span>
22+
<input
23+
ref="domainInput"
24+
:value="domainFilter"
25+
type="text"
26+
class="form-control"
27+
placeholder="Domain filter…"
28+
:disabled="disabled"
29+
@change="onDomainChange"
30+
@keyup.enter="onDomainChange"
31+
/>
32+
<span class="input-group-btn">
33+
<button
34+
class="btn btn-default btn-sm"
35+
type="button"
36+
:disabled="disabled"
37+
@click="onDomainSearch"
38+
>
39+
<i class="bi bi-search"></i>
40+
</button>
41+
<button
42+
v-if="domainFilter"
43+
class="btn btn-default btn-sm"
44+
type="button"
45+
@click="$emit('filter-change', { domainFilter: '' })"
46+
>
47+
48+
</button>
49+
</span>
50+
</div>
51+
52+
<template v-for="filter in visibleFilters" :key="filter.key">
53+
<select
54+
v-if="filter.type === 'single'"
55+
:value="triageStatus"
56+
class="form-control input-sm"
57+
style="width: auto"
58+
:data-filter="filter.key"
59+
:disabled="disabled"
60+
@change="onFilterChange(filter, $event.target.value || null)"
61+
>
62+
<option value="">Any {{ filter.label }}</option>
63+
<option
64+
v-for="opt in filter.options"
65+
:key="opt.value"
66+
:value="opt.value"
67+
>
68+
{{ opt.label }}
69+
</option>
70+
</select>
71+
</template>
72+
</div>
73+
<a class="advanced-link text-muted" @click="$emit('show-advanced')"
74+
>Switch to advance mode ›</a
75+
>
76+
</div>
77+
</template>
78+
79+
<script>
80+
import { BUCKET_STATES } from "../../filter_helpers";
81+
82+
export const FILTERS = [
83+
{
84+
key: "triageStatus",
85+
label: "Triage Status",
86+
queryField: "triage_status",
87+
type: "single",
88+
visibleWhen: "triaged",
89+
},
90+
];
91+
92+
export default {
93+
name: "FilterBar",
94+
props: {
95+
activeState: { type: String, required: true },
96+
domainFilter: { type: String, default: "" },
97+
triageStatus: { type: String, default: null },
98+
triageStatusOptions: { type: Array, default: () => [] },
99+
disabled: { type: Boolean, default: false },
100+
},
101+
emits: ["filter-change", "show-advanced"],
102+
computed: {
103+
bucketStates() {
104+
return BUCKET_STATES;
105+
},
106+
visibleFilters() {
107+
return FILTERS.filter(
108+
(f) => !f.visibleWhen || f.visibleWhen === this.activeState,
109+
).map((f) => ({
110+
...f,
111+
options:
112+
f.key === "triageStatus"
113+
? this.triageStatusOptions
114+
: (f.options ?? []),
115+
}));
116+
},
117+
},
118+
methods: {
119+
setStatus(status) {
120+
const update = { activeState: status };
121+
if (status !== "triaged") update.triageStatus = null;
122+
this.$emit("filter-change", update);
123+
},
124+
onDomainChange(e) {
125+
this.$emit("filter-change", { domainFilter: e.target.value });
126+
},
127+
onDomainSearch() {
128+
this.$emit("filter-change", {
129+
domainFilter: this.$refs.domainInput.value,
130+
});
131+
},
132+
onFilterChange(filter, value) {
133+
this.$emit("filter-change", { [filter.key]: value });
134+
},
135+
},
136+
};
137+
</script>
138+
139+
<style scoped>
140+
.filter-row {
141+
display: flex;
142+
align-items: center;
143+
flex-wrap: wrap;
144+
gap: 8px;
145+
margin-top: 10px;
146+
}
147+
.domain-input {
148+
width: 260px;
149+
}
150+
.advanced-link {
151+
margin-left: auto;
152+
font-size: 11px;
153+
cursor: pointer;
154+
}
155+
</style>

0 commit comments

Comments
 (0)