fix
This commit is contained in:
@@ -3,17 +3,17 @@
|
||||
* 提供通用的列配置加载和保存逻辑
|
||||
*/
|
||||
|
||||
import { ref, Ref, computed, ComputedRef } from 'vue'
|
||||
import { useRoute } from 'vue-router'
|
||||
import { ref, Ref, computed, ComputedRef } from 'vue';
|
||||
import { useRoute } from 'vue-router';
|
||||
|
||||
export interface ColumnConfig {
|
||||
prop?: string
|
||||
label: string
|
||||
alwaysShow?: boolean
|
||||
fixed?: boolean | 'left' | 'right'
|
||||
minWidth?: number | string
|
||||
width?: number | string
|
||||
[key: string]: any
|
||||
prop?: string;
|
||||
label: string;
|
||||
alwaysShow?: boolean;
|
||||
fixed?: boolean | 'left' | 'right';
|
||||
minWidth?: number | string;
|
||||
width?: number | string;
|
||||
[key: string]: any;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -22,136 +22,123 @@ export interface ColumnConfig {
|
||||
* @returns 返回 visibleColumns、columnOrder、loadSavedConfig、handleColumnChange、handleColumnOrderChange 等
|
||||
*/
|
||||
export function useTableColumnControl(tableColumns: ColumnConfig[]) {
|
||||
const route = useRoute()
|
||||
|
||||
// 当前显示的列
|
||||
const visibleColumns = ref<string[]>([])
|
||||
// 列排序顺序
|
||||
const columnOrder = ref<string[]>([])
|
||||
const route = useRoute();
|
||||
|
||||
// 根据路由生成 storageKey
|
||||
const getStorageKey = (suffix: string = '') => {
|
||||
const routePath = route.path.replace(/^\//, '').replace(/\//g, '-')
|
||||
return `table-columns-${routePath}${suffix ? `-${suffix}` : ''}`
|
||||
}
|
||||
// 当前显示的列
|
||||
const visibleColumns = ref<string[]>([]);
|
||||
// 列排序顺序
|
||||
const columnOrder = ref<string[]>([]);
|
||||
|
||||
// 立即从 localStorage 加载配置
|
||||
const loadSavedConfig = () => {
|
||||
const storageKey = getStorageKey()
|
||||
const saved = localStorage.getItem(storageKey)
|
||||
if (saved) {
|
||||
try {
|
||||
const savedColumns = JSON.parse(saved)
|
||||
const validColumns = tableColumns
|
||||
.filter(col => !col.alwaysShow && !col.fixed)
|
||||
.map(col => col.prop || col.label)
|
||||
const filteredSaved = savedColumns.filter((col: string) => validColumns.includes(col))
|
||||
visibleColumns.value = filteredSaved.length > 0 ? filteredSaved : validColumns
|
||||
} catch (e) {
|
||||
console.error('解析列配置失败:', e)
|
||||
visibleColumns.value = tableColumns
|
||||
.filter(col => !col.alwaysShow && !col.fixed)
|
||||
.map(col => col.prop || col.label)
|
||||
}
|
||||
} else {
|
||||
visibleColumns.value = tableColumns
|
||||
.filter(col => !col.alwaysShow && !col.fixed)
|
||||
.map(col => col.prop || col.label)
|
||||
}
|
||||
|
||||
// 加载列排序配置
|
||||
const orderKey = getStorageKey('order')
|
||||
const savedOrder = localStorage.getItem(orderKey)
|
||||
if (savedOrder) {
|
||||
try {
|
||||
const parsedOrder = JSON.parse(savedOrder)
|
||||
const validColumns = tableColumns
|
||||
.filter(col => !col.alwaysShow && !col.fixed)
|
||||
.map(col => col.prop || col.label)
|
||||
columnOrder.value = parsedOrder.filter((key: string) => validColumns.includes(key))
|
||||
validColumns.forEach(key => {
|
||||
if (!columnOrder.value.includes(key)) {
|
||||
columnOrder.value.push(key)
|
||||
}
|
||||
})
|
||||
} catch (e) {
|
||||
console.error('解析列排序失败:', e)
|
||||
columnOrder.value = tableColumns
|
||||
.filter(col => !col.alwaysShow && !col.fixed)
|
||||
.map(col => col.prop || col.label)
|
||||
}
|
||||
} else {
|
||||
columnOrder.value = tableColumns
|
||||
.filter(col => !col.alwaysShow && !col.fixed)
|
||||
.map(col => col.prop || col.label)
|
||||
}
|
||||
}
|
||||
// 根据路由生成 storageKey
|
||||
const getStorageKey = (suffix: string = '') => {
|
||||
const routePath = route.path.replace(/^\//, '').replace(/\//g, '-');
|
||||
return `table-columns-${routePath}${suffix ? `-${suffix}` : ''}`;
|
||||
};
|
||||
|
||||
// 排序后的表格列
|
||||
const sortedTableColumns = computed(() => {
|
||||
const columns = tableColumns.filter(col => {
|
||||
const key = col.prop || col.label
|
||||
return col.alwaysShow || col.fixed || visibleColumns.value.includes(key)
|
||||
})
|
||||
|
||||
if (columnOrder.value.length > 0) {
|
||||
const orderedColumns: ColumnConfig[] = []
|
||||
const unorderedColumns: ColumnConfig[] = []
|
||||
|
||||
columnOrder.value.forEach(key => {
|
||||
const col = columns.find(c => (c.prop || c.label) === key)
|
||||
if (col) {
|
||||
orderedColumns.push(col)
|
||||
}
|
||||
})
|
||||
|
||||
columns.forEach(col => {
|
||||
const key = col.prop || col.label
|
||||
if (!columnOrder.value.includes(key)) {
|
||||
unorderedColumns.push(col)
|
||||
}
|
||||
})
|
||||
|
||||
return [...orderedColumns, ...unorderedColumns]
|
||||
}
|
||||
|
||||
return columns
|
||||
})
|
||||
// 立即从 localStorage 加载配置
|
||||
const loadSavedConfig = () => {
|
||||
const storageKey = getStorageKey();
|
||||
const saved = localStorage.getItem(storageKey);
|
||||
if (saved) {
|
||||
try {
|
||||
const savedColumns = JSON.parse(saved);
|
||||
const validColumns = tableColumns.filter((col) => !col.alwaysShow && !col.fixed).map((col) => col.prop || col.label);
|
||||
const filteredSaved = savedColumns.filter((col: string) => validColumns.includes(col));
|
||||
visibleColumns.value = filteredSaved.length > 0 ? filteredSaved : validColumns;
|
||||
} catch (e) {
|
||||
console.error('解析列配置失败:', e);
|
||||
visibleColumns.value = tableColumns.filter((col) => !col.alwaysShow && !col.fixed).map((col) => col.prop || col.label);
|
||||
}
|
||||
} else {
|
||||
visibleColumns.value = tableColumns.filter((col) => !col.alwaysShow && !col.fixed).map((col) => col.prop || col.label);
|
||||
}
|
||||
|
||||
// 列显示控制函数
|
||||
const checkColumnVisible = (prop: string): boolean => {
|
||||
if (visibleColumns.value.length === 0) {
|
||||
return true
|
||||
}
|
||||
return visibleColumns.value.includes(prop)
|
||||
}
|
||||
// 加载列排序配置
|
||||
const orderKey = getStorageKey('order');
|
||||
const savedOrder = localStorage.getItem(orderKey);
|
||||
if (savedOrder) {
|
||||
try {
|
||||
const parsedOrder = JSON.parse(savedOrder);
|
||||
const validColumns = tableColumns.filter((col) => !col.alwaysShow && !col.fixed).map((col) => col.prop || col.label);
|
||||
columnOrder.value = parsedOrder.filter((key: string) => validColumns.includes(key));
|
||||
validColumns.forEach((key) => {
|
||||
if (!columnOrder.value.includes(key)) {
|
||||
columnOrder.value.push(key);
|
||||
}
|
||||
});
|
||||
} catch (e) {
|
||||
console.error('解析列排序失败:', e);
|
||||
columnOrder.value = tableColumns.filter((col) => !col.alwaysShow && !col.fixed).map((col) => col.prop || col.label);
|
||||
}
|
||||
} else {
|
||||
columnOrder.value = tableColumns.filter((col) => !col.alwaysShow && !col.fixed).map((col) => col.prop || col.label);
|
||||
}
|
||||
};
|
||||
|
||||
// 监听列变化
|
||||
const handleColumnChange = (columns: string[]) => {
|
||||
visibleColumns.value = columns
|
||||
const storageKey = getStorageKey()
|
||||
const selectableColumns = columns.filter(col => {
|
||||
const column = tableColumns.find(c => (c.prop || c.label) === col)
|
||||
return column && !column.alwaysShow && !column.fixed
|
||||
})
|
||||
localStorage.setItem(storageKey, JSON.stringify(selectableColumns))
|
||||
}
|
||||
// 排序后的表格列
|
||||
const sortedTableColumns = computed(() => {
|
||||
const columns = tableColumns.filter((col) => {
|
||||
const key = col.prop || col.label;
|
||||
return col.alwaysShow || col.fixed || visibleColumns.value.includes(key);
|
||||
});
|
||||
|
||||
// 监听列排序变化
|
||||
const handleColumnOrderChange = (order: string[]) => {
|
||||
columnOrder.value = order
|
||||
const storageKey = getStorageKey('order')
|
||||
localStorage.setItem(storageKey, JSON.stringify(order))
|
||||
}
|
||||
if (columnOrder.value.length > 0) {
|
||||
const orderedColumns: ColumnConfig[] = [];
|
||||
const unorderedColumns: ColumnConfig[] = [];
|
||||
|
||||
return {
|
||||
visibleColumns,
|
||||
columnOrder,
|
||||
sortedTableColumns,
|
||||
checkColumnVisible,
|
||||
loadSavedConfig,
|
||||
handleColumnChange,
|
||||
handleColumnOrderChange
|
||||
}
|
||||
columnOrder.value.forEach((key) => {
|
||||
const col = columns.find((c) => (c.prop || c.label) === key);
|
||||
if (col) {
|
||||
orderedColumns.push(col);
|
||||
}
|
||||
});
|
||||
|
||||
columns.forEach((col) => {
|
||||
const key = col.prop || col.label;
|
||||
if (!columnOrder.value.includes(key)) {
|
||||
unorderedColumns.push(col);
|
||||
}
|
||||
});
|
||||
|
||||
return [...orderedColumns, ...unorderedColumns];
|
||||
}
|
||||
|
||||
return columns;
|
||||
});
|
||||
|
||||
// 列显示控制函数
|
||||
const checkColumnVisible = (prop: string): boolean => {
|
||||
if (visibleColumns.value.length === 0) {
|
||||
return true;
|
||||
}
|
||||
return visibleColumns.value.includes(prop);
|
||||
};
|
||||
|
||||
// 监听列变化
|
||||
const handleColumnChange = (columns: string[]) => {
|
||||
visibleColumns.value = columns;
|
||||
const storageKey = getStorageKey();
|
||||
const selectableColumns = columns.filter((col) => {
|
||||
const column = tableColumns.find((c) => (c.prop || c.label) === col);
|
||||
return column && !column.alwaysShow && !column.fixed;
|
||||
});
|
||||
localStorage.setItem(storageKey, JSON.stringify(selectableColumns));
|
||||
};
|
||||
|
||||
// 监听列排序变化
|
||||
const handleColumnOrderChange = (order: string[]) => {
|
||||
columnOrder.value = order;
|
||||
const storageKey = getStorageKey('order');
|
||||
localStorage.setItem(storageKey, JSON.stringify(order));
|
||||
};
|
||||
|
||||
return {
|
||||
visibleColumns,
|
||||
columnOrder,
|
||||
sortedTableColumns,
|
||||
checkColumnVisible,
|
||||
loadSavedConfig,
|
||||
handleColumnChange,
|
||||
handleColumnOrderChange,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user