99 class =" h-8 border-2 input input-bordered rounded-2xl placeholder-neutral-content"
1010 :placeholder =" `Filter by username`"
1111 >
12-
12+ < TorrustSelect v-model:selected = " selectedSorting " class = " ml-auto " :options = " sortingOptions " label = " Sort by " />
1313 </div >
1414 <UserTable :user-profiles =" userProfiles" />
1515 <Pagination v-model:current-page =" currentPage" v-model:page-size =" pageSize" :total-results =" userProfilesTotal" />
@@ -23,6 +23,14 @@ import { notify } from "notiwind-ts";
2323import type { UserProfile } from " torrust-index-types-lib" ;
2424import { onMounted , ref , watch } from " #imports" ;
2525import { useRestApi } from " ~/composables/states" ;
26+ import type { TorrustSelectOption } from " components/TorrustSelect.vue" ;
27+
28+ const sortingOptions: Array <TorrustSelectOption > = [
29+ { name: " Registration date (Newest first)" , value: " DateRegisteredNewest" },
30+ { name: " Registration date (Oldest first)" , value: " DateRegisteredOldest" },
31+ { name: " Username (A to Z)" , value: " UsernameAZ" },
32+ { name: " Username (Z to A)" , value: " UsernameZA" }
33+ ];
2634
2735const route = useRoute ();
2836const router = useRouter ();
@@ -35,9 +43,21 @@ const userProfiles: Ref<Array<UserProfile>> = ref([]);
3543const userProfilesTotal = ref (0 );
3644const currentPage: Ref <number > = ref (Number (route .query ?.page as string ) || 1 );
3745const searchQuery: Ref <string > = ref (null );
46+ const itemsSorting: Ref <string > = ref (route .query ?.sorting as string || sortingOptions [0 ].value );
47+
48+ const selectedSorting = computed ({
49+ get () {
50+ return [itemsSorting .value ];
51+ },
52+ set (value ) {
53+ itemsSorting .value = value [0 ];
54+ currentPage .value = 1 ;
55+ }
56+ });
3857
3958watch (() => route .fullPath , () => {
4059 searchQuery .value = route .query .search as string ?? null ;
60+ itemsSorting .value = route .query .sorting as string ?? sortingOptions [0 ].value ;
4161 currentPage .value = isNaN (route .query .page ) ? 1 : parseInt (route .query .page );
4262 pageSize .value = isNaN (route .query .pageSize ) ? defaultPageSize : parseInt (route .query .pageSize );
4363});
@@ -46,6 +66,7 @@ watch(currentPage, () => {
4666 router .push ({
4767 query: {
4868 search: searchQuery .value ,
69+ sorting: itemsSorting .value ? itemsSorting .value : sortingOptions [0 ].value ,
4970 pageSize: pageSize .value ,
5071 page: currentPage .value
5172 }
@@ -59,6 +80,7 @@ watch([pageSize, searchQuery], () => {
5980 router .push ({
6081 query: {
6182 search: searchQuery .value ,
83+ sorting: itemsSorting .value ? itemsSorting .value : sortingOptions [0 ].value ,
6284 pageSize: pageSize .value ,
6385 page: 1
6486 }
@@ -69,6 +91,7 @@ watch([pageSize, searchQuery], () => {
6991
7092onActivated (() => {
7193 searchQuery .value = route .query .search as string ?? null ;
94+ itemsSorting .value = route .query .sorting as string ?? sortingOptions [0 ].value ;
7295 pageSize .value = route .query .pageSize as number ?? defaultPageSize ;
7396 currentPage .value = route .query .page as number ?? 1 ;
7497});
0 commit comments