three-trees-ui 1.0.99 → 1.1.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.
@@ -16,23 +16,33 @@
16
16
  @click="showDialog"
17
17
  >
18
18
  <div
19
- v-if="inputWriteable"
20
- class="el-input el-input--suffix"
21
- :class="{ 'custom-selector-mobile': isMobile }"
19
+ ref="tagSpans"
20
+ style="width: calc(100% - 25px);"
21
+ :class="{
22
+ 'el-select__tags_readonly': !inputWriteable,
23
+ 'el-select__tags': inputWriteable,
24
+ }"
22
25
  >
23
- <div v-if="isMobile" class="custom-selector-mobile-box">
24
- <div
26
+ <span class="tag-wrap">
27
+ <span
25
28
  v-for="(item, index) in demensions"
26
29
  :key="index"
27
- class="common-selector-tag"
30
+ class="el-tag el-tag--info el-tag--small"
31
+ @click.stop
28
32
  >
29
- <span>{{ item.name }}</span>
30
- <i class="el-icon-error" @click.stop="handleRemove(item)"></i>
31
- </div>
32
- </div>
33
+ <span class="el-select__tags-text">{{ item.name }}</span>
34
+ <i
35
+ v-if="inputWriteable"
36
+ class="el-tag__close el-icon-close"
37
+ @click="handleRemove(item)"
38
+ ></i>
39
+ </span>
40
+ </span>
41
+ </div>
42
+ <div v-if="inputWriteable" class="el-input el-input--suffix">
33
43
  <input
34
44
  ref="inputEl"
35
- v-model="calcInputValue"
45
+ v-model="value"
36
46
  v-validate="inputValidate"
37
47
  type="text"
38
48
  readonly="readonly"
@@ -40,6 +50,10 @@
40
50
  autocomplete="off"
41
51
  class="el-input__inner"
42
52
  :placeholder="placeholder"
53
+ :style="{
54
+ height: inputSuffixHeight + 'px',
55
+ lineHeight: inputSuffixHeight + 'px',
56
+ }"
43
57
  />
44
58
  <span class="el-input__suffix">
45
59
  <span class="el-input__suffix-inner">
@@ -48,13 +62,9 @@
48
62
  </span>
49
63
  </span>
50
64
  </div>
51
- <div v-else class="el-select__tags_readonly">
52
- <span>{{ calcInputValue }}</span>
53
- </div>
54
65
  </div>
55
66
  <ht-field-tail :field-name="inputName" :input-value="value" />
56
67
  <el-dialog
57
- v-if="dialogVisible"
58
68
  title="选择维度"
59
69
  :visible.sync="dialogVisible"
60
70
  class="dialog-selector__wrapper"
@@ -206,10 +216,6 @@
206
216
  mode: {
207
217
  type: String,
208
218
  },
209
- formInputsDisplay: {
210
- type: String,
211
- default: 'inline',
212
- },
213
219
  },
214
220
  data() {
215
221
  return {
@@ -221,17 +227,6 @@
221
227
  }
222
228
  },
223
229
  computed: {
224
- calcInputValue: function() {
225
- let name = ''
226
- if (this.demensions) {
227
- name = this.demensions
228
- .map((k) => {
229
- return k.name
230
- })
231
- .join(',')
232
- }
233
- return name
234
- },
235
230
  primaryField: function() {
236
231
  return this.config && this.config.hasOwnProperty('id')
237
232
  ? 'id'
@@ -290,8 +285,14 @@
290
285
  // 通过valueChange事件发布值变更消息
291
286
  this.$emit('valueChange', ary.join(','), newVal)
292
287
  setTimeout(() => {
288
+ if (newVal.length > 0) {
289
+ this.calacInputSuffixHeight()
290
+ } else {
291
+ this.inputSuffixHeight = 30
292
+ }
293
293
  if (this.$refs.inputEl) {
294
- this.$validator.validate(this.inputName)
294
+ this.$refs.inputEl.focus()
295
+ this.$refs.inputEl.blur()
295
296
  }
296
297
  }, 10)
297
298
  },
@@ -370,13 +371,14 @@
370
371
  this.demensions = tmpAry
371
372
  }
372
373
  },
373
- async showDialog() {
374
+ showDialog() {
374
375
  if (!this.inputWriteable) {
375
376
  return
376
377
  }
377
378
  this.dialogVisible = true
378
- await this.$nextTick()
379
- this.$refs.selector.onShow()
379
+ setTimeout(() => {
380
+ this.$refs.selector.onShow()
381
+ })
380
382
  },
381
383
  handleClose(done) {
382
384
  this.$refs.selector.onHide()
@@ -399,12 +401,12 @@
399
401
  },
400
402
  // 更新当前输入框的高度来适配已选数据的高度
401
403
  calacInputSuffixHeight() {
402
- // if (!this.$refs.tagSpans) return
403
- // if (this.$refs.tagSpans.offsetHeight) {
404
- // this.inputSuffixHeight = this.$refs.tagSpans.offsetHeight + 5
405
- // } else {
406
- // this.inputSuffixHeight = 30
407
- // }
404
+ if (!this.$refs.tagSpans) return
405
+ if (this.$refs.tagSpans.offsetHeight) {
406
+ this.inputSuffixHeight = this.$refs.tagSpans.offsetHeight + 5
407
+ } else {
408
+ this.inputSuffixHeight = 30
409
+ }
408
410
  },
409
411
  },
410
412
  }
@@ -425,10 +427,7 @@
425
427
  position: relative;
426
428
  top: 50%;
427
429
  }
428
- .el-input__inner {
429
- height: 32px;
430
- line-height: 32px;
431
- }
430
+
432
431
  .el-input__inner[aria-invalid='true'] {
433
432
  border-color: #f56c6c;
434
433
  }
@@ -16,23 +16,33 @@
16
16
  @click="showDialog"
17
17
  >
18
18
  <div
19
- v-if="inputWriteable"
20
- class="el-input el-input--suffix"
21
- :class="{ 'custom-selector-mobile': isMobile }"
19
+ ref="tagSpans"
20
+ style="width: calc(100% - 25px);"
21
+ :class="{
22
+ 'el-select__tags_readonly': !inputWriteable,
23
+ 'el-select__tags': inputWriteable,
24
+ }"
22
25
  >
23
- <div v-if="isMobile" class="custom-selector-mobile-box">
24
- <div
26
+ <span class="tag-wrap">
27
+ <span
25
28
  v-for="(item, index) in selectors"
26
29
  :key="index"
27
- class="common-selector-tag"
30
+ class="el-tag el-tag--info el-tag--small"
31
+ @click.stop
28
32
  >
29
- <span>{{ item.name }}</span>
30
- <i class="el-icon-error" @click.stop="handleRemove(item)"></i>
31
- </div>
32
- </div>
33
+ <span class="el-select__tags-text">{{ item.name }}</span>
34
+ <i
35
+ v-if="inputWriteable"
36
+ class="el-tag__close el-icon-close"
37
+ @click="handleRemove(item)"
38
+ ></i>
39
+ </span>
40
+ </span>
41
+ </div>
42
+ <div v-if="inputWriteable" class="el-input el-input--suffix">
33
43
  <input
34
44
  ref="inputEl"
35
- v-model="calcInputValue"
45
+ v-model="value"
36
46
  v-validate="inputValidate"
37
47
  type="text"
38
48
  readonly="readonly"
@@ -40,6 +50,10 @@
40
50
  autocomplete="off"
41
51
  class="el-input__inner"
42
52
  :placeholder="placeholder"
53
+ :style="{
54
+ height: inputSuffixHeight + 'px',
55
+ lineHeight: inputSuffixHeight + 'px',
56
+ }"
43
57
  />
44
58
  <span class="el-input__suffix">
45
59
  <span class="el-input__suffix-inner">
@@ -48,54 +62,49 @@
48
62
  </span>
49
63
  </span>
50
64
  </div>
51
- <div v-else class="el-select__tags_readonly">
52
- <span>{{ calcInputValue }}</span>
53
- </div>
54
65
  </div>
55
66
  <ht-field-tail :field-name="inputName" :input-value="value" />
56
- <template v-if="isDialogShow">
57
- <job-selector-mobile-dialog
58
- v-if="isMobile"
59
- ref="jobSelectorMobileDialog"
60
- v-model="selectors"
61
- :search-placeholder="searchPlaceholder"
62
- :single="single"
63
- :data="data"
64
- :pagination="pagination"
65
- :select-label="selectLabel"
66
- :quick-search-props="quickSearchProps"
67
- :append-to-body="appendToBody"
68
- :title="title"
69
- :primary-field="primaryField"
70
- @search="(word) => $emit('search', word)"
71
- @reset="() => $emit('reset')"
72
- @row-click="(row) => $emit('row-click', row)"
73
- @select-data="(data) => $emit('select-data', data)"
74
- @page-change="(page) => $emit('page-change', page)"
75
- />
76
- <job-selector-dialog
77
- v-else
78
- ref="jobSelectorDialog"
79
- v-model="selectors"
80
- :search-placeholder="searchPlaceholder"
81
- :single="single"
82
- :data="data"
83
- :table-columns="tableColumns"
84
- :pagination="pagination"
85
- :select-label="selectLabel"
86
- :quick-search-props="quickSearchProps"
87
- :append-to-body="appendToBody"
88
- :title="title"
89
- :primary-field="primaryField"
90
- :mode="mode"
91
- @search="(word) => $emit('search', word)"
92
- @reset="() => $emit('reset')"
93
- @row-click="(row) => $emit('row-click', row)"
94
- @select-data="(data) => $emit('select-data', data)"
95
- @page-change="(page) => $emit('page-change', page)"
96
- @size-change="(size) => $emit('size-change', size)"
97
- />
98
- </template>
67
+ <job-selector-mobile-dialog
68
+ v-if="isMobile"
69
+ ref="jobSelectorMobileDialog"
70
+ v-model="selectors"
71
+ :search-placeholder="searchPlaceholder"
72
+ :single="single"
73
+ :data="data"
74
+ :pagination="pagination"
75
+ :select-label="selectLabel"
76
+ :quick-search-props="quickSearchProps"
77
+ :append-to-body="appendToBody"
78
+ :title="title"
79
+ :primary-field="primaryField"
80
+ @search="(word) => $emit('search', word)"
81
+ @reset="() => $emit('reset')"
82
+ @row-click="(row) => $emit('row-click', row)"
83
+ @select-data="(data) => $emit('select-data', data)"
84
+ @page-change="(page) => $emit('page-change', page)"
85
+ />
86
+ <job-selector-dialog
87
+ v-else
88
+ ref="jobSelectorDialog"
89
+ v-model="selectors"
90
+ :search-placeholder="searchPlaceholder"
91
+ :single="single"
92
+ :data="data"
93
+ :table-columns="tableColumns"
94
+ :pagination="pagination"
95
+ :select-label="selectLabel"
96
+ :quick-search-props="quickSearchProps"
97
+ :append-to-body="appendToBody"
98
+ :title="title"
99
+ :primary-field="primaryField"
100
+ :mode="mode"
101
+ @search="(word) => $emit('search', word)"
102
+ @reset="() => $emit('reset')"
103
+ @row-click="(row) => $emit('row-click', row)"
104
+ @select-data="(data) => $emit('select-data', data)"
105
+ @page-change="(page) => $emit('page-change', page)"
106
+ @size-change="(size) => $emit('size-change', size)"
107
+ />
99
108
  </div>
100
109
  </template>
101
110
  <script>
@@ -172,23 +181,11 @@
172
181
  },
173
182
  data() {
174
183
  return {
175
- isDialogShow: false,
176
184
  inputSuffixHeight: 30,
177
185
  selectors: [],
178
186
  }
179
187
  },
180
188
  computed: {
181
- calcInputValue: function() {
182
- let name = ''
183
- if (this.selectors) {
184
- name = this.selectors
185
- .map((k) => {
186
- return k.name
187
- })
188
- .join(',')
189
- }
190
- return name
191
- },
192
189
  primaryField: function() {
193
190
  return this.config && this.config.hasOwnProperty('id')
194
191
  ? 'id'
@@ -238,8 +235,14 @@
238
235
  // 通过valueChange事件发布值变更消息
239
236
  this.$emit('valueChange', ary.join(','), newVal)
240
237
  setTimeout(() => {
238
+ if (newVal.length > 0) {
239
+ this.calacInputSuffixHeight()
240
+ } else {
241
+ this.inputSuffixHeight = 30
242
+ }
241
243
  if (this.$refs.inputEl) {
242
- this.$validator.validate(this.inputName)
244
+ this.$refs.inputEl.focus()
245
+ this.$refs.inputEl.blur()
243
246
  }
244
247
  }, 10)
245
248
  },
@@ -293,14 +296,10 @@
293
296
  this.selectors = tmpAry
294
297
  }
295
298
  },
296
- async showDialog() {
299
+ showDialog() {
297
300
  if (!this.inputWriteable) {
298
301
  return
299
302
  }
300
- if (this.isDialogShow === false) {
301
- this.isDialogShow = true
302
- await this.$nextTick()
303
- }
304
303
  if (this.isMobile) {
305
304
  this.$refs.jobSelectorMobileDialog.showDialog()
306
305
  } else {
@@ -316,12 +315,12 @@
316
315
  },
317
316
  // 更新当前输入框的高度来适配已选数据的高度
318
317
  calacInputSuffixHeight() {
319
- // if (!this.$refs.tagSpans) return
320
- // if (this.$refs.tagSpans.offsetHeight) {
321
- // this.inputSuffixHeight = this.$refs.tagSpans.offsetHeight + 5
322
- // } else {
323
- // this.inputSuffixHeight = 30
324
- // }
318
+ if (!this.$refs.tagSpans) return
319
+ if (this.$refs.tagSpans.offsetHeight) {
320
+ this.inputSuffixHeight = this.$refs.tagSpans.offsetHeight + 5
321
+ } else {
322
+ this.inputSuffixHeight = 30
323
+ }
325
324
  },
326
325
  },
327
326
  }
@@ -336,10 +335,7 @@
336
335
  position: relative;
337
336
  top: 50%;
338
337
  }
339
- .el-input__inner {
340
- height: 32px;
341
- line-height: 32px;
342
- }
338
+
343
339
  .el-input__inner[aria-invalid='true'] {
344
340
  border-color: #f56c6c;
345
341
  }
@@ -1,9 +1,9 @@
1
1
  <template>
2
- <div name="online-form" :class="{ 'is-mobile-online-form': isMobile }">
2
+ <div name="online-form">
3
3
  <el-skeleton v-if="loadStatus == 0" :rows="6" animated />
4
4
  <component
5
- :is="currentComponent"
6
5
  v-else-if="loadStatus > 0"
6
+ v-bind:is="currentComponent"
7
7
  :name="formName"
8
8
  :data="data"
9
9
  :permission="permission"
@@ -31,15 +31,12 @@
31
31
  import onlineSubtable from '@/mixins/onlineSubtable.js'
32
32
  import regionValidator from '@/mixins/regionValidator.js'
33
33
  import emitter from '@/mixins/emitter.js'
34
- import mobileMode from '@/mixins/mobileMode.js'
35
- import { Notification } from 'element-ui'
36
- import { Notify } from 'vant'
37
34
 
38
35
  import Vue from 'vue'
39
36
  export default {
40
37
  name: 'HtOnlineForm',
41
38
  componentName: 'HtOnlineForm',
42
- mixins: [regionValidator, emitter, mobileMode],
39
+ mixins: [regionValidator, emitter],
43
40
  props: {
44
41
  html: String,
45
42
  data: Object,
@@ -82,9 +79,6 @@
82
79
  type: Boolean,
83
80
  default: false,
84
81
  },
85
- formExpand: {
86
- type: String,
87
- },
88
82
  },
89
83
  data() {
90
84
  return {
@@ -134,16 +128,10 @@
134
128
  } else {
135
129
  // 执行校验逻辑
136
130
  this.validateRegion(`[name='${this.formName}']`).then(
137
- async (errorItems) => {
131
+ (errorItems) => {
138
132
  if (errorItems.length > 0) {
139
133
  reject(errorItems)
140
134
  } else {
141
- // 如果有子表,需要检验子表必填
142
- let result = await this.validateTable()
143
- if (result === false) {
144
- reject(8)
145
- return
146
- }
147
135
  this.broadcast('HtGlobalValidate', 'global-validate')
148
136
  }
149
137
  }
@@ -151,93 +139,6 @@
151
139
  }
152
140
  })
153
141
  },
154
- // 校验子表必填
155
- validateTable() {
156
- return new Promise((resolve) => {
157
- if (!this.formExpand) {
158
- resolve(true)
159
- return
160
- }
161
- const expandList = JSON.parse(this.formExpand)
162
-
163
- if (!expandList.list) {
164
- resolve(true)
165
- return
166
- }
167
- const subTableList = expandList.list.filter((it) => {
168
- return (
169
- (this.isMobile && it.ctrlType == 'subDiv') ||
170
- (!this.isMobile && it.ctrlType === 'subtable')
171
- )
172
- })
173
- if (!this.isMobile) {
174
- // pc端找到 分页的子表 校验
175
- const havePageSub = subTableList.filter((k) => {
176
- return k.subtablePagination
177
- })
178
- if (!havePageSub.length) {
179
- resolve(true)
180
- return
181
- }
182
- }
183
- const mainAlias = Object.keys(this.data)[0]
184
- const mainData = this.data[mainAlias]
185
- const errorResult = []
186
-
187
- Object.keys(mainData).forEach((key) => {
188
- if (key.startsWith('sub_')) {
189
- const curSubConfig = subTableList.find((sub) => {
190
- return sub.name == key.replace('sub_', '')
191
- })
192
- const subAlias = key.replace('sub_', '')
193
- const subPermission = this.permission.fields[subAlias]
194
- mainData[key].forEach((item, index) => {
195
- Object.keys(item).forEach((subKey) => {
196
- if (subPermission[subKey] == 'b' && !item[subKey]) {
197
- const subItem = curSubConfig.list.find((l) => {
198
- return l.name === subKey
199
- })
200
- let haveIndex = errorResult.findIndex((it) => {
201
- return (
202
- it.tableName === curSubConfig.desc &&
203
- it.fieldName === subItem.desc
204
- )
205
- })
206
- if (haveIndex === -1) {
207
- errorResult.push({
208
- tableName: curSubConfig.desc,
209
- index: index + 1,
210
- fieldName: subItem.desc,
211
- })
212
- }
213
- }
214
- })
215
- })
216
- }
217
- })
218
- if (errorResult.length > 0) {
219
- const messages = errorResult.map((k) => {
220
- return `${k.tableName},【${k.fieldName}】必填`
221
- })
222
- // 判断是移动端还是pc
223
- if (utils.isMobile()) {
224
- Notify({
225
- message: messages.join('\n'),
226
- background: '#f25130',
227
- })
228
- } else {
229
- Notification.error({
230
- title: this.$t('ht.common.warmTips'),
231
- dangerouslyUseHTMLString: true,
232
- message: messages.join('<br/>'),
233
- })
234
- }
235
- resolve(false)
236
- } else {
237
- resolve(true)
238
- }
239
- })
240
- },
241
142
  init() {
242
143
  this.currentComponent = 'runtimeTemplate_' + this.scopeName
243
144
  this.loadStatus = 1
@@ -281,11 +182,6 @@
281
182
  default: false,
282
183
  },
283
184
  },
284
- data() {
285
- return {
286
- subDivCollapse: [],
287
- }
288
- },
289
185
  template: this.html,
290
186
  })
291
187
  },
@@ -293,29 +189,6 @@
293
189
  }
294
190
  </script>
295
191
  <style lang="scss">
296
- .is-mobile-online-form {
297
- .ht-form-item {
298
- .el-form-item__label {
299
- width: 76px !important;
300
- overflow: hidden;
301
- text-overflow: ellipsis;
302
- white-space: nowrap;
303
- text-align: left;
304
- > span {
305
- display: inline-block;
306
- max-width: 100%;
307
- font-size: 14px;
308
- color: #656a72;
309
- margin-left: 0 !important;
310
- overflow: hidden;
311
- text-overflow: ellipsis;
312
- }
313
- }
314
- .el-form-item__content {
315
- margin-left: 76px !important;
316
- }
317
- }
318
- }
319
192
  .transition {
320
193
  outline: 1px dotted #85a5ff;
321
194
  outline-width: 2px;
@@ -435,7 +308,7 @@
435
308
  width: 100%;
436
309
  }
437
310
  .el-input {
438
- width: 100%;
311
+ width: 100% !important;
439
312
  }
440
313
  .amap-page-container {
441
314
  .amap-toolbar,
@@ -568,7 +441,6 @@
568
441
  }
569
442
 
570
443
  .el-icon-copy-document,
571
- .el-icon-edit,
572
444
  .el-icon-delete {
573
445
  display: inline-block;
574
446
  border: 1px solid #409eff;
@@ -577,9 +449,6 @@
577
449
  color: #409eff;
578
450
  background: #fff;
579
451
  }
580
- .el-button + .el-button {
581
- margin-left: 4px;
582
- }
583
452
  }
584
453
 
585
454
  .el-icon-arrow-right:before {
@@ -653,7 +522,6 @@
653
522
  }
654
523
 
655
524
  .el-icon-copy-document,
656
- .el-icon-edit,
657
525
  .el-icon-delete {
658
526
  display: inline-block;
659
527
  border: 1px solid #409eff;
@@ -687,24 +555,6 @@
687
555
  }
688
556
  }
689
557
  }
690
- .sonDetail_lable_box,
691
- .sonDetail_lable_value {
692
- width: calc(100% - 70px);
693
- .sonDetail_lable_item {
694
- font-weight: 500;
695
- }
696
- > div {
697
- flex: 1;
698
- display: -webkit-box;
699
- -webkit-box-orient: vertical;
700
- -webkit-line-clamp: 2;
701
- overflow: hidden;
702
- text-overflow: ellipsis;
703
- word-break: break-all;
704
- line-height: normal;
705
- text-align: center;
706
- }
707
- }
708
558
  }
709
559
 
710
560
  ::v-deep .el-table__header {