widget.qw 1.0.23 → 1.0.24

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 (99) hide show
  1. package/.env.development +9 -9
  2. package/.env.production +8 -8
  3. package/README.md +73 -73
  4. package/build/style.css +482 -468
  5. package/build/widget.qw.es.js +2373 -1631
  6. package/build/widget.qw.umd.js +2282 -1540
  7. package/index.html +17 -17
  8. package/package.json +47 -47
  9. package/src/App.vue +26 -26
  10. package/src/api/index.js +141 -141
  11. package/src/components/AuditBar.vue +340 -340
  12. package/src/components/BillCard.vue +155 -155
  13. package/src/components/CascaderPicker.vue +87 -87
  14. package/src/components/CascaderPop.vue +330 -330
  15. package/src/components/CheckGroup.vue +113 -113
  16. package/src/components/DatetimePicker/DatetimePop.vue +342 -342
  17. package/src/components/DatetimePicker/index.vue +112 -112
  18. package/src/components/DayDropdown.vue +56 -56
  19. package/src/components/FilePicker.vue +113 -113
  20. package/src/components/Input.vue +71 -71
  21. package/src/components/MonthDropdown.vue +51 -51
  22. package/src/components/MultiPicker.vue +123 -123
  23. package/src/components/SecretNotify.js +5 -5
  24. package/src/components/Sheet.vue +92 -92
  25. package/src/components/SingleApiPicker.vue +112 -112
  26. package/src/components/SinglePicker.vue +102 -102
  27. package/src/components/SingleUserSelector.vue +425 -425
  28. package/src/components/Switch.vue +64 -64
  29. package/src/components/TreePicker.vue +113 -113
  30. package/src/components/UserPicker.vue +106 -106
  31. package/src/components/UserProfile.vue +131 -128
  32. package/src/components/UsersPicker.vue +118 -118
  33. package/src/components/YearDropdown.vue +59 -59
  34. package/src/components/data_selector.vue +280 -280
  35. package/src/components/image_picker.vue +114 -114
  36. package/src/components/images_picker.vue +139 -139
  37. package/src/components/index.js +157 -157
  38. package/src/components/mult_list_selector.vue +155 -155
  39. package/src/components/subdepartment_selector.vue +481 -481
  40. package/src/components/user_selector.vue +639 -639
  41. package/src/components/widget/DataPop.vue +95 -95
  42. package/src/components/widget/TreePop.vue +88 -88
  43. package/src/components/widget/UserPop.vue +347 -347
  44. package/src/main.js +117 -117
  45. package/src/router/index.ts +168 -168
  46. package/src/util/array_util.js +32 -32
  47. package/src/util/auth_util.js +72 -72
  48. package/src/util/bool_util.js +5 -5
  49. package/src/util/bus.js +1 -1
  50. package/src/util/cache_util.js +18 -18
  51. package/src/util/errer_code.js +6 -6
  52. package/src/util/eval_util.js +19 -19
  53. package/src/util/icon_util.js +36 -36
  54. package/src/util/image_util.js +27 -27
  55. package/src/util/index.js +55 -55
  56. package/src/util/num_util.js +70 -70
  57. package/src/util/obj_util.js +28 -28
  58. package/src/util/request.js +73 -73
  59. package/src/util/request_json.js +71 -71
  60. package/src/util/request_json_mute.js +65 -65
  61. package/src/util/request_upload.js +79 -79
  62. package/src/util/route_util.js +31 -31
  63. package/src/util/str_util.js +143 -143
  64. package/src/util/time_util.js +406 -406
  65. package/src/util/toast_util.js +24 -24
  66. package/src/util/tree_util.js +153 -153
  67. package/src/util/validate.js +182 -182
  68. package/src/util/vue_filter.js +223 -223
  69. package/src/views/auditbar/index.vue +65 -65
  70. package/src/views/billcard/index.vue +45 -45
  71. package/src/views/cascaderpop/index.vue +90 -90
  72. package/src/views/checkgroup/index.vue +35 -35
  73. package/src/views/dataSelector/index.vue +48 -48
  74. package/src/views/datetimepicker/index.vue +34 -34
  75. package/src/views/daydropdown/index.vue +31 -31
  76. package/src/views/filepicker/index.vue +31 -31
  77. package/src/views/imagepicker/index.vue +31 -31
  78. package/src/views/imagespicker/index.vue +31 -31
  79. package/src/views/input/index.vue +34 -34
  80. package/src/views/monthdropdown/index.vue +31 -31
  81. package/src/views/multListSelector/index.vue +61 -61
  82. package/src/views/multipicker/index.vue +36 -36
  83. package/src/views/productSelector/index.vue +35 -35
  84. package/src/views/projectdropdown/index.vue +31 -31
  85. package/src/views/projectpicker/index.vue +41 -41
  86. package/src/views/secretnotify/index.vue +27 -27
  87. package/src/views/sheet/index.vue +45 -45
  88. package/src/views/singlepicker/index.vue +35 -35
  89. package/src/views/subdepartmentSelector/index.vue +40 -40
  90. package/src/views/switch/index.vue +34 -34
  91. package/src/views/treepicker/index.vue +41 -41
  92. package/src/views/userSelector/index.vue +54 -54
  93. package/src/views/userSelectorNew/index.vue +45 -45
  94. package/src/views/userpicker/index.vue +43 -43
  95. package/src/views/userprofile/index.vue +30 -30
  96. package/src/views/userspicker/index.vue +43 -43
  97. package/src/views/yeardropdown/index.vue +32 -32
  98. package/src/vm/index.js +1 -1
  99. package/vite.config.ts +122 -122
@@ -1,341 +1,341 @@
1
- <template>
2
- <div class="widget">
3
- <van-field v-if="canPass || canRefuse" v-model="data.memo" class="memo" label="审批意见" placeholder="请输入审批意见" />
4
-
5
- <van-popover v-if="canRefuse" placement="top-start" v-model:show="data.isShowPop" :actions="formatPrevSteps"
6
- actions-direction="vertical" @select="onSelectRefuse">
7
- <template #reference>
8
- <van-button class="refuse-btn" type="danger" @click="onRefuse">驳回</van-button>
9
- </template>
10
- </van-popover>
11
-
12
- <van-button v-if="canPass" class="pass-btn" type="primary" native-type="submit" @click="onPass">同意</van-button>
13
-
14
- <van-button class="apply-btn" v-if="data.canApply" type="primary" native-type="submit" @click="onApply">申请</van-button>
15
-
16
- <div class="audit-title" v-if="data.process && data.process.id">{{ formatProcessTitle }}</div>
17
-
18
- <van-steps class="task-list" direction="vertical" :active="data.process.startedTaskIndex"
19
- v-if="data.process && data.process.id">
20
- <van-step v-for="(task, i) in data.process.tasks" :key="i">
21
- <div class="task-title">{{ formatTitle(task) }}</div>
22
- <div class="task-user" v-if="task.executors" v-for="(executor, j) in task.executors" :key="j">
23
- {{ formatExecutor(executor, task) }}
24
- </div>
25
- </van-step>
26
- </van-steps>
27
- </div>
28
- </template>
29
-
30
- <script setup>
31
- import { ref, reactive, computed, onMounted, defineProps, defineEmits, watch } from "vue"
32
- import util from '../util'
33
- import lodash from 'lodash'
34
-
35
- const props = defineProps({
36
- processId: Number,
37
- mouldId: Number,
38
- userId: String,
39
- form: Object,
40
- process_detail:Function,
41
- })
42
- const emit = defineEmits(['pass', 'refuse', 'apply', 'auth'])
43
- const data = reactive({
44
- isShowPop: false,
45
- process: {},
46
- memo: '',
47
- stepAuth: {},
48
- canApply: false
49
- })
50
- const formatPrevSteps = computed(() => {
51
- if (!data.process || !data.process.prevSteps || data.process.prevSteps.length < 1) {
52
- return []
53
- }
54
-
55
- return data.process.prevSteps.map((item) => {
56
- return {
57
- stepId: item.id,
58
- text: item.title
59
- }
60
- })
61
- })
62
- const canPass = computed(() => {
63
- return data.process && data.process.id && data.process.canPass
64
- })
65
- const canRefuse = computed(() => {
66
- return data.process && data.process.id && data.process.canRefuse
67
- })
68
-
69
- onMounted(() => {
70
-
71
- })
72
-
73
- const onPass = () => {
74
- // 1秒节流
75
- lodash.throttle(() => {
76
- emit('pass', {
77
- memo: data.memo
78
- })
79
- }, 5000)()
80
- }
81
- const onRefuse = () => {
82
-
83
- }
84
- const onSelectRefuse = (action) => {
85
- emit('refuse',
86
- {
87
- memo: data.memo,
88
- action: action
89
- }
90
- )
91
- }
92
-
93
- const onApply = () => {
94
- // 1秒节流
95
- lodash.throttle(() => {
96
- emit('apply', {
97
- memo: data.memo
98
- })
99
- }, 5000)()
100
- }
101
-
102
- const queryDetail = async () => {
103
- if (!props.processId)
104
- return
105
- const params = {
106
- id: props.processId
107
- }
108
- const res = await util.process_detail(params)
109
- data.process = res.data
110
- }
111
-
112
- const queryStepAuth = async () => {
113
- if(!props.processId && !props.mouldId)
114
- return
115
-
116
- const params = {
117
- processId: props.processId,
118
- mouldId: props.mouldId,
119
- userId: props.userId,
120
- form: props.form
121
- }
122
- const res = await util.process_step_auth(params)
123
- data.stepAuth = res.data
124
- }
125
-
126
- const updateAuth = () => {
127
- let res = {}
128
- for (const key in data.stepAuth) {
129
- const fieldAuth = data.stepAuth[key]
130
- let authValue = getAuth(fieldAuth)
131
- res[key] = authValue
132
- }
133
-
134
- emit('auth', res)
135
- }
136
-
137
- // 根据条件列表获取权限
138
- const getAuth = (fieldAuth) => {
139
- // 默认权限: 只读
140
- let defaultCondition = 'readonly'
141
-
142
- if (!fieldAuth) {
143
- return defaultCondition
144
- }
145
-
146
- const conditions = fieldAuth.conditions
147
- if (!conditions || conditions.length < 1) {
148
- return defaultCondition
149
- }
150
-
151
- for (const i in conditions) {
152
- const condition = conditions[i]
153
- // 有条件的权限,根据条件表达式计算匹配的权限
154
- if (condition.condition) {
155
- const result = util.executeExpress(condition.condition, props.form)
156
- if (result === true) {
157
- return condition.value
158
- }
159
- } else {
160
- // 无条件的权限
161
- defaultCondition = condition.value
162
- }
163
- }
164
-
165
- return defaultCondition
166
- }
167
-
168
- const updateCanApply = async () => {
169
- if (props.processId)
170
- return data.canApply = false
171
-
172
- let res = await util.process_can_apply({
173
- mouldId: props.mouldId,
174
- userId: props.userId,
175
- form: props.form
176
- })
177
-
178
- data.canApply = res.data
179
- }
180
-
181
- const formatTitle = (task) => {
182
- let title = task.title
183
- if (task.category == 'start') {
184
- if (task.state == 'pass') {
185
- title = title + ' / ' + '已申请'
186
- } else if (task.state == 'refuse') {
187
- title = title + ' / ' + '已驳回'
188
- } else {
189
- title = title + ' / ' + '申请中'
190
- }
191
- } else if (task.category == 'audit') {
192
- if (task.auditMethod == 'or') {
193
- title = title + '(或签)'
194
- } else {
195
- title = title + '(会签)'
196
- }
197
- if (task.state == 'pass') {
198
- title = title + ' / ' + '已审核'
199
- } else if (task.state == 'refuse') {
200
- title = title + ' / ' + '已驳回'
201
- } else if (task.state == 'started') {
202
- title = title + ' / ' + '审核中'
203
- } else {
204
- title = title + ''
205
- }
206
- } else if (task.category == 'notify') {
207
- if (task.state == 'pass') {
208
- title = title + ' / ' + '已抄送'
209
- } else {
210
- title = title + ''
211
- }
212
- }
213
- return title
214
- }
215
-
216
- const formatExecutor = (executor, task) => {
217
- let action = ''
218
- let username =''
219
- let memo = executor.memo
220
- if (executor.state == 'pass') {
221
- if (task.category == 'notify')
222
- action = `已抄送 ${executor.updatedAt}`
223
- else
224
- action = `已审核 ${executor.updatedAt}`
225
- }else if(data.process.state == 'finish_refuse'){
226
- action = `已撤销 ${executor.updatedAt}`
227
- } else if (executor.state == 'refuse') {
228
- action = `已驳回 ${executor.updatedAt}`
229
- }
230
-
231
- if(executor.user.name!=executor.submiterName && executor.submiterName)
232
- username =`${executor.user.name}/${executor.submiterName}`
233
- else
234
- username = `${executor.user.name}`
235
-
236
- return `${username} ${action} ${memo}`
237
- }
238
-
239
- const formatProcessTitle = computed(() => {
240
- if (data.process.state == 'started') {
241
- return '审批流程: 审核中'
242
- } else if (data.process.state == 'finish_pass') {
243
- return '审批流程: 审批通过'
244
- } else if (data.process.state == 'finish_refuse') {
245
- return '审批流程: 已撤销'
246
- } else {
247
- return '审批流程:'
248
- }
249
- })
250
-
251
- watch(() => props.userId, () => {
252
- if (!props.userId)
253
- return
254
-
255
- queryDetail()
256
- queryStepAuth()
257
- updateCanApply()
258
- }, { immediate: true })
259
-
260
- watch(() => props.processId, () => {
261
- queryDetail()
262
- queryStepAuth()
263
- updateCanApply()
264
- }, { immediate: true })
265
-
266
- watch(() => props.mouldId, async () => {
267
- if (!props.processId && !props.mouldId)
268
- return
269
-
270
- queryDetail()
271
- await queryStepAuth()
272
- updateAuth()
273
- updateCanApply()
274
- }, { immediate: true })
275
-
276
- watch(() => JSON.stringify(props.form), async () => {
277
- if (!data.stepAuth)
278
- return
279
-
280
- queryDetail()
281
- await queryStepAuth()
282
- updateAuth()
283
- updateCanApply()
284
- }, { immediate: true })
285
- </script>
286
-
287
- <style lang="scss" scoped>
288
- .widget {
289
- text-align: center;
290
- padding: 15px 15px;
291
- }
292
-
293
- .memo {
294
- margin-bottom: 15px;
295
- }
296
-
297
- .refuse-btn {
298
- width: 120px;
299
- margin-right: 15px;
300
- }
301
-
302
- .pass-btn {
303
- width: 120px;
304
- }
305
-
306
- .apply-btn {
307
- width: 60vw;
308
- }
309
-
310
- .task-list {
311
- margin-top: 15px;
312
- }
313
-
314
- .task-title {
315
- font-size: 14px;
316
- font-weight: bold;
317
- color: #333;
318
- text-align: left;
319
- }
320
-
321
- .task-user {
322
- font-size: 13px;
323
- color: #666;
324
- text-align: left;
325
- margin-top: 5px;
326
- }
327
-
328
- .audit-title {
329
- padding: 25px 15px 0 15px;
330
- font-size: 16px;
331
- font-weight: bold;
332
- color: #666;
333
- text-align: left;
334
- }
335
- </style>
336
-
337
- <style>
338
- :root:root {
339
- --van-popover-action-width: 70vw;
340
- }
1
+ <template>
2
+ <div class="widget">
3
+ <van-field v-if="canPass || canRefuse" v-model="data.memo" class="memo" label="审批意见" placeholder="请输入审批意见" />
4
+
5
+ <van-popover v-if="canRefuse" placement="top-start" v-model:show="data.isShowPop" :actions="formatPrevSteps"
6
+ actions-direction="vertical" @select="onSelectRefuse">
7
+ <template #reference>
8
+ <van-button class="refuse-btn" type="danger" @click="onRefuse">驳回</van-button>
9
+ </template>
10
+ </van-popover>
11
+
12
+ <van-button v-if="canPass" class="pass-btn" type="primary" native-type="submit" @click="onPass">同意</van-button>
13
+
14
+ <van-button class="apply-btn" v-if="data.canApply" type="primary" native-type="submit" @click="onApply">申请</van-button>
15
+
16
+ <div class="audit-title" v-if="data.process && data.process.id">{{ formatProcessTitle }}</div>
17
+
18
+ <van-steps class="task-list" direction="vertical" :active="data.process.startedTaskIndex"
19
+ v-if="data.process && data.process.id">
20
+ <van-step v-for="(task, i) in data.process.tasks" :key="i">
21
+ <div class="task-title">{{ formatTitle(task) }}</div>
22
+ <div class="task-user" v-if="task.executors" v-for="(executor, j) in task.executors" :key="j">
23
+ {{ formatExecutor(executor, task) }}
24
+ </div>
25
+ </van-step>
26
+ </van-steps>
27
+ </div>
28
+ </template>
29
+
30
+ <script setup>
31
+ import { ref, reactive, computed, onMounted, defineProps, defineEmits, watch } from "vue"
32
+ import util from '../util'
33
+ import lodash from 'lodash'
34
+
35
+ const props = defineProps({
36
+ processId: Number,
37
+ mouldId: Number,
38
+ userId: String,
39
+ form: Object,
40
+ process_detail:Function,
41
+ })
42
+ const emit = defineEmits(['pass', 'refuse', 'apply', 'auth'])
43
+ const data = reactive({
44
+ isShowPop: false,
45
+ process: {},
46
+ memo: '',
47
+ stepAuth: {},
48
+ canApply: false
49
+ })
50
+ const formatPrevSteps = computed(() => {
51
+ if (!data.process || !data.process.prevSteps || data.process.prevSteps.length < 1) {
52
+ return []
53
+ }
54
+
55
+ return data.process.prevSteps.map((item) => {
56
+ return {
57
+ stepId: item.id,
58
+ text: item.title
59
+ }
60
+ })
61
+ })
62
+ const canPass = computed(() => {
63
+ return data.process && data.process.id && data.process.canPass
64
+ })
65
+ const canRefuse = computed(() => {
66
+ return data.process && data.process.id && data.process.canRefuse
67
+ })
68
+
69
+ onMounted(() => {
70
+
71
+ })
72
+
73
+ const onPass = () => {
74
+ // 1秒节流
75
+ lodash.throttle(() => {
76
+ emit('pass', {
77
+ memo: data.memo
78
+ })
79
+ }, 5000)()
80
+ }
81
+ const onRefuse = () => {
82
+
83
+ }
84
+ const onSelectRefuse = (action) => {
85
+ emit('refuse',
86
+ {
87
+ memo: data.memo,
88
+ action: action
89
+ }
90
+ )
91
+ }
92
+
93
+ const onApply = () => {
94
+ // 1秒节流
95
+ lodash.throttle(() => {
96
+ emit('apply', {
97
+ memo: data.memo
98
+ })
99
+ }, 5000)()
100
+ }
101
+
102
+ const queryDetail = async () => {
103
+ if (!props.processId)
104
+ return
105
+ const params = {
106
+ id: props.processId
107
+ }
108
+ const res = await util.process_detail(params)
109
+ data.process = res.data
110
+ }
111
+
112
+ const queryStepAuth = async () => {
113
+ if(!props.processId && !props.mouldId)
114
+ return
115
+
116
+ const params = {
117
+ processId: props.processId,
118
+ mouldId: props.mouldId,
119
+ userId: props.userId,
120
+ form: props.form
121
+ }
122
+ const res = await util.process_step_auth(params)
123
+ data.stepAuth = res.data
124
+ }
125
+
126
+ const updateAuth = () => {
127
+ let res = {}
128
+ for (const key in data.stepAuth) {
129
+ const fieldAuth = data.stepAuth[key]
130
+ let authValue = getAuth(fieldAuth)
131
+ res[key] = authValue
132
+ }
133
+
134
+ emit('auth', res)
135
+ }
136
+
137
+ // 根据条件列表获取权限
138
+ const getAuth = (fieldAuth) => {
139
+ // 默认权限: 只读
140
+ let defaultCondition = 'readonly'
141
+
142
+ if (!fieldAuth) {
143
+ return defaultCondition
144
+ }
145
+
146
+ const conditions = fieldAuth.conditions
147
+ if (!conditions || conditions.length < 1) {
148
+ return defaultCondition
149
+ }
150
+
151
+ for (const i in conditions) {
152
+ const condition = conditions[i]
153
+ // 有条件的权限,根据条件表达式计算匹配的权限
154
+ if (condition.condition) {
155
+ const result = util.executeExpress(condition.condition, props.form)
156
+ if (result === true) {
157
+ return condition.value
158
+ }
159
+ } else {
160
+ // 无条件的权限
161
+ defaultCondition = condition.value
162
+ }
163
+ }
164
+
165
+ return defaultCondition
166
+ }
167
+
168
+ const updateCanApply = async () => {
169
+ if (props.processId)
170
+ return data.canApply = false
171
+
172
+ let res = await util.process_can_apply({
173
+ mouldId: props.mouldId,
174
+ userId: props.userId,
175
+ form: props.form
176
+ })
177
+
178
+ data.canApply = res.data
179
+ }
180
+
181
+ const formatTitle = (task) => {
182
+ let title = task.title
183
+ if (task.category == 'start') {
184
+ if (task.state == 'pass') {
185
+ title = title + ' / ' + '已申请'
186
+ } else if (task.state == 'refuse') {
187
+ title = title + ' / ' + '已驳回'
188
+ } else {
189
+ title = title + ' / ' + '申请中'
190
+ }
191
+ } else if (task.category == 'audit') {
192
+ if (task.auditMethod == 'or') {
193
+ title = title + '(或签)'
194
+ } else {
195
+ title = title + '(会签)'
196
+ }
197
+ if (task.state == 'pass') {
198
+ title = title + ' / ' + '已审核'
199
+ } else if (task.state == 'refuse') {
200
+ title = title + ' / ' + '已驳回'
201
+ } else if (task.state == 'started') {
202
+ title = title + ' / ' + '审核中'
203
+ } else {
204
+ title = title + ''
205
+ }
206
+ } else if (task.category == 'notify') {
207
+ if (task.state == 'pass') {
208
+ title = title + ' / ' + '已抄送'
209
+ } else {
210
+ title = title + ''
211
+ }
212
+ }
213
+ return title
214
+ }
215
+
216
+ const formatExecutor = (executor, task) => {
217
+ let action = ''
218
+ let username =''
219
+ let memo = executor.memo
220
+ if (executor.state == 'pass') {
221
+ if (task.category == 'notify')
222
+ action = `已抄送 ${executor.updatedAt}`
223
+ else
224
+ action = `已审核 ${executor.updatedAt}`
225
+ }else if(data.process.state == 'finish_refuse'){
226
+ action = `已撤销 ${executor.updatedAt}`
227
+ } else if (executor.state == 'refuse') {
228
+ action = `已驳回 ${executor.updatedAt}`
229
+ }
230
+
231
+ if(executor.user.name!=executor.submiterName && executor.submiterName)
232
+ username =`${executor.user.name}/${executor.submiterName}`
233
+ else
234
+ username = `${executor.user.name}`
235
+
236
+ return `${username} ${action} ${memo}`
237
+ }
238
+
239
+ const formatProcessTitle = computed(() => {
240
+ if (data.process.state == 'started') {
241
+ return '审批流程: 审核中'
242
+ } else if (data.process.state == 'finish_pass') {
243
+ return '审批流程: 审批通过'
244
+ } else if (data.process.state == 'finish_refuse') {
245
+ return '审批流程: 已撤销'
246
+ } else {
247
+ return '审批流程:'
248
+ }
249
+ })
250
+
251
+ watch(() => props.userId, () => {
252
+ if (!props.userId)
253
+ return
254
+
255
+ queryDetail()
256
+ queryStepAuth()
257
+ updateCanApply()
258
+ }, { immediate: true })
259
+
260
+ watch(() => props.processId, () => {
261
+ queryDetail()
262
+ queryStepAuth()
263
+ updateCanApply()
264
+ }, { immediate: true })
265
+
266
+ watch(() => props.mouldId, async () => {
267
+ if (!props.processId && !props.mouldId)
268
+ return
269
+
270
+ queryDetail()
271
+ await queryStepAuth()
272
+ updateAuth()
273
+ updateCanApply()
274
+ }, { immediate: true })
275
+
276
+ watch(() => JSON.stringify(props.form), async () => {
277
+ if (!data.stepAuth)
278
+ return
279
+
280
+ queryDetail()
281
+ await queryStepAuth()
282
+ updateAuth()
283
+ updateCanApply()
284
+ }, { immediate: true })
285
+ </script>
286
+
287
+ <style lang="scss" scoped>
288
+ .widget {
289
+ text-align: center;
290
+ padding: 15px 15px;
291
+ }
292
+
293
+ .memo {
294
+ margin-bottom: 15px;
295
+ }
296
+
297
+ .refuse-btn {
298
+ width: 120px;
299
+ margin-right: 15px;
300
+ }
301
+
302
+ .pass-btn {
303
+ width: 120px;
304
+ }
305
+
306
+ .apply-btn {
307
+ width: 60vw;
308
+ }
309
+
310
+ .task-list {
311
+ margin-top: 15px;
312
+ }
313
+
314
+ .task-title {
315
+ font-size: 14px;
316
+ font-weight: bold;
317
+ color: #333;
318
+ text-align: left;
319
+ }
320
+
321
+ .task-user {
322
+ font-size: 13px;
323
+ color: #666;
324
+ text-align: left;
325
+ margin-top: 5px;
326
+ }
327
+
328
+ .audit-title {
329
+ padding: 25px 15px 0 15px;
330
+ font-size: 16px;
331
+ font-weight: bold;
332
+ color: #666;
333
+ text-align: left;
334
+ }
335
+ </style>
336
+
337
+ <style>
338
+ :root:root {
339
+ --van-popover-action-width: 70vw;
340
+ }
341
341
  </style>