|
2 | 2 | <n-page-header subtitle="" @back="router.back()"> |
3 | 3 | <template #title> |
4 | 4 | <div class="flex items-center justify-between"> |
5 | | - <n-input placeholder="搜索"> |
| 5 | + <n-input placeholder="搜索" v-model:value="searchTerm" @update:value="handleSearch"> |
6 | 6 | <template #prefix> |
7 | 7 | <Icon name="ri:search-2-line" /> |
8 | 8 | </template> |
|
48 | 48 | </div> |
49 | 49 | </template> |
50 | 50 | </n-page-header> |
51 | | - <n-data-table class="border dark:border-neutral-700 rounded overflow-hidden" :columns="columns" :data="objects" :row-key="rowKey" @update:checked-row-keys="handleCheck" |
| 51 | + <n-data-table class="border dark:border-neutral-700 rounded overflow-hidden" :columns="columns" :data="filteredObjects" :row-key="rowKey" @update:checked-row-keys="handleCheck" |
52 | 52 | :pagination="false" :bordered="false" /> |
53 | 53 | <object-upload-picker :show="uploadPickerVisible" @update:show="(val) => (uploadPickerVisible = val && refresh())" :bucketName="bucketName" :prefix="prefix" /> |
54 | 54 | <object-new-form :show="newObjectFormVisible" :asPrefix="newObjectAsPrefix" @update:show="(val) => (newObjectFormVisible = val && refresh())" :bucketName="bucketName" |
@@ -86,6 +86,26 @@ const props = defineProps<{ bucket: string; path: string }>(); |
86 | 86 | const uploadPickerVisible = ref(false); |
87 | 87 | const newObjectFormVisible = ref(false); |
88 | 88 | const newObjectAsPrefix = ref(false); |
| 89 | +const searchTerm = ref(''); |
| 90 | +
|
| 91 | +// Add debounce function for search |
| 92 | +const debounce = (fn: Function, delay: number) => { |
| 93 | + let timer: NodeJS.Timeout | null = null; |
| 94 | + return (...args: any[]) => { |
| 95 | + if (timer) clearTimeout(timer); |
| 96 | + timer = setTimeout(() => { |
| 97 | + fn(...args); |
| 98 | + }, delay); |
| 99 | + }; |
| 100 | +}; |
| 101 | +
|
| 102 | +const handleSearch = debounce(() => { |
| 103 | + // Reset pagination when searching |
| 104 | + if (continuationToken.value) { |
| 105 | + continuationToken.value = undefined; |
| 106 | + tokenHistory.value = []; |
| 107 | + } |
| 108 | +}, 300); |
89 | 109 |
|
90 | 110 | // 上传任务 |
91 | 111 | const uploadTaskStore = useUploadTaskManagerStore(); |
@@ -232,7 +252,18 @@ const objects = computed(() => { |
232 | 252 | ); |
233 | 253 | }); |
234 | 254 |
|
| 255 | +// New computed property to filter objects based on search term |
| 256 | +const filteredObjects = computed(() => { |
| 257 | + if (!searchTerm.value.trim()) { |
| 258 | + return objects.value; |
| 259 | + } |
235 | 260 |
|
| 261 | + const term = searchTerm.value.toLowerCase(); |
| 262 | + return objects.value.filter(obj => { |
| 263 | + const displayKey = prefix.value ? obj.Key?.substring(prefix.value.length) : obj.Key; |
| 264 | + return displayKey?.toLowerCase().includes(term); |
| 265 | + }); |
| 266 | +}); |
236 | 267 |
|
237 | 268 | /** ************************************批量删除 */ |
238 | 269 | function rowKey(row: any): string { |
|
0 commit comments