Skip to content

Commit a8c0451

Browse files
committed
feat(ui): Add query parameter functionality in SearchBar component
1 parent c5f7e5b commit a8c0451

File tree

1 file changed

+50
-21
lines changed

1 file changed

+50
-21
lines changed

web/app/src/components/SearchBar.vue

Lines changed: 50 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,31 @@
4242

4343
<script setup>
4444
import { ref, onMounted } from 'vue'
45+
import { useRouter, useRoute } from 'vue-router'
4546
import { Search } from 'lucide-vue-next'
4647
import { Input } from '@/components/ui/input'
4748
import { Select } from '@/components/ui/select'
4849
49-
const searchQuery = ref('')
50-
const filterBy = ref(localStorage.getItem('gatus:filter-by') || (typeof window !== 'undefined' && window.config?.defaultFilterBy) || 'none')
51-
const sortBy = ref(localStorage.getItem('gatus:sort-by') || (typeof window !== 'undefined' && window.config?.defaultSortBy) || 'name')
50+
const router = useRouter()
51+
const route = useRoute()
52+
53+
const [defaultFilterBy, defaultSortBy] = (() => {
54+
let filter = 'none'
55+
let sort = 'name'
56+
if (typeof window !== 'undefined' && window.config) {
57+
if (window.config.defaultFilterBy && window.config.defaultFilterBy !== '{{ .UI.DefaultFilterBy }}') {
58+
filter = window.config.defaultFilterBy
59+
}
60+
if (window.config.defaultSortBy && window.config.defaultSortBy !== '{{ .UI.DefaultSortBy }}') {
61+
sort = window.config.defaultSortBy
62+
}
63+
}
64+
return [filter, sort]
65+
})()
66+
67+
const searchQuery = ref(route.query.search || '')
68+
const filterBy = ref(route.query.filter || localStorage.getItem('gatus:filter-by') || defaultFilterBy)
69+
const sortBy = ref(route.query.sort || localStorage.getItem('gatus:sort-by') || defaultSortBy)
5270
5371
const filterOptions = [
5472
{ label: 'None', value: 'none' },
@@ -64,37 +82,48 @@ const sortOptions = [
6482
6583
const emit = defineEmits(['search', 'update:showOnlyFailing', 'update:showRecentFailures', 'update:groupByGroup', 'update:sortBy', 'initializeCollapsedGroups'])
6684
67-
const handleFilterChange = (value) => {
85+
const handleFilterChange = (value, updateLocalStorage = true) => {
6886
filterBy.value = value
69-
localStorage.setItem('gatus:filter-by', value)
87+
router.push({
88+
query: {
89+
...route.query,
90+
filter: value !== defaultFilterBy ? value : undefined
91+
}
92+
});
93+
if (updateLocalStorage)
94+
localStorage.setItem('gatus:filter-by', value)
7095
71-
// Reset all filter states first
72-
emit('update:showOnlyFailing', false)
73-
emit('update:showRecentFailures', false)
74-
75-
// Apply the selected filter
76-
if (value === 'failing') {
77-
emit('update:showOnlyFailing', true)
78-
} else if (value === 'unstable') {
79-
emit('update:showRecentFailures', true)
80-
}
96+
emit('update:showOnlyFailing', value === 'failing')
97+
emit('update:showRecentFailures', value === 'unstable')
8198
}
8299
83-
const handleSortChange = (value) => {
100+
const handleSortChange = (value, updateLocalStorage = true) => {
84101
sortBy.value = value
85-
localStorage.setItem('gatus:sort-by', value)
102+
router.push({
103+
query: {
104+
...route.query,
105+
sort: value !== defaultSortBy ? value : undefined
106+
}
107+
});
108+
if (updateLocalStorage)
109+
localStorage.setItem('gatus:sort-by', value)
110+
86111
emit('update:sortBy', value)
87112
emit('update:groupByGroup', value === 'group')
88-
113+
89114
// When switching to group view, initialize collapsed groups
90115
if (value === 'group') {
91116
emit('initializeCollapsedGroups')
92117
}
93118
}
94119
95120
onMounted(() => {
96-
// Apply saved filter/sort state on load
97-
handleFilterChange(filterBy.value)
98-
handleSortChange(sortBy.value)
121+
// Apply query search state on load
122+
if (searchQuery.value !== '')
123+
emit ('search', searchQuery.value)
124+
125+
// Apply saved or query filter/sort state on load
126+
handleFilterChange(filterBy.value, false)
127+
handleSortChange(sortBy.value, false)
99128
})
100129
</script>

0 commit comments

Comments
 (0)