cloud-web-corejs 1.0.281 → 1.1.0-dev.4

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 (158) hide show
  1. package/package.json +6 -2
  2. package/src/components/VabUpload/image-viewer.vue +442 -442
  3. package/src/components/VabUpload/index.vue +44 -2
  4. package/src/components/VabUpload/mixins.js +126 -19
  5. package/src/components/VabUpload/view.vue +247 -209
  6. package/src/components/baseTabs/mixins.js +181 -181
  7. package/src/components/bizTab/BizBillActions.vue +129 -0
  8. package/src/components/bizTab/BizTabListPage.vue +391 -0
  9. package/src/components/bizTab/README.md +378 -0
  10. package/src/components/bizTab/billTableUtil.js +48 -0
  11. package/src/components/bizTab/billValidators.js +136 -0
  12. package/src/components/bizTab/bizBillDetailMixin.js +705 -0
  13. package/src/components/bizTab/index.js +24 -0
  14. package/src/components/excelExport/exportFieldDialog.vue +23 -12
  15. package/src/components/excelExport/exportItemConfigUtil.js +30 -0
  16. package/src/components/excelExport/mixins.js +3 -3
  17. package/src/components/mobile/statusTag/mixins.js +1 -61
  18. package/src/components/mobile/wf/content.vue +1662 -1556
  19. package/src/components/mobile/wf/mixins/wfModifyDialogMixin.js +8 -6
  20. package/src/components/table/config.js +78 -78
  21. package/src/components/table/index.js +1276 -1276
  22. package/src/components/table/plugins/cell-area/index.js +1055 -0
  23. package/src/components/table/plugins/cell-area/index.scss +77 -0
  24. package/src/components/table/plugins/cell-area/util.js +224 -0
  25. package/src/components/table/tableForm.vue +330 -330
  26. package/src/components/table/tableFormMixin.js +318 -318
  27. package/src/components/table/vxeFilter/index.js +163 -163
  28. package/src/components/table/vxeFilter/mixin.js +316 -316
  29. package/src/components/wf/content.vue +1188 -1188
  30. package/src/components/wf/wf.js +40 -20
  31. package/src/components/wf/wfActionDropdown.vue +1 -1
  32. package/src/components/wf/wfActionItems.js +1 -1
  33. package/src/components/xform/docs/2026-08 xform H5 P0 /345/256/236/347/216/260/350/247/204/346/240/274.md" +528 -0
  34. package/src/components/xform/docs/2026-08 xform H5 P1 /345/256/236/347/216/260/350/247/204/346/240/274.md" +412 -0
  35. package/src/components/xform/docs/2026-08 xform H5 P2 /345/256/236/347/216/260/350/247/204/346/240/274.md" +287 -0
  36. package/src/components/xform/docs/2026-08 xform /347/247/273/345/212/250/347/253/257/345/270/203/345/261/200/345/257/271/351/275/220 bill_setting /346/226/271/346/241/210.md" +400 -0
  37. package/src/components/xform/form-designer/designer.js +15 -0
  38. package/src/components/xform/form-designer/form-widget/container-widget/data-table-widget.vue +269 -269
  39. package/src/components/xform/form-designer/form-widget/container-widget/detail-temp-widget.vue +132 -0
  40. package/src/components/xform/form-designer/form-widget/container-widget/detail-widget.vue +250 -250
  41. package/src/components/xform/form-designer/form-widget/dialog/fileReferenceDialog.vue +319 -320
  42. package/src/components/xform/form-designer/form-widget/dialog/formDialog.vue +365 -365
  43. package/src/components/xform/form-designer/form-widget/dialog/searchFormDialog.vue +554 -555
  44. package/src/components/xform/form-designer/form-widget/dialog/vabSearchDialog.vue +409 -409
  45. package/src/components/xform/form-designer/form-widget/field-widget/a-link-widget.vue +150 -132
  46. package/src/components/xform/form-designer/form-widget/field-widget/date-range-widget.vue +114 -114
  47. package/src/components/xform/form-designer/form-widget/field-widget/date-widget.vue +154 -154
  48. package/src/components/xform/form-designer/form-widget/field-widget/form-item-wrapper.vue +47 -1
  49. package/src/components/xform/form-designer/form-widget/field-widget/mixins/date-limit-mixin.js +178 -178
  50. package/src/components/xform/form-designer/form-widget/field-widget/mixins/time-limit-mixin.js +77 -77
  51. package/src/components/xform/form-designer/form-widget/field-widget/select-export-item-button-widget.vue +6 -0
  52. package/src/components/xform/form-designer/form-widget/field-widget/select-widget.vue +139 -139
  53. package/src/components/xform/form-designer/form-widget/field-widget/time-range-widget.vue +106 -106
  54. package/src/components/xform/form-designer/form-widget/field-widget/time-widget.vue +134 -134
  55. package/src/components/xform/form-designer/form-widget/field-widget/vabUpload-widget.vue +1 -0
  56. package/src/components/xform/form-designer/setting-panel/form-setting.vue +39 -39
  57. package/src/components/xform/form-designer/setting-panel/property-editor/container-data-table/data-table-editor.vue +10 -10
  58. package/src/components/xform/form-designer/setting-panel/property-editor/container-data-table/exportItemColumns-dialog.vue +438 -432
  59. package/src/components/xform/form-designer/setting-panel/property-editor/container-data-table/table-column-dialog.vue +2103 -2103
  60. package/src/components/xform/form-designer/setting-panel/property-editor/container-detail/detail-temp-edito.vue +90 -0
  61. package/src/components/xform/form-designer/setting-panel/property-editor/container-grid/gutter-editor.vue +82 -82
  62. package/src/components/xform/form-designer/setting-panel/property-editor/container-list-h5/list-h5-editor.vue +19 -5
  63. package/src/components/xform/form-designer/setting-panel/property-editor/container-table/table-dynamicField-editor.vue +8 -8
  64. package/src/components/xform/form-designer/setting-panel/property-editor/dropdownFlag-editor.vue +137 -137
  65. package/src/components/xform/form-designer/setting-panel/property-editor/field-button/search-dialog-event-editor.vue +237 -237
  66. package/src/components/xform/form-designer/setting-panel/property-editor/field-date/date-defaultValue-editor.vue +43 -43
  67. package/src/components/xform/form-designer/setting-panel/property-editor/field-date-range/date-range-defaultValue-editor.vue +43 -43
  68. package/src/components/xform/form-designer/setting-panel/property-editor/field-import-button/import2-button-editor.vue +96 -96
  69. package/src/components/xform/form-designer/setting-panel/property-editor/field-table-export-button/select-export-item-button-editor.vue +51 -0
  70. package/src/components/xform/form-designer/setting-panel/property-editor/field-time/time-defaultValue-editor.vue +42 -42
  71. package/src/components/xform/form-designer/setting-panel/property-editor/field-time-range/time-range-defaultValue-editor.vue +43 -43
  72. package/src/components/xform/form-designer/setting-panel/property-editor/formScriptEnabled-editor.vue +158 -158
  73. package/src/components/xform/form-designer/setting-panel/property-editor/h5Span-editor.vue +51 -0
  74. package/src/components/xform/form-designer/setting-panel/property-editor/itemStyle-editor.vue +39 -0
  75. package/src/components/xform/form-designer/setting-panel/property-editor/name-editor.vue +188 -188
  76. package/src/components/xform/form-designer/setting-panel/property-editor/styleTempClass-editor.vue +51 -0
  77. package/src/components/xform/form-designer/setting-panel/property-editor/textFlag-editor.vue +347 -347
  78. package/src/components/xform/form-designer/setting-panel/propertyRegister.js +4 -0
  79. package/src/components/xform/form-designer/widget-panel/widgetsConfig.js +59 -3
  80. package/src/components/xform/form-render/container-item/data-table-mixin.js +151 -93
  81. package/src/components/xform/form-render/container-item/detail-h5-item.vue +183 -32
  82. package/src/components/xform/form-render/container-item/detail-temp-item.vue +110 -0
  83. package/src/components/xform/form-render/container-item/h5-card-pane-item.vue +160 -140
  84. package/src/components/xform/form-render/container-item/list-h5-item.vue +1688 -1700
  85. package/src/components/xform/form-render/index.vue +153 -147
  86. package/src/components/xform/form-render/indexMixin.js +12 -0
  87. package/src/components/xform/lang/en-US.js +10 -0
  88. package/src/components/xform/lang/zh-CN.js +12 -0
  89. package/src/components/xform/mixins/defaultHandle.js +707 -707
  90. package/src/components/xform/styles/h5.scss +1992 -0
  91. package/src/components/xform/utils/textMaskUtil.js +182 -179
  92. package/src/components/xform/utils/treeTableUtil.js +1292 -1265
  93. package/src/components/xform/utils/util.js +56 -11
  94. package/src/index.js +9 -4
  95. package/src/layout/components/extractedCode/viewDialog.vue +7 -7
  96. package/src/router/index.js +21 -0
  97. package/src/router/modules/customer.js +71 -14
  98. package/src/store/modules/permission.js +17 -18
  99. package/src/utils/pdfUtil.js +429 -429
  100. package/src/utils/resolveViewComponent.js +142 -16
  101. package/src/views/bd/project/branch/bd_branch/edit.vue +145 -0
  102. package/src/views/bd/project/branch/bd_branch/list.vue +72 -0
  103. package/src/views/bd/project/branch/bd_branch/menuKindDialog.vue +106 -0
  104. package/src/views/bd/project/branch/bd_branch/mixins/edit.js +189 -0
  105. package/src/views/bd/project/branch/bd_branch/mixins/list.js +124 -0
  106. package/src/views/bd/project/branch/bd_branch/mixins/menuKindDialog.js +85 -0
  107. package/src/views/bd/project/branch/form_script/list.vue +31 -0
  108. package/src/views/bd/project/branch/form_template/list.vue +30 -0
  109. package/src/views/bd/project/branch/menu_kind/list.vue +31 -0
  110. package/src/views/bd/project/common/form_script/list.vue +16 -0
  111. package/src/views/bd/project/common/form_template/list.vue +15 -0
  112. package/src/views/bd/project/common/menu_kind/list.vue +15 -0
  113. package/src/views/bd/project/core/branchContext.js +100 -0
  114. package/src/views/bd/project/core/branchPage.js +78 -0
  115. package/src/views/bd/project/core/branchPageWrap.vue +225 -0
  116. package/src/views/bd/project/core/branchScope.js +44 -0
  117. package/src/views/bd/project/core/branchSearchPage.js +285 -0
  118. package/src/views/bd/project/core/branchSelect.vue +85 -0
  119. package/src/views/bd/project/core/branchTreeBar.vue +81 -0
  120. package/src/views/bd/project/core/httpBranchPatch.js +58 -0
  121. package/src/views/bd/project/datatable/menu_kind/list.vue +15 -0
  122. package/src/views/bd/project/datatable/table_model/list.vue +15 -0
  123. package/src/views/bd/setting/bd_company_env/dialog.vue +174 -174
  124. package/src/views/bd/setting/table_model/edit.vue +1066 -1066
  125. package/src/views/bd/setting/table_model/mixins/edit.js +1455 -1455
  126. package/src/views/bd/setting/table_model/mixins/zdDialog.js +148 -148
  127. package/src/views/demo/bizTab/bill/billConfig.js +41 -0
  128. package/src/views/demo/bizTab/bill/detail.vue +436 -0
  129. package/src/views/demo/bizTab/bill/list.vue +288 -0
  130. package/src/views/demo/bizTab/bill/productDialog.vue +176 -0
  131. package/src/views/demo/bizTab/simple/billApi.js +123 -0
  132. package/src/views/demo/bizTab/simple/detail.vue +407 -0
  133. package/src/views/demo/bizTab/simple/list.vue +217 -0
  134. package/src/views/demo/bizTab/standalone/index.vue +121 -0
  135. package/src/views/demo/bizTab/wf/billConfig.js +44 -0
  136. package/src/views/demo/bizTab/wf/detail.vue +661 -0
  137. package/src/views/demo/bizTab/wf/list.vue +242 -0
  138. package/src/views/support/form-dialog-demo/demoPickerDialog.vue +72 -0
  139. package/src/views/support/form-dialog-demo/index.vue +537 -0
  140. package/src/views/user/file_view_ins/list.vue +3 -3
  141. package/src/views/user/home/index.vue +8 -6
  142. package/src/views/user/home/wjl/content.vue +1569 -0
  143. package/src/views/user/notify_message/dialog.vue +7 -5
  144. package/src/views/user/outLink/cc_form_view.vue +188 -0
  145. package/src/views/user/outLink/form_view.vue +2 -2
  146. package/src/views/user/outLink/index.vue +4 -4
  147. package/src/views/user/outLink/view.vue +3 -3
  148. package/src/views/user/role/edit.vue +632 -632
  149. package/src/views/user/role/list.vue +260 -260
  150. package/src/views/user/wf/iframe/index.vue +3 -3
  151. package/src/views/user/wf/iframe/index2.vue +3 -3
  152. package/src/views/user/wf/wf_manage/list.vue +1112 -1116
  153. package/src/views/user/wf/wf_manage/list2.vue +9 -13
  154. package/src/views/user/wf/wf_manage/wfContentDialog.vue +8 -5
  155. package/src/components/xform/form-designer/form-widget/field-widget/dropdown-menu-widget.vue +0 -106
  156. package/src/components/xform/form-designer/form-widget/field-widget/tableexportbuttonwidget.vue +0 -99
  157. package/src/components/xform/form-render/container-item/list-h5-item2.vue +0 -1340
  158. package/src/utils/wf.js +0 -766
@@ -1,181 +1,181 @@
1
- import { scrollIntoScrollParent } from '@base/utils/scrollUtil';
2
-
3
- let baseTabsMixin, baseTabPaneMixin;
4
-
5
- baseTabsMixin = {
6
- props: {
7
- value: {
8
- type: [String, Number]
9
- }
10
- },
11
- data: function () {
12
- return {
13
- currentValue: this.value,
14
- navList: []
15
- };
16
- },
17
- methods: {
18
- tabCls: function (item) {
19
- return [
20
- 'tabs-tab',
21
- {
22
- 'tabs-tab-active': item.name === this.currentValue
23
- }
24
- ];
25
- },
26
- //遍历所有为pane的子元素
27
- getTabs() {
28
- let list = [];
29
- if (this.$slots.default) {
30
- this.$slots.default.filter(item => {
31
- return item.child !== undefined && item.child !== null;
32
- }).map(item => item.child).forEach(item => {
33
- if (item.$options.name === 'baseTabPane') {
34
- list.push(item);
35
- } else if (item.$attrs.tabPaneGrade === '2' || item.$attrs.tabPaneGrade === 2) {
36
- let items = item.$children.filter(function (thirdItem) {
37
- return thirdItem.$options.name === 'baseTabPane';
38
- });
39
- list.push(...items);
40
- }
41
- });
42
- }
43
- return list;
44
- },
45
- //将pane子元素中label name放进navList数组
46
- updateNav() {
47
- let navList = [];
48
- let _this = this;
49
- this.getTabs().forEach(function (pane, index) {
50
- navList.push({
51
- label: pane.label,
52
- name: pane.name || index,
53
- visible: pane.visible
54
- });
55
-
56
- // if (!pane.name) pane.name = index;
57
- if (index === 0) {
58
- if (!_this.currentValue) {
59
- _this.currentValue = pane.name || index;
60
- }
61
- }
62
- });
63
- this.navList = navList;
64
- this.updateStatus();
65
- },
66
- updateStatus() {
67
- let tabs = this.getTabs();
68
- let _this = this;
69
- //显示当前正在选中的
70
- tabs.forEach(function (tab) {
71
- return (tab.show = tab.name === _this.currentValue);
72
- });
73
- },
74
- handleChange: function (index) {
75
- let nav = this.navList[index];
76
- let name = nav.name;
77
- this.currentValue = name;
78
- this.$emit('input', name);
79
- this.$emit('on-click', name);
80
- let target = this.getTabs()[index].$el;
81
- //滚动体是 .d-cont 还是它外面那层(.d-header + div{flex:1;overflow-y:auto})由布局决定,
82
- //原来写死 .d-cont,在 .d-cont 没有确定高度(height:inherit 拿到 auto)的页面上
83
- //scrollTop 赋值是空操作,点导航没反应——统一交给 scrollIntoScrollParent 找真正的滚动体。
84
- scrollIntoScrollParent(target);
85
- }
86
- },
87
- watch: {
88
- value: function (val) {
89
- this.currentValue = val;
90
- },
91
- currentValue: function () {
92
- this.updateStatus();
93
- }
94
- }
95
- };
96
-
97
- baseTabPaneMixin = {
98
- props: {
99
- name: {
100
- type: String
101
- },
102
- label: {
103
- type: String,
104
- default: ''
105
- },
106
- showFold: {
107
- type: Boolean,
108
- default: false
109
- },
110
- defaultShowContent: {
111
- type: Boolean,
112
- default: true
113
- },
114
- visible: {
115
- type: Boolean,
116
- default: undefined
117
- }
118
- },
119
- computed: {
120
- foldClass() {
121
- return this.showContent ? 'el-icon-arrow-up' : 'el-icon-arrow-down';
122
- }
123
- },
124
- beforeDestroy() {
125
- //getParent() 只认 baseTabs 父级/祖父级,拿不到就是没被 baseTabs 包着(如设计期画布、
126
- //或中间隔了 draggable),此时没有 navList 可维护,直接跳过——原来这里直接取 .navList 会崩。
127
- let parentPanel = this.getParent();
128
- if (!parentPanel) return;
129
- let navList = parentPanel.navList;
130
- if (navList.length <= 1) {
131
- this.updateNav();
132
- }
133
- },
134
- created() {
135
- if (this.showFold) {
136
- this.showContent = this.defaultShowContent;
137
- }
138
- },
139
- data: function () {
140
- return {
141
- show: true,
142
- showContent: true
143
- };
144
- },
145
- methods: {
146
- getParent() {
147
- if (this.$parent.$options.name === 'baseTabs') {
148
- return this.$parent;
149
- } else if (this.$parent.$parent && this.$parent.$parent.$options.name === 'baseTabs') {
150
- return this.$parent.$parent;
151
- }
152
- },
153
- updateNav() {
154
- let parentPanel = this.getParent();
155
- parentPanel && parentPanel.updateNav();
156
- },
157
- handleFold(val) {
158
- if (this.showFold) {
159
- this.showContent = (val !== null && val !== undefined ? val : !this.showContent);
160
- }
161
- }
162
- },
163
- watch: {
164
- label() {
165
- this.updateNav();
166
- }
167
- },
168
- mounted() {
169
- this.updateNav();
170
- if (this.visible !== undefined) {
171
- this.$watch('visible', (val) => {
172
- this.updateNav();
173
- })
174
- }
175
- }
176
- };
177
-
178
- export {
179
- baseTabsMixin,
180
- baseTabPaneMixin,
181
- }
1
+ import { scrollIntoScrollParent } from '@base/utils/scrollUtil';
2
+
3
+ let baseTabsMixin, baseTabPaneMixin;
4
+
5
+ baseTabsMixin = {
6
+ props: {
7
+ value: {
8
+ type: [String, Number]
9
+ }
10
+ },
11
+ data: function () {
12
+ return {
13
+ currentValue: this.value,
14
+ navList: []
15
+ };
16
+ },
17
+ methods: {
18
+ tabCls: function (item) {
19
+ return [
20
+ 'tabs-tab',
21
+ {
22
+ 'tabs-tab-active': item.name === this.currentValue
23
+ }
24
+ ];
25
+ },
26
+ //遍历所有为pane的子元素
27
+ getTabs() {
28
+ let list = [];
29
+ if (this.$slots.default) {
30
+ this.$slots.default.filter(item => {
31
+ return item.child !== undefined && item.child !== null;
32
+ }).map(item => item.child).forEach(item => {
33
+ if (item.$options.name === 'baseTabPane') {
34
+ list.push(item);
35
+ } else if (item.$attrs.tabPaneGrade === '2' || item.$attrs.tabPaneGrade === 2) {
36
+ let items = item.$children.filter(function (thirdItem) {
37
+ return thirdItem.$options.name === 'baseTabPane';
38
+ });
39
+ list.push(...items);
40
+ }
41
+ });
42
+ }
43
+ return list;
44
+ },
45
+ //将pane子元素中label name放进navList数组
46
+ updateNav() {
47
+ let navList = [];
48
+ let _this = this;
49
+ this.getTabs().forEach(function (pane, index) {
50
+ navList.push({
51
+ label: pane.label,
52
+ name: pane.name || index,
53
+ visible: pane.visible
54
+ });
55
+
56
+ // if (!pane.name) pane.name = index;
57
+ if (index === 0) {
58
+ if (!_this.currentValue) {
59
+ _this.currentValue = pane.name || index;
60
+ }
61
+ }
62
+ });
63
+ this.navList = navList;
64
+ this.updateStatus();
65
+ },
66
+ updateStatus() {
67
+ let tabs = this.getTabs();
68
+ let _this = this;
69
+ //显示当前正在选中的
70
+ tabs.forEach(function (tab) {
71
+ return (tab.show = tab.name === _this.currentValue);
72
+ });
73
+ },
74
+ handleChange: function (index) {
75
+ let nav = this.navList[index];
76
+ let name = nav.name;
77
+ this.currentValue = name;
78
+ this.$emit('input', name);
79
+ this.$emit('on-click', name);
80
+ let target = this.getTabs()[index].$el;
81
+ //滚动体是 .d-cont 还是它外面那层(.d-header + div{flex:1;overflow-y:auto})由布局决定,
82
+ //原来写死 .d-cont,在 .d-cont 没有确定高度(height:inherit 拿到 auto)的页面上
83
+ //scrollTop 赋值是空操作,点导航没反应——统一交给 scrollIntoScrollParent 找真正的滚动体。
84
+ scrollIntoScrollParent(target);
85
+ }
86
+ },
87
+ watch: {
88
+ value: function (val) {
89
+ this.currentValue = val;
90
+ },
91
+ currentValue: function () {
92
+ this.updateStatus();
93
+ }
94
+ }
95
+ };
96
+
97
+ baseTabPaneMixin = {
98
+ props: {
99
+ name: {
100
+ type: String
101
+ },
102
+ label: {
103
+ type: String,
104
+ default: ''
105
+ },
106
+ showFold: {
107
+ type: Boolean,
108
+ default: false
109
+ },
110
+ defaultShowContent: {
111
+ type: Boolean,
112
+ default: true
113
+ },
114
+ visible: {
115
+ type: Boolean,
116
+ default: undefined
117
+ }
118
+ },
119
+ computed: {
120
+ foldClass() {
121
+ return this.showContent ? 'el-icon-arrow-up' : 'el-icon-arrow-down';
122
+ }
123
+ },
124
+ beforeDestroy() {
125
+ //getParent() 只认 baseTabs 父级/祖父级,拿不到就是没被 baseTabs 包着(如设计期画布、
126
+ //或中间隔了 draggable),此时没有 navList 可维护,直接跳过——原来这里直接取 .navList 会崩。
127
+ let parentPanel = this.getParent();
128
+ if (!parentPanel) return;
129
+ let navList = parentPanel.navList;
130
+ if (navList.length <= 1) {
131
+ this.updateNav();
132
+ }
133
+ },
134
+ created() {
135
+ if (this.showFold) {
136
+ this.showContent = this.defaultShowContent;
137
+ }
138
+ },
139
+ data: function () {
140
+ return {
141
+ show: true,
142
+ showContent: true
143
+ };
144
+ },
145
+ methods: {
146
+ getParent() {
147
+ if (this.$parent.$options.name === 'baseTabs') {
148
+ return this.$parent;
149
+ } else if (this.$parent.$parent && this.$parent.$parent.$options.name === 'baseTabs') {
150
+ return this.$parent.$parent;
151
+ }
152
+ },
153
+ updateNav() {
154
+ let parentPanel = this.getParent();
155
+ parentPanel && parentPanel.updateNav();
156
+ },
157
+ handleFold(val) {
158
+ if (this.showFold) {
159
+ this.showContent = (val !== null && val !== undefined ? val : !this.showContent);
160
+ }
161
+ }
162
+ },
163
+ watch: {
164
+ label() {
165
+ this.updateNav();
166
+ }
167
+ },
168
+ mounted() {
169
+ this.updateNav();
170
+ if (this.visible !== undefined) {
171
+ this.$watch('visible', (val) => {
172
+ this.updateNav();
173
+ })
174
+ }
175
+ }
176
+ };
177
+
178
+ export {
179
+ baseTabsMixin,
180
+ baseTabPaneMixin,
181
+ }
@@ -0,0 +1,129 @@
1
+ <template>
2
+ <div class="fr">
3
+ <!-- 按钮顺序(.fr 里 DOM 次序即从左到右):
4
+ 翻单 → 提交流程 → 业务按钮(默认插槽) → 重置 → 保存
5
+ #before 是留给"要排在翻单之前"的特例,一般不用。
6
+ 另外 wfUtil 的「更多」下拉 / 「修改单据」是 append 到本容器最前面的,会落在最左侧。 -->
7
+ <slot name="before"></slot>
8
+ <!-- ① 上一单 / 下一单:列表侧 openDetail 传了 navRows 才出现 -->
9
+ <template v-if="showBillNav">
10
+ <!-- 用默认按钮而不是 primary+plain:element 对 primary+plain 的禁用态是淡蓝
11
+ (#8cc5ff/#ecf5ff),在头部一排蓝按钮里看不出不可点;默认按钮的禁用态本来就是灰的 -->
12
+ <el-button
13
+ class="button-sty"
14
+ icon="el-icon-arrow-left"
15
+ :disabled="!detail.canPrevBill || busy"
16
+ @click="detail.gotoPrevBill()"
17
+ >{{ $t1("上一单") }}</el-button
18
+ >
19
+ <el-button
20
+ class="button-sty"
21
+ :disabled="!detail.canNextBill || busy"
22
+ @click="detail.gotoNextBill()"
23
+ >{{ $t1("下一单") }}<i class="el-icon-arrow-right el-icon--right"
24
+ /></el-button>
25
+ </template>
26
+ <!-- ② 提交流程。新增页是「保存并提交流程」,已存过的单据是「提交流程」,两者互斥 -->
27
+ <el-button
28
+ v-if="detail.showSaveSubmitBtn"
29
+ type="success"
30
+ class="button-sty"
31
+ icon="el-icon-video-play"
32
+ :disabled="busy"
33
+ :loading="detail.billSaving"
34
+ @click="detail.saveAndSubmitHandle()"
35
+ >{{ detail.saveSubmitButtonName }}</el-button
36
+ >
37
+ <el-button
38
+ v-if="detail.showWfStartBtn"
39
+ type="success"
40
+ class="button-sty"
41
+ icon="el-icon-video-play"
42
+ :disabled="busy"
43
+ @click="detail.startWfHandle()"
44
+ >{{ detail.submitButtonName }}</el-button
45
+ >
46
+ <!-- ③ 业务按钮(作废/复制/打印这类各单据自己的动作) -->
47
+ <slot></slot>
48
+ <!-- ④⑤ 重置、保存。每个按钮都显式写 :disabled:el-button 没传 disabled 时会继承外层
49
+ el-form 的 disabled(element-ui button.vue buttonDisabled),显式传就切断这条继承 -->
50
+ <el-button
51
+ v-if="canEdit"
52
+ type="primary"
53
+ plain
54
+ class="button-sty"
55
+ icon="el-icon-refresh-right"
56
+ :disabled="busy"
57
+ @click="detail.reloadDetail()"
58
+ >{{ $t1("重置") }}</el-button
59
+ >
60
+ <el-button
61
+ v-if="canEdit"
62
+ type="primary"
63
+ class="button-sty"
64
+ icon="el-icon-check"
65
+ :disabled="busy"
66
+ :loading="detail.billSaving"
67
+ @click="detail.saveHandle()"
68
+ >{{ $t1("保存") }}</el-button
69
+ >
70
+ </div>
71
+ </template>
72
+
73
+ <script>
74
+ /**
75
+ * 单据详情头部按钮区,统一「上一单/下一单 / 提交流程 / 保存 / 重置」的显隐、顺序与文案。
76
+ * 从左到右固定为:翻单 → 提交流程 → 业务按钮(默认插槽) → 重置 → 保存。
77
+ * 按钮名走后台 wf_diy_attribute 的 param18(wfButtonName.js),后台没配才用默认文案。
78
+ *
79
+ * 用法(detail 传详情组件自身,模板里用 Vue 内置的 _self):
80
+ * <div class="d-header clearfix">
81
+ * <div class="fl">标题</div>
82
+ * <biz-bill-actions :detail="_self" />
83
+ * </div>
84
+ *
85
+ * 注意:根节点是 .d-header 里的 .fr,别再往外包一层,否则布局会散,
86
+ * 而且 wfUtil 的「更多」下拉 / 「修改单据」就是往 .el-form .d-header > .fr 里塞的。
87
+ */
88
+ export default {
89
+ name: "BizBillActions",
90
+ props: {
91
+ // 详情组件实例(混入了 bizBillDetailMixin)
92
+ detail: {
93
+ type: Object,
94
+ required: true,
95
+ },
96
+ /**
97
+ * 覆盖「是否可编辑」(显示重置/保存)。
98
+ * 不传 = 自动判断:流程没启动、或流程当前节点允许改单据。
99
+ * 故意不声明 type:Boolean 型 prop 不传时 Vue 会塞 false,三态就没法表达。
100
+ */
101
+ editable: {
102
+ default: undefined,
103
+ },
104
+ // 是否显示上一单/下一单。不传 = 有翻单快照就显示
105
+ billNav: {
106
+ default: undefined,
107
+ },
108
+ },
109
+ computed: {
110
+ // 与字段禁用同源:都取详情的 canEditBill(),不会出现「字段能改却没有保存按钮」
111
+ canEdit() {
112
+ if (this.editable !== undefined && this.editable !== null) {
113
+ return !!this.editable;
114
+ }
115
+ return !this.detail.billDisabled;
116
+ },
117
+ showBillNav() {
118
+ if (this.billNav !== undefined && this.billNav !== null) {
119
+ return !!this.billNav;
120
+ }
121
+ return !!this.detail.billNavState;
122
+ },
123
+ // 保存中、或「已入库待提交流程」期间:一律禁用,避免并发写同一张单
124
+ busy() {
125
+ return !!(this.detail.billSaving || this.detail.billSubmitting);
126
+ },
127
+ },
128
+ };
129
+ </script>