Skip to content

Commit 028135c

Browse files
committed
add URL filter
1 parent 4f070b5 commit 028135c

File tree

1 file changed

+64
-7
lines changed

1 file changed

+64
-7
lines changed

webui/src/components/dashboard/http/Requests.vue

Lines changed: 64 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,28 +35,31 @@ const dialogRef = useTemplateRef('dialogRef')
3535
let dialog: Modal | undefined;
3636
type CheckboxFilter = 'Not' | 'Single' | 'Multi'
3737
interface Filter {
38-
service: FilterItem
39-
method: FilterItem & { custom?: string}
38+
service: MultiFilterItem
39+
method: MultiFilterItem & { custom?: string}
40+
url: FilterItem
4041
}
4142
interface FilterItem {
43+
checkbox: boolean
44+
value: any
45+
}
46+
interface MultiFilterItem {
4247
checkbox: boolean
4348
state: CheckboxFilter
4449
value: string[]
4550
}
4651
const filter = reactive<Filter>({
4752
service: { state: 'Not', checkbox: false, value: [] },
48-
method: { state: 'Not', checkbox: false, value: ['GET']}
53+
method: { state: 'Not', checkbox: false, value: ['GET']},
54+
url: { checkbox: false, value: null}
4955
})
5056
5157
onMounted(() => {
5258
dialog = Modal.getOrCreateInstance(dialogRef.value!);
5359
const s = localStorage.getItem(`http-requests-${getFilterCacheKey()}`)
54-
console.log('load ' +props.serviceName)
55-
console.log(s)
5660
if (s && s !== '') {
5761
const saved = JSON.parse(s)
5862
Object.assign(filter, saved)
59-
console.log(filter)
6063
}
6164
})
6265
@@ -113,6 +116,12 @@ const events = computed<ServiceEvent[]>(() => {
113116
return false;
114117
})
115118
}
119+
if (filter.url.value && filter.url.value['test']) {
120+
result = result.filter(x => {
121+
const data = x.data as HttpEventData
122+
return filter.url.value.test(data.request.url)
123+
})
124+
}
116125
return result
117126
})
118127
@@ -183,7 +192,7 @@ onUnmounted(() => {
183192
function showDialog() {
184193
dialog?.show()
185194
}
186-
function changeCheckbox(fi: FilterItem) {
195+
function changeCheckbox(fi: MultiFilterItem) {
187196
switch (fi.state) {
188197
case 'Not':
189198
fi.state = 'Single';
@@ -210,6 +219,10 @@ const activeFiltersCount = computed(() => {
210219
if (filter.method.state !== 'Not') {
211220
counter++;
212221
}
222+
if (filter.url.checkbox && filter.url.value) {
223+
console.log(filter.url.value)
224+
counter++;
225+
}
213226
return counter;
214227
})
215228
function getFilterCacheKey() {
@@ -221,6 +234,31 @@ function getFilterCacheKey() {
221234
}
222235
return `filter-${props.serviceName}-${props.path}-${props.method}`
223236
}
237+
const regexInput = ref('')
238+
const regexError = ref<any>(null)
239+
let debounceTimer: number | null = null
240+
watch(regexInput, (value) => {
241+
if (debounceTimer) {
242+
clearTimeout(debounceTimer)
243+
}
244+
245+
try {
246+
const v = value.trim();
247+
if (!v) {
248+
filter.url.value = null
249+
regexError.value = null
250+
return
251+
}
252+
filter.url.value = new RegExp(v)
253+
regexError.value = null
254+
} catch (error) {
255+
debounceTimer = setTimeout(() => {
256+
regexError.value = error
257+
filter.url.value = null
258+
}, 1500)
259+
}
260+
261+
})
224262
</script>
225263

226264
<template>
@@ -326,6 +364,25 @@ function getFilterCacheKey() {
326364
</div>
327365
</div>
328366

367+
<div class="row">
368+
<div class="col">
369+
<div class="form-check">
370+
<input class="form-check-input" type="checkbox" v-model="filter.url.checkbox" id="url">
371+
<label class="form-check-label" for="url">URL</label>
372+
</div>
373+
</div>
374+
<div class="col">
375+
<div class="row me-0" v-if="filter.url.checkbox">
376+
<input type="text" class="form-control form-control-sm" id="method-custom" v-model="regexInput" placeholder="Regex" :class="{ 'is-invalid': regexError }">
377+
</div>
378+
</div>
379+
</div>
380+
<div class="row mb-3">
381+
<div class="invalid-feedback" v-if="regexError" style="display: inline;">
382+
Invalid regular expression: {{ regexError }}
383+
</div>
384+
</div>
385+
329386
</div>
330387
</div>
331388
</div>

0 commit comments

Comments
 (0)