mirror of
https://github.com/fastapiadmin/FastapiAdmin.git
synced 2026-09-25 21:57:48 +00:00
feat: 添加高亮行与序号列,优化全屏及缓存布局
This commit is contained in:
@@ -413,6 +413,7 @@ defineExpose({
|
||||
<ElButton type="danger" @click="handleClear" v-ripple>清除数据</ElButton>
|
||||
|
||||
<FaTable :data="tableData" style="margin-top: 10px">
|
||||
<ElTableColumn type="index" label="序号" width="60" />
|
||||
<ElTableColumn
|
||||
v-for="key in Object.keys(headers)"
|
||||
:key="key"
|
||||
|
||||
@@ -86,6 +86,7 @@ const handleFileChange = async (uploadFile: UploadFile) => {
|
||||
<ElButton type="danger" @click="handleClear" v-ripple>清除数据</ElButton>
|
||||
|
||||
<FaTable :data="tableData" style="margin-top: 10px">
|
||||
<ElTableColumn type="index" label="序号" width="60" />
|
||||
<ElTableColumn
|
||||
v-for="key in Object.keys(headers)"
|
||||
:key="key"
|
||||
|
||||
@@ -59,6 +59,61 @@
|
||||
</div>
|
||||
</div>
|
||||
</ElPopover>
|
||||
|
||||
<!-- 礼花效果介绍弹窗(放在 Popover 外,避免被 Popover 销毁) -->
|
||||
<ElDialog
|
||||
v-model="fireworksDialogVisible"
|
||||
title="礼花效果"
|
||||
width="480px"
|
||||
:close-on-click-modal="true"
|
||||
>
|
||||
<div class="px-2">
|
||||
<div class="mb-5 flex items-start gap-4">
|
||||
<div class="flex-cc size-14 rounded-xl bg-gradient-to-br from-purple-400 to-indigo-500">
|
||||
<FaSvgIcon icon="ri:loader-line" class="text-2xl text-white" />
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<h4 class="m-0 text-base font-semibold">节日礼花动画</h4>
|
||||
<p class="mt-1 text-sm text-g-500 leading-relaxed">
|
||||
根据当前节日自动匹配对应素材的全屏 Canvas 烟花效果,支持多种粒子形状和绚丽色彩。
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<ElDivider />
|
||||
|
||||
<div class="space-y-3">
|
||||
<div class="flex items-center gap-3">
|
||||
<ElTag type="primary" class="!rounded-md !border-0 flex-shrink-0">快捷键</ElTag>
|
||||
<span class="text-sm text-g-600">
|
||||
<ElTag size="small" class="!mr-1">Ctrl</ElTag>
|
||||
+
|
||||
<ElTag size="small" class="!mx-1">Shift</ElTag>
|
||||
+
|
||||
<ElTag size="small" class="!ml-1">P</ElTag>
|
||||
<span class="mx-2 text-g-400">/</span>
|
||||
<ElTag size="small" class="!mr-1">⌘</ElTag>
|
||||
+
|
||||
<ElTag size="small" class="!mx-1">Shift</ElTag>
|
||||
+
|
||||
<ElTag size="small" class="!ml-1">P</ElTag>
|
||||
</span>
|
||||
</div>
|
||||
<div class="flex items-center gap-3">
|
||||
<ElTag type="success" class="!rounded-md !border-0 flex-shrink-0">节日素材</ElTag>
|
||||
<span class="text-sm text-g-600">
|
||||
礼花素材与当前节日配置一致,自动匹配春节、元宵、中秋等传统节日主题
|
||||
</span>
|
||||
</div>
|
||||
<div class="flex items-center gap-3">
|
||||
<ElTag type="warning" class="!rounded-md !border-0 flex-shrink-0">触发方式</ElTag>
|
||||
<span class="text-sm text-g-600">
|
||||
页面加载时自动检测节日并连发,也可通过快捷键手动触发一次
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</ElDialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
@@ -69,6 +124,7 @@ defineOptions({ name: "FaFastEnter" });
|
||||
|
||||
const router = useRouter();
|
||||
const popoverRef = ref();
|
||||
const fireworksDialogVisible = ref(false);
|
||||
|
||||
// 使用快速入口配置
|
||||
const { enabledApplications, enabledQuickLinks } = useFastEnter();
|
||||
@@ -104,6 +160,11 @@ const handleNavigate = (
|
||||
* @param application 应用配置对象
|
||||
*/
|
||||
const handleApplicationClick = (application: FastEnterApplication): void => {
|
||||
if (application.isDialog) {
|
||||
popoverRef.value?.hide();
|
||||
fireworksDialogVisible.value = true;
|
||||
return;
|
||||
}
|
||||
handleNavigate(application.routeName, application.link, application.routeQuery);
|
||||
};
|
||||
|
||||
@@ -112,6 +173,11 @@ const handleApplicationClick = (application: FastEnterApplication): void => {
|
||||
* @param quickLink 快速链接配置对象
|
||||
*/
|
||||
const handleQuickLinkClick = (quickLink: FastEnterQuickLink): void => {
|
||||
if (quickLink.isDialog) {
|
||||
popoverRef.value?.hide();
|
||||
fireworksDialogVisible.value = true;
|
||||
return;
|
||||
}
|
||||
handleNavigate(quickLink.routeName, quickLink.link, quickLink.routeQuery);
|
||||
};
|
||||
</script>
|
||||
|
||||
@@ -139,6 +139,9 @@
|
||||
<ElCheckbox v-model="isHeaderBackground" :value="true">
|
||||
{{ t("table.headerBackground") }}
|
||||
</ElCheckbox>
|
||||
<ElCheckbox v-model="highlightCurrentRow" :value="true">
|
||||
{{ t("table.highlightCurrentRow") }}
|
||||
</ElCheckbox>
|
||||
</div>
|
||||
</ElPopover>
|
||||
<slot name="right"></slot>
|
||||
@@ -179,7 +182,7 @@ interface Props {
|
||||
}
|
||||
|
||||
const props = withDefaults(defineProps<Props>(), {
|
||||
fullClass: "fa-page-view",
|
||||
fullClass: "fa-table-card",
|
||||
layout: "search,refresh,size,fullscreen,columns,rowDrag,settings",
|
||||
showSearchBar: undefined,
|
||||
});
|
||||
@@ -224,7 +227,8 @@ const tableSizeOptions = [
|
||||
];
|
||||
|
||||
const tableStore = useTableStore();
|
||||
const { tableSize, isZebra, isBorder, isHeaderBackground, isRowDrag } = storeToRefs(tableStore);
|
||||
const { tableSize, isZebra, isBorder, isHeaderBackground, isRowDrag, highlightCurrentRow } =
|
||||
storeToRefs(tableStore);
|
||||
|
||||
const toggleRowDrag = () => {
|
||||
tableStore.setIsRowDrag(!isRowDrag.value);
|
||||
@@ -289,12 +293,29 @@ const isFullScreen = ref(false);
|
||||
/** 保存原始的 overflow 样式,用于退出全屏时恢复 */
|
||||
const originalOverflow = ref("");
|
||||
|
||||
/**
|
||||
* 查找可全屏的容器元素
|
||||
* 优先取 .fa-table-card 的父级(包含搜索栏 + 表格卡片),其次降级到 fullClass
|
||||
*/
|
||||
const findFullscreenContainer = (): HTMLElement | null => {
|
||||
const headerEl = document.getElementById("fa-table-header");
|
||||
if (headerEl) {
|
||||
const card = headerEl.closest(`.${props.fullClass}`);
|
||||
if (card?.parentElement) {
|
||||
// 取父级 — 通常包裹了搜索栏 + 表格卡片
|
||||
return card.parentElement as HTMLElement;
|
||||
}
|
||||
if (card) return card as HTMLElement;
|
||||
}
|
||||
return document.querySelector(`.${props.fullClass}`);
|
||||
};
|
||||
|
||||
/**
|
||||
* 切换全屏状态
|
||||
* 进入全屏时会隐藏页面滚动条,退出时恢复原状态
|
||||
*/
|
||||
const toggleFullScreen = () => {
|
||||
const el = document.querySelector(`.${props.fullClass}`);
|
||||
const el = findFullscreenContainer();
|
||||
if (!el) return;
|
||||
|
||||
isFullScreen.value = !isFullScreen.value;
|
||||
@@ -336,7 +357,7 @@ onUnmounted(() => {
|
||||
// 如果组件在全屏状态下被卸载,恢复页面滚动状态
|
||||
if (isFullScreen.value) {
|
||||
document.body.style.overflow = originalOverflow.value;
|
||||
const el = document.querySelector(`.${props.fullClass}`);
|
||||
const el = findFullscreenContainer();
|
||||
if (el) {
|
||||
el.classList.remove("el-full-screen");
|
||||
}
|
||||
|
||||
@@ -116,8 +116,15 @@ const elTableRef = ref<InstanceType<typeof ElTable> | null>(null);
|
||||
const paginationRef = ref<HTMLElement>();
|
||||
const tableHeaderRef = ref<HTMLElement>();
|
||||
const tableStore = useTableStore();
|
||||
const { isBorder, isZebra, tableSize, isFullScreen, isHeaderBackground, isRowDrag } =
|
||||
storeToRefs(tableStore);
|
||||
const {
|
||||
isBorder,
|
||||
isZebra,
|
||||
tableSize,
|
||||
isFullScreen,
|
||||
isHeaderBackground,
|
||||
isRowDrag,
|
||||
highlightCurrentRow,
|
||||
} = storeToRefs(tableStore);
|
||||
|
||||
/** 分页配置接口 */
|
||||
interface PaginationConfig {
|
||||
@@ -306,6 +313,7 @@ const mergedTableProps = computed(() => ({
|
||||
border: border.value,
|
||||
size: size.value,
|
||||
headerCellStyle: headerCellStyle.value,
|
||||
highlightCurrentRow: highlightCurrentRow.value,
|
||||
// Element Plus 默认值为 true,未显式传入时不应被 FaTable 覆盖成 false。
|
||||
selectOnIndeterminate: hasExplicitTableProp("selectOnIndeterminate")
|
||||
? props.selectOnIndeterminate
|
||||
|
||||
Reference in New Issue
Block a user