UNPKG

ivue-material-plus

Version:

A high quality UI components Library with Vue.js

1 lines 14.2 kB
{"version":3,"file":"index.mjs","sources":["../../../../../../src/components/ivue-table/table-header/index.ts"],"sourcesContent":["import {\r\n h,\r\n defineComponent,\r\n inject,\r\n getCurrentInstance,\r\n onMounted,\r\n nextTick,\r\n ref,\r\n} from 'vue';\r\nimport IvueIcon from '../../ivue-icon/index.vue';\r\n\r\nimport useUtils from './utils';\r\nimport useStyle from './styles';\r\nimport useEvent from './events';\r\nimport useTableLayoutObserver from '../table-layout-observer';\r\n\r\n// 过滤组件\r\nimport FilterPanel from '../table/filter-panel.vue';\r\n\r\n// ts\r\nimport { TableContextKey } from '../table/defaults';\r\nimport type { TableColumnCtx } from '../table-column/defaults';\r\nimport type { PropType } from 'vue';\r\nimport type {\r\n TableHeader,\r\n FilterPanelInstance,\r\n TableHeaderProps,\r\n} from './types';\r\n\r\nconst prefixCls = 'ivue-table';\r\n\r\nexport default defineComponent({\r\n props: {\r\n /**\r\n * 列是否固定在左侧或者右侧。 true 表示固定在左侧\r\n *\r\n * @type {String}\r\n */\r\n fixed: {\r\n type: String,\r\n default: '',\r\n },\r\n /**\r\n * store\r\n *\r\n * @type {Object}\r\n */\r\n store: {\r\n required: true,\r\n type: Object as PropType<TableHeaderProps['store']>,\r\n },\r\n /**\r\n * 是否带有纵向边框\r\n *\r\n * @type {Boolean}\r\n */\r\n border: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n /**\r\n * 默认的排序列的 prop 和顺序。\r\n *\r\n * @type {Object}\r\n */\r\n defaultSort: {\r\n type: Object as PropType<TableHeaderProps['defaultSort']>,\r\n default: () => {\r\n return {\r\n prop: '',\r\n order: '',\r\n };\r\n },\r\n },\r\n /**\r\n * tooltip点击是否阻止当前事件在捕获和冒泡阶段的进一步传播\r\n *\r\n * @type {Boolean}\r\n */\r\n tooltipStop: {\r\n type: Boolean,\r\n },\r\n },\r\n setup(props: TableHeaderProps, { emit }) {\r\n // vm\r\n const vm = getCurrentInstance() as TableHeader;\r\n\r\n // inject\r\n const IvueTable = inject(TableContextKey);\r\n\r\n // data\r\n\r\n // 过滤的列节点\r\n const filterPanels = ref<Record<number, FilterPanelInstance>>({});\r\n\r\n const {\r\n // 获取当前列的行数\r\n columnRows,\r\n isGroup,\r\n } = useUtils(props);\r\n\r\n const {\r\n // 头部行样式\r\n getHeaderCellClass,\r\n getHeaderCellStyle,\r\n getHeaderRowStyle,\r\n getHeaderRowClass,\r\n } = useStyle(props);\r\n\r\n // 事件\r\n const {\r\n handleSortClick,\r\n handleHeaderClick,\r\n handleMouseDown,\r\n handleMouseMove,\r\n handleMouseOut,\r\n } = useEvent(props, emit);\r\n\r\n // 布局改变监听\r\n const { handleColumnsChange, handleScrollableWidthChange } =\r\n useTableLayoutObserver(IvueTable);\r\n\r\n vm.state = {\r\n handleColumnsChange,\r\n handleScrollableWidthChange,\r\n };\r\n\r\n vm.filterPanels = filterPanels;\r\n\r\n // methods\r\n\r\n // 渲染排序\r\n const renderSortable = (column) => {\r\n // 是否有排序\r\n if (!column.sortable) {\r\n return null;\r\n }\r\n\r\n return h(\r\n 'span',\r\n {\r\n class: `${prefixCls}-header--sortable`,\r\n },\r\n [\r\n // 上按钮\r\n h(\r\n IvueIcon,\r\n {\r\n class: `${prefixCls}-header--ascending`,\r\n onClick: ($event: Event) => {\r\n handleSortClick($event, column, 'ascending');\r\n },\r\n },\r\n {\r\n default: () => 'arrow_drop_up',\r\n }\r\n ),\r\n // 下按钮\r\n h(\r\n IvueIcon,\r\n {\r\n class: `${prefixCls}-header--descending`,\r\n onClick: ($event: Event) => {\r\n handleSortClick($event, column, 'descending');\r\n },\r\n },\r\n {\r\n default: () => 'arrow_drop_down',\r\n }\r\n ),\r\n ]\r\n );\r\n };\r\n\r\n // 渲染头部\r\n const renderHeader = (column, cellIndex: number) => {\r\n // 是否有头部\r\n if (!column.renderHeader) {\r\n return column.label;\r\n }\r\n\r\n return h('span', {}, [\r\n column.renderHeader({\r\n column,\r\n $index: cellIndex,\r\n store: props.store,\r\n _self: vm.$parent,\r\n }),\r\n ]);\r\n };\r\n\r\n // 渲染过滤\r\n const renderFilter = (column: TableColumnCtx) => {\r\n if (!column.filterable) {\r\n return null;\r\n }\r\n\r\n return h(FilterPanel, {\r\n // 当前列\r\n column,\r\n // store\r\n store: props.store,\r\n // 过滤弹出框的定位\r\n placement: column.filterPlacement,\r\n // tooltip点击是否阻止当前事件在捕获和冒泡阶段的进一步传播\r\n tooltipStop: props.tooltipStop,\r\n // 更新列数据\r\n upDataColumn: (key: string, value: boolean) => {\r\n column[key] = value;\r\n },\r\n });\r\n };\r\n\r\n // 渲染 th\r\n const renderTh = (\r\n list: TableColumnCtx[],\r\n rowSpan: number,\r\n rowIndex: number\r\n ) => {\r\n return list.map((column: TableColumnCtx, cellIndex: number) => {\r\n // 规定单元格可横跨的行数\r\n if (column.rowSpan > rowSpan) {\r\n rowSpan = column.rowSpan;\r\n }\r\n\r\n return h(\r\n 'th',\r\n {\r\n // class\r\n class: getHeaderCellClass(rowIndex, cellIndex, list, column),\r\n // style\r\n style: getHeaderCellStyle(rowIndex, cellIndex, list, column),\r\n // 规定单元格可横跨的列数。\r\n colspan: column.colSpan,\r\n // 规定单元格可横跨的行数\r\n rowspan: column.rowSpan,\r\n // key\r\n key: `${column.id}-thead`,\r\n onClick: ($event: Event) => {\r\n // 头部点击\r\n handleHeaderClick($event, column);\r\n },\r\n // 鼠标按下\r\n onMousedown: ($event: MouseEvent) => {\r\n handleMouseDown($event, column);\r\n },\r\n // 鼠标移动\r\n onMousemove: ($event: MouseEvent) => {\r\n handleMouseMove($event, column);\r\n },\r\n // 鼠标退出\r\n onMouseout: () => {\r\n handleMouseOut();\r\n },\r\n },\r\n [\r\n // cell\r\n h(\r\n 'div',\r\n {\r\n class: [\r\n 'cell',\r\n // 是否有选择过滤\r\n column.filteredValue && column.filteredValue.length > 0\r\n ? 'highlight'\r\n : '',\r\n ],\r\n },\r\n h(\r\n 'div',\r\n {\r\n class: 'cell-content',\r\n },\r\n [\r\n // 渲染头部\r\n renderHeader(column, cellIndex),\r\n // 排序\r\n renderSortable(column),\r\n // 渲染过滤\r\n renderFilter(column),\r\n ]\r\n )\r\n ),\r\n ]\r\n );\r\n });\r\n };\r\n\r\n // onMounted\r\n onMounted(() => {\r\n nextTick(() => {\r\n const { prop, order } = props.defaultSort;\r\n\r\n IvueTable?.store.commit('sort', { prop, order, init: true });\r\n });\r\n });\r\n\r\n return {\r\n // data\r\n filterPanels,\r\n\r\n // computed\r\n isGroup,\r\n columnRows,\r\n\r\n // methods\r\n renderTh,\r\n handleColumnsChange,\r\n getHeaderRowStyle,\r\n getHeaderRowClass,\r\n };\r\n },\r\n render() {\r\n const {\r\n columnRows,\r\n renderTh,\r\n isGroup,\r\n getHeaderRowStyle,\r\n getHeaderRowClass,\r\n } = this;\r\n\r\n const rowSpan = 1;\r\n\r\n return h(\r\n 'thead',\r\n {\r\n class: {\r\n ['is-group']: isGroup,\r\n },\r\n },\r\n columnRows.map((item: TableColumnCtx, rowIndex: number) => {\r\n return h(\r\n 'tr',\r\n {\r\n class: getHeaderRowClass(rowIndex),\r\n style: getHeaderRowStyle(rowIndex),\r\n key: rowIndex,\r\n },\r\n renderTh(item, rowSpan, rowIndex)\r\n );\r\n })\r\n );\r\n },\r\n});\r\n"],"names":["useTableLayoutObserver"],"mappings":"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"}