bri-components 1.2.53 → 1.2.55

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.
Files changed (28) hide show
  1. package/package.json +2 -2
  2. package/src/components/controls/{BriControlInput.vue → DshControlInput.vue} +15 -12
  3. package/src/components/controls/base/DshCascader/DshCascader.vue +260 -341
  4. package/src/components/controls/base/DshCascader/cascaderMixin.js +176 -0
  5. package/src/components/controls/base/DshCascader/cascaderModal.vue +374 -0
  6. package/src/components/controls/base/DshCascader/cascaderPicker.vue +406 -0
  7. package/src/components/controls/base/DshCascader/cascaderPickerMixin.js +202 -0
  8. package/src/components/controls/base/DshCoordinates.vue +6 -10
  9. package/src/components/controls/base/DshDate/DshDaterange.vue +15 -12
  10. package/src/components/controls/base/DshEditor.vue +1 -1
  11. package/src/components/controls/controlMixin.js +14 -4
  12. package/src/components/controls/senior/BriLabels.vue +5 -10
  13. package/src/components/controls/senior/flatTable.vue +119 -3
  14. package/src/components/controls/senior/flatTableImportModal.vue +279 -0
  15. package/src/components/controls/senior/selectDepartments.vue +5 -19
  16. package/src/components/controls/senior/selectUsers/{DepartmentMenu.vue → departMenu.vue} +26 -16
  17. package/src/components/controls/senior/selectUsers/selectUsers.vue +10 -23
  18. package/src/components/form/DshDefaultSearch.vue +1 -1
  19. package/src/components/list/DshBox/DshCrossTable.vue +13 -1
  20. package/src/components/small/BriTooltip.vue +6 -0
  21. package/src/index.js +5 -5
  22. package/src/styles/components/index.less +0 -1
  23. package/src/styles/components/list/DshBox/DshCrossTable.less +32 -22
  24. package/src/styles/components/small/BriTooltip.less +0 -25
  25. package/src/styles/global/base.less +3 -3
  26. package/src/styles/global/control.less +3 -3
  27. package/src/styles/reset-iview-other.less +21 -0
  28. package/src/components/controls/base/DshCascader/InfoCascader.vue +0 -319
@@ -0,0 +1,406 @@
1
+ <template>
2
+ <div class="cascaderPicker">
3
+ <Dropdown
4
+ style="width: 100%;"
5
+ trigger="custom"
6
+ :visible="showModal"
7
+ :placement="placement"
8
+ :transfer="true"
9
+ transfer-class-name="cascaderPicker-down"
10
+ :stop-propagation="true"
11
+ :events-enabled="true"
12
+ >
13
+ <div @click.stop="clickInput">
14
+ <slot>
15
+ <Input
16
+ v-model="inputStr"
17
+ :placeholder="selfPropsObj._placeholder"
18
+ :disabled="selfPropsObj._disabled"
19
+ :readonly="true"
20
+ :clearable="selfPropsObj._clearable"
21
+ :size="selfPropsObj._size"
22
+ ></Input>
23
+ </slot>
24
+ </div>
25
+
26
+ <!-- 下拉面板 -->
27
+ <div
28
+ slot="list"
29
+ class="wrap"
30
+ >
31
+ <!-- 头部 -->
32
+ <div class="wrap-header">
33
+ <!-- 搜索 -->
34
+ <div class="wrap-header-left">
35
+ <template v-if="filterable">
36
+ <!-- 搜索框 -->
37
+ <Input
38
+ class="search"
39
+ v-model="searchName"
40
+ placeholder="请输入关键字或标识"
41
+ search
42
+ @on-enter="search"
43
+ @on-search="search"
44
+ @on-change="search"
45
+ />
46
+
47
+ <!-- 模式切换 -->
48
+ <template>
49
+ <div
50
+ v-if="useMode"
51
+ class="mode"
52
+ @click="showMode = showMode === 'default' ? 'flat' : 'default'"
53
+ >
54
+ <dsh-icons :list="[{ icon: 'md-swap' }]" />
55
+ <span class="mode-name">
56
+ {{ showMode === "default" ? "按层级" : "按平级" }}
57
+ </span>
58
+ </div>
59
+
60
+ <Tooltip
61
+ v-else
62
+ style="margin-left: 5px; cursor: pointer;"
63
+ :content="modeTip"
64
+ max-width="250"
65
+ transfer
66
+ >
67
+ <Icon
68
+ class="item-header-help"
69
+ type="md-help-circle"
70
+ size="16"
71
+ ></Icon>
72
+ </Tooltip>
73
+ </template>
74
+ </template>
75
+ </div>
76
+
77
+ <!-- 按钮 -->
78
+ <dsh-buttons
79
+ class="wrap-header-right"
80
+ :list="$getOperationList()"
81
+ @click="$dispatchEvent($event)"
82
+ ></dsh-buttons>
83
+ </div>
84
+
85
+ <!-- 内容 -->
86
+ <div class="wrap-content">
87
+ <!-- 选中项tabs -->
88
+ <div class="wrap-content-tabs">
89
+ <span
90
+ v-for="(tabItem, tabIndex) in selectedLinealDatas"
91
+ :key="tabIndex"
92
+ class="item"
93
+ @click="curTabIndex = tabIndex"
94
+ >
95
+ <span :class="{
96
+ 'item-text': true,
97
+ 'item-text-empty': tabItem[nameKey] === undefined,
98
+ 'item-text-active': tabIndex === curTabIndex,
99
+ }">
100
+ {{ tabItem[nameKey] === undefined ? "请选择" : tabItem[nameKey] }}
101
+ </span>
102
+ </span>
103
+ </div>
104
+
105
+ <!-- 列表 -->
106
+ <div class="wrap-content-list">
107
+ <!-- 有数据 -->
108
+ <DropdownMenu
109
+ v-if="showTreeData.length"
110
+ class="wrap-content-list-menu"
111
+ >
112
+ <!-- 拍平方式 -->
113
+ <template v-if="useFlatMode">
114
+ <DropdownItem
115
+ v-for="dataItem in showFlatData"
116
+ :key="dataItem[valueKey]"
117
+ :class="{
118
+ 'item': true,
119
+ 'item-active': selectedLastOption && dataItem[valueKey] === selectedLastOption[valueKey],
120
+ 'item-disabled': dataItem.disabled
121
+ }"
122
+ :name="dataItem[valueKey]"
123
+ :disabled="dataItem.disabled"
124
+ @click.native.stop="clickItem(dataItem)"
125
+ >
126
+ <span class="item-name">
127
+ {{ dataItem[nameKey] }}
128
+ </span>
129
+
130
+ <span class="item-icon">
131
+ <dsh-icons :list="[{
132
+ icon: selectedLastOption && dataItem[valueKey] === selectedLastOption[valueKey]
133
+ ? 'md-checkmark'
134
+ : ''
135
+ }]" />
136
+ </span>
137
+ </DropdownItem>
138
+ </template>
139
+
140
+ <!-- 层级方式 -->
141
+ <template v-else>
142
+ <DropdownItem
143
+ v-for="dataItem in curSelectedLinealData.data"
144
+ :key="dataItem[valueKey]"
145
+ :class="{
146
+ 'item': true,
147
+ 'item-active': dataItem[valueKey] === curSelectedLinealData[valueKey],
148
+ 'item-disabled': dataItem.disabled
149
+ }"
150
+ :name="dataItem[valueKey]"
151
+ @click.native.stop="clickItem(dataItem)"
152
+ >
153
+ <span class="item-name">
154
+ {{ dataItem[nameKey] }}
155
+ </span>
156
+
157
+ <span class="item-icon">
158
+ <dsh-icons :list="[{
159
+ icon: dataItem[valueKey] === curSelectedLinealData[valueKey]
160
+ ? 'md-checkmark'
161
+ : dataItem.children.length
162
+ ? 'ios-arrow-forward'
163
+ : ''
164
+ }]" />
165
+ </span>
166
+ </DropdownItem>
167
+ </template>
168
+ </DropdownMenu>
169
+
170
+ <!-- 无数据 -->
171
+ <div
172
+ v-else
173
+ class="wrap-content-list-nodata"
174
+ >
175
+ 暂无可用的数据……
176
+ </div>
177
+ </div>
178
+ </div>
179
+ </div>
180
+ </Dropdown>
181
+ </div>
182
+ </template>
183
+
184
+ <script>
185
+ import cascaderPickerMixin from "./cascaderPickerMixin.js";
186
+
187
+ export default {
188
+ name: "cascaderPicker",
189
+ mixins: [
190
+ cascaderPickerMixin
191
+ ],
192
+ components: {},
193
+ props: {
194
+ placement: {
195
+ type: String,
196
+ default: "bottom-start"
197
+ }
198
+ },
199
+ data () {
200
+ return {
201
+ curTabIndex: 0
202
+ };
203
+ },
204
+ computed: {
205
+ initData () {
206
+ return this.data;
207
+ },
208
+ selectedLinealDatas () {
209
+ const arr = this.selectedOptions.map((item, index, list) => {
210
+ return {
211
+ ...item,
212
+ data: index === 0 ? this.showTreeData : list[index - 1].children
213
+ };
214
+ });
215
+
216
+ return [
217
+ ...arr,
218
+
219
+ ...(
220
+ this.selectedOptions.length
221
+ ? this.selectedLastOption.children.length && this.curTabIndex + 1 > this.selectedOptions.length
222
+ ? [
223
+ {
224
+ data: this.selectedLastOption.children
225
+ }
226
+ ]
227
+ : []
228
+ : [
229
+ {
230
+ data: this.showTreeData
231
+ }
232
+ ]
233
+ )
234
+ ];
235
+ },
236
+ curSelectedLinealData () {
237
+ return this.selectedLinealDatas[this.curTabIndex];
238
+ }
239
+ },
240
+ created () {
241
+ this.init();
242
+ },
243
+ methods: {
244
+ // 初始化
245
+ init () {
246
+ this.selectedValue = this.activeValue;
247
+ this.curTabIndex = this.selectedOptions.length
248
+ ? this.selectedLastOption.children.length
249
+ ? this.selectedOptions.length
250
+ : this.selectedOptions.length - 1
251
+ : 0;
252
+ },
253
+
254
+ search () {
255
+ this.selectedValue = [];
256
+ this.curTabIndex = 0;
257
+ },
258
+ clickItemCb (node) {
259
+ // 区分展示方式
260
+ if (this.showMode === "default" && node.children.length) {
261
+ this.curTabIndex = this.curTabIndex + 1;
262
+ }
263
+ }
264
+ }
265
+ };
266
+ </script>
267
+
268
+ <style lang="less">
269
+ .cascaderPicker {
270
+ &-down {
271
+ &.ivu-select-dropdown {
272
+ min-width: 400px;
273
+ max-width: 400px;
274
+ max-height: 600px; // 必须有
275
+ border: 0.5px solid #e5e5e5;
276
+ box-shadow: 0 3px 14px 2px rgba(0,0,0,0.05), 0 8px 10px 1px rgba(0,0,0,0.06), 0 5px 5px -3px rgba(0,0,0,0.1);
277
+ }
278
+
279
+ .wrap {
280
+ &-header {
281
+ width: 100%;
282
+ height: 40px;
283
+ padding: 0px 8px 3px;
284
+ border-bottom: 1px solid @borderColor;
285
+ display: flex;
286
+ justify-content: space-between;
287
+ align-items: center;
288
+
289
+ &-left {
290
+ width: 270px;
291
+ display: flex;
292
+ align-items: center;
293
+
294
+ .search {
295
+ width: 180px;
296
+ }
297
+
298
+ .mode {
299
+ width: 90px;
300
+ padding-top: 14px;
301
+ padding-left: 5px;
302
+ display: flex;
303
+ align-items: center;
304
+ cursor: pointer;
305
+
306
+ &-name {
307
+ font-size: 12px;
308
+ }
309
+ }
310
+ }
311
+
312
+ &-right {
313
+ padding-left: 10px;
314
+ display: flex;
315
+ justify-content: flex-end;
316
+ }
317
+ }
318
+
319
+ &-content {
320
+ &-tabs {
321
+ width: 100%;
322
+ height: 40px;
323
+ padding: 0px 5px;
324
+ white-space: nowrap;
325
+ overflow: auto;
326
+
327
+ .item {
328
+ display: inline-block;
329
+ padding: 0px 10px;
330
+ cursor: pointer;
331
+
332
+ &-text {
333
+ display: inline-block;
334
+ padding-top: 3px; // 为了文字靠下点
335
+ line-height: 34px;
336
+ font-weight: 500;
337
+
338
+ &-empty {
339
+ color: @placeholderColor;
340
+ }
341
+
342
+ &-active {
343
+ border-bottom: 3px solid @themeColor;
344
+ // transition-duration: 0.3s;
345
+ }
346
+ }
347
+ }
348
+ }
349
+
350
+ &-list {
351
+ width: 100%;
352
+ min-height: 360px;
353
+ max-height: 360px;
354
+ padding: 5px 10px 10px;
355
+ overflow: auto;
356
+
357
+ &-menu {
358
+ .item {
359
+ padding: 8px 10px;
360
+ border-radius: @borderRadius;
361
+ line-height: 16px;
362
+ cursor: pointer;
363
+ display: flex;
364
+ flex-direction: row;
365
+ justify-content: space-between;
366
+ align-items: center;
367
+
368
+ &-name {
369
+ flex: 1;
370
+ min-width: 0px;
371
+ white-space: normal;
372
+ }
373
+
374
+ &-icon {
375
+ width: 40px;
376
+ padding-left: 10px;
377
+ text-align: right;
378
+ }
379
+
380
+ &:hover,
381
+ &-active {
382
+ background-color: @theme-focus;
383
+ color: @themeColor;
384
+ }
385
+
386
+ &-disabled {
387
+ background-color: @inputBg-disabled;
388
+ color: @textColor-disabled;
389
+
390
+ &:hover {
391
+ background-color: @inputBg-disabled;
392
+ color: @textColor-disabled;
393
+ }
394
+ }
395
+ }
396
+ }
397
+
398
+ &-nodata {
399
+ #dsh-nodata();
400
+ }
401
+ }
402
+ }
403
+ }
404
+ }
405
+ }
406
+ </style>
@@ -0,0 +1,202 @@
1
+ export default {
2
+ mixins: [],
3
+ components: {},
4
+ props: {
5
+ value: {
6
+ type: Boolean,
7
+ default: false
8
+ },
9
+
10
+ activeValue: {
11
+ type: Array,
12
+ default () {
13
+ return [];
14
+ }
15
+ },
16
+ activeStr: {
17
+ type: String,
18
+ default: ""
19
+ },
20
+ data: {
21
+ type: Array,
22
+ drfault () {
23
+ return [];
24
+ }
25
+ },
26
+ propsObj: {
27
+ type: Object,
28
+ default () {
29
+ return {};
30
+ }
31
+ }
32
+ },
33
+ data () {
34
+ return {
35
+ searchName: "",
36
+ showMode: "default", // "flat", "default"
37
+ maxFlatModeSearchNum: 80,
38
+
39
+ selectedValue: [],
40
+
41
+ operationMap: {
42
+ canCancel: {
43
+ name: "取消",
44
+ type: "canCancel",
45
+ btnType: "cancel",
46
+ size: "small",
47
+ event: "clickCancel"
48
+ },
49
+ canConfirm: {
50
+ name: "确认",
51
+ type: "canConfirm",
52
+ btnType: "primary",
53
+ size: "small",
54
+ event: "clickConfirm"
55
+ }
56
+ }
57
+ };
58
+ },
59
+ computed: {
60
+ showModal: {
61
+ get () {
62
+ return this.value;
63
+ },
64
+ set (bool) {
65
+ this.$emit("input", bool);
66
+ }
67
+ },
68
+
69
+ selfPropsObj () {
70
+ return {
71
+ ...this.propsObj
72
+ };
73
+ },
74
+ filterable () {
75
+ return this.selfPropsObj._filterable;
76
+ },
77
+ changeOnSelect () {
78
+ return this.selfPropsObj._changeOnSelect;
79
+ },
80
+ saveKey () {
81
+ return this.selfPropsObj._saveKey;
82
+ },
83
+ valueKey () {
84
+ return this.selfPropsObj._valueKey;
85
+ },
86
+ nameKey () {
87
+ return this.selfPropsObj._nameKey;
88
+ },
89
+ renderFormat () {
90
+ return this.selfPropsObj._renderFormat;
91
+ },
92
+ resourceKey () {
93
+ return this.selfPropsObj._resourceKey;
94
+ },
95
+
96
+ useMode () {
97
+ return this.searchName.trim() &&
98
+ this.showFlatData.length < this.maxFlatModeSearchNum;
99
+ },
100
+ useFlatMode () {
101
+ return this.filterable &&
102
+ this.showMode === "flat" &&
103
+ this.useMode;
104
+ },
105
+ modeTip () {
106
+ return `在搜索时,会出现层级和平级切换开关,但搜索出的结果超${this.maxFlatModeSearchNum}个时,\
107
+ 将不支持使用模式切换,因为此时平级方式不方便,不适用`;
108
+ },
109
+
110
+ inputStr: {
111
+ get () {
112
+ return this.activeStr;
113
+ },
114
+ set (str) {
115
+ if (!str) {
116
+ this.$emit("clear", []);
117
+ }
118
+ }
119
+ },
120
+ matchFunc () {
121
+ return node => {
122
+ return (
123
+ this.changeOnSelect
124
+ ? true
125
+ : node.isLeaf
126
+ ) && (
127
+ this.searchName.trim()
128
+ ? node[this.nameKey].includes(this.searchName.trim()) || node[this.valueKey].includes(this.searchName.trim())
129
+ : true
130
+ );
131
+ };
132
+ },
133
+ showTreeData () {
134
+ return this.$getTreeDataByMatchFunc(this.matchFunc, this.initData);
135
+ },
136
+ showFlatData () {
137
+ return this.$getListDataByMatchFunc(this.matchFunc, this.initData).map(arrItem => {
138
+ return {
139
+ ...arrItem.slice(-1)[0],
140
+ [this.nameKey]: this.renderFormat(arrItem.map(item => item[this.nameKey]))
141
+ };
142
+ });
143
+ },
144
+ // 选中项 -各级数据对象集合
145
+ selectedOptions () {
146
+ return this.$getTreeLinealDatas(this.selectedValue, this.showTreeData, undefined, this.saveKey);
147
+ },
148
+ // 选中项 -最后一级数据对象
149
+ selectedLastOption () {
150
+ return this.selectedOptions.slice(-1)[0];
151
+ },
152
+ // 选中项 -名字
153
+ selectedName () {
154
+ return this.selectedLastOption ? this.selectedLastOption[this.nameKey] : "";
155
+ }
156
+ },
157
+ created () { },
158
+ methods: {
159
+ clickInput () {
160
+ if (!this.selfPropsObj._disabled) {
161
+ this.showModal = true;
162
+ }
163
+ },
164
+ clickItem (node) {
165
+ this.oldSelectedValue = this.selectedValue;
166
+ this.selectedValue = node.keys;
167
+ // 避免重复点击
168
+ if (JSON.stringify(this.selectedValue) !== JSON.stringify(this.oldSelectedValue)) {
169
+ const obj = {
170
+ value: this.selectedValue,
171
+ selectedOptions: this.selectedOptions,
172
+ tabIndex: this.curTabIndex
173
+ };
174
+ this.$emit("change", obj);
175
+ !node.children.length && this.$emit("finish", obj);
176
+ }
177
+
178
+ this.clickItemCb && this.clickItemCb(node);
179
+ },
180
+ clickCancel () {
181
+ this.showModal = false;
182
+ },
183
+ clickConfirm () {
184
+ if (this.selectedValue.length && this.selectedOptions.length) {
185
+ if (!this.changeOnSelect && !this.selectedLastOption.isLeaf) {
186
+ this.$Message.error({
187
+ content: "请选择到末级数据!",
188
+ duration: 2
189
+ });
190
+ } else {
191
+ this.$emit("confirm", this.selectedValue, this.selectedOptions);
192
+ }
193
+ } else {
194
+ this.$Message.error({
195
+ content: "请选择数据!",
196
+ duration: 2
197
+ });
198
+ }
199
+ }
200
+
201
+ }
202
+ };
@@ -7,18 +7,15 @@
7
7
  :transfer="true"
8
8
  >
9
9
  <!-- 编辑 -->
10
- <bri-control-input
10
+ <dsh-control-input
11
11
  v-if="canEdit"
12
- :class="{
13
- ...commonClass
14
- }"
15
- :canEdit="finalCanEdit"
12
+ :class="commonClass"
16
13
  :value="curVal"
17
- :inputIcon="inputIcon"
14
+ :disabled="selfPropsObj._disabled"
18
15
  :propsObj="selfPropsObj"
19
16
  @clear="clickClear"
20
17
  @click.native="clickInput"
21
- ></bri-control-input>
18
+ ></dsh-control-input>
22
19
 
23
20
  <!-- 查看 -->
24
21
  <div
@@ -194,6 +191,8 @@
194
191
  computed: {
195
192
  selfPropsObj () {
196
193
  return {
194
+ _icon: "ios-map-outline",
195
+
197
196
  ...this.propsObj,
198
197
  ...this.commonDealPropsObj
199
198
  };
@@ -201,9 +200,6 @@
201
200
  showType () {
202
201
  return this.selfPropsObj._showType;
203
202
  },
204
- inputIcon () {
205
- return "ios-map-outline";
206
- },
207
203
 
208
204
  curVal: {
209
205
  get () {