cy-element-ui 1.1.26 → 1.1.27
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/README.md +260 -37
- package/lib/CySelectDisplayInput.js +29 -13
- package/lib/CySubTitle.js +11 -2
- package/lib/CyTabDialog.js +70 -26
- package/lib/CyTreeSelect.js +106 -4
- package/lib/element-ui.common.js +237 -66
- package/lib/index.js +2 -2
- package/package.json +121 -133
- package/packages/cy/selectDisplayInput/src/main.vue +87 -75
- package/packages/cy/subTitle/src/main.vue +45 -36
- package/packages/cy/tabDialog/src/main.vue +315 -277
- package/packages/cy/treeSelect/src/main.vue +378 -290
- package/src/index.js +1 -1
- package/web-types.json +4908 -4193
|
@@ -1,277 +1,315 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
:
|
|
16
|
-
:
|
|
17
|
-
:
|
|
18
|
-
:
|
|
19
|
-
:
|
|
20
|
-
:
|
|
21
|
-
:
|
|
22
|
-
:
|
|
23
|
-
:
|
|
24
|
-
:
|
|
25
|
-
:
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
@
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
<slot
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
<
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
}
|
|
277
|
-
|
|
1
|
+
<template>
|
|
2
|
+
<!-- 组件根容器 -->
|
|
3
|
+
<div class="cy-tab-dialog">
|
|
4
|
+
<!-- 独立遮罩层:仅当 visible 且 modal 为 true 时显示,点击可关闭 -->
|
|
5
|
+
<div
|
|
6
|
+
v-show="visible && modal"
|
|
7
|
+
contenteditable="false"
|
|
8
|
+
class="cy-tab-dialog-modal"
|
|
9
|
+
:style="{ zIndex: modelZIndex, height: modelHeight ? modelHeight : '100%' }"
|
|
10
|
+
@click="closeOnClickModal && handleClose"
|
|
11
|
+
></div>
|
|
12
|
+
|
|
13
|
+
<!-- 基础对话框:禁用自带遮罩/滚动锁定,改用上方自管遮罩 -->
|
|
14
|
+
<el-dialog
|
|
15
|
+
:visible="visible"
|
|
16
|
+
:title="title"
|
|
17
|
+
:width="width"
|
|
18
|
+
:fullscreen="fullscreen"
|
|
19
|
+
:modal="false"
|
|
20
|
+
:modal-append-to-body="false"
|
|
21
|
+
:append-to-body="false"
|
|
22
|
+
:lock-scroll="true"
|
|
23
|
+
:custom-class="customClass"
|
|
24
|
+
:close-on-click-modal="appendToTagsView ? false : closeOnClickModal"
|
|
25
|
+
:close-on-press-escape="appendToTagsView ? false : closeOnPressEscape"
|
|
26
|
+
:show-close="showClose"
|
|
27
|
+
:center="center"
|
|
28
|
+
:destroy-on-close="destroyOnClose"
|
|
29
|
+
contenteditable="false"
|
|
30
|
+
v-dialog-drag="isDrag"
|
|
31
|
+
v-dialog-drag-width="isDrag"
|
|
32
|
+
v-dialog-drag-height="isDrag"
|
|
33
|
+
:before-close="beforeClose"
|
|
34
|
+
@open="handleOpen"
|
|
35
|
+
@opened="handleOpened"
|
|
36
|
+
@close="handleClose"
|
|
37
|
+
@closed="handleClosed"
|
|
38
|
+
>
|
|
39
|
+
<!-- 自定义标题插槽 -->
|
|
40
|
+
<template v-if="$slots.title" slot="title">
|
|
41
|
+
<slot name="title"></slot>
|
|
42
|
+
</template>
|
|
43
|
+
|
|
44
|
+
<!-- 默认插槽:对话框主体内容 -->
|
|
45
|
+
<slot></slot>
|
|
46
|
+
|
|
47
|
+
<!-- 自定义底部操作区插槽 -->
|
|
48
|
+
<template v-if="$slots.footer" slot="footer">
|
|
49
|
+
<slot name="footer"></slot>
|
|
50
|
+
</template>
|
|
51
|
+
</el-dialog>
|
|
52
|
+
</div>
|
|
53
|
+
</template>
|
|
54
|
+
|
|
55
|
+
<script>
|
|
56
|
+
// 引入 Element UI 底层 Dialog 组件(直接引用源码而非全量注册)
|
|
57
|
+
import ElDialog from '../../../dialog';
|
|
58
|
+
import Vue from 'vue';
|
|
59
|
+
|
|
60
|
+
export default {
|
|
61
|
+
name: 'CyTabDialog',
|
|
62
|
+
components: {
|
|
63
|
+
ElDialog
|
|
64
|
+
},
|
|
65
|
+
props: {
|
|
66
|
+
// 是否显示 Dialog,支持 .sync 修饰符
|
|
67
|
+
visible: {
|
|
68
|
+
type: Boolean,
|
|
69
|
+
default: false
|
|
70
|
+
},
|
|
71
|
+
// Dialog 的标题,也可通过具名 slot 自定义
|
|
72
|
+
title: {
|
|
73
|
+
type: String,
|
|
74
|
+
default: ''
|
|
75
|
+
},
|
|
76
|
+
// Dialog 的宽度
|
|
77
|
+
width: {
|
|
78
|
+
type: String,
|
|
79
|
+
default: '50%'
|
|
80
|
+
},
|
|
81
|
+
// 是否为全屏 Dialog
|
|
82
|
+
fullscreen: {
|
|
83
|
+
type: Boolean,
|
|
84
|
+
default: false
|
|
85
|
+
},
|
|
86
|
+
// Dialog CSS 中的 margin-top 值
|
|
87
|
+
top: {
|
|
88
|
+
type: String,
|
|
89
|
+
default: '6vh'
|
|
90
|
+
},
|
|
91
|
+
// 是否需要遮罩层
|
|
92
|
+
modal: {
|
|
93
|
+
type: Boolean,
|
|
94
|
+
default: true
|
|
95
|
+
},
|
|
96
|
+
// 遮罩层是否插入至 body 元素上,若为 false,则遮罩层会插入至 Dialog 的父元素上
|
|
97
|
+
appendToBody: {
|
|
98
|
+
type: Boolean,
|
|
99
|
+
default: false
|
|
100
|
+
},
|
|
101
|
+
// 是否在 Dialog 出现时将 body 或上层滚动锁定
|
|
102
|
+
lockScroll: {
|
|
103
|
+
type: Boolean,
|
|
104
|
+
default: true
|
|
105
|
+
},
|
|
106
|
+
// Dialog 的自定义类名
|
|
107
|
+
customClass: {
|
|
108
|
+
type: String,
|
|
109
|
+
default: ''
|
|
110
|
+
},
|
|
111
|
+
// 是否可以通过点击 modal 关闭 Dialog
|
|
112
|
+
closeOnClickModal: {
|
|
113
|
+
type: Boolean,
|
|
114
|
+
default: false
|
|
115
|
+
},
|
|
116
|
+
// 是否可以通过按下 ESC 关闭 Dialog
|
|
117
|
+
closeOnPressEscape: {
|
|
118
|
+
type: Boolean,
|
|
119
|
+
default: true
|
|
120
|
+
},
|
|
121
|
+
// 是否显示关闭按钮
|
|
122
|
+
showClose: {
|
|
123
|
+
type: Boolean,
|
|
124
|
+
default: true
|
|
125
|
+
},
|
|
126
|
+
// 是否对头部和底部采用居中布局
|
|
127
|
+
center: {
|
|
128
|
+
type: Boolean,
|
|
129
|
+
default: false
|
|
130
|
+
},
|
|
131
|
+
// 关闭时销毁 Dialog 中的元素
|
|
132
|
+
destroyOnClose: {
|
|
133
|
+
type: Boolean,
|
|
134
|
+
default: false
|
|
135
|
+
},
|
|
136
|
+
// 是否放到 tagsView 中(即当前 app-views 下面);此属性为 true 时 appendToBody 无效
|
|
137
|
+
appendToTagsView: {
|
|
138
|
+
type: Boolean,
|
|
139
|
+
default: false
|
|
140
|
+
},
|
|
141
|
+
// 对话框是否可拖拽
|
|
142
|
+
isDrag: {
|
|
143
|
+
type: Boolean,
|
|
144
|
+
default: true
|
|
145
|
+
},
|
|
146
|
+
// 关闭前的回调,会暂停 Dialog 的关闭
|
|
147
|
+
beforeClose: {
|
|
148
|
+
type: Function
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
data() {
|
|
152
|
+
return {
|
|
153
|
+
// 判断 dialog 是否已经放到对应的 div 下
|
|
154
|
+
rendered: false,
|
|
155
|
+
// 自管遮罩层的 z-index
|
|
156
|
+
modelZIndex: 1000,
|
|
157
|
+
// 自管遮罩层的高度(根据父容器动态计算)
|
|
158
|
+
modelHeight: 0,
|
|
159
|
+
// 当前 app-views 的 dom 元素
|
|
160
|
+
parentDom: null,
|
|
161
|
+
// 当前 el-dialog 的 dom 元素
|
|
162
|
+
elDialogDom: null
|
|
163
|
+
};
|
|
164
|
+
},
|
|
165
|
+
watch: {
|
|
166
|
+
// 监听 visible:控制 dialog 显示/隐藏、挂载位置、键盘事件、遮罩层级
|
|
167
|
+
visible: {
|
|
168
|
+
immediate: true,
|
|
169
|
+
handler(val) {
|
|
170
|
+
if (val) {
|
|
171
|
+
this.$emit('open');
|
|
172
|
+
Vue.nextTick(() => {
|
|
173
|
+
const dom = this.$el;
|
|
174
|
+
// 首次打开时处理挂载位置
|
|
175
|
+
if (!this.rendered) {
|
|
176
|
+
this.rendered = true;
|
|
177
|
+
if (this.appendToTagsView) {
|
|
178
|
+
// 将当前 dialog 挪到当前 app-views 里面的 app-container
|
|
179
|
+
this.parentDom = dom.closest('.app-container');
|
|
180
|
+
if (!this.parentDom) this.parentDom = document.body;
|
|
181
|
+
this.parentDom.append(dom);
|
|
182
|
+
} else if (this.appendToBody) {
|
|
183
|
+
// 将当前 dialog 挪到当前 body 里面
|
|
184
|
+
this.parentDom = document.body;
|
|
185
|
+
this.parentDom.append(dom);
|
|
186
|
+
}
|
|
187
|
+
// 添加键盘监听事件(用于 ESC 关闭)
|
|
188
|
+
if (this.closeOnPressEscape) {
|
|
189
|
+
document.addEventListener('keydown', this.escKeyDown);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
setTimeout(() => {
|
|
194
|
+
if (this.parentDom) this.modelHeight = this.parentDom.scrollHeight + 'px';
|
|
195
|
+
// 当前 VDialog 不在 body 中时
|
|
196
|
+
if (!this.parentDom || this.parentDom.tagName.toUpperCase() !== 'BODY') {
|
|
197
|
+
// 获取 el-dialog 的宽度,如果大于 app-views 的宽度,则 el-dialog 不居中显示
|
|
198
|
+
let elDialogWidth = dom.getElementsByClassName('el-dialog')[0].clientWidth;
|
|
199
|
+
if (!this.parentDom || elDialogWidth < this.parentDom.clientWidth) {
|
|
200
|
+
dom.getElementsByClassName('el-dialog')[0].style.left = '50%';
|
|
201
|
+
dom.getElementsByClassName('el-dialog')[0].style.transform = 'translateX(-50%)';
|
|
202
|
+
} else {
|
|
203
|
+
dom.getElementsByClassName('el-dialog')[0].style.left = '0';
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
dom.getElementsByClassName('el-dialog')[0].style.marginTop = this.top;
|
|
207
|
+
}, 50);
|
|
208
|
+
|
|
209
|
+
// 获取 el-dialog 的 z-index,赋值给 model,用于处理 model 的层级问题
|
|
210
|
+
this.elDialogDom = dom.children[1];
|
|
211
|
+
setTimeout(() => {
|
|
212
|
+
this.modelZIndex = this.elDialogDom.style.zIndex;
|
|
213
|
+
}, 50);
|
|
214
|
+
});
|
|
215
|
+
} else {
|
|
216
|
+
// immediate=true 时,首次打开不需要触发 close 事件
|
|
217
|
+
if (this.rendered) this.$emit('close');
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
},
|
|
222
|
+
methods: {
|
|
223
|
+
/**
|
|
224
|
+
* 打开回调,透传 open 事件
|
|
225
|
+
* @fires {Event} open
|
|
226
|
+
* @returns {void}
|
|
227
|
+
*/
|
|
228
|
+
handleOpen() {
|
|
229
|
+
this.$emit('open');
|
|
230
|
+
},
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* 打开动画结束回调,透传 opened 事件
|
|
234
|
+
* @fires {Event} opened
|
|
235
|
+
* @returns {void}
|
|
236
|
+
*/
|
|
237
|
+
handleOpened() {
|
|
238
|
+
this.$emit('opened');
|
|
239
|
+
},
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* 关闭回调:同步 visible 并透传 close 事件
|
|
243
|
+
* @fires {Event} update:visible
|
|
244
|
+
* @fires {Event} close
|
|
245
|
+
* @returns {void}
|
|
246
|
+
*/
|
|
247
|
+
handleClose() {
|
|
248
|
+
this.$emit('update:visible', false);
|
|
249
|
+
this.$emit('close');
|
|
250
|
+
},
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* 关闭动画结束回调,透传 closed 事件
|
|
254
|
+
* @fires {Event} closed
|
|
255
|
+
* @returns {void}
|
|
256
|
+
*/
|
|
257
|
+
handleClosed() {
|
|
258
|
+
this.$emit('closed');
|
|
259
|
+
},
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* 监听 esc 键,按层级优先级关闭最上层 dialog
|
|
263
|
+
* @param {KeyboardEvent} event - 键盘事件对象
|
|
264
|
+
* @returns {void}
|
|
265
|
+
*/
|
|
266
|
+
escKeyDown(event) {
|
|
267
|
+
if (event.keyCode === 27) {
|
|
268
|
+
// 获取 body 下的直接子节点中的已打开的 VDialog
|
|
269
|
+
let bodyVDialogDomArr = [];
|
|
270
|
+
let bodyChildrenArr = document.body.childNodes;
|
|
271
|
+
for (let i = 0; i < bodyChildrenArr.length; i++) {
|
|
272
|
+
let item = bodyChildrenArr[i];
|
|
273
|
+
if (item.tagName && item.tagName.toUpperCase() === 'DIV' && item.className && item.className.split(' ').includes('cy-tab-dialog-opened')) {
|
|
274
|
+
bodyVDialogDomArr.push(item);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
// 判断 body 中是否有已打开的 VDialog,如果有,优先关闭 body 下的 VDialog
|
|
278
|
+
if (bodyVDialogDomArr.length > 0) {
|
|
279
|
+
// 获取当前 cy-tab-dialog 在当前 body 中的下标
|
|
280
|
+
let curDomIndex = [].indexOf.call(bodyVDialogDomArr, this.$el);
|
|
281
|
+
if (curDomIndex === bodyVDialogDomArr.length - 1) {
|
|
282
|
+
this.handleClose();
|
|
283
|
+
}
|
|
284
|
+
} else if (document.getElementById('tags-view-container') && this.parentDom.parentElement.getAttribute('include_name')) {
|
|
285
|
+
// 获取当前 app-views 对应的 include_name 值
|
|
286
|
+
let includeName = this.parentDom.parentElement.getAttribute('include_name');
|
|
287
|
+
// 根据 includeName 获取 tagsView 中的 tag 标签页
|
|
288
|
+
let tagDom = document.getElementById('tags-view-container').querySelectorAll(`[include_name=${ includeName }]`);
|
|
289
|
+
if (tagDom && tagDom[0]) {
|
|
290
|
+
// 判断此标签页是否为选中状态,只有选中状态中的 VDialog 才可以进行关闭
|
|
291
|
+
if (tagDom[0].className.split(' ').includes('active')) {
|
|
292
|
+
let vDialogList = this.parentDom.getElementsByClassName('cy-tab-dialog-opened');
|
|
293
|
+
// 获取当前 cy-tab-dialog 在当前 app-views 中的下标
|
|
294
|
+
let curDomIndex = [].indexOf.call(vDialogList, this.$el);
|
|
295
|
+
if (curDomIndex === vDialogList.length - 1) {
|
|
296
|
+
this.handleClose();
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
} else {
|
|
301
|
+
this.handleClose();
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
},
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* 组件销毁前移除键盘监听,避免内存泄漏
|
|
309
|
+
* @returns {void}
|
|
310
|
+
*/
|
|
311
|
+
beforeDestroy() {
|
|
312
|
+
document.removeEventListener('keydown', this.escKeyDown);
|
|
313
|
+
}
|
|
314
|
+
};
|
|
315
|
+
</script>
|