33 <div class =" flex w-full" >
44 <div class =" flex flex-wrap justify-between w-full gap-2" >
55 <div class =" flex flex-wrap gap-2" >
6+ <input
7+ v-model =" searchQuery"
8+ name =" search"
9+ type =" text"
10+ class =" border-2 input input-bordered rounded-2xl placeholder-neutral-content"
11+ :placeholder =" `Search torrents`"
12+ @keyup.enter =" submitSearch"
13+ >
14+
15+ </div >
16+ <div class =" flex flex-wrap gap-1" >
617 <TorrustSelect
718 v-model:selected =" categoryFilters"
819 :options =" categories.map(entry => ({ name: entry.name, value: entry.name }))"
1728 :multiple =" true"
1829 search
1930 />
20- </div >
21- <div >
2231 <TorrustSelect v-model:selected =" selectedSorting" class =" ml-auto" :options =" sortingOptions" label =" Sort by" />
2332 </div >
2433 </div >
@@ -102,7 +111,13 @@ const selectedSorting = computed({
102111});
103112
104113watch (() => route .fullPath , () => {
105- searchQuery .value = route .query .search as string ;
114+ searchQuery .value = route .query .search as string ?? null ;
115+ itemsSorting .value = route .query .sorting as string ?? null ;
116+ pageSize .value = route .query .pageSize as number ?? null ;
117+ currentPage .value = route .query .page as number ?? null ;
118+ layout .value = route .query .layout as string ?? null ;
119+ categoryFilters .value = route .query .categoryFilters as string [] ?? null ;
120+ tagFilters .value = route .query .tagFilters as string [] ?? null ;
106121});
107122
108123watch ([searchQuery , itemsSorting , pageSize , currentPage , layout , categoryFilters , tagFilters ], () => {
@@ -123,12 +138,34 @@ watch([searchQuery, itemsSorting, pageSize, currentPage, layout, categoryFilters
123138
124139onActivated (() => {
125140 searchQuery .value = route .query .search as string ?? null ;
141+ itemsSorting .value = route .query .sorting as string ?? null ;
142+ pageSize .value = route .query .pageSize as number ?? null ;
143+ currentPage .value = route .query .page as number ?? null ;
144+ layout .value = route .query .layout as string ?? null ;
145+ categoryFilters .value = route .query .categoryFilters as string [] ?? null ;
146+ tagFilters .value = route .query .tagFilters as string [] ?? null ;
126147});
127148
128149onMounted (() => {
150+ searchQuery .value = route .query .search as string ?? null ;
129151 loadTorrents ();
130152});
131153
154+ function submitSearch () {
155+ navigateTo ({
156+ path: " /torrents" ,
157+ query: {
158+ search: searchQuery .value ,
159+ sorting: itemsSorting .value ,
160+ pageSize: pageSize .value ,
161+ page: 1 ,
162+ layout: layout .value ,
163+ categoryFilters: categoryFilters .value ,
164+ tagFilters: tagFilters .value
165+ }
166+ });
167+ }
168+
132169function loadTorrents () {
133170 rest .value .torrent .getTorrents (
134171 {
0 commit comments