diff --git a/ui/pages/browser/[...slug].vue b/ui/pages/browser/[...slug].vue index 7a4b15e0..aa80639a 100644 --- a/ui/pages/browser/[...slug].vue +++ b/ui/pages/browser/[...slug].vue @@ -19,6 +19,20 @@
@@ -40,22 +54,47 @@ style="min-width: 1300px; table-layout: fixed;"> - # - Name - Size - Date + + # + + + + + + Name + + + + + + + Size + + + + + + + Date + + + + - + - + {{ item.name }} 0 ? route.params.slug?.join('/' const bg_enable = useStorage('random_bg', true) const bg_opacity = useStorage('random_bg_opacity', 0.85) +const sort_by = useStorage('sort_by', 'name') +const sort_order = useStorage('sort_order', 'asc') + +const search = ref('') +const show_filter = ref(false) + +const filteredItems = computed(() => { + if (!search.value) { + return sortedItems(items.value) + } + + const searchLower = search.value.toLowerCase() + return sortedItems(items.value.filter(item => { + return item.name.toLowerCase().includes(searchLower) + })) +}) + +const sortedItems = items => { + + if (!items || items.length < 1) { + return [] + } + + if ('name' === sort_by.value) { + return items.sort((a, b) => { + return 'asc' === sort_order.value ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name) + }) + } + + if (sort_by.value === 'size') { + return items.sort((a, b) => { + return 'asc' === sort_order.value ? a.size - b.size : b.size - a.size + }) + } + + if (sort_by.value === 'date') { + return items.sort((a, b) => { + let aDate = new Date(a.mtime) + let bDate = new Date(b.mtime) + return 'asc' === sort_order.value ? aDate - bDate : bDate - aDate + }) + } + + if (sort_by.value === 'type') { + return items.sort((a, b) => { + return 'asc' === sort_order.value ? a.content_type.localeCompare(b.content_type) : b.content_type.localeCompare(a.content_type) + }) + } + + return items +} + + const model_item = ref() const closeModel = () => model_item.value = null @@ -184,6 +276,11 @@ const handleClick = item => { } if ('dir' === item.content_type) { + if (search.value) { + search.value = '' + show_filter.value = false + } + reloadContent(item.path) return } @@ -321,4 +418,27 @@ const setIcon = item => { return 'fa-file' } + +const changeSort = by => { + if (!['name', 'size', 'date', 'type'].includes(by)) { + return + } + + if (by !== sort_by.value) { + sort_by.value = by + } + + sort_order.value = 'asc' === sort_order.value ? 'desc' : 'asc' +} + +const toggleFilter = () => { + show_filter.value = !show_filter.value + if (!show_filter.value) { + search.value = '' + return + } + + awaitElement('#search', e => e.focus()) +} +