| <script setup lang="ts"> |
| import { computed } from 'vue'; |
| import { FolderIcon } from 'tdesign-icons-vue-next'; |
| import type { Account } from '../services/accountApi'; |
|
|
| const props = defineProps<{ |
| selectedAccount: number | ''; |
| currentPath: string; |
| accounts: Account[]; |
| isNewFile?: boolean; |
| isUploadFile?: boolean; |
| }>(); |
|
|
| const emit = defineEmits<{ |
| (e: 'pathClick', path: string): void; |
| (e: 'rootClick'): void; |
| (e: 'update:selectedAccount', value: number): void; |
| }>(); |
|
|
| const pathBreadcrumbs = computed(() => { |
| const { currentPath, isNewFile } = props; |
| if (isNewFile) { |
| // For new files, show "新建文件" at the end of the breadcrumb |
| const paths = currentPath ? currentPath.split('/').filter(Boolean) : []; |
| const breadcrumbs = paths.map((path: string, index: number) => ({ |
| text: path, |
| path: paths.slice(0, index + 1).join('/') |
| })); |
|
|
| return breadcrumbs; |
| } |
|
|
| // Regular file browsing |
| if (!currentPath || typeof currentPath !== 'string') return []; |
| const paths = currentPath.split('/').filter(Boolean); |
| if (paths.length === 0) return []; |
| return paths.map((path: string, index: number) => ({ |
| text: path, |
| path: paths.slice(0, index + 1).join('/') |
| })); |
| }); |
| </script> |
|
|
| <template> |
| <div class="header-section bg-white p-4 rounded-lg shadow-sm"> |
| <div class="flex flex-col md:flex-row md:items-center md:justify-between gap-3"> |
| <div class="flex flex-col md:flex-row md:items-center gap-3"> |
| <t-select :value="selectedAccount" class="w-full md:w-64" placeholder="选择仓库" |
| @update:value="(val: number) => emit('update:selectedAccount', val)"> |
| <t-option v-for="acc in accounts" :key="acc.id" :value="acc.id" :label="`${acc.owner}/${acc.repo}`" /> |
| </t-select> |
|
|
| <t-breadcrumb v-if="currentPath && pathBreadcrumbs.length > 0 || isNewFile || isUploadFile" class="mt-3"> |
| <t-breadcrumb-item @click="emit('rootClick')" class="cursor-pointer hover:text-blue-500"> |
| <span class="flex items-center gap-1"> |
| <FolderIcon /> 根目录 |
| </span> |
| </t-breadcrumb-item> |
| <t-breadcrumb-item v-for="item in pathBreadcrumbs" :key="item.path" @click="emit('pathClick', item.path)" |
| class="cursor-pointer hover:text-blue-500"> |
| {{ item.text }} |
| </t-breadcrumb-item> |
| </t-breadcrumb> |
| </div> |
| <slot></slot> |
| </div> |
| </div> |
| </template> |
|
|