|
|
@@ -1,14 +1,6 @@
|
|
|
<script setup lang="ts">
|
|
|
import { VbUtil, VbComponents } from "@@/vb-dom"
|
|
|
import { type Header, symbolKeys } from "./../../models"
|
|
|
-const props = withDefaults(
|
|
|
- defineProps<{
|
|
|
- searchFormShow: boolean
|
|
|
- }>(),
|
|
|
- {
|
|
|
- searchFormShow: true
|
|
|
- }
|
|
|
-)
|
|
|
|
|
|
// 从统一上下文获取数据
|
|
|
const context = inject(symbolKeys.tableContext)!
|
|
|
@@ -23,15 +15,15 @@ const searchFormRowItems = context.config.searchFormRowItems
|
|
|
const columns = context.state.columns
|
|
|
const tableBox = context.refs.tableBox
|
|
|
|
|
|
+// 从 context 获取高级搜索面板显示状态
|
|
|
+const advancedSearchVisible = context.state.advancedSearchVisible
|
|
|
+// 从 context 获取列显隐菜单显示状态
|
|
|
+const columnMenuVisible = context.state.columnMenuVisible
|
|
|
+
|
|
|
// 计算是否显示搜索按钮
|
|
|
const showSearchBtn = computed(() => {
|
|
|
return showRightSearchBtn && (!!searchFormItems.value || !!searchFormRowItems.value)
|
|
|
})
|
|
|
-const columnMenuRef = ref()
|
|
|
-const elTreeRef = ref()
|
|
|
-const emits = defineEmits<(e: "update:searchFormShow", v: boolean) => void>()
|
|
|
-
|
|
|
-const btnColumnId = ref(VbUtil.getUniqueIdWithPrefix("btn-column"))
|
|
|
|
|
|
const style = computed(() => {
|
|
|
const ret: any = {}
|
|
|
@@ -42,40 +34,17 @@ const style = computed(() => {
|
|
|
return ret
|
|
|
})
|
|
|
|
|
|
-const visColumnIds = ref()
|
|
|
-function getVisibleIds() {
|
|
|
- const ids: string[] = []
|
|
|
- function calcVisibleIds(list: Header[]) {
|
|
|
- list.forEach((v) => {
|
|
|
- if (v.visible === undefined || v.visible) {
|
|
|
- ids.push(v.field)
|
|
|
- if (v.children && v.children.length > 0) {
|
|
|
- calcVisibleIds(v.children)
|
|
|
- }
|
|
|
- }
|
|
|
- })
|
|
|
+// 搜索
|
|
|
+const toggleSearch = (event?: MouseEvent) => {
|
|
|
+ // 阻止事件冒泡,避免触发 handleClickOutside
|
|
|
+ if (event) {
|
|
|
+ event.stopPropagation()
|
|
|
}
|
|
|
- calcVisibleIds(columns.value)
|
|
|
- return ids
|
|
|
-}
|
|
|
-function getColumnById(id: string, list: Header[]): Header | null {
|
|
|
- for (let i = 0; i < list.length; i++) {
|
|
|
- const item = list[i]
|
|
|
- if (item.field === id) {
|
|
|
- return item
|
|
|
- }
|
|
|
- if (item.children && item.children.length > 0) {
|
|
|
- const ret = getColumnById(id, item.children)
|
|
|
- if (ret) {
|
|
|
- return ret
|
|
|
- }
|
|
|
- }
|
|
|
+ // 如果列菜单是打开的,先关闭它
|
|
|
+ if (columnMenuVisible.value) {
|
|
|
+ columnMenuVisible.value = false
|
|
|
}
|
|
|
- return null
|
|
|
-}
|
|
|
-// 搜索
|
|
|
-const toggleSearch = () => {
|
|
|
- emits("update:searchFormShow", !props.searchFormShow)
|
|
|
+ advancedSearchVisible.value = !advancedSearchVisible.value
|
|
|
}
|
|
|
|
|
|
// 刷新
|
|
|
@@ -83,40 +52,14 @@ const refresh = () => {
|
|
|
VbUtil.EventHandlerUtil.trigger(tableBox.value, "vbtable.query")
|
|
|
}
|
|
|
|
|
|
-const hideColumnMenu = () => {
|
|
|
- VbComponents.MenuComponent.hideDropdowns(columnMenuRef.value)
|
|
|
-}
|
|
|
-const onColumnChange = (data: any) => {
|
|
|
- const column = getColumnById(data.field, columns.value)
|
|
|
- if (column) {
|
|
|
- column.visible = !(column.visible == undefined || column.visible)
|
|
|
- VbUtil.EventHandlerUtil.trigger(tableBox.value, "vbtable.columns-change", columns.value)
|
|
|
+// 切换列显隐菜单
|
|
|
+const toggleColumnMenu = () => {
|
|
|
+ // 如果高级搜索面板是打开的,先关闭它
|
|
|
+ if (advancedSearchVisible.value) {
|
|
|
+ advancedSearchVisible.value = false
|
|
|
}
|
|
|
+ columnMenuVisible.value = !columnMenuVisible.value
|
|
|
}
|
|
|
-onMounted(() => {
|
|
|
- const el = document.querySelector("#" + btnColumnId.value) as HTMLElement
|
|
|
- if (!VbComponents.MenuComponent.getInstance(el)) {
|
|
|
- VbComponents.MenuComponent.createInstance("#" + btnColumnId.value, {
|
|
|
- dropdown: {
|
|
|
- hoverTimeout: 200,
|
|
|
- zindex: 105
|
|
|
- },
|
|
|
- accordion: {
|
|
|
- slideSpeed: 250,
|
|
|
- expand: false
|
|
|
- }
|
|
|
- })
|
|
|
- }
|
|
|
-
|
|
|
- visColumnIds.value = getVisibleIds()
|
|
|
-})
|
|
|
-watch(
|
|
|
- () => columns.value,
|
|
|
- () => {
|
|
|
- visColumnIds.value = getVisibleIds()
|
|
|
- elTreeRef.value.setCheckedKeys(visColumnIds.value)
|
|
|
- }
|
|
|
-)
|
|
|
</script>
|
|
|
<template>
|
|
|
<div :style="style">
|
|
|
@@ -124,10 +67,10 @@ watch(
|
|
|
<vb-tooltip
|
|
|
v-if="showSearchBtn"
|
|
|
class="item"
|
|
|
- :content="searchFormShow ? '隐藏搜索' : '显示搜索'"
|
|
|
+ :content="advancedSearchVisible ? '收起高级搜索' : '高级搜索'"
|
|
|
:delay="1000"
|
|
|
placement="top">
|
|
|
- <el-button class="btn btn-light-primary p-3" circle @click="toggleSearch()">
|
|
|
+ <el-button class="btn btn-light-primary p-3" circle @click="toggleSearch">
|
|
|
<VbIcon icon-name="magnifier" icon-type="solid"></VbIcon>
|
|
|
</el-button>
|
|
|
</vb-tooltip>
|
|
|
@@ -142,42 +85,10 @@ watch(
|
|
|
placement="top"
|
|
|
:delay="1000"
|
|
|
v-if="showRightColumnBtn">
|
|
|
- <el-button
|
|
|
- class="btn btn-light-primary p-3"
|
|
|
- circle
|
|
|
- data-vb-menu-trigger="click"
|
|
|
- data-vb-menu-static="true"
|
|
|
- :data-vb-menu-target="`#${btnColumnId}`"
|
|
|
- data-vb-menu-placement="auto-end">
|
|
|
+ <el-button class="btn btn-light-primary p-3" circle @click="toggleColumnMenu">
|
|
|
<VbIcon icon-name="burger-menu-5" icon-type="solid"></VbIcon>
|
|
|
</el-button>
|
|
|
</vb-tooltip>
|
|
|
</el-row>
|
|
|
- <div
|
|
|
- ref="columnMenuRef"
|
|
|
- class="menu menu-sub menu-sub-dropdown menu-column w-auto p-5 px-10"
|
|
|
- :id="btnColumnId"
|
|
|
- data-vb-menu="true">
|
|
|
- <div class="d-flex flex-column position-relative pe-5">
|
|
|
- <div class="position-absolute" style="top: -5px; right: -20px" @click="hideColumnMenu">
|
|
|
- <vb-tooltip class="item" content="关闭" placement="top" :delay="1000">
|
|
|
- <div
|
|
|
- class="btn btn-sm btn-light-primary w-25px h-25px p-0 d-flex align-items-center justify-content-center">
|
|
|
- <span class="bi bi-x-circle fs-5"></span>
|
|
|
- </div>
|
|
|
- </vb-tooltip>
|
|
|
- </div>
|
|
|
-
|
|
|
- <el-tree
|
|
|
- ref="elTreeRef"
|
|
|
- :data="columns"
|
|
|
- show-checkbox
|
|
|
- node-key="field"
|
|
|
- :default-checked-keys="visColumnIds"
|
|
|
- :check-on-click-node="true"
|
|
|
- :props="{ label: 'name', children: 'children' }"
|
|
|
- @check="onColumnChange"></el-tree>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
</div>
|
|
|
</template>
|