RuralDatabase/apps/web/components/user/section/bucket/detail.vue

151 lines
3.4 KiB
Vue

<script setup lang="ts">
const { path } = defineProps<{
path: string
}>()
// 定义双向绑定模态框的显示
const model = defineModel({
type: Boolean,
})
const filePath = ref(path)
effect(() => {
filePath.value = path
})
const { data, refresh, pending, error } = useAsyncData(
'bucketApi.detail.info',
() => bucketApi.detail.info(filePath.value),
{
watch: [filePath],
default: (): FileinfoData => ({
ChunkList: {
Chunks: [],
Total: 0,
},
Ctime: 0,
Mtime: 0,
Name: '',
Path: '',
Size: 0,
Type: '',
}),
})
const columns: {
key: keyof FileinfoDataChunkInfo
label?: string
sortable?: boolean
}[] = [{
key: 'ChunkID',
label: '分块名称',
sortable: true,
}, {
key: 'ChunkSize',
label: '分块大小',
class: ' truncate',
sortable: true,
}, {
key: 'InternalURL',
label: '存储地址',
sortable: true,
}, {
key: 'ServerTags',
label: '服务器',
sortable: true,
}, {
key: 'DataCenterTags',
label: '数据中心',
sortable: true,
}, {
key: 'Mtime',
}]
const query = ref('')
const pageIndex = ref(1)
const pageSize = ref(10)
// 分页
const list = computed(() => {
return data.value.ChunkList?.Chunks?.filter(i => i.ChunkID?.includes(query.value)).slice((pageIndex.value - 1) * pageSize.value, pageIndex.value * pageSize.value) ?? []
})
const fileInfo = computed(() => ([
{
name: '文件名',
value: data.value.Name,
},
{
name: '文件大小',
value: merticKB(data.value.Size ?? 0) as string,
},
{
name: '路径',
value: (data.value.Path),
},
{
name: '后缀',
value: (data.value.Type),
},
{
name: '创建时间',
value: format.dateTime(data.value.Ctime),
},
{
name: '修改时间',
value: format.dateTime(data.value.Mtime),
},
]))
const { copy } = useClipboard()
</script>
<template>
<UDashboardModal v-model="model" title="文件详情" description="查看文件具体内容信息" :ui="{ width: 'sm:max-w-2xl' }">
<div class="grid grid-cols-1 md:grid-cols-2">
<div v-for="item in fileInfo" :key="item.name" class="grid w-full grid-cols-4 px-2">
<div class="col-span-1 pl-2 border-l-2 typography-muted border-gray-500/50">
{{ item.name }}
</div>
<div
class="w-full col-span-3 truncate cursor-pointer typography-muted"
:title="`点击复制:${item.value}`"
@click="copy(item.value!)"
>
{{ item.value }}
</div>
</div>
</div>
<TableBase
$selected="selected"
$query="query"
$page-index="pageIndex"
$page-size="pageSize"
:loading="pending"
:error="error"
:list="list"
:page-total="data.ChunkList?.Total ?? 0"
:columns="columns"
:refresh="refresh"
>
<template #ChunkSize-data="{ row }">
<SizeBadge :size="row.ChunkSize ?? 0" />
</template>
<template #InternalURL-data="{ row }">
<p v-for="i in row.InternalURL" :key="i">
{{ i }}
</p>
</template>
<template #ServerTags-data="{ row }">
<p v-for="i in row.ServerTags" :key="i">
{{ i }}
</p>
</template>
<template #DataCenterTags-data="{ row }">
<p v-for="i in row.DataCenterTags" :key="i">
{{ i }}
</p>
</template>
</TableBase>
</UDashboardModal>
</template>