Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 11 additions & 3 deletions app/components/Package/ListControls.vue
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
<script setup lang="ts">
export type SortOption = 'downloads' | 'updated' | 'name-asc' | 'name-desc'
export type SortOption =
| 'downloads-desc'
| 'downloads-asc'
| 'updated-desc'
| 'updated-asc'
| 'name-asc'
| 'name-desc'

const props = defineProps<{
/** Current search/filter text */
Expand Down Expand Up @@ -32,8 +38,10 @@ const sortValue = computed({
const sortOptions = computed(
() =>
[
{ value: 'downloads', label: $t('package.sort.downloads') },
{ value: 'updated', label: $t('package.sort.updated') },
{ value: 'downloads-desc', label: $t('package.sort.downloads_desc') },
{ value: 'downloads-asc', label: $t('package.sort.downloads_asc') },
{ value: 'updated-desc', label: $t('package.sort.updated_desc') },
{ value: 'updated-asc', label: $t('package.sort.updated_asc') },
{ value: 'name-asc', label: $t('package.sort.name_asc') },
{ value: 'name-desc', label: $t('package.sort.name_desc') },
] as const,
Expand Down
49 changes: 36 additions & 13 deletions app/pages/~[username]/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -24,27 +24,40 @@ const updateUrl = debounce((updates: { page?: number; filter?: string; sort?: st
...route.query,
page: updates.page && updates.page > 1 ? updates.page : undefined,
q: updates.filter || undefined,
sort: updates.sort && updates.sort !== 'downloads' ? updates.sort : undefined,
sort: updates.sort && updates.sort !== 'downloads-desc' ? updates.sort : undefined,
},
})
}, 300)

type SortOption = 'downloads' | 'updated' | 'name-asc' | 'name-desc'
type SortOption =
| 'downloads-desc'
| 'downloads-asc'
| 'updated-desc'
| 'updated-asc'
| 'name-asc'
| 'name-desc'

// Filter and sort state (from URL)
const filterText = shallowRef(
(Array.isArray(route.query.q) ? route.query.q[0] : route.query.q) ?? '',
)
const sortOption = shallowRef<SortOption>(
((Array.isArray(route.query.sort) ? route.query.sort[0] : route.query.sort) as SortOption) ||
'downloads',
)
const rawSort = (Array.isArray(route.query.sort) ? route.query.sort[0] : route.query.sort) as
| SortOption
| 'downloads'
| 'updated'
| undefined
const normalizedSort: SortOption =
rawSort === 'downloads'
? 'downloads-desc'
: rawSort === 'updated'
? 'updated-desc'
: (rawSort ?? 'downloads-desc')
Comment on lines +49 to +54
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Backwards compatibility


const sortOption = shallowRef<SortOption>(normalizedSort)

// Track if we've loaded all results (one-way flag, doesn't reset)
// Initialize to true if URL already has filter/sort params
const hasLoadedAll = shallowRef(
Boolean(route.query.q) || (route.query.sort && route.query.sort !== 'downloads'),
)
const hasLoadedAll = shallowRef(Boolean(route.query.q) || normalizedSort !== 'downloads-desc')

// Update URL when filter/sort changes (debounced)
const debouncedUpdateUrl = debounce((filter: string, sort: string) => {
Expand All @@ -53,7 +66,7 @@ const debouncedUpdateUrl = debounce((filter: string, sort: string) => {

watch([filterText, sortOption], ([filter, sort]) => {
// Once user interacts with filter/sort, load all results
if (!hasLoadedAll.value && (filter !== '' || sort !== 'downloads')) {
if (!hasLoadedAll.value && (filter !== '' || sort !== 'downloads-desc')) {
hasLoadedAll.value = true
}
debouncedUpdateUrl(filter, sort)
Expand Down Expand Up @@ -104,20 +117,30 @@ const filteredAndSortedPackages = computed(() => {

// Apply sort
switch (sortOption.value) {
case 'updated':
case 'updated-desc':
pkgs.sort((a, b) => {
const dateA = a.package.date || ''
const dateB = b.package.date || ''
return dateB.localeCompare(dateA)
})
break
case 'updated-asc':
pkgs.sort((a, b) => {
const dateA = a.package.date || ''
const dateB = b.package.date || ''
return dateA.localeCompare(dateB)
})
break
case 'name-asc':
pkgs.sort((a, b) => a.package.name.localeCompare(b.package.name))
break
case 'name-desc':
pkgs.sort((a, b) => b.package.name.localeCompare(a.package.name))
break
case 'downloads':
case 'downloads-asc':
pkgs.sort((a, b) => (a.downloads?.weekly ?? 0) - (b.downloads?.weekly ?? 0))
break
case 'downloads-desc':
default:
pkgs.sort((a, b) => (b.downloads?.weekly ?? 0) - (a.downloads?.weekly ?? 0))
break
Expand Down Expand Up @@ -158,7 +181,7 @@ function handlePageChange(page: number) {
watch(username, () => {
currentPage.value = 1
filterText.value = ''
sortOption.value = 'downloads'
sortOption.value = 'downloads-desc'
hasLoadedAll.value = false
})

Expand Down
6 changes: 4 additions & 2 deletions i18n/locales/ar.json
Original file line number Diff line number Diff line change
Expand Up @@ -318,8 +318,10 @@
"dependencies": "الاعتماديات"
},
"sort": {
"downloads": "الأكثر تنزيلًا",
"updated": "مُحدَّثة مؤخرًا",
"downloads_desc": "الأكثر تنزيلًا",
"downloads_asc": "الأقل تنزيلًا",
"updated_desc": "مُحدَّثة مؤخرًا",
"updated_asc": "الأقدم تحديثًا",
"name_asc": "الاسم (A-Z)",
"name_desc": "الاسم (Z-A)"
}
Expand Down
6 changes: 4 additions & 2 deletions i18n/locales/az.json
Original file line number Diff line number Diff line change
Expand Up @@ -337,8 +337,10 @@
"dependencies": "Asılılıqlar"
},
"sort": {
"downloads": "Ən çox endirilən",
"updated": "Son yenilənən",
"downloads_desc": "Ən çox endirilən",
"downloads_asc": "Ən az endirilən",
"updated_desc": "Son yenilənən",
"updated_asc": "Ən əvvəl yenilənən",
"name_asc": "Ad (A-Z)",
"name_desc": "Ad (Z-A)"
}
Expand Down
6 changes: 4 additions & 2 deletions i18n/locales/de-DE.json
Original file line number Diff line number Diff line change
Expand Up @@ -355,8 +355,10 @@
"dependencies": "Abhängigkeiten"
},
"sort": {
"downloads": "Meiste Downloads",
"updated": "Zuletzt aktualisiert",
"downloads_desc": "Meiste Downloads",
"downloads_asc": "Wenigste Downloads",
"updated_desc": "Zuletzt aktualisiert",
"updated_asc": "Am wenigsten kürzlich aktualisiert",
"name_asc": "Name (A-Z)",
"name_desc": "Name (Z-A)"
}
Expand Down
6 changes: 4 additions & 2 deletions i18n/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -374,8 +374,10 @@
"dependencies": "Dependencies"
},
"sort": {
"downloads": "Most downloaded",
"updated": "Recently updated",
"downloads_desc": "Most downloaded",
"downloads_asc": "Least downloaded",
"updated_desc": "Recently updated",
"updated_asc": "Least recently updated",
"name_asc": "Name (A-Z)",
"name_desc": "Name (Z-A)"
}
Expand Down
6 changes: 4 additions & 2 deletions i18n/locales/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -333,8 +333,10 @@
"get_started": "Empezar"
},
"sort": {
"downloads": "Más descargados",
"updated": "Recientemente actualizados",
"downloads_desc": "Más descargados",
"downloads_asc": "Menos descargados",
"updated_desc": "Recientemente actualizados",
"updated_asc": "Menos recientemente actualizados",
"name_asc": "Nombre (A-Z)",
"name_desc": "Nombre (Z-A)"
},
Expand Down
6 changes: 4 additions & 2 deletions i18n/locales/fr-FR.json
Original file line number Diff line number Diff line change
Expand Up @@ -335,8 +335,10 @@
"get_started": "Commencer"
},
"sort": {
"downloads": "Plus téléchargés",
"updated": "Récemment mis à jour",
"downloads_desc": "Plus téléchargés",
"downloads_asc": "Moins téléchargés",
"updated_desc": "Récemment mis à jour",
"updated_asc": "Moins récemment mis à jour",
"name_asc": "Nom (A-Z)",
"name_desc": "Nom (Z-A)"
},
Expand Down
6 changes: 4 additions & 2 deletions i18n/locales/hu-HU.json
Original file line number Diff line number Diff line change
Expand Up @@ -335,8 +335,10 @@
"dependencies": "Függőségek"
},
"sort": {
"downloads": "Legtöbbször letöltött",
"updated": "Legfrissebb",
"downloads_desc": "Legtöbbször letöltött",
"downloads_asc": "Legkevesebbet letöltött",
"updated_desc": "Legfrissebb",
"updated_asc": "Legrégebben frissített",
"name_asc": "Név (A-Z)",
"name_desc": "Név (Z-A)"
}
Expand Down
5 changes: 3 additions & 2 deletions i18n/locales/id-ID.json
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,9 @@
"total": "{size} total ukuran tidak terkompresi (termasuk semua {count} dependensi untuk linux-x64)"
}
},
"skills": {
"file_counts": {}
},
"links": {
"repo": "repo",
"homepage": "beranda",
Expand Down Expand Up @@ -355,8 +358,6 @@
"dependencies": "Dependensi"
},
"sort": {
"downloads": "Paling banyak diunduh",
"updated": "Terakhir diperbarui",
"name_asc": "Nama (A-Z)",
"name_desc": "Nama (Z-A)"
}
Expand Down
6 changes: 4 additions & 2 deletions i18n/locales/it-IT.json
Original file line number Diff line number Diff line change
Expand Up @@ -323,8 +323,10 @@
"dependencies": "Dipendenze"
},
"sort": {
"downloads": "Più scaricati",
"updated": "Aggiornati di recente",
"downloads_desc": "Più scaricati",
"downloads_asc": "Meno scaricati",
"updated_desc": "Aggiornati di recente",
"updated_asc": "Aggiornati meno di recente",
"name_asc": "Nome (A-Z)",
"name_desc": "Nome (Z-A)"
}
Expand Down
6 changes: 4 additions & 2 deletions i18n/locales/ja-JP.json
Original file line number Diff line number Diff line change
Expand Up @@ -323,8 +323,10 @@
"dependencies": "依存関係"
},
"sort": {
"downloads": "ダウンロード数順",
"updated": "更新順",
"downloads_desc": "ダウンロード数順",
"downloads_asc": "ダウンロード数が少ない順",
"updated_desc": "更新順",
"updated_asc": "更新が古い順",
"name_asc": "名前順(A-Z)",
"name_desc": "名前順(Z-A)"
}
Expand Down
5 changes: 3 additions & 2 deletions i18n/locales/ne-NP.json
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,9 @@
"total": "{size} कुल अनप्याक्ड साइज (linux-x64 का लागि {count} सबै डिपेन्डेन्सीहरू सहित)"
}
},
"skills": {
"file_counts": {}
},
"links": {
"repo": "रिपो",
"homepage": "होमपेज",
Expand Down Expand Up @@ -355,8 +358,6 @@
"dependencies": "डिपेन्डेन्सीहरू"
},
"sort": {
"downloads": "धेरै डाउनलोड भएका",
"updated": "भर्खरै अपडेट भएका",
"name_asc": "नाम (A-Z)",
"name_desc": "नाम (Z-A)"
}
Expand Down
6 changes: 4 additions & 2 deletions i18n/locales/pl-PL.json
Original file line number Diff line number Diff line change
Expand Up @@ -355,8 +355,10 @@
"dependencies": "Zależności"
},
"sort": {
"downloads": "Najczęściej pobierane",
"updated": "Ostatnio aktualizowane",
"downloads_desc": "Najczęściej pobierane",
"downloads_asc": "Najrzadziej pobierane",
"updated_desc": "Ostatnio aktualizowane",
"updated_asc": "Najdawniej aktualizowane",
"name_asc": "Nazwa (A-Z)",
"name_desc": "Nazwa (Z-A)"
}
Expand Down
6 changes: 4 additions & 2 deletions i18n/locales/pt-BR.json
Original file line number Diff line number Diff line change
Expand Up @@ -355,8 +355,10 @@
"dependencies": "Dependências"
},
"sort": {
"downloads": "Mais baixados",
"updated": "Recentemente atualizado",
"downloads_desc": "Mais baixados",
"downloads_asc": "Menos baixados",
"updated_desc": "Recentemente atualizado",
"updated_asc": "Menos recentemente atualizado",
"name_asc": "Nome (A-Z)",
"name_desc": "Nome (Z-A)"
}
Expand Down
6 changes: 4 additions & 2 deletions i18n/locales/ru-RU.json
Original file line number Diff line number Diff line change
Expand Up @@ -332,8 +332,10 @@
"dependencies": "Зависимости"
},
"sort": {
"downloads": "Больше всего скачиваний",
"updated": "Недавно обновлённые",
"downloads_desc": "Больше всего скачиваний",
"downloads_asc": "Меньше всего скачиваний",
"updated_desc": "Недавно обновлённые",
"updated_asc": "Давно не обновлявшиеся",
"name_asc": "Имя (А-Я)",
"name_desc": "Имя (Я-А)"
}
Expand Down
6 changes: 4 additions & 2 deletions i18n/locales/uk-UA.json
Original file line number Diff line number Diff line change
Expand Up @@ -337,8 +337,10 @@
"dependencies": "Залежності"
},
"sort": {
"downloads": "Найбільше завантажено",
"updated": "Недавно оновлено",
"downloads_desc": "Найбільше завантажено",
"downloads_asc": "Найменше завантажено",
"updated_desc": "Недавно оновлено",
"updated_asc": "Найдавніше оновлено",
"name_asc": "Ім'я (A-Z)",
"name_desc": "Ім'я (Z-A)"
}
Expand Down
6 changes: 4 additions & 2 deletions i18n/locales/zh-CN.json
Original file line number Diff line number Diff line change
Expand Up @@ -343,8 +343,10 @@
"dependencies": "依赖"
},
"sort": {
"downloads": "最多下载的",
"updated": "最近更新的",
"downloads_desc": "最多下载的",
"downloads_asc": "最少下载的",
"updated_desc": "最近更新的",
"updated_asc": "最久未更新的",
"name_asc": "名称(A-Z)",
"name_desc": "名称(Z-A)"
}
Expand Down
6 changes: 4 additions & 2 deletions lunaria/files/ar-EG.json
Original file line number Diff line number Diff line change
Expand Up @@ -318,8 +318,10 @@
"dependencies": "الاعتماديات"
},
"sort": {
"downloads": "الأكثر تنزيلًا",
"updated": "مُحدَّثة مؤخرًا",
"downloads_desc": "الأكثر تنزيلًا",
"downloads_asc": "الأقل تنزيلًا",
"updated_desc": "مُحدَّثة مؤخرًا",
"updated_asc": "الأقدم تحديثًا",
"name_asc": "الاسم (A-Z)",
"name_desc": "الاسم (Z-A)"
}
Expand Down
6 changes: 4 additions & 2 deletions lunaria/files/az.json
Original file line number Diff line number Diff line change
Expand Up @@ -337,8 +337,10 @@
"dependencies": "Asılılıqlar"
},
"sort": {
"downloads": "Ən çox endirilən",
"updated": "Son yenilənən",
"downloads_desc": "Ən çox endirilən",
"downloads_asc": "Ən az endirilən",
"updated_desc": "Son yenilənən",
"updated_asc": "Ən əvvəl yenilənən",
"name_asc": "Ad (A-Z)",
"name_desc": "Ad (Z-A)"
}
Expand Down
6 changes: 4 additions & 2 deletions lunaria/files/de-DE.json
Original file line number Diff line number Diff line change
Expand Up @@ -355,8 +355,10 @@
"dependencies": "Abhängigkeiten"
},
"sort": {
"downloads": "Meiste Downloads",
"updated": "Zuletzt aktualisiert",
"downloads_desc": "Meiste Downloads",
"downloads_asc": "Wenigste Downloads",
"updated_desc": "Zuletzt aktualisiert",
"updated_asc": "Am wenigsten kürzlich aktualisiert",
"name_asc": "Name (A-Z)",
"name_desc": "Name (Z-A)"
}
Expand Down
6 changes: 4 additions & 2 deletions lunaria/files/en-US.json
Original file line number Diff line number Diff line change
Expand Up @@ -374,8 +374,10 @@
"dependencies": "Dependencies"
},
"sort": {
"downloads": "Most downloaded",
"updated": "Recently updated",
"downloads_desc": "Most downloaded",
"downloads_asc": "Least downloaded",
"updated_desc": "Recently updated",
"updated_asc": "Least recently updated",
"name_asc": "Name (A-Z)",
"name_desc": "Name (Z-A)"
}
Expand Down
Loading