UNPKG

ivue-material-plus

Version:

A high quality UI components Library with Vue.js

1 lines 16.3 kB
{"version":3,"file":"table.mjs","sources":["../../../../../src/components/ivue-table/table.vue"],"sourcesContent":["<template>\r\n <div\r\n :class=\"wrapperClass\"\r\n @mouseleave=\"handleMouseLeave()\"\r\n ref=\"tableWrapper\"\r\n >\r\n <!-- 外层 -->\r\n <div :class=\"`${prefixCls}-content`\" :style=\"contentStyles\">\r\n <!-- hidden -->\r\n <div ref=\"hiddenColumns\" :class=\"`${prefixCls}-hidden`\">\r\n <slot />\r\n </div>\r\n\r\n <!-- 头部 -->\r\n <div\r\n :class=\"`${prefixCls}-header--wrapper`\"\r\n v-mousewheel=\"handleMousewheel\"\r\n ref=\"header\"\r\n v-if=\"showHeader && tableLayout === 'fixed'\"\r\n >\r\n <table\r\n :class=\"`${prefixCls}-header`\"\r\n :style=\"tableStyles\"\r\n border=\"0\"\r\n cellpadding=\"0\"\r\n cellspacing=\"0\"\r\n ref=\"tableHeader\"\r\n >\r\n <!-- colgroup -->\r\n <ivue-colgroup\r\n :columns=\"store.states.columns.value\"\r\n :tableLayout=\"tableLayout\"\r\n ></ivue-colgroup>\r\n <!-- header -->\r\n <table-header\r\n :border=\"border\"\r\n :defaultSort=\"defaultSort\"\r\n :store=\"store\"\r\n :tooltipStop=\"tooltipStop\"\r\n @on-drag-visible=\"handleDragVisible\"\r\n ref=\"tableHeaderContent\"\r\n ></table-header>\r\n </table>\r\n </div>\r\n <!-- 内容 -->\r\n <div :class=\"`${prefixCls}-body-wrapper`\" ref=\"bodyWrapper\">\r\n <ivue-scrollbar\r\n :wrapperStyle=\"scrollbarWrapperStyle\"\r\n :contentStyle=\"scrollbarContentStyle\"\r\n :always=\"scrollbarAlways\"\r\n ref=\"scrollbar\"\r\n >\r\n <!-- 表格 -->\r\n <table\r\n :class=\"`${prefixCls}-body`\"\r\n :style=\"tableBodyStyle\"\r\n cellspacing=\"0\"\r\n cellpadding=\"0\"\r\n border=\"0\"\r\n ref=\"tableBody\"\r\n >\r\n <!-- colgroup -->\r\n <ivue-colgroup\r\n :columns=\"store.states.columns.value\"\r\n :table-layout=\"tableLayout\"\r\n ></ivue-colgroup>\r\n\r\n <!-- auto 头部 -->\r\n <table-header\r\n :border=\"border\"\r\n :defaultSort=\"defaultSort\"\r\n :store=\"store\"\r\n @on-drag-visible=\"handleDragVisible\"\r\n v-if=\"showHeader && tableLayout === 'auto'\"\r\n ></table-header>\r\n\r\n <!-- 内容 -->\r\n <table-body\r\n :store=\"store\"\r\n :stripe=\"stripe\"\r\n :rowClassName=\"rowClassName\"\r\n :rowStyle=\"rowStyle\"\r\n :tooltipTheme=\"tooltipTheme\"\r\n ></table-body>\r\n </table>\r\n <!-- 没有数据 -->\r\n <div\r\n v-if=\"isData\"\r\n :class=\"`${prefixCls}-placeholder`\"\r\n :style=\"placeholderStyle\"\r\n ref=\"placeholder\"\r\n >\r\n <slot name=\"placeholder\">\r\n <span :class=\"`${prefixCls}-placeholder--text`\">{{\r\n placeholder\r\n }}</span>\r\n </slot>\r\n </div>\r\n </ivue-scrollbar>\r\n </div>\r\n <!-- 合计 -->\r\n <div\r\n v-if=\"showSummary\"\r\n v-show=\"!isData\"\r\n v-mousewheel=\"handleMousewheel\"\r\n :class=\"`${prefixCls}-footer--wrapper`\"\r\n ref=\"footer\"\r\n >\r\n <table-footer\r\n :border=\"border\"\r\n :defaultSort=\"defaultSort\"\r\n :store=\"store\"\r\n :style=\"tableStyles\"\r\n :sum-text=\"sumText\"\r\n :summary-method=\"summaryMethod\"\r\n ></table-footer>\r\n </div>\r\n </div>\r\n <!-- 拖拽时的虚线 -->\r\n <div\r\n :class=\"`${prefixCls}-column-resize-proxy`\"\r\n ref=\"draggingDotted\"\r\n v-show=\"dragging\"\r\n ></div>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport {\r\n computed,\r\n defineComponent,\r\n getCurrentInstance,\r\n provide,\r\n onMounted,\r\n} from 'vue';\r\nimport { debounce } from 'lodash-unified';\r\n\r\n// 表格改变\r\nimport TableLayout from './table-layout';\r\n// Mousewheel\r\nimport { Mousewheel } from '../../utils/directives';\r\n\r\n// store\r\nimport { createStore } from './store/helper';\r\n\r\n// 表格style\r\nimport useStyle from './table/styles';\r\nimport useUtils from './table/utils';\r\n\r\n// components\r\nimport IvueColgroup from './colgroup';\r\nimport TableHeader from './table-header';\r\nimport TableBody from './table-body';\r\nimport IvueScrollbar from '../ivue-scrollbar/index.vue';\r\nimport TableFooter from './table-footer';\r\n\r\n// props\r\nimport defaultProps from './table/defaults';\r\n\r\n// ts\r\nimport { Table, TableContextKey } from './table/defaults';\r\nimport type { TableColumnCtx } from './table-column/defaults';\r\n\r\nconst prefixCls = 'ivue-table';\r\nlet tableIdSeed = 1;\r\n\r\nexport default defineComponent({\r\n name: prefixCls,\r\n props: defaultProps,\r\n directives: {\r\n Mousewheel,\r\n },\r\n emits: [\r\n 'on-cell-mouse-enter',\r\n 'on-cell-mouse-leave',\r\n 'on-selection-change',\r\n 'on-select-all',\r\n 'on-select',\r\n 'on-current-change',\r\n 'on-header-click',\r\n 'on-sort-change',\r\n 'on-filter-change',\r\n 'on-header-dragend',\r\n 'on-expand-change',\r\n 'on-cell-click',\r\n 'on-row-click',\r\n ],\r\n setup(props) {\r\n // vm\r\n const table = getCurrentInstance() as Table;\r\n\r\n // 设置id\r\n const tableId = `${prefixCls}-${tableIdSeed++}`;\r\n table.tableId = tableId;\r\n\r\n // store\r\n const store = createStore(table, props);\r\n table.store = store;\r\n\r\n // 表格布局\r\n const layout = new TableLayout({\r\n // table store\r\n store: table.store,\r\n // table vm\r\n table,\r\n // 列的宽度是否自撑开\r\n fit: props.fit,\r\n // 显示头部\r\n showHeader: props.showHeader,\r\n });\r\n\r\n table.layout = layout;\r\n\r\n // 表格样式\r\n const {\r\n // data\r\n dragging,\r\n renderExpanded,\r\n resizeState,\r\n tableWidth,\r\n isGroup,\r\n\r\n // computed\r\n tableLayout,\r\n contentStyles,\r\n tableStyles,\r\n placeholderStyle,\r\n tableBodyStyle,\r\n scrollbarWrapperStyle,\r\n scrollbarContentStyle,\r\n\r\n // methods\r\n updateLayout,\r\n handleMouseLeave,\r\n handleMousewheel,\r\n handleDragVisible,\r\n handleBindEvents,\r\n } = useStyle(props, layout, store, table);\r\n\r\n // 去抖更新布局\r\n const debouncedUpdateLayout = debounce(updateLayout, 50);\r\n\r\n // 表格状态\r\n table.state = {\r\n resizeState,\r\n isGroup,\r\n updateLayout,\r\n debouncedUpdateLayout,\r\n };\r\n\r\n const {\r\n // 单选选择当前行\r\n setCurrentRow,\r\n // 返回当前选中的行\r\n getSelectionRows,\r\n // 多选选择的行\r\n toggleRowSelection,\r\n // 清除多选选择行\r\n clearSelection,\r\n // 用于清空排序条件,数据会恢复成未排序的状态\r\n clearSort,\r\n // 手动排序表格,参数 prop 属性指定排序列 order 指定排序顺序\r\n sort,\r\n // 传入由columnKey 组成的数组以清除指定列的过滤条件\r\n clearFilter,\r\n // 切换行展开\r\n toggleRowExpansion,\r\n } = useUtils(store);\r\n\r\n // computed\r\n\r\n // 外层样式\r\n const wrapperClass = computed(() => {\r\n return [\r\n prefixCls,\r\n `${prefixCls}-layout-${tableLayout.value}`,\r\n {\r\n // 列的宽度是否自撑开\r\n [`${prefixCls}-fit`]: props.fit,\r\n // \t是否带有纵向边框\r\n [`${prefixCls}-border`]: props.border || isGroup.value,\r\n // 是否拥有多级表头\r\n [`${prefixCls}-group`]: isGroup.value,\r\n // Table 的最大高度\r\n [`${prefixCls}-max-height`]: props.maxHeight,\r\n // 滚动x\r\n [`${prefixCls}-scroll-x`]: layout.scrollX.value,\r\n // 滚动y\r\n [`${prefixCls}-scroll-y`]: layout.scrollY.value,\r\n // 没有固定列的时使用\r\n [`${prefixCls}-nofixed-row-hover`]:\r\n !store.states.isFixedColumns.value,\r\n // 是否有表格数据\r\n [`${prefixCls}-nofixed-row-transition`]:\r\n (store.states.data.value || []).length !== 0 &&\r\n (store.states.data.value || []).length < 100,\r\n // 是否在表尾显示合计行\r\n ['has-footer']: props.showSummary,\r\n // 是否为斑马纹 table\r\n [`${prefixCls}-stripe`]: props.stripe,\r\n },\r\n ];\r\n });\r\n\r\n // 是否有数据\r\n const isData = computed(() => {\r\n return (store.states.data.value || []).length === 0;\r\n });\r\n\r\n // onMounted\r\n onMounted(() => {\r\n // 设置整理后的列设置数据 未扁平化列数据 | 扁平化后的列数据 | 是否有固定列\r\n store.updateColumns();\r\n\r\n // 表格宽度\r\n const el: HTMLElement = table.vnode.el as HTMLElement;\r\n // 表格头部\r\n const header: HTMLElement = table.refs.header;\r\n\r\n // 设置宽度\r\n tableWidth.value = el.offsetWidth;\r\n\r\n // 初始化表格大小\r\n resizeState.value = {\r\n width: tableWidth.value,\r\n height: el.offsetHeight,\r\n headerHeight: props.showHeader && header ? header.offsetHeight : null,\r\n };\r\n\r\n // 初始化过滤的数据\r\n store.states.columns.value.forEach((column: TableColumnCtx) => {\r\n if (column.filteredValue && column.filteredValue.length) {\r\n table.store.commit('filterChange', {\r\n column,\r\n values: column.filteredValue,\r\n silent: true,\r\n });\r\n }\r\n });\r\n\r\n // 初始化完成\r\n table.$ready = true;\r\n\r\n // 更新布局\r\n updateLayout();\r\n\r\n // 绑定事件 滚动 | 列的宽度自撑开 | 表格大小改变\r\n handleBindEvents();\r\n });\r\n\r\n // provide\r\n provide(TableContextKey, table);\r\n\r\n return {\r\n prefixCls,\r\n\r\n // data\r\n dragging,\r\n renderExpanded,\r\n resizeState,\r\n isGroup,\r\n\r\n // layout\r\n layout,\r\n // store\r\n store,\r\n\r\n // computed\r\n isData,\r\n wrapperClass,\r\n contentStyles,\r\n tableLayout,\r\n tableStyles,\r\n placeholderStyle,\r\n tableBodyStyle,\r\n scrollbarWrapperStyle,\r\n scrollbarContentStyle,\r\n\r\n // methods\r\n handleMouseLeave,\r\n handleMousewheel,\r\n handleDragVisible,\r\n setCurrentRow,\r\n toggleRowSelection,\r\n getSelectionRows,\r\n clearSelection,\r\n clearSort,\r\n sort,\r\n clearFilter,\r\n toggleRowExpansion,\r\n };\r\n },\r\n components: {\r\n IvueColgroup,\r\n TableBody,\r\n IvueScrollbar,\r\n TableHeader,\r\n TableFooter,\r\n },\r\n});\r\n</script>\r\n"],"names":["_resolveDirective","_openBlock","_createElementBlock","_normalizeClass","_createCommentVNode","_createElementVNode","_normalizeStyle","_renderSlot","_withDirectives","_createVNode","_withCtx","_createBlock"],"mappings":"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"}