umy-ui-table 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +111 -0
- package/lib/button.js +1 -0
- package/lib/icon.js +1 -0
- package/lib/index.js +1 -0
- package/lib/locale/format.js +56 -0
- package/lib/locale/index.js +72 -0
- package/lib/locale/lang/en.js +123 -0
- package/lib/locale/lang/zh-CN.js +119 -0
- package/lib/mixins/locale.js +17 -0
- package/lib/theme-chalk/base.css +0 -0
- package/lib/theme-chalk/button.css +1 -0
- package/lib/theme-chalk/fonts/element-icons.ttf +0 -0
- package/lib/theme-chalk/fonts/element-icons.woff +0 -0
- package/lib/theme-chalk/fonts/iconfont.1785562768224.ttf +0 -0
- package/lib/theme-chalk/fonts/iconfont.1785562768224.woff +0 -0
- package/lib/theme-chalk/fonts/iconfont.1785562768224.woff2 +0 -0
- package/lib/theme-chalk/icon.css +1 -0
- package/lib/theme-chalk/index.css +1 -0
- package/lib/theme-chalk/u-table-column.css +0 -0
- package/lib/theme-chalk/u-table.css +1 -0
- package/lib/theme-chalk/ux-grid.css +1 -0
- package/lib/theme-chalk/ux-table-column.css +0 -0
- package/lib/u-table-column.js +1 -0
- package/lib/u-table.js +1 -0
- package/lib/umd/locale/en.js +139 -0
- package/lib/umd/locale/zh-CN.js +135 -0
- package/lib/umy-ui.common.js +1 -0
- package/lib/utils/svg.js +33 -0
- package/lib/utils/types.js +35 -0
- package/lib/utils/util.js +268 -0
- package/lib/ux-grid.js +1 -0
- package/lib/ux-table-column.js +1 -0
- package/package.json +117 -0
- package/packages/button/index.js +7 -0
- package/packages/button/src/button-group.vue +10 -0
- package/packages/button/src/button.vue +166 -0
- package/packages/checkbox/index.js +8 -0
- package/packages/checkbox/src/checkbox-button.vue +199 -0
- package/packages/checkbox/src/checkbox-group.vue +48 -0
- package/packages/checkbox/src/checkbox.vue +222 -0
- package/packages/checkbox-button/index.js +8 -0
- package/packages/checkbox-group/index.js +8 -0
- package/packages/icon/index.js +7 -0
- package/packages/icon/src/icon.vue +40 -0
- package/packages/input/index.js +2 -0
- package/packages/input/src/calcTextareaHeight.js +104 -0
- package/packages/input/src/input.vue +424 -0
- package/packages/option/index.js +2 -0
- package/packages/pagination/index.js +2 -0
- package/packages/pagination/src/pager.vue +163 -0
- package/packages/pagination/src/pagination.js +386 -0
- package/packages/scrollbar/index.js +8 -0
- package/packages/scrollbar/src/bar.js +92 -0
- package/packages/scrollbar/src/main.js +130 -0
- package/packages/scrollbar/src/util.js +34 -0
- package/packages/select/index.js +2 -0
- package/packages/select/src/navigation-mixin.js +54 -0
- package/packages/select/src/option-group.vue +60 -0
- package/packages/select/src/option.vue +163 -0
- package/packages/select/src/select-dropdown.vue +74 -0
- package/packages/select/src/select.vue +889 -0
- package/packages/table/index.js +8 -0
- package/packages/table/src/config.js +123 -0
- package/packages/table/src/dropdown.js +28 -0
- package/packages/table/src/filter-panel.vue +194 -0
- package/packages/table/src/layout-observer.js +68 -0
- package/packages/table/src/store/current.js +71 -0
- package/packages/table/src/store/expand.js +65 -0
- package/packages/table/src/store/helper.js +37 -0
- package/packages/table/src/store/index.js +145 -0
- package/packages/table/src/store/tree.js +208 -0
- package/packages/table/src/store/watcher.js +448 -0
- package/packages/table/src/table-body.js +493 -0
- package/packages/table/src/table-column.js +381 -0
- package/packages/table/src/table-footer.js +174 -0
- package/packages/table/src/table-header.js +537 -0
- package/packages/table/src/table-layout.js +231 -0
- package/packages/table/src/table.vue +741 -0
- package/packages/table/src/util.js +256 -0
- package/packages/tag/index.js +8 -0
- package/packages/tag/src/tag.vue +58 -0
- package/packages/tools/directives/mousewheel.js +18 -0
- package/packages/tools/directives/repeat-click.js +24 -0
- package/packages/tools/locale/format.js +46 -0
- package/packages/tools/locale/index.js +48 -0
- package/packages/tools/locale/lang/en.js +120 -0
- package/packages/tools/locale/lang/zh-CN.js +116 -0
- package/packages/tools/mixins/emitter.js +33 -0
- package/packages/tools/mixins/focus.js +9 -0
- package/packages/tools/mixins/locale.js +9 -0
- package/packages/tools/mixins/migrating.js +54 -0
- package/packages/tools/transitions/collapse-transition.js +77 -0
- package/packages/tools/utils/after-leave.js +27 -0
- package/packages/tools/utils/aria-dialog.js +90 -0
- package/packages/tools/utils/aria-utils.js +122 -0
- package/packages/tools/utils/clickoutside.js +76 -0
- package/packages/tools/utils/date-util.js +292 -0
- package/packages/tools/utils/date.js +368 -0
- package/packages/tools/utils/dom.js +227 -0
- package/packages/tools/utils/menu/aria-menubar.js +14 -0
- package/packages/tools/utils/menu/aria-menuitem.js +49 -0
- package/packages/tools/utils/menu/aria-submenu.js +59 -0
- package/packages/tools/utils/merge.js +15 -0
- package/packages/tools/utils/popper.js +1276 -0
- package/packages/tools/utils/popup/index.js +218 -0
- package/packages/tools/utils/popup/popup-manager.js +194 -0
- package/packages/tools/utils/resize-event.js +35 -0
- package/packages/tools/utils/scroll-into-view.js +27 -0
- package/packages/tools/utils/scrollbar-width.js +29 -0
- package/packages/tools/utils/shared.js +7 -0
- package/packages/tools/utils/svg.js +1 -0
- package/packages/tools/utils/types.js +28 -0
- package/packages/tools/utils/util.js +241 -0
- package/packages/tools/utils/vdom.js +5 -0
- package/packages/tools/utils/vue-popper.js +198 -0
- package/packages/tooltip/index.js +8 -0
- package/packages/tooltip/src/main.js +241 -0
- package/packages/u-table/index.js +4 -0
- package/packages/u-table/revise-el-table-mixins/index.js +10 -0
- package/packages/u-table/revise-el-table-mixins/table-extend.js +60 -0
- package/packages/u-table/revise-el-table-mixins/table.mixins.js +261 -0
- package/packages/u-table/revise-el-table-mixins/virtual-table-body-render.js +132 -0
- package/packages/u-table/src/u-table.vue +248 -0
- package/packages/u-table/u-table-mixins/index.js +483 -0
- package/packages/u-table/u-table-tree-mixins/methods.js +120 -0
- package/packages/u-table/u-table-tree-mixins/u-table-tree-mixins.js +161 -0
- package/packages/u-table-column/index.js +8 -0
- package/packages/utils/common.js +27 -0
- package/packages/ux-grid/index.js +6 -0
- package/packages/ux-grid/mixins/index.js +707 -0
- package/packages/ux-grid/src/interceptor.js +6 -0
- package/packages/ux-grid/src/ux-grid.vue +301 -0
- package/packages/ux-table-column/index.js +10 -0
- package/tools/locale/format.js +46 -0
- package/tools/locale/index.js +54 -0
- package/tools/locale/lang/en.js +120 -0
- package/tools/locale/lang/zh-CN.js +116 -0
- package/tools/mixins/locale.js +9 -0
- package/tools/utils/svg.js +1 -0
- package/tools/utils/types.js +28 -0
- package/tools/utils/util.js +241 -0
|
@@ -0,0 +1,483 @@
|
|
|
1
|
+
// umy-table mixins
|
|
2
|
+
import { isArrayFn, removal, typeIs } from "../../utils/common";
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
props: {
|
|
6
|
+
data: { type: Array, default: () => [] }, // 表格数据
|
|
7
|
+
height: [String, Number],
|
|
8
|
+
maxHeight: [String, Number],
|
|
9
|
+
dialogData: { type: Array, default: () => [] }, // 选择显示字段数组
|
|
10
|
+
dataChangesScrollTop: { default: true, type: Boolean }, // 数据变化是否需要滚动到顶部
|
|
11
|
+
stripe: { default: false, type: Boolean }, // 是否为斑马纹
|
|
12
|
+
size: { default: "", type: String }, // Table 的尺寸
|
|
13
|
+
fit: { default: true, type: Boolean }, // 列的宽度是否自撑开
|
|
14
|
+
defaultSort: Object, // 默认的排序列的 prop 和顺序
|
|
15
|
+
showHeader: { default: true, type: Boolean }, // 是否显示表头
|
|
16
|
+
currentRowKey: [String, Number], // 当前行的 key,只写属性
|
|
17
|
+
selectOnIndeterminate: { type: Boolean, default: true }, // 在多选表格中,当仅有部分行被选中时,点击表头的多选框时的行为
|
|
18
|
+
emptyText: { default: "暂无数据", type: String }, // 空数据时显示的文本内容
|
|
19
|
+
indent: { type: Number, default: 16 }, // 展示树形数据时,树节点的缩进
|
|
20
|
+
lazy: Boolean,
|
|
21
|
+
load: Function,
|
|
22
|
+
border: { default: true, type: Boolean }, // 是否显示纵向边框
|
|
23
|
+
showSummary: { default: false, type: Boolean }, // 是否需要合计
|
|
24
|
+
defaultExpandAll: { default: false, type: Boolean }, // 是否默认展开所有行,当 Table 包含展开行存在或者为树形表格时有效
|
|
25
|
+
expandRowKeys: Array,
|
|
26
|
+
treeProps: {
|
|
27
|
+
default() {
|
|
28
|
+
return { hasChildren: "hasChildren", children: "children" };
|
|
29
|
+
},
|
|
30
|
+
type: Object,
|
|
31
|
+
}, // 渲染嵌套数据的配置选项
|
|
32
|
+
treeConfig: [Boolean, Object], // 树形结构配置项
|
|
33
|
+
totalOption: { default: () => [], type: Array }, // 需要合计的选项
|
|
34
|
+
sumText: { default: "合计", type: String }, // 合计行名称
|
|
35
|
+
fieldSort: { default: true, type: Boolean }, // 字段排序
|
|
36
|
+
rowId: String, // 长用于大数据树
|
|
37
|
+
rowKey: [String, Function], // 支持树类型的数据
|
|
38
|
+
highlightCurrentRow: { default: true, type: Boolean }, // 是否要高亮当前行
|
|
39
|
+
inverseCurrentRow: { default: false, type: Boolean }, // 是否需要反选高亮当前行
|
|
40
|
+
showDialogIcon: { default: true, type: Boolean }, // 是否显示操作字段的上下移动按钮(侧滑框)
|
|
41
|
+
moveDownIcon: { default: "", type: String }, // 下移按钮的图标(侧滑框)
|
|
42
|
+
moveUpIcon: { default: "", type: String }, // 上移按钮的图标(侧滑框)
|
|
43
|
+
showAmend: { default: false, type: Boolean }, // 是否显示修改字段名按钮(侧滑框)
|
|
44
|
+
amendBtnIcon: { default: "", type: String }, // 修改字段按钮的图标(侧滑框)
|
|
45
|
+
fieldTitle: { default: "选择显示字段", type: String }, // 弹框的标题(侧滑框)
|
|
46
|
+
recordTableSelect: { default: false, type: Boolean }, // 是否记录表格的选项id(必须保证行ID存在,且唯一)
|
|
47
|
+
headerDragStyle: { default: false, type: Boolean }, // 是否修改表格的头部拖动样式 | Boolean | false
|
|
48
|
+
useVirtual: { default: false, type: Boolean }, // 是否开启虚拟滚动 | Boolean | false
|
|
49
|
+
rowHeight: { default: 60, type: Number }, // 行高(必须要设置行高,否则会导致表格计算不正确)| Number | 60
|
|
50
|
+
excessRows: { default: 3, type: Number }, // 可视区域上方和下方额外渲染的行数,行数越多表格接替渲染效果越好,但越耗性能 Number 3
|
|
51
|
+
spanMethod: Function, // 合并行或列的计算方法 (注意,当开启useVirtual时,无效)
|
|
52
|
+
tooltipEffect: { default: "dark", type: String }, // tooltip effect 属性 String dark/light
|
|
53
|
+
beautifyTable: { default: false, type: Boolean }, // 美化表格,修改了样式
|
|
54
|
+
tooltipPlacement: { default: "top", type: String }, // Tooltip 的出现位置 String top
|
|
55
|
+
summaryMethod: Function, // 自定义的合计计算方法
|
|
56
|
+
bigDataCheckbox: { default: false, type: Boolean }, // 大量数据时候(至少数据量大于3000条每页),表格存在selection选择列表时,是否开启解决全选卡顿(缓慢)问题,开启此项可能影响table-column的selectable属性功能,最好不要使用selectable
|
|
57
|
+
rowClassName: [String, Function], // 行的 className 的回调方法,也可以使用字符串为所有行设置一个固定的 className。
|
|
58
|
+
rowStyle: [Object, Function], // 行的 style 的回调方法
|
|
59
|
+
cellClassName: [String, Function], // 行单元格的 className 的回调方法
|
|
60
|
+
cellStyle: [Object, Function], // 行单元格的 style 的回调方法
|
|
61
|
+
headerRowClassName: [String, Function], // 表头行的 className 的回调方法
|
|
62
|
+
headerRowStyle: [Object, Function], // 表头行的 style 的回调方法
|
|
63
|
+
headerCellClassName: [String, Function], // 表头单元格的 className 的回调方法
|
|
64
|
+
headerCellStyle: [Object, Function], // 表头单元格的 style 的回调方法
|
|
65
|
+
showHeaderOverflow: { type: [Boolean, String], default: null }, // 设置表头所有内容过长时显示为省略号
|
|
66
|
+
showBodyOverflow: { type: [Boolean, String], default: null }, // 设置表体所有内容过长时显示为省略号
|
|
67
|
+
fixedColumnsRoll: { default: false, type: Boolean }, // 表格有固定列,同时表格有合计,同时表格有横向滚动条,会导致固定列部分的横向滚动条不可拖动,是否需要解决此问题
|
|
68
|
+
selectTrClass: String, // 如果当前行被选中了 type类型为selection,就给当前行给个类样式
|
|
69
|
+
paginationShow: { default: false, type: Boolean }, // 是否需要分页器
|
|
70
|
+
total: { default: 0, type: Number }, // 总条数
|
|
71
|
+
pagerCount: { default: 5, type: Number }, // 页码按钮的数量,当总页数超过该值时会折叠
|
|
72
|
+
pageSize: { default: 10, type: Number }, // 每页条数
|
|
73
|
+
currentPage: { default: 1, type: Number }, // 当前页
|
|
74
|
+
pageSizes: { default: () => [10, 20, 30, 50], type: Array }, // 每页显示个数选择器的选项设置
|
|
75
|
+
layout: { default: "total, sizes, prev, pager, next, jumper", type: String }, // 分页组件布局,子组件名用逗号分隔
|
|
76
|
+
},
|
|
77
|
+
methods: {
|
|
78
|
+
// 分页器的事件
|
|
79
|
+
handleSizeChange(val) {
|
|
80
|
+
this.newPageSize = val;
|
|
81
|
+
this.$emit("handlePageSize", { size: this.newPageSize, page: this.newcurrentPage });
|
|
82
|
+
},
|
|
83
|
+
handleCurrentChange(val) {
|
|
84
|
+
this.newcurrentPage = val;
|
|
85
|
+
this.$emit("handlePageSize", { size: this.newPageSize, page: this.newcurrentPage });
|
|
86
|
+
},
|
|
87
|
+
// 用于可展开表格与树形表格
|
|
88
|
+
toggleRowExpansion(row, expanded) {
|
|
89
|
+
this.$refs.singleTable.toggleRowExpansion(row, expanded);
|
|
90
|
+
},
|
|
91
|
+
// 合并行或列的计算方法
|
|
92
|
+
arraySpanMethod({ row, column, rowIndex, columnIndex }) {
|
|
93
|
+
let objs = { row, column, rowIndex, columnIndex };
|
|
94
|
+
// 是否有条件开启合并列
|
|
95
|
+
if (typeof this.spanMethod === "function") {
|
|
96
|
+
return this.spanMethod(objs);
|
|
97
|
+
} else {
|
|
98
|
+
return "";
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
|
|
102
|
+
// 当用户手动勾选全选 Checkbox 时触发的事件 selection
|
|
103
|
+
selectAll(selection) {
|
|
104
|
+
this.$emit("select-all", selection);
|
|
105
|
+
// 当用户取消全选,就去找出表格当前的数据ID,然后去删除记录选择项ID数组对应的值
|
|
106
|
+
if (this.recordTableSelect && this.data.length <= 1000) {
|
|
107
|
+
if (selection.length === 0) {
|
|
108
|
+
// this.data当前页的数据(当前表格数据)
|
|
109
|
+
this.data.forEach((item) => {
|
|
110
|
+
this.tableSelectData.forEach((is, index) => {
|
|
111
|
+
if (item.id === is) {
|
|
112
|
+
this.tableSelectData.splice(index, 1);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
// 全选 就去添加记录
|
|
118
|
+
if (selection.length > 0) {
|
|
119
|
+
this.data.forEach((item) => {
|
|
120
|
+
if (item.id) {
|
|
121
|
+
this.tableSelectData.push(item.id);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
this.tableSelectData = JSON.parse(JSON.stringify(removal(this.tableSelectData)));
|
|
126
|
+
// 这就是整个表格当前选中项(包含分页)
|
|
127
|
+
this.$emit("table-select-change", this.tableSelectData);
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
// 当用户手动勾选数据行的 Checkbox 时触发的事件
|
|
131
|
+
plSelect(selection, row) {
|
|
132
|
+
this.$emit("select", selection, row);
|
|
133
|
+
// (执行删除选中节点操作)
|
|
134
|
+
if (row.id && this.recordTableSelect && this.data.length <= 1000) {
|
|
135
|
+
// 思路如下: selection表示当前表格选中的节点数组, row表示当前点击的行节点
|
|
136
|
+
// 1.如果selection中存在row , 代表当前是勾上节点
|
|
137
|
+
// 2.相反selection中不存在row , 代表当前是在取消选中节点
|
|
138
|
+
// 3.如果当前在取消选中节点,则falsData为空
|
|
139
|
+
// 4.如果falsData为空,则去执行删除 -> 存放整个表格(包含分页)的数组中的值 (则 his.dats整个表格(包含分页)选中的节点数组节点ID)
|
|
140
|
+
// 5. 这一步非常重要(判断当时节点是关闭,还是开启)
|
|
141
|
+
let falsData = selection.filter((item) => item.id === row.id);
|
|
142
|
+
// 如果falsData数组为空,则代表当前节点被关闭了
|
|
143
|
+
if (falsData.length === 0) {
|
|
144
|
+
this.tableSelectData.forEach((item, index) => {
|
|
145
|
+
if (item === row.id) {
|
|
146
|
+
this.tableSelectData.splice(index, 1);
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
// 当前节点被开启
|
|
151
|
+
if (falsData.length > 0) {
|
|
152
|
+
this.tableSelectData.push(row.id);
|
|
153
|
+
}
|
|
154
|
+
this.tableSelectData = JSON.parse(JSON.stringify(removal(this.tableSelectData)));
|
|
155
|
+
// 这就是整个表格当前选中项(包含分页)
|
|
156
|
+
this.$emit("table-select-change", this.tableSelectData);
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
// 当选择项发生变化时会触发该事件
|
|
160
|
+
handleSelectionChange(val) {
|
|
161
|
+
this.$emit("selection-change", val);
|
|
162
|
+
},
|
|
163
|
+
// 用于多选表格,切换某一行的选中状态,如果使用了第二个参数,则是设置这一行选中与否(selected 为 true 则选中)
|
|
164
|
+
toggleRowSelection(rows) {
|
|
165
|
+
if (rows && isArrayFn(rows)) {
|
|
166
|
+
if (rows.length > 0 && this.$refs.singleTable) {
|
|
167
|
+
rows.forEach((item) => {
|
|
168
|
+
if (item.selected) {
|
|
169
|
+
this.$refs.singleTable.toggleRowSelection(item.row, item.selected, this.recordTableSelect);
|
|
170
|
+
} else if (item.selected === false) {
|
|
171
|
+
this.$refs.singleTable.toggleRowSelection(item.row, false, this.recordTableSelect);
|
|
172
|
+
} else if (item.selected === undefined) {
|
|
173
|
+
this.$refs.singleTable.toggleRowSelection(item.row, "", this.recordTableSelect);
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
} else {
|
|
178
|
+
console.error("数据格式需要一个数组");
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
// 用于多选表格,切换选中状态,适用于选中很多,取消很多
|
|
182
|
+
partRowSelections(datas, state) {
|
|
183
|
+
if (typeIs(state) === "boolean" && this.useVirtual && this.bigDataCheckbox && this.rowKey) {
|
|
184
|
+
this.$refs.singleTable.partRowSelections(datas, state);
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
// 用于多选表格,切换所有行的选中状态
|
|
188
|
+
toggleAllSelection() {
|
|
189
|
+
if (this.$refs.singleTable) {
|
|
190
|
+
this.$refs.singleTable.toggleAllSelection();
|
|
191
|
+
} else {
|
|
192
|
+
console.error("toggleAllSelection方法为找到,可能表格未加载完毕");
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
// 用于多选表格,清空用户的选择
|
|
196
|
+
clearSelection() {
|
|
197
|
+
if (this.$refs.singleTable) {
|
|
198
|
+
this.$refs.singleTable.clearSelection();
|
|
199
|
+
} else {
|
|
200
|
+
console.error("clearSelection方法为找到,可能表格未加载完毕");
|
|
201
|
+
}
|
|
202
|
+
},
|
|
203
|
+
// 让表格滚动条回到顶部,和左侧
|
|
204
|
+
pagingScrollTopLeft(top = 0, left = 0, type = "不倒计时") {
|
|
205
|
+
this.$refs.singleTable.pagingScrollTop(top, left, type);
|
|
206
|
+
},
|
|
207
|
+
// 滚动表格到底部
|
|
208
|
+
scrollBottom() {
|
|
209
|
+
this.$refs.singleTable.scrollBottom();
|
|
210
|
+
},
|
|
211
|
+
// 合计的方法
|
|
212
|
+
getSummaries(param) {
|
|
213
|
+
if (typeof this.summaryMethod === "function" && this.summaryMethod) {
|
|
214
|
+
return this.summaryMethod(param);
|
|
215
|
+
} else {
|
|
216
|
+
const { columns, data } = param;
|
|
217
|
+
const sums = [];
|
|
218
|
+
columns.forEach((column, index) => {
|
|
219
|
+
if (index === 0) {
|
|
220
|
+
sums[index] = this.sumText;
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
const values = data.map((item) => Number(item[column.property]));
|
|
224
|
+
// 需要合并的选项
|
|
225
|
+
const flas = this.totalOption.filter((item) => item.label === column.label);
|
|
226
|
+
if (!values.every((value) => isNaN(value)) && flas.length > 0) {
|
|
227
|
+
sums[index] = values.reduce((prev, curr) => {
|
|
228
|
+
const value = Number(curr);
|
|
229
|
+
if (!isNaN(value)) {
|
|
230
|
+
return prev + curr;
|
|
231
|
+
} else {
|
|
232
|
+
return prev;
|
|
233
|
+
}
|
|
234
|
+
}, 0);
|
|
235
|
+
sums[index] += flas[0].unit || "";
|
|
236
|
+
} else {
|
|
237
|
+
sums[index] = "";
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
// 返回一个二维数组的表尾合计
|
|
241
|
+
return [sums];
|
|
242
|
+
}
|
|
243
|
+
},
|
|
244
|
+
// 打开自定义字段框
|
|
245
|
+
plDialogOpens() {
|
|
246
|
+
this._times = null;
|
|
247
|
+
this.$refs.plDialog.style.width = 300 + "px";
|
|
248
|
+
this._times = setTimeout(() => {
|
|
249
|
+
this.plDialogFals = true;
|
|
250
|
+
}, 200);
|
|
251
|
+
// 创建节点(主要用来弹出menu窗口时,不让起点击外面)
|
|
252
|
+
this.aBox = document.createElement("div");
|
|
253
|
+
this.aBox.className = "modal-backdrop";
|
|
254
|
+
this.aBox.style.display = "block";
|
|
255
|
+
this.aBox.onclick = () => {
|
|
256
|
+
this.closeModal();
|
|
257
|
+
};
|
|
258
|
+
document.body.appendChild(this.aBox);
|
|
259
|
+
},
|
|
260
|
+
// 关闭自定义字段框(取消选择)
|
|
261
|
+
closeModal() {
|
|
262
|
+
this.plDialogFals = false;
|
|
263
|
+
clearTimeout(this._times);
|
|
264
|
+
this.$refs.plDialog.style.width = 0 + "px";
|
|
265
|
+
this.aBox.style.display = "none";
|
|
266
|
+
this.clearNode();
|
|
267
|
+
this.newDialogData = JSON.parse(JSON.stringify(this.dialogData));
|
|
268
|
+
},
|
|
269
|
+
// 确认按钮
|
|
270
|
+
confirmField() {
|
|
271
|
+
this.$emit("show-field", this.newDialogData);
|
|
272
|
+
this.plDialogFals = false;
|
|
273
|
+
clearTimeout(this._times);
|
|
274
|
+
this.$refs.plDialog.style.width = 0 + "px";
|
|
275
|
+
this.aBox.style.display = "none";
|
|
276
|
+
this.clearNode();
|
|
277
|
+
},
|
|
278
|
+
// 重置按钮
|
|
279
|
+
reset() {
|
|
280
|
+
this.$emit("reset", this.newDialogData);
|
|
281
|
+
this.plDialogFals = false;
|
|
282
|
+
clearTimeout(this._times);
|
|
283
|
+
this.$refs.plDialog.style.width = 0 + "px";
|
|
284
|
+
this.aBox.style.display = "none";
|
|
285
|
+
this.clearNode();
|
|
286
|
+
},
|
|
287
|
+
// 当某一行被点击时会触发该事件
|
|
288
|
+
rowClick(row, column, event) {
|
|
289
|
+
if (this.highlightCurrentRow) {
|
|
290
|
+
this.$refs.singleTable.setCurrentRow(row);
|
|
291
|
+
}
|
|
292
|
+
this.$emit("row-click", row, column, event);
|
|
293
|
+
// 如果当前节点存在current-row,再次点击时候那么就去掉current-row效果
|
|
294
|
+
if (event.path && this.highlightCurrentRow && this.inverseCurrentRow) {
|
|
295
|
+
event.path.forEach((item) => {
|
|
296
|
+
if (item && item.classList) {
|
|
297
|
+
item.classList.forEach((its) => {
|
|
298
|
+
if (its === "current-row") {
|
|
299
|
+
this.$refs.singleTable.setCurrentRow();
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
},
|
|
306
|
+
// 当某一行被双点击时
|
|
307
|
+
rowDblclick(row, column, event) {
|
|
308
|
+
this.$emit("row-dblclick", row, column, event);
|
|
309
|
+
},
|
|
310
|
+
// 用于单选表格,设定某一行为选中行
|
|
311
|
+
setCurrentRow(row) {
|
|
312
|
+
if (row) {
|
|
313
|
+
this.$refs.singleTable.setCurrentRow(row);
|
|
314
|
+
} else {
|
|
315
|
+
this.$refs.singleTable.setCurrentRow();
|
|
316
|
+
}
|
|
317
|
+
},
|
|
318
|
+
// 当用户对某一行展开或者关闭的时候会触发该事件
|
|
319
|
+
expChang(row, expandedRows) {
|
|
320
|
+
this.$emit("expand-change", row, expandedRows);
|
|
321
|
+
},
|
|
322
|
+
// 当某一列的表头被点击时会触发该事件
|
|
323
|
+
headerClick(column, event) {
|
|
324
|
+
this.$emit("header-click", column, event);
|
|
325
|
+
},
|
|
326
|
+
// 修改字段名按钮事件
|
|
327
|
+
amendField(item, index) {
|
|
328
|
+
this.$emit("amend-field", item, index);
|
|
329
|
+
},
|
|
330
|
+
// 表体滚动事件
|
|
331
|
+
tableBodyScroll(table, event) {
|
|
332
|
+
// 当表格滚动暴露滚动事件
|
|
333
|
+
this.$emit("table-body-scroll", table, event);
|
|
334
|
+
},
|
|
335
|
+
// 当拖动表头改变了列的宽度的时候会触发该事件(newWidth, oldWidth, column, event)
|
|
336
|
+
headerDragend(newWidth, oldWidth, column, event) {
|
|
337
|
+
this.$emit("header-dragend", newWidth, oldWidth, column, event);
|
|
338
|
+
this.doLayout("不执行滚动条");
|
|
339
|
+
},
|
|
340
|
+
// 对 Table 进行重新布局。当 Table 或其祖先元素由隐藏切换为显示时,可能需要调用此方法
|
|
341
|
+
doLayout(type) {
|
|
342
|
+
this.$refs.singleTable.doLayout();
|
|
343
|
+
const { scrollTop, useVirtual, judgeFlse } = this.$refs.singleTable;
|
|
344
|
+
if (scrollTop && useVirtual && type !== "不执行滚动条") {
|
|
345
|
+
if (judgeFlse) {
|
|
346
|
+
this.$refs.singleTable.scrollBottom();
|
|
347
|
+
} else {
|
|
348
|
+
this.$refs.singleTable.pagingScrollTop(scrollTop);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
},
|
|
352
|
+
// 删除节点
|
|
353
|
+
clearNode() {
|
|
354
|
+
// 删除节点
|
|
355
|
+
let parent = this.aBox ? this.aBox.parentNode : "";
|
|
356
|
+
parent && parent.removeChild(this.aBox);
|
|
357
|
+
let doms = document.getElementsByClassName("modal-backdrop");
|
|
358
|
+
if (doms.length > 0) {
|
|
359
|
+
document.body.removeChild(doms[0]);
|
|
360
|
+
}
|
|
361
|
+
this.aBox = null;
|
|
362
|
+
},
|
|
363
|
+
// 当表格的排序条件发生变化的时候会触发该事件
|
|
364
|
+
sortChange({ column, prop, order }) {
|
|
365
|
+
let objs = { column, prop, order };
|
|
366
|
+
this.$emit("sort-change", objs);
|
|
367
|
+
},
|
|
368
|
+
// 当表格的当前行发生变化的时候会触发该事件
|
|
369
|
+
currentChange(currentRow, oldCurrentRow) {
|
|
370
|
+
this.$emit("current-change", currentRow, oldCurrentRow);
|
|
371
|
+
},
|
|
372
|
+
// 当表格的筛选条件发生变化的时候会触发该事件
|
|
373
|
+
filterChange(filters) {
|
|
374
|
+
this.$emit("filter-change", filters);
|
|
375
|
+
},
|
|
376
|
+
// 用于清空排序条件,数据会恢复成未排序的状态
|
|
377
|
+
clearSort() {
|
|
378
|
+
this.$refs.singleTable.clearSort();
|
|
379
|
+
},
|
|
380
|
+
// 不传入参数时用于清空所有过滤条件,数据会恢复成未过滤的状态
|
|
381
|
+
clearFilter(columnKey) {
|
|
382
|
+
this.$refs.singleTable.clearFilter(columnKey);
|
|
383
|
+
},
|
|
384
|
+
// 手动对 Table 进行排序
|
|
385
|
+
sort(prop, order) {
|
|
386
|
+
this.$refs.singleTable.sort(prop, order);
|
|
387
|
+
},
|
|
388
|
+
// 当单元格 hover 进入时会触发该事件
|
|
389
|
+
cellMouseEnter(row, column, cell, event) {
|
|
390
|
+
this.$emit("cell-mouse-enter", row, column, cell, event);
|
|
391
|
+
},
|
|
392
|
+
// 当单元格 hover 退出时会触发该事件
|
|
393
|
+
cellMouseLeave(row, column, cell, event) {
|
|
394
|
+
this.$emit("cell-mouse-leave", row, column, cell, event);
|
|
395
|
+
},
|
|
396
|
+
// 当某个单元格被点击时会触发该事件
|
|
397
|
+
cellClick(row, column, cell, event) {
|
|
398
|
+
this.$emit("cell-click", row, column, cell, event);
|
|
399
|
+
},
|
|
400
|
+
// 当某个单元格被双击击时会触发该事件
|
|
401
|
+
cellDblclick(row, column, cell, event) {
|
|
402
|
+
this.$emit("cell-dblclick", row, column, cell, event);
|
|
403
|
+
},
|
|
404
|
+
// 当某一行被鼠标右键点击时会触发该事件
|
|
405
|
+
rowContextmenu(row, column, event) {
|
|
406
|
+
this.$emit("row-contextmenu", row, column, event);
|
|
407
|
+
},
|
|
408
|
+
// 当某一列的表头被鼠标右键点击时触发该事件 column, event
|
|
409
|
+
headerContextmenu(column, event) {
|
|
410
|
+
this.$emit("header-contextmenu", column, event);
|
|
411
|
+
},
|
|
412
|
+
// 判断行是否为树形节点展开状态
|
|
413
|
+
isTreeExpandByRow(row) {
|
|
414
|
+
return this.$refs.singleTable.isTreeExpandByRow(row);
|
|
415
|
+
},
|
|
416
|
+
// 当虚拟树节点展开或收起时会触发该事件
|
|
417
|
+
toggleTreeExpands(row, treeExpanded, event) {
|
|
418
|
+
this.$emit("toggle-tree-expand", row, treeExpanded, event);
|
|
419
|
+
},
|
|
420
|
+
// 展开全部pl-table的树
|
|
421
|
+
setAllTreeExpansion() {
|
|
422
|
+
this.$refs.singleTable.setAllTreeExpansion();
|
|
423
|
+
},
|
|
424
|
+
// 关闭所有
|
|
425
|
+
clearTreeExpand() {
|
|
426
|
+
this.$refs.singleTable.clearTreeExpand();
|
|
427
|
+
},
|
|
428
|
+
// 获取已展开的节点
|
|
429
|
+
getTreeExpandRecords() {
|
|
430
|
+
return this.$refs.singleTable.getTreeExpandRecords();
|
|
431
|
+
},
|
|
432
|
+
// 设置展开树形节点
|
|
433
|
+
setTreeExpansion(rows, expanded) {
|
|
434
|
+
this.$refs.singleTable.setPlTreeExpansion(rows, expanded);
|
|
435
|
+
},
|
|
436
|
+
// 切换展开树形节点的状态
|
|
437
|
+
toggleTreeExpansion(row) {
|
|
438
|
+
this.$refs.singleTable.toggleTreeExpansion(row);
|
|
439
|
+
},
|
|
440
|
+
},
|
|
441
|
+
// 生命周期结束
|
|
442
|
+
beforeDestroy() {},
|
|
443
|
+
// 如果使用了keep-alive
|
|
444
|
+
deactivated() {},
|
|
445
|
+
activated() {},
|
|
446
|
+
watch: {
|
|
447
|
+
data: {
|
|
448
|
+
// 当需要监听一个对象的改变时,普通的watch方法无法监听到对象内部属性的改变,此时就需要deep属性对对象进行深度监听。
|
|
449
|
+
// deep: true, // 不需要监听数组对象的变化
|
|
450
|
+
immediate: true, // 如果我们需要在最初绑定值的时候也执行函数,则就需要用到immediate属性。
|
|
451
|
+
handler(val) {
|
|
452
|
+
if (!isArrayFn(val)) {
|
|
453
|
+
throw new Error("表格数据需要的是数组格式,请检查你的数据格式");
|
|
454
|
+
}
|
|
455
|
+
},
|
|
456
|
+
},
|
|
457
|
+
dialogData: {
|
|
458
|
+
deep: true,
|
|
459
|
+
immediate: true,
|
|
460
|
+
handler(val) {
|
|
461
|
+
this.newDialogData = JSON.parse(JSON.stringify(val));
|
|
462
|
+
},
|
|
463
|
+
},
|
|
464
|
+
currentPage(val) {
|
|
465
|
+
this.newcurrentPage = val;
|
|
466
|
+
},
|
|
467
|
+
pageSize(val) {
|
|
468
|
+
this.newPageSize = val;
|
|
469
|
+
},
|
|
470
|
+
height: {
|
|
471
|
+
immediate: true,
|
|
472
|
+
handler(value) {
|
|
473
|
+
this.setHeight();
|
|
474
|
+
},
|
|
475
|
+
},
|
|
476
|
+
maxHeight: {
|
|
477
|
+
immediate: true,
|
|
478
|
+
handler(value) {
|
|
479
|
+
this.setHeight();
|
|
480
|
+
},
|
|
481
|
+
},
|
|
482
|
+
},
|
|
483
|
+
};
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import XEUtils from "xe-utils/ctor";
|
|
2
|
+
import { typeIs } from "../../utils/common";
|
|
3
|
+
|
|
4
|
+
// 方法
|
|
5
|
+
export default {
|
|
6
|
+
// 暴露相关方法
|
|
7
|
+
/**
|
|
8
|
+
* 设置展开树形节点,二个参数设置这一行展开与否
|
|
9
|
+
* 支持单行
|
|
10
|
+
* 支持多行
|
|
11
|
+
* @param {Array/Row} rows 行数据
|
|
12
|
+
* @param {Boolean} expanded 是否展开
|
|
13
|
+
*/
|
|
14
|
+
setTreeExpansion(rows, expanded) {
|
|
15
|
+
let { treeOpts, plTreeData } = this;
|
|
16
|
+
let { accordion } = treeOpts;
|
|
17
|
+
if (rows) {
|
|
18
|
+
if (!XEUtils.isArray(rows)) {
|
|
19
|
+
rows = [rows];
|
|
20
|
+
}
|
|
21
|
+
if (rows.length) {
|
|
22
|
+
rows.forEach((row) => {
|
|
23
|
+
// 节点已经展开 或者关闭,再去展开获取关闭 直接返回
|
|
24
|
+
if ((row.pl_table_expand || false) === expanded) return;
|
|
25
|
+
row.pl_table_expand = expanded;
|
|
26
|
+
// 当前row在数据中的索引值(非常重要)
|
|
27
|
+
const index = plTreeData.findIndex((item) => item[this.rowId] === row[this.rowId]);
|
|
28
|
+
// 获取当前节点下面的展开的子节点
|
|
29
|
+
const treeExpandeds = this.eachTreeExpand(row);
|
|
30
|
+
// 大于等于0才代表是展开的表格中可见的节点。不大于等于0代表是展开的 不可见的子节点
|
|
31
|
+
if (index >= 0) {
|
|
32
|
+
// 展开节点
|
|
33
|
+
if (expanded) {
|
|
34
|
+
// 插入节点
|
|
35
|
+
plTreeData.splice(index + 1, 0, ...treeExpandeds);
|
|
36
|
+
// 添加当前展开节点到 ->展开节点数组中
|
|
37
|
+
this.treeExpandeds.push(row);
|
|
38
|
+
} else {
|
|
39
|
+
// 关闭节点
|
|
40
|
+
// 删除所有子层级数据(删除的子节点其实很简单,就是删除当前节点下面的子节点数量)
|
|
41
|
+
plTreeData.splice(index + 1, treeExpandeds.length);
|
|
42
|
+
// 删除展开节点数组的row
|
|
43
|
+
XEUtils.remove(this.treeExpandeds, (item) => item[this.rowId] === row[this.rowId]);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
// 载入数据
|
|
48
|
+
this.setTreeTableData();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
// 判断行是否为树形节点展开状态
|
|
53
|
+
isTreeExpandByRow(row) {
|
|
54
|
+
if (!this.rowId) {
|
|
55
|
+
return false;
|
|
56
|
+
} else {
|
|
57
|
+
const rowInfo = this.plTreeData.filter((item) => item[this.rowId] === row[this.rowId])[0];
|
|
58
|
+
return typeIs(rowInfo.pl_table_expand) === "boolean" ? rowInfo.pl_table_expand : false;
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
// 展开所有
|
|
62
|
+
setAllTreeExpansion() {
|
|
63
|
+
let data = JSON.parse(JSON.stringify(this.copyPlTreeData));
|
|
64
|
+
let treeExpandeds = [];
|
|
65
|
+
this.treeExpandeds = [];
|
|
66
|
+
XEUtils.eachTree(
|
|
67
|
+
data,
|
|
68
|
+
(row) => {
|
|
69
|
+
if (row[this.treeOpts.children]) {
|
|
70
|
+
row.pl_table_expand = true;
|
|
71
|
+
// 添加进入展开节点中
|
|
72
|
+
this.treeExpandeds.push(row);
|
|
73
|
+
}
|
|
74
|
+
treeExpandeds.push(row);
|
|
75
|
+
},
|
|
76
|
+
this.treeOpts
|
|
77
|
+
);
|
|
78
|
+
this.plTreeData = treeExpandeds;
|
|
79
|
+
// 设置数据
|
|
80
|
+
this.setTreeTableData();
|
|
81
|
+
},
|
|
82
|
+
// 关闭所有
|
|
83
|
+
clearTreeExpand() {
|
|
84
|
+
this.plTreeData = JSON.parse(JSON.stringify(this.copyPlTreeData));
|
|
85
|
+
this.treeExpandeds = [];
|
|
86
|
+
// 设置数据
|
|
87
|
+
this.setTreeTableData();
|
|
88
|
+
},
|
|
89
|
+
// 获取已展开的节点
|
|
90
|
+
getTreeExpandRecords() {
|
|
91
|
+
let newData = JSON.parse(JSON.stringify(this.treeExpandeds));
|
|
92
|
+
newData.forEach((item) => {
|
|
93
|
+
delete item.pl_table_expand;
|
|
94
|
+
delete item.pl_table_level;
|
|
95
|
+
});
|
|
96
|
+
return newData.slice(0);
|
|
97
|
+
},
|
|
98
|
+
// 设置树的节点展开与否
|
|
99
|
+
setPlTreeExpansion(rows, expanded) {
|
|
100
|
+
if (!rows) return;
|
|
101
|
+
const { children } = this.treeOpts;
|
|
102
|
+
// 根据rowId, 获取当前数据中的row,不改变表格数据,改变复制的数据
|
|
103
|
+
let row = this.plTreeData.filter((item) => item[this.rowId] === rows[this.rowId])[0];
|
|
104
|
+
// row || children无子节点。不存在就返回
|
|
105
|
+
if (!row || !row[children]) return;
|
|
106
|
+
// 设置节点
|
|
107
|
+
this.setTreeExpansion(row, expanded);
|
|
108
|
+
},
|
|
109
|
+
// 切换展开树形节点的状态
|
|
110
|
+
toggleTreeExpansion(rows) {
|
|
111
|
+
if (!rows) return;
|
|
112
|
+
const { children } = this.treeOpts;
|
|
113
|
+
// 根据rowId, 获取当前数据中的row,不改变表格数据,改变复制的数据
|
|
114
|
+
let row = this.plTreeData.filter((item) => item[this.rowId] === rows[this.rowId])[0];
|
|
115
|
+
// row || children无子节点。不存在就返回
|
|
116
|
+
if (!row || !row[children]) return;
|
|
117
|
+
// 设置节点
|
|
118
|
+
this.setTreeExpansion(row, !this.isTreeExpandByRow(row));
|
|
119
|
+
},
|
|
120
|
+
};
|