bri-components 1.5.21 → 1.6.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.
Files changed (153) hide show
  1. package/README.md +83 -83
  2. package/lib/styles/bundle.css +12 -12
  3. package/lib/styles/font/fontello.svg +31 -31
  4. package/package.json +125 -125
  5. package/src/components/Error/Error403.vue +42 -42
  6. package/src/components/Error/Error404.vue +40 -40
  7. package/src/components/Error/Error500.vue +51 -51
  8. package/src/components/Error/error.less +162 -162
  9. package/src/components/Error/errorBack.vue +40 -40
  10. package/src/components/controls/DshControlInput.vue +195 -195
  11. package/src/components/controls/base/BriUpload/BriUpload.vue +434 -434
  12. package/src/components/controls/base/BriUpload/BriUploadImage.vue +377 -377
  13. package/src/components/controls/base/BriUpload/uploadList.vue +727 -727
  14. package/src/components/controls/base/BriUpload/uploadMixin.js +446 -446
  15. package/src/components/controls/base/DshCascader/DshCascader.vue +215 -215
  16. package/src/components/controls/base/DshCascader/components/cascaderModal.vue +366 -366
  17. package/src/components/controls/base/DshCascader/components/cascaderPicker.vue +416 -416
  18. package/src/components/controls/base/DshCascader/components/cascaderSimple.vue +141 -141
  19. package/src/components/controls/base/DshCascader/components/cascaderTree.vue +151 -151
  20. package/src/components/controls/base/DshCoordinates.vue +585 -577
  21. package/src/components/controls/base/DshDate/DshDate.vue +191 -191
  22. package/src/components/controls/base/DshDate/DshDaterange.vue +186 -186
  23. package/src/components/controls/base/DshDivider.vue +201 -201
  24. package/src/components/controls/base/DshEditor.vue +274 -274
  25. package/src/components/controls/base/DshInput/BriInputs.vue +166 -166
  26. package/src/components/controls/base/DshInput/DshInput.vue +260 -260
  27. package/src/components/controls/base/DshNumber/BriInputNumber/BriInputNumber.vue +435 -435
  28. package/src/components/controls/base/DshNumber/BriInputNumber/mixins/emitter.js +34 -34
  29. package/src/components/controls/base/DshNumber/BriInputNumber/mixins/form.js +14 -14
  30. package/src/components/controls/base/DshNumber/BriInputNumber/utils/assist.js +322 -322
  31. package/src/components/controls/base/DshNumber/DshNumber.vue +143 -143
  32. package/src/components/controls/base/DshNumber/DshNumberange.vue +109 -109
  33. package/src/components/controls/base/DshSelect/DshCheckbox.vue +168 -168
  34. package/src/components/controls/base/DshSelect/DshSelect.vue +180 -180
  35. package/src/components/controls/base/DshSelect/DshSelectAll.vue +269 -269
  36. package/src/components/controls/base/DshSwitch/DshSwitch.vue +115 -115
  37. package/src/components/controls/control.less +324 -324
  38. package/src/components/controls/controlMap.js +117 -117
  39. package/src/components/controls/extra/DshColor.vue +81 -81
  40. package/src/components/controls/extra/DshThemeColor.vue +100 -100
  41. package/src/components/controls/extra/DshThemeIcon.vue +122 -122
  42. package/src/components/controls/mixins/cascaderMixin.js +325 -325
  43. package/src/components/controls/mixins/cascaderPickerMixin.js +227 -227
  44. package/src/components/controls/mixins/cascaderTableMixin.js +130 -130
  45. package/src/components/controls/mixins/controlMixin.js +393 -393
  46. package/src/components/controls/mixins/dateMixin.js +149 -149
  47. package/src/components/controls/mixins/flatTableMixin.js +111 -111
  48. package/src/components/controls/mixins/numberMixin.js +112 -112
  49. package/src/components/controls/mixins/selectMixin.js +233 -233
  50. package/src/components/controls/mixins/switchMixin.js +87 -87
  51. package/src/components/controls/mixins/userAndDepartMixin.js +260 -260
  52. package/src/components/controls/senior/DshLabels.vue +333 -333
  53. package/src/components/controls/senior/DshPackage.vue +57 -57
  54. package/src/components/controls/senior/cascaderTable.vue +213 -213
  55. package/src/components/controls/senior/correlation.vue +135 -135
  56. package/src/components/controls/senior/flatTable.vue +138 -138
  57. package/src/components/controls/senior/selectDepartments.vue +399 -399
  58. package/src/components/controls/senior/selectUsers/departMenu.vue +293 -293
  59. package/src/components/controls/senior/selectUsers/selectUsers.vue +712 -712
  60. package/src/components/controls/special/DshBack.vue +42 -42
  61. package/src/components/controls/special/DshUndeveloped.vue +41 -41
  62. package/src/components/form/DshAdvSearch.vue +510 -510
  63. package/src/components/form/DshDefaultSearch.vue +260 -260
  64. package/src/components/form/DshForm.vue +494 -494
  65. package/src/components/form/searchMixin.js +376 -376
  66. package/src/components/list/BriCard.vue +95 -95
  67. package/src/components/list/BriTable.vue +205 -205
  68. package/src/components/list/BriTree.vue +529 -529
  69. package/src/components/list/BriTreeItem.vue +163 -163
  70. package/src/components/list/DshBox/DshBox.vue +219 -219
  71. package/src/components/list/DshBox/DshCard.vue +446 -446
  72. package/src/components/list/DshBox/DshCrossTable.vue +827 -827
  73. package/src/components/list/DshBox/DshList.vue +404 -404
  74. package/src/components/list/DshBox/DshPanel.vue +669 -669
  75. package/src/components/list/DshBox/DshSingleData.vue +119 -119
  76. package/src/components/list/DshBox/DshTable.vue +239 -239
  77. package/src/components/list/DshCascaderTable.vue +115 -115
  78. package/src/components/list/DshFlatTable.vue +337 -337
  79. package/src/components/list/DshPage.vue +194 -194
  80. package/src/components/list/DshTreeTable.vue +113 -113
  81. package/src/components/list/common/importModal.vue +243 -243
  82. package/src/components/list/common/quoteListModal.vue +206 -206
  83. package/src/components/list/mixins/DshCascaderTableMixin.js +278 -278
  84. package/src/components/list/mixins/DshFlatTableMixin.js +509 -509
  85. package/src/components/list/mixins/DshTreeTableMixin.js +286 -286
  86. package/src/components/list/mixins/tableBaseMixin.js +1653 -1653
  87. package/src/components/list/mixins/treeTableBaseMixin.js +145 -145
  88. package/src/components/other/BriAvatar.vue +166 -166
  89. package/src/components/other/BriCode.vue +125 -125
  90. package/src/components/other/BriCollapseTree.vue +207 -207
  91. package/src/components/other/BriGantt.vue +1087 -1087
  92. package/src/components/other/BriIframe.vue +116 -116
  93. package/src/components/other/BriLoading.vue +171 -171
  94. package/src/components/other/BriSvg.vue +27 -27
  95. package/src/components/other/DshColorPanel.vue +128 -128
  96. package/src/components/other/DshMenuNav.vue +188 -188
  97. package/src/components/small/BriButton.vue +71 -71
  98. package/src/components/small/BriDrawer.vue +169 -169
  99. package/src/components/small/BriTooltip.vue +87 -87
  100. package/src/components/small/DshBtnModal.vue +68 -68
  101. package/src/components/small/DshButtons.vue +324 -324
  102. package/src/components/small/DshDropdown.vue +225 -225
  103. package/src/components/small/DshIcons.vue +59 -59
  104. package/src/components/small/DshListRender.js +21 -21
  105. package/src/components/small/DshModal.vue +160 -160
  106. package/src/components/small/DshSteps.vue +141 -141
  107. package/src/components/small/DshTabs.vue +598 -598
  108. package/src/components/small/DshTabsSet.vue +309 -309
  109. package/src/components/small/DshTags.vue +251 -251
  110. package/src/components/small/DshTitle.vue +50 -50
  111. package/src/components/small/render.js +20 -20
  112. package/src/components/unit/DshFormUnit.vue +398 -398
  113. package/src/components/unit/DshListUnit.vue +115 -115
  114. package/src/components/unit/unitMixin.js +86 -86
  115. package/src/data/index.js +4 -4
  116. package/src/index.js +285 -285
  117. package/src/styles/bundle.css +12 -12
  118. package/src/styles/components/BriButton.less +307 -307
  119. package/src/styles/components/BriTable.less +344 -344
  120. package/src/styles/components/DshModal.less +257 -257
  121. package/src/styles/components/index.less +3 -3
  122. package/src/styles/global/animate.less +11 -11
  123. package/src/styles/global/base.less +45 -45
  124. package/src/styles/global/box.less +186 -186
  125. package/src/styles/global/control.less +122 -122
  126. package/src/styles/global/flex.less +282 -282
  127. package/src/styles/global/global.less +8 -8
  128. package/src/styles/global/text.less +59 -59
  129. package/src/styles/global/variables.less +85 -85
  130. package/src/styles/iconfont/iconfont.css +254 -254
  131. package/src/styles/iconfont/iconfont.json +422 -422
  132. package/src/styles/iconfont/iconfont.svg +137 -137
  133. package/src/styles/index.less +26 -26
  134. package/src/styles/reset-easytable.less +21 -21
  135. package/src/styles/reset-iview-controls.less +145 -145
  136. package/src/styles/reset-iview-other.less +49 -49
  137. package/src/styles/reset-iview-variables.less +43 -43
  138. package/src/styles/reset.less +45 -45
  139. package/src/utils/index.js +3 -5
  140. package/lib/0.bri-components.min.js +0 -1
  141. package/lib/1.bri-components.min.js +0 -1
  142. package/lib/10.bri-components.min.js +0 -1
  143. package/lib/11.bri-components.min.js +0 -1
  144. package/lib/2.bri-components.min.js +0 -1
  145. package/lib/3.bri-components.min.js +0 -1
  146. package/lib/4.bri-components.min.js +0 -1
  147. package/lib/5.bri-components.min.js +0 -1
  148. package/lib/6.bri-components.min.js +0 -1
  149. package/lib/7.bri-components.min.js +0 -1
  150. package/lib/8.bri-components.min.js +0 -1
  151. package/lib/9.bri-components.min.js +0 -1
  152. package/lib/bri-components.min.js +0 -18
  153. package/src/utils/table.js +0 -175
@@ -1,494 +1,494 @@
1
- <template>
2
- <Form
3
- class="DshForm"
4
- ref="form"
5
- :model="formData"
6
- :rules="showRules ? rules : {}"
7
- @submit.native.prevent
8
- @on-validate="validateCb"
9
- >
10
- <Row>
11
- <template v-if="showFormList.length">
12
- <template v-for="formItem in showFormList">
13
- <i-col
14
- :key="formItem._key"
15
- :id="formItem._key"
16
- class="DshForm-item"
17
- :span="formItem._br ? 24 : (formItem._span || 24)"
18
- >
19
- <FormItem
20
- v-if="hideMap[formItem._key] !== true"
21
- class="DshForm-item-FormItem"
22
- :prop="formItem._key"
23
- @click.native="clickControl(formItem)"
24
- >
25
- <dsh-form-unit
26
- ref="dshFormUnit"
27
- :canEdit="canEdit"
28
- :formData="formData"
29
- :formItem="formItem"
30
- :allFormList="selfAllFormList"
31
- :inTableType="inTableType"
32
- :allListRows="allListRows"
33
- :rowIndex="rowIndex"
34
- :parentFormList="parentFormList"
35
- :parentObj="parentObj"
36
- :changedFields="changedFields"
37
- :height="height"
38
- :rowStyle="rowStyle"
39
- :labelStyle="labelStyle"
40
- :formControlClass="formControlClass"
41
- @change="change(arguments)"
42
- @refChange="refChange(arguments)"
43
- @changeField="changeField"
44
- >
45
- <slot
46
- :canEdit="canEdit"
47
- :formItem="formItem"
48
- :formData="formData"
49
- :allFormList="selfAllFormList"
50
- ></slot>
51
-
52
- <slot
53
- name="label"
54
- slot="label"
55
- :canEdit="canEdit"
56
- :formItem="formItem"
57
- :formData="formData"
58
- :allFormList="selfAllFormList"
59
- ></slot>
60
-
61
- <slot
62
- name="extra"
63
- slot="extra"
64
- :canEdit="canEdit"
65
- :formItem="formItem"
66
- :formData="formData"
67
- :allFormList="selfAllFormList"
68
- ></slot>
69
-
70
- <slot
71
- name="corner"
72
- slot="corner"
73
- :canEdit="canEdit"
74
- :formItem="formItem"
75
- :formData="formData"
76
- :allFormList="selfAllFormList"
77
- ></slot>
78
- </dsh-form-unit>
79
- </FormItem>
80
- </i-col>
81
-
82
- <!-- 换行 -->
83
- <i-col
84
- v-if="formItem._wrap"
85
- :key="formItem._key + '_wrap'"
86
- style="min-height: 0px;"
87
- :span="24"
88
- ></i-col>
89
- </template>
90
- </template>
91
-
92
- <div
93
- v-else
94
- class="DshForm-nodata"
95
- >
96
- {{ "--- 无字段 ---" }}
97
- </div>
98
- </Row>
99
- </Form>
100
- </template>
101
-
102
- <script>
103
- import DshFormUnit from "../unit/DshFormUnit.vue";
104
-
105
- export default {
106
- name: "DshForm",
107
- components: {
108
- DshFormUnit
109
- },
110
- props: {
111
- canEdit: {
112
- type: Boolean,
113
- default: true
114
- },
115
- formData: {
116
- type: Object,
117
- default () {
118
- return {};
119
- }
120
- },
121
- formList: {
122
- type: Array,
123
- default () {
124
- return [];
125
- }
126
- },
127
- allFormList: {
128
- type: Array,
129
- default () {
130
- return [];
131
- }
132
- },
133
-
134
- /* 表格字段内用到的 */
135
- inTableType: {
136
- type: String,
137
- validator (val) {
138
- return ["flatTable", "treeTable", "cascaderTable"].includes(val);
139
- }
140
- },
141
- allListRows: {
142
- type: Array,
143
- default () {
144
- return [];
145
- }
146
- },
147
- rowIndex: Number,
148
- parentObj: {
149
- type: Object,
150
- default () {
151
- return {};
152
- }
153
- },
154
- parentFormList: {
155
- type: Array,
156
- default () {
157
- return [];
158
- }
159
- },
160
-
161
- changedFields: {
162
- type: Array,
163
- default () {
164
- return [];
165
- }
166
- },
167
- height: [String, Number],
168
- rowStyle: {
169
- type: Object,
170
- default () {
171
- return {};
172
- }
173
- },
174
- labelStyle: {
175
- type: Object,
176
- default () {
177
- return {};
178
- }
179
- },
180
- formControlClass: String,
181
-
182
- /* 本组件使用 -不传递子组件的 */
183
- showRules: {
184
- type: Boolean,
185
- default: true
186
- }
187
- },
188
- data () {
189
- return {
190
- rules: {},
191
- hideMap: {},
192
- errorObj: {
193
- errors: []
194
- },
195
-
196
- forceValidateTypes: [
197
- "select", "region", "cascader", "regions", "cascaders", "file", "coordinates", "editor",
198
- "users", "departments", "labels", "flatTable", "cascaderTable", "reference", "referenceBy"
199
- ],
200
- ignoreProperties: [
201
- "_name", "_key", "_span", "_br", "_line", "_noLabel", "_required", "_clearable", "_default"
202
- ]
203
- // subIgnoreProperties: []
204
- };
205
- },
206
- computed: {
207
- selfAllFormList () {
208
- return this.allFormList.length ? this.allFormList : this.formList;
209
- },
210
- showFormList () {
211
- return this.formList.filter(formItem => this.isShow(formItem, this.formData, this.parentObj));
212
- }
213
- },
214
- watch: {
215
- formList () {
216
- this.init();
217
- }
218
- },
219
- created () {
220
- this.init();
221
- },
222
- methods: {
223
- // 初始化
224
- init () {
225
- this.initMonitor();
226
- this.initRules();
227
- },
228
- // 初始化监测 -监测所有字段
229
- initMonitor () {
230
- this.selfAllFormList.forEach(formItem => {
231
- this.$set(this.formData, formItem._key, this.formData[formItem._key]);
232
- });
233
- },
234
- // 初始化校验
235
- initRules () {
236
- // 此处代码可以改,但写法不能改!不然会引起表单页面渲染完就自动校验
237
- this.formList.reduce((rulesObj, formItem) => {
238
- rulesObj[formItem._key] = this.getRules(formItem);
239
- return rulesObj;
240
- }, this.rules);
241
- },
242
-
243
- /* ------- 供外部使用 ---------- */
244
- // 获取iview的form组件实例
245
- getFormRef () {
246
- return this.$refs.form;
247
- },
248
- // 校验
249
- submit () {
250
- this.errorObj = {
251
- errors: []
252
- };
253
-
254
- const bool = this.getValid();
255
- if (bool) {
256
- this.validateSuccess({});
257
- } else {
258
- this.validateFailed(this.errorObj);
259
- }
260
-
261
- return bool;
262
- },
263
- // 获取校验结果
264
- getValid () {
265
- let bool = true;
266
-
267
- this.getFormRef().validate(valid => {
268
- bool = bool && valid;
269
- });
270
- this.selfValidate((valid, errorFormList) => {
271
- bool = bool && valid;
272
-
273
- errorFormList.forEach(formItem => {
274
- this.validateCb(formItem._key, false, `"${formItem._name}"内部校验不正确!`);
275
- });
276
- });
277
-
278
- return bool;
279
- },
280
- // 强制校验,动态校验切换时-单选多选的校验文字无法消失
281
- forceValidateField (formItem) {
282
- if (["select", "checkbox"].includes(formItem._type) && !this.rules[formItem._key].length) {
283
- this.$set(this.hideMap, formItem._key, true);
284
- this.$nextTick(() => {
285
- this.$set(this.hideMap, formItem._key, false);
286
- });
287
- } else {
288
- this.$refs.form.validateField(formItem._key);
289
- }
290
- },
291
-
292
- // 控件自己的校验
293
- selfValidate (cb) {
294
- let bool = true;
295
- let errorRefs = [];
296
-
297
- if (this.$refs.dshFormUnit) {
298
- errorRefs = this.$refs.dshFormUnit.filter(refItem => !refItem.validate());
299
- bool = !errorRefs.length;
300
- }
301
-
302
- cb && cb(bool, errorRefs.map(errorRefItem => errorRefItem.formItem));
303
- return bool;
304
- },
305
- // iview的校验回调
306
- validateCb (prop, valid, error) {
307
- if (valid === false) {
308
- this.errorObj.errors.push({
309
- bool: false,
310
- message: error
311
- });
312
- }
313
- },
314
- // 校验成功
315
- validateSuccess (obj) {
316
- this.$emit("validateSuccess", obj);
317
- },
318
- // 校验失败
319
- validateFailed (errorObj) {
320
- this.$emit("validateFailed", errorObj);
321
- },
322
-
323
- // 点击控件
324
- clickControl (formItem) {
325
- this.$emit("clickControl", formItem);
326
- },
327
- // 切换字段
328
- changeField (...params) {
329
- this.$emit("changeField", ...params);
330
- },
331
- // 发生改动
332
- change (params) {
333
- this.forceFormValidate(...params);
334
- this.$emit("change", ...params);
335
- },
336
- // 关联表相关的change
337
- refChange (params) {
338
- this.$emit("refChange", ...params);
339
- },
340
-
341
- /* -------- 工具类 -------- */
342
- isShow (formItem, formData, parentObj) {
343
- // 寻找循环项
344
- if (formItem._loop === true) {
345
- Object.entries({
346
- ...formData,
347
- _displayType: "show",
348
- canEdit: !["createdAt", "updatedAt", "_creaters"].includes(formData._key)
349
- }).forEach(arr => {
350
- if (!this.ignoreProperties.includes(arr[0]) && arr[1] !== undefined) {
351
- this.$set(formItem, arr[0], arr[1]);
352
- }
353
- });
354
- }
355
-
356
- return this.$isAdvRelyShow(formItem, formData, parentObj);
357
- },
358
- getRules (formItem) {
359
- let rules = [];
360
- let ruleConfig = this.$getFieldRuleConfig(formItem);
361
-
362
- // 数据格式校验 -关联表格类型的会被过滤掉
363
- if (
364
- ruleConfig.type &&
365
- (!ruleConfig.fields || Object.entries(ruleConfig.fields).every(arr => !arr[1].transform)) &&
366
- (!["date"].includes(formItem._type) || !["daterange", "datetimerange"].includes(formItem._dateType)) &&
367
- (!["select", "checkbox"].includes(formItem._type)) // 考虑到选项用数字类型时,应该type: "number"
368
- ) {
369
- rules.push({
370
- message: `"${formItem._name}"数据格式有错!`,
371
- trigger: "blur, change",
372
- type: "string",
373
- ...ruleConfig,
374
- fields: ruleConfig.fields && Object.entries(ruleConfig.fields).reduce((obj, arr) => {
375
- return {
376
- ...obj,
377
- [arr[0]]: {
378
- ...arr[1],
379
- required: false,
380
- message: `"${formItem._name}"${arr[1].message || ""}`
381
- }
382
- };
383
- }, ruleConfig.fields)
384
- });
385
- }
386
-
387
- // 必填校验
388
- if (formItem._required) {
389
- rules.push({
390
- message: `"${formItem._name}"为必填项!`,
391
- trigger: "blur, change",
392
- type: "string",
393
- required: true,
394
- ...ruleConfig,
395
- fields: ruleConfig.fields && Object.entries(ruleConfig.fields).reduce((obj, arr) => {
396
- return {
397
- ...obj,
398
- [arr[0]]: {
399
- ...arr[1],
400
- message: `"${formItem._name}"${arr[1].message || ""}`
401
- }
402
- };
403
- }, ruleConfig.fields)
404
- });
405
- }
406
-
407
- // 格式校验(不依赖必填)
408
- if (ruleConfig.regs && ruleConfig.regs.length) {
409
- rules.push({
410
- message: formItem._regMessage || ruleConfig._regMessage || `"${formItem._name}"格式不正确!`,
411
- trigger: "blur, change",
412
- type: "string",
413
- transform: (val) => {
414
- return this.$isEmptyData(val)
415
- ? val
416
- : ruleConfig.regs.every(regItem => regItem.test(val)) && val;
417
- },
418
- ...ruleConfig
419
- });
420
- }
421
-
422
- // 对比校验(横向同类型字段对比)-暂时只number和date对比校验
423
- if (formItem._saveRuleConfigs && formItem._saveRuleConfigs.length) {
424
- const ruleObj = {
425
- message: `"${formItem._name}"对比不通过!`,
426
- trigger: "blur, change",
427
- type: "string",
428
- transform: (val) => {
429
- return this.$normalComparedFunc(formItem, this.formData, this.selfAllFormList, this.parentObj, this.parentFormList, this.inTableType, ruleObj)
430
- ? val
431
- : false;
432
- },
433
- ...ruleConfig
434
- };
435
-
436
- rules.push(ruleObj);
437
- }
438
-
439
- // 对比校验(层级表格的层级对比)-暂时只number和date对比校验
440
- if (this.inTableType === "treeTable" && ["downToUp", "upToDown"].includes(formItem._writeSort)) {
441
- const ruleObj = {
442
- message: `"${formItem._name}"层级对比不通过!`,
443
- trigger: "blur, change",
444
- type: "string",
445
- transform: (val) => {
446
- return this.$levelComparedFunc(formItem, this.formData, this.allListRows, this.inTableType, ruleObj)
447
- ? val
448
- : false;
449
- },
450
- ...ruleConfig
451
- };
452
-
453
- rules.push(ruleObj);
454
- }
455
-
456
- return rules;
457
- },
458
- // 强行执行一些校验
459
- forceFormValidate (curFormItem) {
460
- if (curFormItem._required === true && this.forceValidateTypes.includes(curFormItem._type)) {
461
- this.$refs.form.validateField(curFormItem._key);
462
- }
463
- }
464
- }
465
- };
466
- </script>
467
-
468
- <style lang="less" scoped>
469
- .DshForm {
470
- padding-bottom: 5px;
471
-
472
- &-item-FormItem {
473
- margin-bottom: 0px;
474
- }
475
-
476
- &-nodata {
477
- #dsh-nodata();
478
- }
479
- }
480
- </style>
481
- <style lang="less">
482
- .DshForm {
483
- .ivu-form-item-content {
484
- line-height: normal;
485
-
486
- .ivu-form-item-error-tip {
487
- top: calc(100% - 8px);
488
- left: 16px;
489
- padding-top: 0px;
490
- font-size: 12px;
491
- }
492
- }
493
- }
494
- </style>
1
+ <template>
2
+ <Form
3
+ class="DshForm"
4
+ ref="form"
5
+ :model="formData"
6
+ :rules="showRules ? rules : {}"
7
+ @submit.native.prevent
8
+ @on-validate="validateCb"
9
+ >
10
+ <Row>
11
+ <template v-if="showFormList.length">
12
+ <template v-for="formItem in showFormList">
13
+ <i-col
14
+ :key="formItem._key"
15
+ :id="formItem._key"
16
+ class="DshForm-item"
17
+ :span="formItem._br ? 24 : (formItem._span || 24)"
18
+ >
19
+ <FormItem
20
+ v-if="hideMap[formItem._key] !== true"
21
+ class="DshForm-item-FormItem"
22
+ :prop="formItem._key"
23
+ @click.native="clickControl(formItem)"
24
+ >
25
+ <dsh-form-unit
26
+ ref="dshFormUnit"
27
+ :canEdit="canEdit"
28
+ :formData="formData"
29
+ :formItem="formItem"
30
+ :allFormList="selfAllFormList"
31
+ :inTableType="inTableType"
32
+ :allListRows="allListRows"
33
+ :rowIndex="rowIndex"
34
+ :parentFormList="parentFormList"
35
+ :parentObj="parentObj"
36
+ :changedFields="changedFields"
37
+ :height="height"
38
+ :rowStyle="rowStyle"
39
+ :labelStyle="labelStyle"
40
+ :formControlClass="formControlClass"
41
+ @change="change(arguments)"
42
+ @refChange="refChange(arguments)"
43
+ @changeField="changeField"
44
+ >
45
+ <slot
46
+ :canEdit="canEdit"
47
+ :formItem="formItem"
48
+ :formData="formData"
49
+ :allFormList="selfAllFormList"
50
+ ></slot>
51
+
52
+ <slot
53
+ name="label"
54
+ slot="label"
55
+ :canEdit="canEdit"
56
+ :formItem="formItem"
57
+ :formData="formData"
58
+ :allFormList="selfAllFormList"
59
+ ></slot>
60
+
61
+ <slot
62
+ name="extra"
63
+ slot="extra"
64
+ :canEdit="canEdit"
65
+ :formItem="formItem"
66
+ :formData="formData"
67
+ :allFormList="selfAllFormList"
68
+ ></slot>
69
+
70
+ <slot
71
+ name="corner"
72
+ slot="corner"
73
+ :canEdit="canEdit"
74
+ :formItem="formItem"
75
+ :formData="formData"
76
+ :allFormList="selfAllFormList"
77
+ ></slot>
78
+ </dsh-form-unit>
79
+ </FormItem>
80
+ </i-col>
81
+
82
+ <!-- 换行 -->
83
+ <i-col
84
+ v-if="formItem._wrap"
85
+ :key="formItem._key + '_wrap'"
86
+ style="min-height: 0px;"
87
+ :span="24"
88
+ ></i-col>
89
+ </template>
90
+ </template>
91
+
92
+ <div
93
+ v-else
94
+ class="DshForm-nodata"
95
+ >
96
+ {{ "--- 无字段 ---" }}
97
+ </div>
98
+ </Row>
99
+ </Form>
100
+ </template>
101
+
102
+ <script>
103
+ import DshFormUnit from "../unit/DshFormUnit.vue";
104
+
105
+ export default {
106
+ name: "DshForm",
107
+ components: {
108
+ DshFormUnit
109
+ },
110
+ props: {
111
+ canEdit: {
112
+ type: Boolean,
113
+ default: true
114
+ },
115
+ formData: {
116
+ type: Object,
117
+ default () {
118
+ return {};
119
+ }
120
+ },
121
+ formList: {
122
+ type: Array,
123
+ default () {
124
+ return [];
125
+ }
126
+ },
127
+ allFormList: {
128
+ type: Array,
129
+ default () {
130
+ return [];
131
+ }
132
+ },
133
+
134
+ /* 表格字段内用到的 */
135
+ inTableType: {
136
+ type: String,
137
+ validator (val) {
138
+ return ["flatTable", "treeTable", "cascaderTable"].includes(val);
139
+ }
140
+ },
141
+ allListRows: {
142
+ type: Array,
143
+ default () {
144
+ return [];
145
+ }
146
+ },
147
+ rowIndex: Number,
148
+ parentObj: {
149
+ type: Object,
150
+ default () {
151
+ return {};
152
+ }
153
+ },
154
+ parentFormList: {
155
+ type: Array,
156
+ default () {
157
+ return [];
158
+ }
159
+ },
160
+
161
+ changedFields: {
162
+ type: Array,
163
+ default () {
164
+ return [];
165
+ }
166
+ },
167
+ height: [String, Number],
168
+ rowStyle: {
169
+ type: Object,
170
+ default () {
171
+ return {};
172
+ }
173
+ },
174
+ labelStyle: {
175
+ type: Object,
176
+ default () {
177
+ return {};
178
+ }
179
+ },
180
+ formControlClass: String,
181
+
182
+ /* 本组件使用 -不传递子组件的 */
183
+ showRules: {
184
+ type: Boolean,
185
+ default: true
186
+ }
187
+ },
188
+ data () {
189
+ return {
190
+ rules: {},
191
+ hideMap: {},
192
+ errorObj: {
193
+ errors: []
194
+ },
195
+
196
+ forceValidateTypes: [
197
+ "select", "region", "cascader", "regions", "cascaders", "file", "coordinates", "editor",
198
+ "users", "departments", "labels", "flatTable", "cascaderTable", "reference", "referenceBy"
199
+ ],
200
+ ignoreProperties: [
201
+ "_name", "_key", "_span", "_br", "_line", "_noLabel", "_required", "_clearable", "_default"
202
+ ]
203
+ // subIgnoreProperties: []
204
+ };
205
+ },
206
+ computed: {
207
+ selfAllFormList () {
208
+ return this.allFormList.length ? this.allFormList : this.formList;
209
+ },
210
+ showFormList () {
211
+ return this.formList.filter(formItem => this.isShow(formItem, this.formData, this.parentObj));
212
+ }
213
+ },
214
+ watch: {
215
+ formList () {
216
+ this.init();
217
+ }
218
+ },
219
+ created () {
220
+ this.init();
221
+ },
222
+ methods: {
223
+ // 初始化
224
+ init () {
225
+ this.initMonitor();
226
+ this.initRules();
227
+ },
228
+ // 初始化监测 -监测所有字段
229
+ initMonitor () {
230
+ this.selfAllFormList.forEach(formItem => {
231
+ this.$set(this.formData, formItem._key, this.formData[formItem._key]);
232
+ });
233
+ },
234
+ // 初始化校验
235
+ initRules () {
236
+ // 此处代码可以改,但写法不能改!不然会引起表单页面渲染完就自动校验
237
+ this.formList.reduce((rulesObj, formItem) => {
238
+ rulesObj[formItem._key] = this.getRules(formItem);
239
+ return rulesObj;
240
+ }, this.rules);
241
+ },
242
+
243
+ /* ------- 供外部使用 ---------- */
244
+ // 获取iview的form组件实例
245
+ getFormRef () {
246
+ return this.$refs.form;
247
+ },
248
+ // 校验
249
+ submit () {
250
+ this.errorObj = {
251
+ errors: []
252
+ };
253
+
254
+ const bool = this.getValid();
255
+ if (bool) {
256
+ this.validateSuccess({});
257
+ } else {
258
+ this.validateFailed(this.errorObj);
259
+ }
260
+
261
+ return bool;
262
+ },
263
+ // 获取校验结果
264
+ getValid () {
265
+ let bool = true;
266
+
267
+ this.getFormRef().validate(valid => {
268
+ bool = bool && valid;
269
+ });
270
+ this.selfValidate((valid, errorFormList) => {
271
+ bool = bool && valid;
272
+
273
+ errorFormList.forEach(formItem => {
274
+ this.validateCb(formItem._key, false, `"${formItem._name}"内部校验不正确!`);
275
+ });
276
+ });
277
+
278
+ return bool;
279
+ },
280
+ // 强制校验,动态校验切换时-单选多选的校验文字无法消失
281
+ forceValidateField (formItem) {
282
+ if (["select", "checkbox"].includes(formItem._type) && !this.rules[formItem._key].length) {
283
+ this.$set(this.hideMap, formItem._key, true);
284
+ this.$nextTick(() => {
285
+ this.$set(this.hideMap, formItem._key, false);
286
+ });
287
+ } else {
288
+ this.$refs.form.validateField(formItem._key);
289
+ }
290
+ },
291
+
292
+ // 控件自己的校验
293
+ selfValidate (cb) {
294
+ let bool = true;
295
+ let errorRefs = [];
296
+
297
+ if (this.$refs.dshFormUnit) {
298
+ errorRefs = this.$refs.dshFormUnit.filter(refItem => !refItem.validate());
299
+ bool = !errorRefs.length;
300
+ }
301
+
302
+ cb && cb(bool, errorRefs.map(errorRefItem => errorRefItem.formItem));
303
+ return bool;
304
+ },
305
+ // iview的校验回调
306
+ validateCb (prop, valid, error) {
307
+ if (valid === false) {
308
+ this.errorObj.errors.push({
309
+ bool: false,
310
+ message: error
311
+ });
312
+ }
313
+ },
314
+ // 校验成功
315
+ validateSuccess (obj) {
316
+ this.$emit("validateSuccess", obj);
317
+ },
318
+ // 校验失败
319
+ validateFailed (errorObj) {
320
+ this.$emit("validateFailed", errorObj);
321
+ },
322
+
323
+ // 点击控件
324
+ clickControl (formItem) {
325
+ this.$emit("clickControl", formItem);
326
+ },
327
+ // 切换字段
328
+ changeField (...params) {
329
+ this.$emit("changeField", ...params);
330
+ },
331
+ // 发生改动
332
+ change (params) {
333
+ this.forceFormValidate(...params);
334
+ this.$emit("change", ...params);
335
+ },
336
+ // 关联表相关的change
337
+ refChange (params) {
338
+ this.$emit("refChange", ...params);
339
+ },
340
+
341
+ /* -------- 工具类 -------- */
342
+ isShow (formItem, formData, parentObj) {
343
+ // 寻找循环项
344
+ if (formItem._loop === true) {
345
+ Object.entries({
346
+ ...formData,
347
+ _displayType: "show",
348
+ canEdit: !["createdAt", "updatedAt", "_creaters"].includes(formData._key)
349
+ }).forEach(arr => {
350
+ if (!this.ignoreProperties.includes(arr[0]) && arr[1] !== undefined) {
351
+ this.$set(formItem, arr[0], arr[1]);
352
+ }
353
+ });
354
+ }
355
+
356
+ return this.$isAdvRelyShow(formItem, formData, parentObj);
357
+ },
358
+ getRules (formItem) {
359
+ let rules = [];
360
+ let ruleConfig = this.$getFieldRuleConfig(formItem);
361
+
362
+ // 数据格式校验 -关联表格类型的会被过滤掉
363
+ if (
364
+ ruleConfig.type &&
365
+ (!ruleConfig.fields || Object.entries(ruleConfig.fields).every(arr => !arr[1].transform)) &&
366
+ (!["date"].includes(formItem._type) || !["daterange", "datetimerange"].includes(formItem._dateType)) &&
367
+ (!["select", "checkbox"].includes(formItem._type)) // 考虑到选项用数字类型时,应该type: "number"
368
+ ) {
369
+ rules.push({
370
+ message: `"${formItem._name}"数据格式有错!`,
371
+ trigger: "blur, change",
372
+ type: "string",
373
+ ...ruleConfig,
374
+ fields: ruleConfig.fields && Object.entries(ruleConfig.fields).reduce((obj, arr) => {
375
+ return {
376
+ ...obj,
377
+ [arr[0]]: {
378
+ ...arr[1],
379
+ required: false,
380
+ message: `"${formItem._name}"${arr[1].message || ""}`
381
+ }
382
+ };
383
+ }, ruleConfig.fields)
384
+ });
385
+ }
386
+
387
+ // 必填校验
388
+ if (formItem._required) {
389
+ rules.push({
390
+ message: `"${formItem._name}"为必填项!`,
391
+ trigger: "blur, change",
392
+ type: "string",
393
+ required: true,
394
+ ...ruleConfig,
395
+ fields: ruleConfig.fields && Object.entries(ruleConfig.fields).reduce((obj, arr) => {
396
+ return {
397
+ ...obj,
398
+ [arr[0]]: {
399
+ ...arr[1],
400
+ message: `"${formItem._name}"${arr[1].message || ""}`
401
+ }
402
+ };
403
+ }, ruleConfig.fields)
404
+ });
405
+ }
406
+
407
+ // 格式校验(不依赖必填)
408
+ if (ruleConfig.regs && ruleConfig.regs.length) {
409
+ rules.push({
410
+ message: formItem._regMessage || ruleConfig._regMessage || `"${formItem._name}"格式不正确!`,
411
+ trigger: "blur, change",
412
+ type: "string",
413
+ transform: (val) => {
414
+ return this.$isEmptyData(val)
415
+ ? val
416
+ : ruleConfig.regs.every(regItem => regItem.test(val)) && val;
417
+ },
418
+ ...ruleConfig
419
+ });
420
+ }
421
+
422
+ // 对比校验(横向同类型字段对比)-暂时只number和date对比校验
423
+ if (formItem._saveRuleConfigs && formItem._saveRuleConfigs.length) {
424
+ const ruleObj = {
425
+ message: `"${formItem._name}"对比不通过!`,
426
+ trigger: "blur, change",
427
+ type: "string",
428
+ transform: (val) => {
429
+ return this.$normalComparedFunc(formItem, this.formData, this.selfAllFormList, this.parentObj, this.parentFormList, this.inTableType, ruleObj)
430
+ ? val
431
+ : false;
432
+ },
433
+ ...ruleConfig
434
+ };
435
+
436
+ rules.push(ruleObj);
437
+ }
438
+
439
+ // 对比校验(层级表格的层级对比)-暂时只number和date对比校验
440
+ if (this.inTableType === "treeTable" && ["downToUp", "upToDown"].includes(formItem._writeSort)) {
441
+ const ruleObj = {
442
+ message: `"${formItem._name}"层级对比不通过!`,
443
+ trigger: "blur, change",
444
+ type: "string",
445
+ transform: (val) => {
446
+ return this.$levelComparedFunc(formItem, this.formData, this.allListRows, this.inTableType, ruleObj)
447
+ ? val
448
+ : false;
449
+ },
450
+ ...ruleConfig
451
+ };
452
+
453
+ rules.push(ruleObj);
454
+ }
455
+
456
+ return rules;
457
+ },
458
+ // 强行执行一些校验
459
+ forceFormValidate (curFormItem) {
460
+ if (curFormItem._required === true && this.forceValidateTypes.includes(curFormItem._type)) {
461
+ this.$refs.form.validateField(curFormItem._key);
462
+ }
463
+ }
464
+ }
465
+ };
466
+ </script>
467
+
468
+ <style lang="less" scoped>
469
+ .DshForm {
470
+ padding-bottom: 5px;
471
+
472
+ &-item-FormItem {
473
+ margin-bottom: 0px;
474
+ }
475
+
476
+ &-nodata {
477
+ #dsh-nodata();
478
+ }
479
+ }
480
+ </style>
481
+ <style lang="less">
482
+ .DshForm {
483
+ .ivu-form-item-content {
484
+ line-height: normal;
485
+
486
+ .ivu-form-item-error-tip {
487
+ top: calc(100% - 8px);
488
+ left: 16px;
489
+ padding-top: 0px;
490
+ font-size: 12px;
491
+ }
492
+ }
493
+ }
494
+ </style>