cloud-web-corejs 1.0.54-dev.810 → 1.0.54-dev.811

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 (83) hide show
  1. package/package.json +1 -1
  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/mobile/wf/content.vue +1665 -1556
  8. package/src/components/table/config.js +78 -78
  9. package/src/components/table/index.js +1276 -1276
  10. package/src/components/table/tableForm.vue +330 -330
  11. package/src/components/table/tableFormMixin.js +318 -318
  12. package/src/components/table/vxeFilter/index.js +163 -163
  13. package/src/components/table/vxeFilter/mixin.js +316 -316
  14. package/src/components/wf/content.vue +1188 -1188
  15. package/src/components/wf/wf.js +29 -12
  16. package/src/components/wf/wfActionDropdown.vue +1 -1
  17. package/src/components/wf/wfActionItems.js +1 -1
  18. 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
  19. 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
  20. 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
  21. 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
  22. package/src/components/xform/form-designer/designer.js +15 -0
  23. package/src/components/xform/form-designer/form-widget/container-widget/data-table-widget.vue +269 -269
  24. package/src/components/xform/form-designer/form-widget/container-widget/detail-temp-widget.vue +132 -0
  25. package/src/components/xform/form-designer/form-widget/container-widget/detail-widget.vue +250 -250
  26. package/src/components/xform/form-designer/form-widget/dialog/fileReferenceDialog.vue +319 -320
  27. package/src/components/xform/form-designer/form-widget/dialog/formDialog.vue +365 -365
  28. package/src/components/xform/form-designer/form-widget/dialog/searchFormDialog.vue +554 -555
  29. package/src/components/xform/form-designer/form-widget/dialog/vabSearchDialog.vue +409 -409
  30. package/src/components/xform/form-designer/form-widget/field-widget/a-link-widget.vue +150 -132
  31. package/src/components/xform/form-designer/form-widget/field-widget/date-range-widget.vue +114 -114
  32. package/src/components/xform/form-designer/form-widget/field-widget/date-widget.vue +154 -154
  33. package/src/components/xform/form-designer/form-widget/field-widget/form-item-wrapper.vue +29 -1
  34. package/src/components/xform/form-designer/form-widget/field-widget/mixins/date-limit-mixin.js +178 -178
  35. package/src/components/xform/form-designer/form-widget/field-widget/mixins/time-limit-mixin.js +77 -77
  36. package/src/components/xform/form-designer/form-widget/field-widget/select-widget.vue +139 -139
  37. package/src/components/xform/form-designer/form-widget/field-widget/time-range-widget.vue +106 -106
  38. package/src/components/xform/form-designer/form-widget/field-widget/time-widget.vue +134 -134
  39. package/src/components/xform/form-designer/form-widget/field-widget/vabUpload-widget.vue +1 -0
  40. package/src/components/xform/form-designer/setting-panel/form-setting.vue +39 -39
  41. package/src/components/xform/form-designer/setting-panel/property-editor/container-data-table/exportItemColumns-dialog.vue +438 -438
  42. package/src/components/xform/form-designer/setting-panel/property-editor/container-data-table/table-column-dialog.vue +2103 -2103
  43. package/src/components/xform/form-designer/setting-panel/property-editor/container-detail/detail-temp-edito.vue +90 -0
  44. package/src/components/xform/form-designer/setting-panel/property-editor/container-grid/gutter-editor.vue +82 -82
  45. package/src/components/xform/form-designer/setting-panel/property-editor/container-table/table-dynamicField-editor.vue +8 -8
  46. package/src/components/xform/form-designer/setting-panel/property-editor/dropdownFlag-editor.vue +137 -137
  47. package/src/components/xform/form-designer/setting-panel/property-editor/field-button/search-dialog-event-editor.vue +237 -237
  48. package/src/components/xform/form-designer/setting-panel/property-editor/field-date/date-defaultValue-editor.vue +43 -43
  49. package/src/components/xform/form-designer/setting-panel/property-editor/field-date-range/date-range-defaultValue-editor.vue +43 -43
  50. package/src/components/xform/form-designer/setting-panel/property-editor/field-import-button/import2-button-editor.vue +96 -96
  51. package/src/components/xform/form-designer/setting-panel/property-editor/field-time/time-defaultValue-editor.vue +42 -42
  52. package/src/components/xform/form-designer/setting-panel/property-editor/field-time-range/time-range-defaultValue-editor.vue +43 -43
  53. package/src/components/xform/form-designer/setting-panel/property-editor/formScriptEnabled-editor.vue +158 -158
  54. package/src/components/xform/form-designer/setting-panel/property-editor/h5Span-editor.vue +51 -0
  55. package/src/components/xform/form-designer/setting-panel/property-editor/itemStyle-editor.vue +39 -0
  56. package/src/components/xform/form-designer/setting-panel/property-editor/name-editor.vue +188 -188
  57. package/src/components/xform/form-designer/setting-panel/property-editor/styleTempClass-editor.vue +51 -0
  58. package/src/components/xform/form-designer/setting-panel/property-editor/textFlag-editor.vue +347 -347
  59. package/src/components/xform/form-designer/setting-panel/propertyRegister.js +4 -0
  60. package/src/components/xform/form-designer/widget-panel/widgetsConfig.js +55 -3
  61. package/src/components/xform/form-render/container-item/data-table-mixin.js +33 -12
  62. package/src/components/xform/form-render/container-item/detail-h5-item.vue +183 -32
  63. package/src/components/xform/form-render/container-item/detail-temp-item.vue +110 -0
  64. package/src/components/xform/form-render/container-item/h5-card-pane-item.vue +160 -140
  65. package/src/components/xform/form-render/container-item/list-h5-item.vue +1642 -1700
  66. package/src/components/xform/form-render/index.vue +153 -147
  67. package/src/components/xform/form-render/indexMixin.js +12 -0
  68. package/src/components/xform/lang/en-US.js +10 -0
  69. package/src/components/xform/lang/zh-CN.js +12 -0
  70. package/src/components/xform/mixins/defaultHandle.js +707 -707
  71. package/src/components/xform/styles/h5.scss +1633 -0
  72. package/src/components/xform/utils/textMaskUtil.js +182 -182
  73. package/src/components/xform/utils/treeTableUtil.js +1292 -1265
  74. package/src/components/xform/utils/util.js +56 -11
  75. package/src/utils/pdfUtil.js +429 -429
  76. package/src/views/bd/setting/bd_company_env/dialog.vue +174 -174
  77. package/src/views/bd/setting/table_model/edit.vue +1066 -1066
  78. package/src/views/bd/setting/table_model/mixins/edit.js +1455 -1455
  79. package/src/views/bd/setting/table_model/mixins/zdDialog.js +148 -148
  80. package/src/views/user/home/wjl/content.vue +394 -31
  81. package/src/views/user/role/edit.vue +632 -632
  82. package/src/views/user/role/list.vue +260 -260
  83. package/src/views/user/wf/wf_manage/list.vue +1116 -1116
@@ -0,0 +1,1633 @@
1
+ /**
2
+ * xform H5(移动端)版式样式基线
3
+ *
4
+ * 作用域:全部收在 .xform-h5 下。该根类由 form-render/index.vue 依
5
+ * formConfig.layoutType === 'H5' 输出,PC/Pad 版式下整份样式不生效。
6
+ *
7
+ * 为什么放包内而不是 resources/css/style.scss:
8
+ * package.json 的 files 只含 src/resources/js,不含 src/resources/css ——
9
+ * style.scss 不随 cloud-web-corejs 发布,消费应用用的是自己那份拷贝。
10
+ * 样式写在这里才能随包走,改一次各应用同步生效。
11
+ * 详见 docs/2026-08 xform 移动端布局对齐 bill_setting 方案.md 决策 2。
12
+ *
13
+ * ★ 特异度硬约束(改这个文件前必读):
14
+ * style.scss 里已有一批裸类名的 H5 规则(.h5-detail-wrap .h5-item ...),
15
+ * 它走全局 styles/index.scss,本文件走组件 <style> 块,两者加载先后在
16
+ * webpack 下不可靠,不能靠「后写覆盖先写」。因此:
17
+ * 1. 覆盖规则的选择器段数必须严格多于对手(对手 0,3,0 就写到 0,4,0 以上);
18
+ * 2. 对手带 !important 的,本方也必须带,特异度再高也压不过。
19
+ * 每处覆盖点都标了对手所在行号,便于核对。
20
+ */
21
+
22
+ @import "~@/styles/variables.scss";
23
+
24
+ /* ============ 块 A:变量 ============ */
25
+ /* 收掉 bill_setting 散在 4 处 5 个值的 calc(100vh - N),不要抄它的具体数值 */
26
+ $xformH5HeaderHeight: 38px; // 标题栏
27
+ $xformH5FooterHeight: 56px; // 底部动作栏
28
+ $xformH5RowHeight: 48px; // 字段行高
29
+ $xformH5LabelWidth: 80px; // 标签宽
30
+ $xformH5RowBorder: #f3f3f3; // 行分隔线
31
+ $xformH5CardRadius: 12px;
32
+ $xformH5PageBg: #f1f5fb;
33
+
34
+ /* ============ 块 B:分组卡片(对齐 bill_setting 的 .c-item / .tit) ============ */
35
+ /* 对手:style.scss:13766 .h5-detail-wrap .h5-item (0,2,0);本方 0,3,0
36
+ .c-item / .tit 是 components/mobile/h5Card/h5CardPane.vue 的外壳类
37
+ (移动版 wf 面板 content.vue 的根节点就是 <h5-card-pane>)。
38
+ 把它们并进来,wf 面板直接复用 xform 的卡片视觉,不必再搬一套卡片皮肤。 */
39
+ .xform-h5 .h5-detail-wrap {
40
+ .h5-item,
41
+ .c-item {
42
+ background: #fff;
43
+ border-radius: $xformH5CardRadius;
44
+ margin: 12px 8px 0;
45
+ padding-bottom: 6px;
46
+ overflow: hidden;
47
+
48
+ /* 对手:style.scss:13771 .h5-detail-wrap .h5-item .h5-title (0,3,0);本方 0,4,0
49
+ .tit 同上,是 h5CardPane 的标题类 */
50
+ .h5-title,
51
+ .tit {
52
+ line-height: 45px;
53
+ padding: 0 12px;
54
+ border-bottom: 1px solid #f6f6f6;
55
+ position: relative;
56
+
57
+ b {
58
+ font-size: 14px;
59
+ font-weight: 600;
60
+ color: #323232;
61
+ }
62
+
63
+ /* 左侧竖色条,对齐 bill_setting 的 .tit > b::before */
64
+ &::after {
65
+ content: "";
66
+ position: absolute;
67
+ left: 0;
68
+ top: 16px;
69
+ width: 4px;
70
+ height: 13px;
71
+ background: $baseColor;
72
+ border-radius: 4px;
73
+ }
74
+
75
+ /* 展开/收起箭头。h5CardPane 的那份在块 L 里(.c-item > .tit > .arrow),
76
+ 这里是 xform 自己的卡片 h5-card-pane-item.vue,口径保持一致。 */
77
+ > .arrow {
78
+ position: absolute;
79
+ right: 12px;
80
+ top: 0;
81
+ line-height: 45px;
82
+ font-size: 16px;
83
+ color: #909399;
84
+ }
85
+ }
86
+ }
87
+
88
+ /* 标题栏的按钮区原本贴右边(style.scss:13786 right:12px),会和箭头叠在一起,
89
+ 给箭头让出一格。对手 (0,4,0),本方 (0,5,0)。 */
90
+ .h5-item .h5-title .btns {
91
+ right: 34px;
92
+ }
93
+ }
94
+
95
+ /* ============ 块 C:字段行(表格版式的 CSS 复刻) ============ */
96
+ /* 决策 4 走 CSS 复刻而非真 <table>:字段组件全部依赖 el-form-item 挂
97
+ prop/rules,compareView 也包在里面,拆 th/td 会打断校验链与对比包裹。 */
98
+ .xform-h5 .h5-detail-wrap .h5-item .h5-form-box {
99
+ padding: 12px;
100
+
101
+ .form-widget-list {
102
+ display: flex;
103
+ flex-wrap: wrap;
104
+ }
105
+
106
+ .field-wrapper {
107
+ width: 100%;
108
+ }
109
+
110
+ /* 半宽(两列),由字段选项 h5Span === 'half' 打在 form-item-wrapper 根节点上 */
111
+ .field-wrapper.h5-half {
112
+ width: 50%;
113
+ }
114
+
115
+ .el-form-item {
116
+ display: flex;
117
+ align-items: flex-start;
118
+ position: relative;
119
+ min-height: $xformH5RowHeight;
120
+ padding: 6px 0;
121
+ margin-bottom: 0;
122
+ border-bottom: 1px solid $xformH5RowBorder;
123
+
124
+ /* 对手:style.scss:13860 附近 .h5-detail-wrap .h5-item .el-form-item__label (0,3,0)
125
+ 带 text-align:left !important,且把 &:after 设成了 display:none */
126
+ .el-form-item__label {
127
+ width: $xformH5LabelWidth;
128
+ padding: 0 5px 0 0;
129
+ margin: 0;
130
+ line-height: 1.4;
131
+ height: auto;
132
+ overflow: hidden;
133
+ color: #808080;
134
+ text-align: left !important;
135
+
136
+ /* 标签后自动补冒号,对齐 bill_setting form-table 的 th::after。
137
+ 对手把 display 关了,必须先打开再给 content。 */
138
+ &::after {
139
+ display: inline !important;
140
+ content: ":";
141
+ }
142
+ }
143
+
144
+ .el-form-item__content {
145
+ flex: 1;
146
+ line-height: 1.4;
147
+ text-align: right;
148
+ word-break: break-word;
149
+ }
150
+
151
+ &:last-child {
152
+ border-bottom: none;
153
+ }
154
+ }
155
+ }
156
+
157
+ /* ============ 块 D:输入控件归一(去边框、右对齐) ============ */
158
+ .xform-h5 .h5-detail-wrap .h5-item .h5-form-box .el-form-item__content {
159
+ .el-input,
160
+ .el-select {
161
+ width: 100% !important;
162
+ }
163
+
164
+ /* 对手:style.scss:13868 附近 .h5-detail-wrap .h5-item .el-input .el-input__inner (0,4,0)
165
+ 带 height/line-height 双 !important,故本方三条也带 */
166
+ .el-input .el-input__inner,
167
+ .el-textarea .el-textarea__inner {
168
+ height: auto !important;
169
+ line-height: 1.4 !important;
170
+ min-height: 34px;
171
+ border: none !important;
172
+ border-radius: 0 !important;
173
+ padding: 0;
174
+ text-align: right;
175
+ background: transparent;
176
+ }
177
+
178
+ .el-input .el-input__suffix,
179
+ .el-input .el-input__prefix {
180
+ .el-input__icon {
181
+ line-height: 34px !important;
182
+ }
183
+ }
184
+
185
+ .el-radio-group .el-radio,
186
+ .el-checkbox-group .el-checkbox {
187
+ margin: 0 0 0 8px;
188
+
189
+ .el-radio__label,
190
+ .el-checkbox__label {
191
+ padding-left: 4px;
192
+ }
193
+ }
194
+ }
195
+
196
+ /* ============ 块 C1:表格布局(.table-layout)下的行高 ============ */
197
+ /* 块 C 那套(flex 行 + min-height:48px)只在字段直接排在 .h5-form-box 里时生效。
198
+ 表单若用「表格布局」,字段会被塞进 td.table-cell,此时 style.scss:9896 起把
199
+ .field-wrapper 变成 display:table、.el-form-item 变成 display:table-row:
200
+
201
+ - table-row 上的 min-height / padding / border 一律不生效 —— 块 C 的 48px
202
+ 行高在这条路径上完全落空;
203
+ - 那段还想把 .el-form-item__label 设成 table-cell,但 element 的 label 自带
204
+ float:left,而 CSS 规范里 float 非 none 会把 display 强制算成 block,
205
+ 于是标签变成浮动块、脱出表格流,整行高度只剩内容格的 16.8px(实测)。
206
+
207
+ 所以这里做两件事:把标签的浮动去掉、还原成真正的 table-cell;行高改用
208
+ table-row 上的 height(对 table-row 而言 height 即最小高度)。两个单元格
209
+ vertical-align:middle 之后,标签与值在行内垂直居中。
210
+ 对手 .designer-view .table-layout td.table-cell .field-wrapper .el-form-item …
211
+ 是 (0,6,1);本方 (0,7,1) 起步。 */
212
+ .xform-h5
213
+ .h5-detail-wrap
214
+ .h5-item
215
+ .h5-form-box
216
+ .table-layout
217
+ td.table-cell
218
+ .field-wrapper
219
+ .el-form-item {
220
+ height: $xformH5RowHeight;
221
+
222
+ > .el-form-item__label,
223
+ > .el-form-item__content {
224
+ display: table-cell;
225
+ float: none;
226
+ vertical-align: middle;
227
+ padding-top: 4px;
228
+ padding-bottom: 4px;
229
+ }
230
+ }
231
+
232
+ /* ============ 块 C2:宽内容字段不走紧凑行版式 ============ */
233
+ /* 附件、图片、富文本这类字段的内容是一片区域而不是一行值。
234
+ 块 C/D 那套(标签定宽 80px + 内容 flex:1 右对齐)是给单行输入设计的,
235
+ 套上去会把附件列表挤到右侧贴着边框、文件名压线、缩略图变形。
236
+ 这里让它们恢复成「标签在上、内容整行左对齐」。
237
+ h5-block 由 form-item-wrapper 按字段类型打,见其 isH5BlockField。
238
+ 本方 0,6,0 > 块 C/D 的 0,5,0,且在其后定义。 */
239
+ .xform-h5 .h5-detail-wrap .h5-item .h5-form-box .field-wrapper.h5-block {
240
+ width: 100%;
241
+
242
+ .el-form-item {
243
+ display: block;
244
+
245
+ .el-form-item__label {
246
+ width: auto;
247
+ float: none;
248
+ display: block;
249
+ text-align: left !important;
250
+ }
251
+
252
+ .el-form-item__content {
253
+ flex: none;
254
+ text-align: left;
255
+ margin-left: 0 !important; // el-form 的 label-width 会给 content 留左边距
256
+ }
257
+ }
258
+
259
+ /* 上传组件内部不该继承「输入框去边框 + 右对齐」那几条 */
260
+ .el-input .el-input__inner,
261
+ .el-textarea .el-textarea__inner {
262
+ text-align: left;
263
+ }
264
+ }
265
+
266
+ /* ============ 块 E:必填星号与校验错误位 ============ */
267
+ /* 字段行改 flex 后 Element 的星号与错误提示会错位,必须显式定位
268
+ (bill_setting 的 .el-form-item__label:before{position:absolute} 是同一处理) */
269
+ .xform-h5 .h5-detail-wrap .h5-item .h5-form-box .el-form-item {
270
+ &.is-required:not(.is-no-asterisk) > .el-form-item__label::before {
271
+ position: absolute;
272
+ left: -8px;
273
+ margin: 0;
274
+ }
275
+
276
+ .el-form-item__error {
277
+ position: static;
278
+ text-align: right;
279
+ padding-top: 2px;
280
+ }
281
+ }
282
+
283
+ /* ============ 块 F:半宽落单行 ============ */
284
+ /* 一行末尾落单的半宽字段保持半宽、右侧留白(bill_setting 的 table 版式天然如此)。
285
+ 若产品要求撑满整行,把下面这条注释放开即可。 */
286
+ // 用 // 而非 /* */:sass 的块注释会原样输出到生产 CSS,被注释掉的规则不该进产物
287
+ // .xform-h5 .h5-detail-wrap .h5-item .h5-form-box .field-wrapper.h5-half:nth-child(odd):last-child {
288
+ // width: 100%;
289
+ // }
290
+
291
+ /* ============ 块 G:骨架(flex 列 + 内部滚动区) ============ */
292
+ /* 改动前是「整页滚 + 底栏 position:fixed」,底栏在弹框里会钉到屏幕底部
293
+ (三个弹框各写过 .H5 补丁想推回去,但那三条选择器从未生效,已删)。
294
+ 改成流内布局后,底栏自然贴容器底部,且 iOS 键盘弹起不再顶飞底栏。 */
295
+ .xform-h5 {
296
+ height: 100%;
297
+
298
+ /* container-item-wrapper 那层,高度要能传下去 */
299
+ .container-wrapper {
300
+ height: 100%;
301
+ }
302
+
303
+ .h5-detail-wrap {
304
+ display: flex;
305
+ flex-direction: column;
306
+ height: 100%;
307
+ min-height: 0; // 允许在 flex 父级下收缩
308
+ /* 压掉 style.scss:13765 的 padding-bottom:68px(那是给 fixed 底栏让位用的) */
309
+ padding-bottom: 0 !important;
310
+ }
311
+
312
+ .h5-header {
313
+ flex: none;
314
+ height: $xformH5HeaderHeight;
315
+ line-height: $xformH5HeaderHeight;
316
+ }
317
+
318
+ .h5-detail-body {
319
+ flex: 1;
320
+ /* ★ 必写:flex 子项默认 min-height:auto 会被内容撑开,
321
+ 结果是父级溢出而不是子级滚动 */
322
+ min-height: 0;
323
+ overflow-y: auto;
324
+ -webkit-overflow-scrolling: touch;
325
+ /* 滚到底时最后一张卡片要留出呼吸位,否则它的下边缘正好压在底部动作栏上。
326
+ 卡片是 margin:12px 8px 0(只有上间距),末尾这一格只能由滚动区补。
327
+ 取 12px 与卡片间距同口径。 */
328
+ padding-bottom: 12px;
329
+
330
+ /* ★ 字段卡片那组的高度必须由内容决定。
331
+ detail-h5-item.vue 的 scoped 样式里有一条从设计器画布抄来的
332
+ `.grid-container .form-widget-list { height: 100% }`,而该组件的根节点
333
+ 正是 .h5-detail-wrap.grid-container —— 于是这个 transition-group 被钉成
334
+ 滚动区的高度(100%),跟内容实际高度脱钩:内容更高时,排在它后面的
335
+ 流程面板会按 100% 那个位置起排,直接压到卡片上(实测重叠 65px,表现
336
+ 就是「流程信息和附件信息之间没有间隔」);内容更矮时则反过来空一大段。
337
+ 对手是 scoped 的 .grid-container .form-widget-list[data-v-x] (0,3,0),
338
+ 本方 (0,4,0)。 */
339
+ > .form-widget-list {
340
+ height: auto;
341
+ }
342
+ }
343
+
344
+ .h5-fixed-bottom-btns {
345
+ /* 压掉 style.scss:10246 附近的 position:fixed 与 height:56px!important。
346
+ 单行固定高:超出三个的按钮进图标下拉,不换行。 */
347
+ position: static !important;
348
+ flex: none;
349
+ height: $xformH5FooterHeight !important;
350
+ }
351
+ }
352
+
353
+ /* ★ 页面态必须定死一屏,不能用 min-height。
354
+ 实测宿主链没有确定高度(#containt 只有背景/圆角,没有 height),
355
+ .designer-view{height:100%} → .xform-h5{height:100%} 一路塌陷成 auto;
356
+ 此时 min-height:100vh 会被内容撑高 → 整页滚动 → 标题栏和底部动作栏跟着滚走。
357
+ 改成 height:100vh + overflow:hidden:容器恰好一屏、外层无可滚余量,
358
+ 内容只在 .h5-detail-body 里滚,标题栏与底栏才真正固定。 */
359
+ .xform-h5 .h5-detail-wrap {
360
+ height: 100vh;
361
+ overflow: hidden;
362
+ }
363
+ /* 弹框/抽屉态:高度由弹框自己的 .cont 给,跟随容器而不是视口 */
364
+ .el-dialog .xform-h5 .h5-detail-wrap,
365
+ .el-drawer .xform-h5 .h5-detail-wrap {
366
+ height: 100%;
367
+ }
368
+
369
+ /* ============ 块 H:底部动作栏(胶囊按钮,单行、最多三个 + 图标下拉) ============ */
370
+ .xform-h5 .h5-detail-wrap .h5-fixed-bottom-btns {
371
+ display: flex;
372
+ align-items: center;
373
+ background: #fff;
374
+ padding: 8px;
375
+ box-shadow: 0 0 10px rgba(0, 0, 0, 0.06);
376
+
377
+ .form-widget-list,
378
+ .el-form {
379
+ display: flex;
380
+ flex: 1;
381
+ min-width: 0; // 让内部按钮能被压缩,否则长文案会把下拉挤出去
382
+ }
383
+
384
+ /* flex:1 等分 —— 1 个铺满、2 个各一半、3 个各三分之一,全自动 */
385
+ .field-wrapper {
386
+ flex: 1;
387
+ min-width: 0;
388
+ margin: 0 5px;
389
+ }
390
+
391
+ .button-sty,
392
+ .el-button {
393
+ width: 100%;
394
+ height: 40px;
395
+ border-radius: 30px;
396
+ padding: 0;
397
+ /* 三个并排时按钮偏窄:字号收一档、超长省略,避免文字撑破 */
398
+ font-size: 13px;
399
+ overflow: hidden;
400
+ text-overflow: ellipsis;
401
+ white-space: nowrap;
402
+
403
+ i {
404
+ margin-right: 3px;
405
+ }
406
+ }
407
+
408
+ /* 「更多」:一个裸的箭头图标,不做成按钮 —— 没有底色、边框、圆角,
409
+ 只按内容宽占位,不参与等分。 */
410
+ > .h5-more-dropdown {
411
+ flex: none;
412
+ margin-left: 4px;
413
+
414
+ .h5-more-icon {
415
+ display: block;
416
+ padding: 0 8px;
417
+ font-size: 20px;
418
+ line-height: 40px;
419
+ color: $baseColor;
420
+ cursor: pointer;
421
+ }
422
+ }
423
+ }
424
+
425
+ /* ============ 「更多」下拉菜单 ============ */
426
+ /* ★ 不能嵌进 .xform-h5:el-dropdown-menu 默认 append-to-body,
427
+ 菜单 DOM 会被挪到 <body> 下、脱离根类作用域,嵌套写法一律失效。
428
+ bill_setting 的 .mobileApp_dropdown.el-dropdown-menu 也是顶层选择器,同一模式。 */
429
+ .xform-h5-dropdown.el-dropdown-menu {
430
+ .el-dropdown-menu__item {
431
+ margin: 8px 0;
432
+ line-height: normal;
433
+ }
434
+
435
+ .button-sty,
436
+ .el-button {
437
+ width: 100%;
438
+ height: 36px;
439
+ border-radius: 30px;
440
+ padding: 0 16px;
441
+ font-size: 13px;
442
+
443
+ i {
444
+ margin-right: 4px;
445
+ }
446
+ }
447
+ }
448
+
449
+ /* ============ 明细详情弹框:铺满视口 ============ */
450
+ /* 这个弹框是 :modal="false"(无遮罩),高度又只由内容撑开,
451
+ 于是底部动作栏(通过/驳回/中断)会从弹框下方露出来,看着像两层界面。
452
+ 让它铺满一屏盖住底栏。作用域限定在 .xform-h5 内,不影响 bill_setting
453
+ 那边同样用 .h5view-dialog 的弹框(弹框未 append-to-body,DOM 就在本作用域里)。 */
454
+ .xform-h5 .el-dialog__wrapper .el-dialog.h5view-dialog {
455
+ margin: 0 !important;
456
+ height: 100vh;
457
+ display: flex;
458
+ flex-direction: column;
459
+ border-radius: 0;
460
+
461
+ > .el-dialog__body {
462
+ flex: 1;
463
+ min-height: 0;
464
+ overflow-y: auto;
465
+ -webkit-overflow-scrolling: touch;
466
+ }
467
+
468
+ /* 内容区的 height 是模板里的内联样式,只能用 !important 压掉,
469
+ 改由上面的 flex 决定高度 */
470
+ .cont {
471
+ height: auto !important;
472
+ }
473
+
474
+ /* 底部「关闭」:与底部动作栏同款胶囊,铺满一行 */
475
+ > .el-dialog__footer {
476
+ flex: none;
477
+ padding: 8px 13px;
478
+ box-shadow: 0 0 10px rgba(0, 0, 0, 0.06);
479
+
480
+ .button-sty,
481
+ .el-button {
482
+ width: 100%;
483
+ height: 40px;
484
+ border-radius: 30px;
485
+ padding: 0;
486
+ font-size: 13px;
487
+
488
+ i {
489
+ margin-right: 3px;
490
+ }
491
+ }
492
+ }
493
+ }
494
+
495
+ /* ============ 明细行的「查看」角标 ============ */
496
+ /* 对齐 bill_setting 的 .pro-item .t::after:主色淡底圆钮 + 右向箭头,
497
+ 提示这一行可以点进详情。与 itemStyle 无关,明细行一律有。
498
+ 对手 .h5-list-box .item (0,2,0);本方 (0,3,0)。 */
499
+ .xform-h5 .h5-list-box .item {
500
+ .h5-item-arrow {
501
+ position: absolute;
502
+ right: 12px;
503
+ top: 10px;
504
+ z-index: 1;
505
+ width: 20px;
506
+ height: 20px;
507
+ line-height: 20px;
508
+ text-align: center;
509
+ font-size: 12px;
510
+ border-radius: 50%;
511
+ background: transparentize($baseColor, 0.88);
512
+ color: $baseColor;
513
+
514
+ &::before {
515
+ content: "\e6e0";
516
+ font-family: element-icons !important;
517
+ }
518
+ }
519
+
520
+ /* 给角标让位:明细行没有 .t1 标题行,字段区直接顶到右边会被角标压住 */
521
+ .t2 {
522
+ padding-right: 28px;
523
+ }
524
+ }
525
+
526
+ /* ============ 块 I:明细行卡片皮肤(list-h5 的 itemStyle=card) ============ */
527
+ /* 现状 .h5-list-box .item(style.scss:14029)已经是白底+radius8+1px边框+左侧竖条的卡片,
528
+ 与 bill_setting 的 .pro-item 只差 4 点:圆角、竖条→圆点、右上角箭头角标、小字段字号。
529
+ 对手 .h5-list-box .item (0,2,0);本方 .xform-h5 .h5-list-box .item.h5-item-card (0,4,0)。 */
530
+ .xform-h5 .h5-list-box .item.h5-item-card {
531
+ border-radius: $xformH5CardRadius;
532
+
533
+ .t1 {
534
+ padding-right: 40px; // 给右上角箭头角标让位
535
+
536
+ /* 左侧 4px 竖条 → 5px 圆点(对手 .t1:before 是 0,3,1,本方 0,5,1) */
537
+ &::before {
538
+ position: relative !important;
539
+ display: inline-block;
540
+ left: auto !important;
541
+ top: auto !important;
542
+ width: 5px !important;
543
+ height: 5px !important;
544
+ margin-right: 4px;
545
+ border-radius: 50% !important;
546
+ vertical-align: middle;
547
+ }
548
+ }
549
+
550
+ .t2 > dl {
551
+ min-width: 49%;
552
+ font-size: 11px;
553
+ }
554
+
555
+ /* 行级对比标记(getCompareRowClass 的返回值),角标对齐 bill_setting 的
556
+ .pro-item .t i.el-icon-warning */
557
+ &.xform-compare-row-changed::after {
558
+ content: "\e7a3";
559
+ font-family: element-icons !important;
560
+ position: absolute;
561
+ right: 38px;
562
+ top: 10px;
563
+ font-size: 14px;
564
+ color: #ff731c;
565
+ }
566
+
567
+ &.xform-compare-row-new {
568
+ border-color: $baseColor;
569
+ }
570
+ }
571
+
572
+ /* ============ 块 J:附件(VabUpload 列表的 H5 行式版式) ============ */
573
+ /* 这一块的第一版是照抄 bill_setting/h5.scss 的 74px 方格口径,实测把附件压没了、
574
+ 已撤回;那套 DOM 里 .el-upload-list__item-thumbnail 是 item 的直接子元素,而
575
+ VabUpload 不是。这一版照 VabUpload/view.vue 的真实结构重写:
576
+
577
+ .upload-list 一个附件一个(模板内联 inline-block + float:left)
578
+ .upload-box > ul.el-upload-list--picture
579
+ li.el-upload-list__item
580
+ > div ← 唯一子元素,行的 flex 容器只能挂在它上面
581
+ .el-upload-list__item-thumbnail > p > .el-image
582
+ .el-upload-list__item-name > p 文件名 / p 大小 / p 创建时间
583
+ .el-upload-input showSortInput / showNameInput 时才有
584
+ .el-upload-list__item-status-label
585
+ .el-icon-close 删除(编辑态才渲染)
586
+ .el-icon-tagEdit 下载 + 详情
587
+
588
+ 改成「一行一个附件」:左 56px 缩略图,右文件名两行截断 + 次要信息,行右端是常驻的
589
+ 操作图标。PC 那套是 102px 卡片流式排,一个附件就吃掉 H5 小半屏,还大片留白。
590
+
591
+ ★ 操作入口必须常驻:PC 上 .show-video 靠 :hover 出现、.el-icon-tagEdit 被
592
+ style.scss 的 H5 段直接 display:none —— 触摸屏没有 hover,等于下载/详情在 H5
593
+ 上根本点不到。(view.vue 里这两个还受 attachment.h5 !== 1 控制,那是历史遗留
594
+ 开关,不是「H5 不给操作」的意思,故三个入口全放开。)
595
+ 预览不用放开 .show-video:它只是缩略图上的 hover 遮罩,el-image 自己就绑了
596
+ @click="openPreview",H5 上直接点缩略图即可,放出来反而挡住图。
597
+
598
+ ★ 特异度:真正难缠的对手是 style.scss:15604 起的 `#uploadImage.widgetSize-N`
599
+ 一段(尺寸全在那里:li 的 width/height/padding-left、缩略图的 width/height 与
600
+ margin-left:-98px 负边距、p 与 img 的定死宽高),**带 id,(1,3,0)~(1,6,0),
601
+ 再多的 class 也压不过**。所以本块整体嵌在 #uploadImage 下取到 (1,5,0) 起步,
602
+ 每一条都严格高于对应对手。另外两个较弱的对手是 style.scss:13801 起的
603
+ .h5-detail-wrap .h5-item .h5-form-box …(0,4,0~0,5,0)和 body .el-upload-list
604
+ … .show-video(0,4,1),顺带一并压掉。
605
+ 注:#uploadImage 是 VabUpload 每个实例都写死的 id(DOM 里会重复),这里只把它
606
+ 当选择器用来抬特异度,不依赖它唯一。 */
607
+ .xform-h5 .h5-detail-wrap .h5-item .h5-form-box #uploadImage {
608
+ /* 行容器。模板里写死了内联 display:inline-block;float:left,只能用 !important 压 */
609
+ .upload-list {
610
+ display: block !important;
611
+ float: none !important;
612
+ width: 100%;
613
+ margin: 0 0 8px;
614
+ }
615
+
616
+ .upload-box {
617
+ border-top: none;
618
+ margin-top: 0;
619
+ }
620
+
621
+ .el-upload-list {
622
+ margin: 0;
623
+ }
624
+
625
+ .el-upload-list__item {
626
+ width: 100%;
627
+ height: auto;
628
+ margin: 0;
629
+ padding: 8px;
630
+ overflow: visible;
631
+ background: #fff;
632
+ border: solid 1px #f0f1f1;
633
+ border-radius: 10px;
634
+ transition: none; // element 的 item 有 transform 过渡,行式下没意义还会闪
635
+
636
+ /* 行本体。li 下只有这一个 div,所有子块都在它里面 */
637
+ > div {
638
+ display: flex;
639
+ flex-wrap: wrap; // showSortInput/showNameInput 时那两个输入框整行另起
640
+ align-items: center;
641
+ width: 100%;
642
+ }
643
+
644
+ .el-upload-list__item-thumbnail {
645
+ flex: none;
646
+ width: 56px;
647
+ height: 56px;
648
+ margin: 0 10px 0 0;
649
+ padding: 0;
650
+ border-radius: 8px;
651
+ overflow: hidden;
652
+ background: #f7f8fa;
653
+
654
+ /* 这三层的宽高在 #uploadImage.widgetSize-N 里都被写死成 88/98px,逐层压掉 */
655
+ p {
656
+ width: 100%;
657
+ height: 100%;
658
+ padding: 0;
659
+ margin: 0;
660
+ }
661
+
662
+ .el-image {
663
+ width: 100%;
664
+ height: 100%;
665
+ }
666
+
667
+ img {
668
+ max-width: 100%;
669
+ max-height: 100%;
670
+ }
671
+
672
+ /* hover 遮罩:H5 用不上,直接点缩略图就是预览 */
673
+ .show-video {
674
+ display: none;
675
+ }
676
+ }
677
+
678
+ .el-upload-list__item-name {
679
+ flex: 1;
680
+ min-width: 0; // 不写这行,长文件名会把行撑破而不是省略
681
+ width: auto;
682
+ height: auto;
683
+ margin: 0;
684
+ padding: 0;
685
+ line-height: 1.4;
686
+
687
+ /* 文件名:两行截断 */
688
+ > .el-tooltip > p,
689
+ > p:first-child {
690
+ margin: 0;
691
+ font-size: 13px;
692
+ color: #212121;
693
+ display: -webkit-box;
694
+ -webkit-line-clamp: 2;
695
+ -webkit-box-orient: vertical;
696
+ overflow: hidden;
697
+ word-break: break-all;
698
+ }
699
+
700
+ /* 大小 / 创建时间等次要信息 */
701
+ > p + p,
702
+ > .el-tooltip + p {
703
+ margin: 2px 0 0;
704
+ font-size: 11px;
705
+ color: rgba(128, 128, 128, 0.8);
706
+ }
707
+ }
708
+
709
+ /* 序号 / 名称输入:整行另起,不跟缩略图挤一行 */
710
+ .el-upload-input {
711
+ width: 100%;
712
+ margin: 8px 0 0;
713
+ }
714
+
715
+ .el-upload-list__item-status-label {
716
+ display: none;
717
+ }
718
+
719
+ /* 行右端常驻操作:只留「下载」。点击区按 44px 给足 */
720
+ .el-icon-tagEdit {
721
+ display: flex;
722
+ flex: none;
723
+ position: static;
724
+ align-items: center;
725
+ margin-left: 4px;
726
+ color: $baseColor;
727
+
728
+ i {
729
+ margin: 0;
730
+ padding: 0 8px;
731
+ font-size: 20px;
732
+ line-height: 44px;
733
+ }
734
+
735
+ /* 「文件详情」(属性弹框)H5 上不出:它是 PC 的管理向功能,
736
+ 弹的是一整张属性表,小屏上既挤又用不上。 */
737
+ .icon-shuxing {
738
+ display: none;
739
+ }
740
+ }
741
+
742
+ /* 删除(编辑态才渲染):并进右端图标组,不再做成飘在角上的红点 */
743
+ .el-icon-close {
744
+ display: flex;
745
+ flex: none;
746
+ position: static;
747
+ align-items: center;
748
+ width: auto;
749
+ height: auto;
750
+ top: auto;
751
+ right: auto;
752
+ background: none;
753
+ border-radius: 0;
754
+ color: $dred;
755
+ opacity: 1;
756
+
757
+ i {
758
+ padding: 0 8px;
759
+ font-size: 18px;
760
+ line-height: 44px;
761
+ }
762
+ }
763
+ }
764
+
765
+ /* 上传入口(编辑态):PC 是 100×100 的虚线方块,跟行式列表放一起很突兀。
766
+ 改成整行一条虚线「+」条,与上面每条附件同宽同圆角。
767
+ .el-upload 的 float/inline-block 是模板内联样式,只能 !important 压。 */
768
+ .el-upload.el-upload--picture {
769
+ display: block !important;
770
+ float: none !important;
771
+ width: 100%;
772
+
773
+ .avatar-uploader {
774
+ width: 100%;
775
+ height: 44px;
776
+ line-height: 44px;
777
+ margin: 0;
778
+ padding: 0;
779
+ background: none;
780
+ border: dashed 1px #dfdfdf;
781
+ border-radius: 10px;
782
+ color: $baseColor;
783
+
784
+ .avatar-uploader-icon {
785
+ font-size: 18px;
786
+ line-height: 44px;
787
+ }
788
+ }
789
+ }
790
+ }
791
+
792
+ /* ============ 块 K:H5 按钮基线 —— 不出图标 ============ */
793
+ /* H5 的按钮只出文字,不带 el-icon-*。底部动作栏本来就是这样(detail-h5-item.vue
794
+ 构造按钮时明确不取注册表的 iconClass/elIcon),但弹框里的按钮是直接沿用 PC 模板
795
+ 的,`icon="el-icon-close"` / `icon="el-icon-check"` 都跟着进来了,同一屏里两种样子。
796
+
797
+ 用 CSS 抹而不是逐个删模板上的 icon 属性:这些模板(选用户 views/mobile/user/user、
798
+ 加签 addTaskUserdialog、减签、催办、修改候选人…)同时被手写移动页用着,
799
+ 改模板会波及包外;收在 .xform-h5 下则只影响 xform 的 H5 版式。
800
+
801
+ 只作用于 el-button 的直接子 i(element 把 icon 渲染成按钮的第一个子元素)。
802
+ 底栏「更多」下拉的触发器是裸 <i class="h5-more-icon">、不在 el-button 里,不受影响。 */
803
+ .xform-h5 {
804
+ .pop-box .el-button > i,
805
+ .pop-screen-box .el-button > i,
806
+ .h5-detail-wrap .h5-fixed-bottom-btns .el-button > i,
807
+ .el-dialog.h5view-dialog > .el-dialog__footer .el-button > i {
808
+ display: none;
809
+ }
810
+ }
811
+
812
+ /* ============ 块 L:移动版流程(wf)面板 ============ */
813
+ /* 来源:resources/css/h5.scss —— 那份不随包发布、xform 引不到,故把
814
+ components/mobile/wf/content.vue 实际用到的类搬进包内。
815
+ 原规则嵌在 .h5-box .form-box .c .c-item .cont 下(xform 没有 .h5-box 祖先,
816
+ 本来就命中不了),这里重新挂到 .xform-h5 下,不存在与原规则的覆盖竞争。
817
+ 卡片外壳 .c-item / .tit 已并进块 B,此处只补 wf 专属部分。 */
818
+ .xform-h5 {
819
+ /* h5CardPane 的折叠箭头 */
820
+ .c-item > .tit > .arrow {
821
+ position: absolute;
822
+ right: 12px;
823
+ top: 0;
824
+ line-height: 45px;
825
+ font-size: 16px;
826
+ }
827
+
828
+ /* ---- 流程信息区 ---- */
829
+ .flowPath-box {
830
+ overflow: hidden;
831
+ padding: 0 12px;
832
+
833
+ > .t,
834
+ .m2 .t {
835
+ color: $baseColor;
836
+ margin-top: 16px;
837
+
838
+ &:before {
839
+ content: "";
840
+ width: 5px;
841
+ height: 5px;
842
+ border-radius: 50%;
843
+ background: $baseColor;
844
+ margin-right: 3px;
845
+ vertical-align: middle;
846
+ display: inline-block;
847
+ }
848
+
849
+ span {
850
+ vertical-align: middle;
851
+ }
852
+ }
853
+
854
+ .c {
855
+ padding: 0 5px;
856
+ margin-top: 5px;
857
+ height: auto;
858
+ margin-bottom: 12px;
859
+
860
+ .name {
861
+ font-weight: 600;
862
+
863
+ .el-tag {
864
+ line-height: 19px;
865
+ font-weight: 400;
866
+ display: inline-block;
867
+ margin-top: 4px;
868
+ }
869
+ }
870
+
871
+ .btn {
872
+ color: $baseColor;
873
+ background: transparentize($baseColor, 0.91);
874
+ padding: 7px 10px;
875
+ font-size: 13px;
876
+
877
+ i {
878
+ font-size: 12px;
879
+ margin-right: 3px;
880
+ }
881
+ }
882
+ }
883
+
884
+ .m2 {
885
+ min-width: 50%;
886
+ float: left;
887
+ margin-bottom: 12px;
888
+ }
889
+ }
890
+
891
+ /* ---- 审批动作按钮区 ---- */
892
+ .flowPath-btns {
893
+ padding: 12px 0;
894
+ margin: 0 0 0 -10px;
895
+
896
+ .btn {
897
+ height: 34px;
898
+ border-radius: 20px;
899
+ padding: 0 0 0 12px;
900
+ font-size: 13px;
901
+ width: calc(33% - 24px);
902
+ margin-left: 24px;
903
+ margin-bottom: 10px;
904
+ background: none;
905
+ position: relative;
906
+
907
+ i {
908
+ width: 22px;
909
+ height: 23px;
910
+ background: #e9e9e9;
911
+ margin: 0 17px 0 -7px;
912
+ vertical-align: middle;
913
+ border-radius: 15px;
914
+ display: inline-block;
915
+ line-height: 22px;
916
+ text-align: center;
917
+ color: #fff;
918
+ position: absolute;
919
+ left: 0;
920
+ top: 4px;
921
+ font-size: 14px;
922
+
923
+ &.icon-tongguo {
924
+ font-size: 16px;
925
+ line-height: 24px;
926
+ }
927
+ }
928
+
929
+ &.el-button--success {
930
+ color: $green;
931
+ > i {
932
+ background: $green;
933
+ }
934
+ }
935
+
936
+ &.el-button--primary > i {
937
+ background: $baseColor;
938
+ }
939
+
940
+ &.el-button--warning {
941
+ color: $yellow;
942
+ > i {
943
+ background: $yellow;
944
+ }
945
+ }
946
+
947
+ &.el-button--danger {
948
+ color: $dred;
949
+ > i {
950
+ background: $dred;
951
+ }
952
+ }
953
+ }
954
+ }
955
+
956
+ /* ---- 全屏弹层(.pop-box)---- */
957
+ /* 用这个根类的一共 7 个:流程图预览、任务情况预览(这两个是 mobile/wf/content.vue
958
+ 模板里内联写的,见该文件 showPreviewDialog / showRenwuDialog 两段)、
959
+ 选用户 views/mobile/user/user/dialog.vue、加签 addTaskUserdialog、减签
960
+ deleteTaskUserDialog、催办 urgingDialog、修改候选人 setCandidateDialog、
961
+ 修改单据 wfModifyDialog。它们共用同一批类名,所以一次搬齐。
962
+
963
+ 原规则整段嵌在 resources/css/h5.scss 的 `.h5-box` 下,而 xform H5 的根类是
964
+ .xform-h5、全项目没有任何 .vue 输出过 h5-box —— 一条都命中不了,表现是列表
965
+ 退化成裸文字、搜索行和已选区完全没有版式。(对比 .pop-tipsBox 是顶层选择器,
966
+ 所以通过/驳回/转办那几个小确认框看着正常,一点「选用户」就裸。)
967
+
968
+ 骨架高度不抄原文的 calc(100vh - 102px / 138px / 151px) 那套(值随有没有搜索行
969
+ 而变,脆),一律 flex + min-height:0,与块 A、块 G 同口径。content.vue 那两处
970
+ .flex 上的内联 height:calc(100vh - 38px) 不用管:flex-basis:0% 会接管主轴尺寸。 */
971
+ .pop-box {
972
+ position: fixed;
973
+ top: 0;
974
+ right: 0;
975
+ bottom: 0;
976
+ left: 0;
977
+ background: #f6f6f6;
978
+ z-index: 99;
979
+
980
+ /* 骨架:标题栏 / 搜索行 / 底部按钮条 flex:none,中间那段独占剩余高度并内部滚动 */
981
+ > div {
982
+ display: flex;
983
+ flex-direction: column;
984
+ height: 100%;
985
+ }
986
+
987
+ .header-box {
988
+ flex: none;
989
+ position: relative;
990
+ background-color: #fff;
991
+ text-align: center;
992
+ height: $xformH5HeaderHeight;
993
+ line-height: $xformH5HeaderHeight;
994
+ font-size: 16px;
995
+ color: #212121;
996
+ border-bottom: solid 1px #f1f6fc;
997
+
998
+ .back {
999
+ position: absolute;
1000
+ right: 14px;
1001
+ top: 50%;
1002
+ margin-top: -10px;
1003
+ line-height: 20px;
1004
+ font-size: 20px;
1005
+ }
1006
+
1007
+ /* 「修改单据 — 节点:xx」这类副标题 */
1008
+ > span {
1009
+ margin: 0 8px;
1010
+ }
1011
+ }
1012
+
1013
+ /* 搜索行(选用户 / 加签):输入框 + 右侧「高级筛选」 */
1014
+ .search-H5box {
1015
+ flex: none;
1016
+ position: relative;
1017
+ display: flex;
1018
+ padding: 8px 16px 0;
1019
+
1020
+ .txt {
1021
+ flex: 1;
1022
+ position: relative;
1023
+ height: 38px;
1024
+ background: #fff;
1025
+ border: solid 1px #e4e4e4;
1026
+ border-radius: 38px 0 0 38px;
1027
+
1028
+ .el-input {
1029
+ width: 100% !important;
1030
+ }
1031
+
1032
+ .el-input__inner {
1033
+ height: 38px !important;
1034
+ width: 100%;
1035
+ border: none;
1036
+ background: none;
1037
+ line-height: 38px;
1038
+ padding-left: 39px;
1039
+ font-size: 13px;
1040
+ }
1041
+
1042
+ /* 放大镜挪到左侧(element 默认在右) */
1043
+ .el-input__suffix {
1044
+ position: absolute;
1045
+ left: 12px;
1046
+ right: inherit;
1047
+ top: 7px;
1048
+ width: 20px;
1049
+ transform: inherit !important;
1050
+ }
1051
+
1052
+ .el-input-group__append {
1053
+ border: none;
1054
+ background: none;
1055
+
1056
+ .el-button {
1057
+ border: none;
1058
+ background: $baseColor;
1059
+ color: #fff;
1060
+ width: 53px;
1061
+ height: 30px;
1062
+ padding: 0;
1063
+ position: absolute;
1064
+ right: 4px;
1065
+ top: 4px;
1066
+ /* element 给 .el-input-group__append .el-button 定了 margin:-10px -20px,
1067
+ 绝对定位后这对负边距会把按钮整体往右上顶出去(实测右溢 16px、上溢
1068
+ 5px,正好压在「高级筛选」上)。原文是用 right:26px/top:14px 反向补
1069
+ 偿的,这里直接清零,right/top 才是所见即所得。 */
1070
+ margin: 0;
1071
+ border-radius: 30px;
1072
+ outline: none;
1073
+ font-size: 13px;
1074
+ }
1075
+ }
1076
+ }
1077
+
1078
+ .icon-screen {
1079
+ flex: none;
1080
+ height: 38px;
1081
+ line-height: 38px;
1082
+ padding: 0 10px;
1083
+ font-size: 13px;
1084
+ color: $baseColor;
1085
+ background: transparentize($baseColor, 0.88);
1086
+ border: solid 1px #e4e4e4;
1087
+ border-left: none;
1088
+ border-radius: 0 10px 10px 0;
1089
+
1090
+ i {
1091
+ margin-right: 5px;
1092
+ font-size: 14px;
1093
+ }
1094
+ }
1095
+ }
1096
+
1097
+ /* 修改单据:表单直接挂在骨架下,不套 .flex */
1098
+ > div > .form-box {
1099
+ flex: 1;
1100
+ min-height: 0;
1101
+ overflow-y: auto;
1102
+ }
1103
+
1104
+ .flex {
1105
+ display: flex;
1106
+ flex-direction: column;
1107
+ flex: 1;
1108
+ min-height: 0;
1109
+
1110
+ /* 可滚动的候选列表 */
1111
+ .checkbox-all_list {
1112
+ flex: 1;
1113
+ min-height: 0;
1114
+ overflow: auto;
1115
+ padding: 0 12px;
1116
+
1117
+ .order-item {
1118
+ background: #fff;
1119
+
1120
+ .is-checked {
1121
+ position: absolute;
1122
+ right: 0;
1123
+ top: 0;
1124
+ width: 62px;
1125
+ height: 22px;
1126
+ line-height: 20px;
1127
+ text-align: center;
1128
+ font-size: 13px;
1129
+ color: #fff;
1130
+ background: #e2e2e2;
1131
+ border: solid 1px #dcdcdc;
1132
+ border-radius: 0 8px 0 6px;
1133
+
1134
+ i {
1135
+ margin-right: 3px;
1136
+ font-size: 13px;
1137
+ }
1138
+ }
1139
+
1140
+ &.on {
1141
+ border: solid 1px $baseColor;
1142
+
1143
+ .is-checked {
1144
+ border-color: $baseColor;
1145
+ background: $baseColor;
1146
+ }
1147
+ }
1148
+ }
1149
+ }
1150
+
1151
+ /* 已选区(底部固定,不滚) */
1152
+ .checkbox-all {
1153
+ flex: none;
1154
+ position: relative;
1155
+ min-height: 80px;
1156
+ padding: 0 12px 8px;
1157
+ background: #fff;
1158
+ box-shadow: 0 -3px 4px rgba(0, 0, 0, 0.06);
1159
+
1160
+ .ca-t {
1161
+ margin: 8px 0;
1162
+ font-size: 14px;
1163
+ font-weight: 600;
1164
+ }
1165
+
1166
+ .ca-c span {
1167
+ display: inline-block;
1168
+ position: relative;
1169
+ height: 24px;
1170
+ line-height: 24px;
1171
+ padding: 0 28px 0 2px;
1172
+ margin: 4px 10px 4px 0;
1173
+ font-size: 13px;
1174
+ color: $baseColor;
1175
+ border: solid 1px $baseColor;
1176
+ border-radius: 4px;
1177
+
1178
+ i {
1179
+ position: absolute;
1180
+ top: 0;
1181
+ right: 0;
1182
+ width: 24px;
1183
+ height: 24px;
1184
+ line-height: 24px;
1185
+ text-align: center;
1186
+ background: transparentize($baseColor, 0.91);
1187
+ }
1188
+ }
1189
+ }
1190
+
1191
+ .form-box {
1192
+ display: flex;
1193
+ flex-direction: column;
1194
+ flex: 1;
1195
+ overflow: hidden;
1196
+
1197
+ .tit {
1198
+ margin: 8px 12px;
1199
+ background: rgba(51, 106, 153, 0.1);
1200
+ border-radius: 11px;
1201
+ padding: 10px 12px;
1202
+ font-size: 13px;
1203
+ color: $baseColor;
1204
+
1205
+ &:before {
1206
+ content: "";
1207
+ width: 5px;
1208
+ height: 5px;
1209
+ background: $baseColor;
1210
+ border-radius: 50%;
1211
+ vertical-align: middle;
1212
+ margin-right: 5px;
1213
+ display: inline-block;
1214
+ }
1215
+
1216
+ > span {
1217
+ vertical-align: middle;
1218
+ }
1219
+ }
1220
+ }
1221
+ }
1222
+
1223
+ /* 按钮口径与块 H 的底部动作栏、块 G 的明细详情弹框页脚保持一致(40px 高胶囊)。
1224
+ 原文搬过来时是 border-radius:14px —— 那是手写移动页 resources/css/h5.scss 的
1225
+ 口径,跟包内基线不是一套,同一屏里会出现两种按钮,故改齐。
1226
+ 左右 margin 保留:选用户/加签这些是两个按钮并排,需要中间那道缝。 */
1227
+ .fixed-bottom-btns {
1228
+ flex: none;
1229
+ background: #f6f6f6;
1230
+ display: flex;
1231
+ padding: 4px 8px;
1232
+
1233
+ .btn {
1234
+ flex: 1;
1235
+ margin: 4px 6px;
1236
+ height: 40px;
1237
+ border-radius: 30px;
1238
+ padding: 0;
1239
+ font-size: 13px;
1240
+
1241
+ i {
1242
+ margin-right: 3px;
1243
+ }
1244
+ }
1245
+ }
1246
+
1247
+ /* 列表里的一张候选卡片。原文挂在 .h5-box 下(不在 .pop-box 段内),
1248
+ xform 里只有这批弹层用得到,就收进来。 */
1249
+ .order-item {
1250
+ position: relative;
1251
+ border: solid 1px #f0f1f1;
1252
+ border-radius: 12px;
1253
+ padding: 8px 10px;
1254
+ margin: 8px 0;
1255
+
1256
+ /* 左侧那道竖条 */
1257
+ &:before {
1258
+ content: "";
1259
+ position: absolute;
1260
+ left: 0;
1261
+ top: 6px;
1262
+ width: 3px;
1263
+ height: 50px;
1264
+ background: $baseColor;
1265
+ border-radius: 5px;
1266
+ }
1267
+
1268
+ .t1 {
1269
+ margin-bottom: 6px;
1270
+
1271
+ /* 模板里恒有 <i class="icon">(原文设了一圈头像样式后又 display:none,
1272
+ 等于留着没用)。照原样隐藏,避免哪天有人给裸 .icon 加了全局规则时冒出来。 */
1273
+ .icon {
1274
+ display: none;
1275
+ }
1276
+
1277
+ span {
1278
+ vertical-align: middle;
1279
+ margin: 0 5px 0 0;
1280
+ }
1281
+ }
1282
+
1283
+ .t2 {
1284
+ font-size: 11px;
1285
+ color: rgba(128, 128, 128, 0.8);
1286
+
1287
+ p {
1288
+ min-width: 50%;
1289
+ margin-bottom: 4px;
1290
+ display: inline-block;
1291
+ }
1292
+ }
1293
+
1294
+ /* 修改候选人:卡片内的「设置候选人」按钮 */
1295
+ .btns {
1296
+ text-align: right;
1297
+ margin-top: 4px;
1298
+
1299
+ .btn {
1300
+ height: 28px;
1301
+ padding: 0 10px;
1302
+ font-size: 13px;
1303
+ }
1304
+ }
1305
+ }
1306
+ }
1307
+
1308
+ /* ---- 高级筛选抽屉(h5SearchDialog,从 .pop-box 里再弹一层)---- */
1309
+ .pop-screen-box {
1310
+ position: fixed;
1311
+ top: 0;
1312
+ right: 0;
1313
+ bottom: 0;
1314
+ left: 0;
1315
+ z-index: 99;
1316
+
1317
+ &:before {
1318
+ content: "";
1319
+ position: absolute;
1320
+ left: 0;
1321
+ right: 0;
1322
+ top: 0;
1323
+ bottom: 0;
1324
+ background: rgba(0, 0, 0, 0.3);
1325
+ }
1326
+
1327
+ > div {
1328
+ display: flex;
1329
+ flex-direction: column;
1330
+ position: absolute;
1331
+ top: 0;
1332
+ right: 0;
1333
+ bottom: 0;
1334
+ width: 80%;
1335
+ background: #fff;
1336
+
1337
+ .header-box {
1338
+ flex: none;
1339
+ position: relative;
1340
+ text-align: center;
1341
+ height: $xformH5HeaderHeight;
1342
+ line-height: $xformH5HeaderHeight;
1343
+ font-size: 16px;
1344
+ color: #212121;
1345
+ border-bottom: solid 1px #eee;
1346
+
1347
+ .back {
1348
+ position: absolute;
1349
+ right: 14px;
1350
+ top: 50%;
1351
+ margin-top: -10px;
1352
+ line-height: 20px;
1353
+ font-size: 20px;
1354
+ }
1355
+ }
1356
+
1357
+ .p-cont {
1358
+ flex: 1;
1359
+ min-height: 0;
1360
+ overflow-y: auto;
1361
+ padding: 10px 16px 0;
1362
+
1363
+ .txt {
1364
+ width: 100%;
1365
+ }
1366
+
1367
+ .el-form .el-form-item {
1368
+ margin-bottom: 4px;
1369
+
1370
+ .el-form-item__label {
1371
+ padding: 0;
1372
+ margin: 0;
1373
+ font-size: 13px;
1374
+ }
1375
+
1376
+ .el-input {
1377
+ width: 100% !important;
1378
+ height: 38px;
1379
+ border-radius: 4px;
1380
+ }
1381
+
1382
+ .el-input__inner {
1383
+ font-size: 13px;
1384
+ }
1385
+ }
1386
+ }
1387
+
1388
+ .p-btn {
1389
+ flex: none;
1390
+ display: flex;
1391
+ padding: 8px;
1392
+
1393
+ .btn {
1394
+ flex: 1;
1395
+ margin: 0 8px;
1396
+ height: 42px;
1397
+ border-radius: 12px;
1398
+ }
1399
+ }
1400
+ }
1401
+ }
1402
+
1403
+ /* ---- 任务情况时间轴 ---- */
1404
+ .h5-process-info {
1405
+ font-size: 12px;
1406
+ padding: 12px 16px;
1407
+ background: #fff;
1408
+ margin: 10px 12px;
1409
+ border-radius: 15px;
1410
+
1411
+ .item {
1412
+ display: flex;
1413
+ line-height: 1.4;
1414
+ padding: 6px 0 8px;
1415
+ position: relative;
1416
+
1417
+ &:after {
1418
+ content: "";
1419
+ width: 2px;
1420
+ position: absolute;
1421
+ background: #e9e9e9;
1422
+ top: 22px;
1423
+ bottom: -10px;
1424
+ left: 76px;
1425
+ z-index: 2;
1426
+ }
1427
+
1428
+ &:last-child:after {
1429
+ display: none;
1430
+ }
1431
+
1432
+ .time {
1433
+ color: #666;
1434
+ width: 82px;
1435
+ position: absolute;
1436
+ top: 37px;
1437
+ left: -14px;
1438
+ right: 0;
1439
+ text-align: center;
1440
+ zoom: 0.9;
1441
+ }
1442
+
1443
+ .status {
1444
+ width: 50px;
1445
+ line-height: 16px;
1446
+ padding: 2px 0;
1447
+ height: 100%;
1448
+ text-align: center;
1449
+ border-radius: 22px;
1450
+ vertical-align: middle;
1451
+ background: #fff;
1452
+ border: 1px solid #dcdfe6;
1453
+ color: #606266;
1454
+
1455
+ &.green {
1456
+ border: solid 1px #acedc9;
1457
+ background: #e7faf0;
1458
+ color: #67c23a;
1459
+ }
1460
+ &.red {
1461
+ border: solid 1px #ffcaca;
1462
+ background: #ffeded;
1463
+ color: #f56c6c;
1464
+ }
1465
+ &.gray {
1466
+ color: #d6d6d6;
1467
+ background: #f4f4f5;
1468
+ border-color: #d3d4d6;
1469
+ }
1470
+ &.orgn {
1471
+ color: #e6a23c;
1472
+ background: #fdf6ec;
1473
+ border-color: #f5dab1;
1474
+ }
1475
+ &.blue {
1476
+ background-color: transparentize($baseColor, 0.94);
1477
+ color: $baseColor;
1478
+ border: solid 1px transparentize($baseColor, 0.72);
1479
+ }
1480
+ }
1481
+
1482
+ .circle {
1483
+ background: $baseColor;
1484
+ width: 14px;
1485
+ height: 14px;
1486
+ border-radius: 50%;
1487
+ border: solid 3px #fff;
1488
+ display: inline-block;
1489
+ margin: 3px 20px;
1490
+ z-index: 9;
1491
+ }
1492
+
1493
+ .info {
1494
+ width: calc(100% - 100px);
1495
+
1496
+ p {
1497
+ margin: 2px 0;
1498
+ display: block;
1499
+
1500
+ > span {
1501
+ display: inline-block;
1502
+ min-width: 50%;
1503
+
1504
+ &.name {
1505
+ font-weight: 600;
1506
+ width: 100%;
1507
+ margin-bottom: 3px;
1508
+ }
1509
+ }
1510
+
1511
+ &.t {
1512
+ display: flex;
1513
+
1514
+ .t1 {
1515
+ min-width: 65px;
1516
+ margin-right: 0;
1517
+ flex: none;
1518
+ }
1519
+
1520
+ span {
1521
+ flex: 1;
1522
+ white-space: pre-line;
1523
+ }
1524
+ }
1525
+ }
1526
+ }
1527
+ }
1528
+ }
1529
+
1530
+ /* ---- 确认/表单提示框(通过、驳回、转办等)---- */
1531
+ /* 注意:.icon 沿用 resources/images 下的图标,`~@/` 在消费应用里解析到它自己的
1532
+ src/resources/images —— 该目录同样不在 package.json files 内,属隐式依赖。
1533
+ 消费应用现有的 h5.scss 已引用同一批图,故风险可控;若要彻底解耦可换字体图标。 */
1534
+ .pop-tipsBox {
1535
+ position: relative;
1536
+
1537
+ &:before {
1538
+ content: "";
1539
+ position: fixed;
1540
+ top: 0;
1541
+ right: 0;
1542
+ bottom: 0;
1543
+ left: 0;
1544
+ background: rgba(0, 0, 0, 0.4);
1545
+ z-index: 998;
1546
+ }
1547
+
1548
+ > div {
1549
+ position: fixed;
1550
+ top: 24%;
1551
+ left: 32px;
1552
+ right: 32px;
1553
+ box-shadow: 0 0 14px rgba(0, 0, 0, 0.16);
1554
+ border-radius: 18px;
1555
+ padding: 68px 16px 18px;
1556
+ text-align: center;
1557
+ z-index: 999;
1558
+ background-color: #fff;
1559
+ background-size: 100% auto;
1560
+ border: solid 2px #fff;
1561
+
1562
+ .icon {
1563
+ background: url(~@/resources/images/icon-tips.png) no-repeat center;
1564
+ background-size: cover;
1565
+ position: absolute;
1566
+ top: -19px;
1567
+ left: 50%;
1568
+ margin-left: -34px;
1569
+ width: 68px;
1570
+ height: 68px;
1571
+ border-radius: 50%;
1572
+ border: solid 2px #fff;
1573
+ }
1574
+
1575
+ .cont {
1576
+ padding: 0 0 18px;
1577
+
1578
+ .name {
1579
+ font-weight: 600;
1580
+ font-size: 18px;
1581
+ margin-bottom: 24px;
1582
+ }
1583
+
1584
+ .txt {
1585
+ max-height: 100px;
1586
+ overflow: auto;
1587
+ word-break: break-word;
1588
+ }
1589
+
1590
+ .txt2 {
1591
+ max-height: 200px;
1592
+ overflow: auto;
1593
+ word-break: break-word;
1594
+ }
1595
+
1596
+ .form-box {
1597
+ border: solid 1px #dcdcdc;
1598
+ padding: 0 12px;
1599
+ border-radius: 10px;
1600
+ margin-top: -8px;
1601
+
1602
+ .line {
1603
+ border: solid 1px #e8e8e8;
1604
+ }
1605
+ }
1606
+ }
1607
+
1608
+ .btns {
1609
+ display: flex;
1610
+
1611
+ .btn {
1612
+ flex: 1;
1613
+ height: 40px;
1614
+ border-radius: 12px;
1615
+
1616
+ &.el-button--primary.is-plain {
1617
+ border-color: $baseColor;
1618
+ }
1619
+ }
1620
+ }
1621
+ }
1622
+
1623
+ &.error > div .icon {
1624
+ background-image: url(~@/resources/images/icon-error.png);
1625
+ border-color: #fff;
1626
+ }
1627
+ }
1628
+ }
1629
+
1630
+ /* ============ 页面底色 ============ */
1631
+ .xform-h5 .h5-detail-wrap {
1632
+ background: $xformH5PageBg;
1633
+ }