4242
4343<script setup>
4444import { ref , onMounted } from ' vue'
45+ import { useRouter , useRoute } from ' vue-router'
4546import { Search } from ' lucide-vue-next'
4647import { Input } from ' @/components/ui/input'
4748import { 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
5371const filterOptions = [
5472 { label: ' None' , value: ' none' },
@@ -64,37 +82,48 @@ const sortOptions = [
6482
6583const 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
95120onMounted (() => {
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