diff --git a/DysonNetwork.Drive/Client/src/components/FilePoolSelect.vue b/DysonNetwork.Drive/Client/src/components/FilePoolSelect.vue new file mode 100644 index 0000000..22b6bbc --- /dev/null +++ b/DysonNetwork.Drive/Client/src/components/FilePoolSelect.vue @@ -0,0 +1,198 @@ + + + diff --git a/DysonNetwork.Drive/Client/src/views/dashboard/files.vue b/DysonNetwork.Drive/Client/src/views/dashboard/files.vue index 6611c7f..d335018 100644 --- a/DysonNetwork.Drive/Client/src/views/dashboard/files.vue +++ b/DysonNetwork.Drive/Client/src/views/dashboard/files.vue @@ -1,6 +1,22 @@ @@ -27,10 +43,12 @@ import { import { h, onMounted, ref } from 'vue' import { useRouter } from 'vue-router' import { formatBytes } from '../format' +import FilePoolSelect from '@/components/FilePoolSelect.vue' const router = useRouter() const files = ref([]) +const filePool = ref(null) const tableColumns: DataTableColumns = [ { @@ -95,7 +113,6 @@ const tableColumns: DataTableColumns = [ h( NButton, { - quaternary: true, circle: true, text: true, onClick: () => { @@ -109,7 +126,6 @@ const tableColumns: DataTableColumns = [ h( NButton, { - quaternary: true, circle: true, text: true, type: 'error', @@ -129,11 +145,19 @@ const tableColumns: DataTableColumns = [ const tablePagination = ref({ page: 1, itemCount: 0, + pageSize: 10, + showSizePicker: true, + pageSizes: [10, 20, 30, 40, 50], }) async function fetchFiles() { + if (loading.value) return try { - const response = await fetch('/api/files/me') + loading.value = true + const pag = tablePagination.value + const response = await fetch( + `/api/files/me?take=${pag.pageSize}&offset=${(pag.page! - 1) * pag.pageSize!}${filePool.value ? '&pool=' + filePool.value : ''}`, + ) if (!response.ok) { throw new Error('Network response was not ok') } @@ -142,10 +166,19 @@ async function fetchFiles() { tablePagination.value.itemCount = parseInt(response.headers.get('x-total') ?? '0') } catch (error) { console.error('Failed to fetch files:', error) + } finally { + loading.value = false } } onMounted(() => fetchFiles()) +function handlePageChange(page: number) { + tablePagination.value.page = page + fetchFiles() +} + +const loading = ref(false) + const dialog = useDialog() const messageDialog = useMessage() const loadingBar = useLoadingBar() diff --git a/DysonNetwork.Drive/Client/src/views/index.vue b/DysonNetwork.Drive/Client/src/views/index.vue index af6cfd2..7c52755 100644 --- a/DysonNetwork.Drive/Client/src/views/index.vue +++ b/DysonNetwork.Drive/Client/src/views/index.vue @@ -23,17 +23,7 @@
- +
@@ -134,6 +124,8 @@ import { useUserStore } from '@/stores/user' import type { SnFilePool } from '@/types/pool' import { formatBytes } from './format' +import FilePoolSelect from '@/components/FilePoolSelect.vue' + import * as tus from 'tus-js-client' const userStore = useUserStore() diff --git a/DysonNetwork.Drive/Storage/FileController.cs b/DysonNetwork.Drive/Storage/FileController.cs index 3dae816..0a79310 100644 --- a/DysonNetwork.Drive/Storage/FileController.cs +++ b/DysonNetwork.Drive/Storage/FileController.cs @@ -146,16 +146,17 @@ public class FileController( .Where(e => e.AccountId == accountId) .Include(e => e.Pool) .OrderByDescending(e => e.CreatedAt) - .Skip(offset) - .Take(take); + .AsQueryable(); if (pool.HasValue) query = query.Where(e => e.PoolId == pool); - - var files = await query.ToListAsync(); - + var total = await query.CountAsync(); Response.Headers.Append("X-Total", total.ToString()); + var files = await query + .Skip(offset) + .Take(take) + .ToListAsync(); return Ok(files); }