vue2-client 1.18.21 → 1.18.23

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.
@@ -1,404 +1,404 @@
1
- <template>
2
- <!-- 抽屉 -->
3
- <a-drawer
4
- :visible="visible"
5
- width="95vw"
6
- title="流程详情"
7
- @close="onClose"
8
- class="modern-workflow-drawer"
9
- :bodyStyle="{ padding: '0', background: '#f5f7fa', flex: 1 }"
10
- :headerStyle="{ borderBottom: '1px solid #eaedf2', padding: '16px 24px' }"
11
- >
12
- <div class="workflow-container">
13
- <!-- 基础信息卡片 -->
14
- <div class="info-section">
15
- <workflow-base-information
16
- v-if="details"
17
- ref="baseInformation"
18
- :workflow-id="workflowId"
19
- :details="details"
20
- :visible="visible"
21
- class="base-info-card"
22
- />
23
- </div>
24
-
25
- <!-- 内容区域 -->
26
- <div class="content-section">
27
- <a-card class="content-card" :bordered="false">
28
- <a-tabs
29
- :activeKey="activeKey"
30
- @change="changeTab"
31
- class="modern-tabs"
32
- :tabBarStyle="{ marginBottom: '5px', borderBottom: '1px solid #eaedf2' }"
33
- >
34
- <!-- 查看/编辑进度标签页 -->
35
- <a-tab-pane key="1" tab="开始工作">
36
- <WorkFlowHandle
37
- v-if="isWorkflowDataReady"
38
- ref="workflowHandle"
39
- :workflow-id="workflowId"
40
- :workflowState="details.f_state === 1"
41
- :complete-time="details.f_complete_time"
42
- :stepsForChild="steps"
43
- :visible="visible"
44
- :taskName="details.f_task_name"
45
- :details="details"
46
- :renderCurrentNode="renderCurrentNode"
47
- :initStepId="initStepId"
48
- @refresh="stepChanged"
49
- @success="success"
50
- @nextClick="nextClick"
51
- @preClick="preClick"
52
- @x-form-item-emit-func="handleFormItemEvent"
53
- class="handle-content"
54
- />
55
- <div v-else-if="activeKey === '1'" class="loading-placeholder">
56
- <a-spin size="large" tip="正在加载工作流数据..."/>
57
- </div>
58
- </a-tab-pane>
59
-
60
- <!-- 任务流转记录标签页 -->
61
- <a-tab-pane key="2" tab="流转记录">
62
- <workflow-log
63
- v-if="activeKey === '2'"
64
- :workflow-id="workflowId"
65
- class="log-content"
66
- />
67
- </a-tab-pane>
68
-
69
- <!-- 任务留言标签页 -->
70
- <a-tab-pane key="4">
71
- <span slot="tab" class="message-tab">
72
- <span>任务留言</span>
73
- <a-badge
74
- :count="messageList.length"
75
- :offset="[8, -4]"
76
- :numberStyle="{ backgroundColor: '#5B6B8F', fontSize: '12px', padding: '0 6px', height: '18px', lineHeight: '18px', borderRadius: '9px' }"
77
- />
78
- </span>
79
- <div class="message-content">
80
- <template v-if="activeKey === '4' && details">
81
- <leave-message
82
- :workflowId="workflowId"
83
- :projectName="details.f_task_name"
84
- :data="messageList"
85
- :loading="messageLoading"
86
- @success="success"
87
- class="leave-message-component"
88
- />
89
- </template>
90
- </div>
91
- </a-tab-pane>
92
-
93
- <!-- 查看附件标签页 -->
94
- <a-tab-pane key="5" tab="查看附件">
95
- <template v-if="activeKey === '5' && details">
96
- <file-item-group :workflow-id="workflowId" @search="getWorkFlowFiles"/>
97
- </template>
98
- </a-tab-pane>
99
-
100
- <!-- 任务流转记录标签页 -->
101
- <a-tab-pane key="6" tab="工作日志">
102
- <worklog
103
- v-if="activeKey === '6'"
104
- :workflow-id="workflowId"
105
- :details="details"
106
- class="log-content"
107
- />
108
- </a-tab-pane>
109
- </a-tabs>
110
- </a-card>
111
- </div>
112
- </div>
113
- </a-drawer>
114
- </template>
115
-
116
- <script>
117
- import { mapState } from 'vuex'
118
- import workflowBaseInformation from '@vue2-client/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowBaseInformation.vue'
119
- import WorkFlowHandle from '@vue2-client/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandle.vue'
120
- import XFormTable from '@vue2-client/base-client/components/common/XFormTable/XFormTable'
121
- import { postByServiceName } from '@vue2-client/services/api/restTools'
122
- import { workFlowViewApi } from '@vue2-client/services/api/workFlow'
123
- import WorkflowLog from '@vue2-client/pages/WorkflowDetail/WorkflowPageDetail/WorkflowLog.vue'
124
- import LeaveMessage from '@vue2-client/pages/WorkflowDetail/WorkflowPageDetail/LeaveMessage.vue'
125
- import XUploadFilesView from '@vue2-client/base-client/components/common/XUploadFilesView/index.vue'
126
- import FileItemGroup from '@vue2-client/components/FileImageItem/FileItemGroup.vue'
127
- import worklog from '@vue2-client/pages/WorkflowDetail/WorkflowPageDetail/worklog.vue'
128
-
129
- export default {
130
- name: 'WorkflowDetail',
131
- components: {
132
- FileItemGroup,
133
- workflowBaseInformation,
134
- WorkFlowHandle,
135
- XFormTable,
136
- WorkflowLog,
137
- LeaveMessage,
138
- XUploadFilesView,
139
- worklog
140
- },
141
- props: {},
142
- data () {
143
- return {
144
- // 页面宽度
145
- screenWidth: document.documentElement.clientWidth,
146
- // 页面高度
147
- screenHeight: document.documentElement.clientHeight,
148
- // 控制当前标签页
149
- activeKey: '1',
150
- // 保存流程和留言信息
151
- steps: undefined,
152
- // 基础信息
153
- details: undefined,
154
- // 给XFormTable增加额外查询条件
155
- fixedAddForm: {},
156
- fixedQueryForm: {},
157
- // 留言数据
158
- messageList: [],
159
- messageLoading: true,
160
- workflowId: '',
161
- initStepId: null,
162
- visible: false,
163
- // 控制流程是否可操作
164
- renderCurrentNode: true
165
- }
166
- },
167
- expose: ['setFormValue'],
168
- computed: {
169
- ...mapState('account', { currUser: 'user' }),
170
- ...mapState('setting', ['isMobile']),
171
- // 检查 WorkFlowHandle 组件渲染所需的数据是否都已准备好
172
- isWorkflowDataReady () {
173
- return this.activeKey === '1' &&
174
- this.details &&
175
- this.details.f_state !== undefined &&
176
- this.steps !== undefined
177
- }
178
- },
179
- mounted () {
180
- // this.init()
181
- },
182
- methods: {
183
- // 内部组件更新了当前步骤后的回调
184
- stepChanged () {
185
- this.initStepId = null
186
- this.loading = true
187
- this.reload()
188
- },
189
- // 获取所有步骤
190
- getSteps () {
191
- return postByServiceName(workFlowViewApi.getStepNoteAndHandler, {
192
- workflowId: this.workflowId,
193
- curUserId: String(this.currUser.id)
194
- })
195
- .then(res => {
196
- this.steps = res
197
- }, err => {
198
- console.log(err)
199
- })
200
- },
201
- // 关闭抽屉的回调
202
- onClose () {
203
- if (this.$refs.workflowHandle !== undefined) {
204
- this.$refs.workflowHandle.onClose()
205
- }
206
- this.visible = false
207
- this.activeKey = '1'
208
- this.details = undefined
209
- this.fixedAddForm = {}
210
- this.fixedQueryForm = {}
211
- this.steps = undefined
212
- this.messageList = []
213
- this.currStepId = null
214
- this.$emit('drawerOnClose')
215
- },
216
- // 获取基础信息
217
- getBaseInfo () {
218
- this.loading = true
219
- return postByServiceName(workFlowViewApi.getWorkFlowBasicInfo, {
220
- workflowId: this.workflowId
221
- })
222
- .then(res => {
223
- // 主动传入得优先级较高
224
- if (this.currStepId) {
225
- res.f_sub_state = this.steps.find(item => item.id === this.currStepId)?.name
226
- } else {
227
- res.f_sub_state = this.steps.find(item => item.id === res.f_step_id)?.name
228
- }
229
- this.details = res
230
- }, err => {
231
- console.log(err)
232
- })
233
- },
234
- // 获取附件列表
235
- getWorkFlowFiles (date, callback, errorCallback) {
236
- postByServiceName(workFlowViewApi.getWorkFlowAttachments, {
237
- workflowId: this.workflowId,
238
- uploadDate: date
239
- })
240
- .then(res => {
241
- res.files = [
242
- ...(res.images || []),
243
- ...(res.files || []),
244
- ]
245
- callback(res)
246
- })
247
- .catch((e) => errorCallback(e))
248
- },
249
- async reload () {
250
- await this.getSteps()
251
- await this.getBaseInfo()
252
- this.fixedQueryForm.a_f_workflow_id = this.workflowId
253
- this.fixedAddForm.a_f_workflow_id = this.workflowId
254
- },
255
- // 初始化两张固定表
256
- async init ({ workflowId, stepId, renderCurrentNode = true, visible = true }) {
257
- this.workflowId = workflowId
258
- if (stepId) {
259
- this.initStepId = stepId
260
- }
261
- this.visible = visible
262
- this.renderCurrentNode = renderCurrentNode
263
- await this.reload()
264
- },
265
- // 切换标签页
266
- changeTab (id) {
267
- this.activeKey = id
268
- },
269
- // 提交完成后事件
270
- success (res) {
271
- this.visible = false
272
- this.$emit('success', res)
273
- },
274
- // 提交完成后事件
275
- nextClick (res) {
276
- this.$emit('nextClick', res)
277
- },
278
- // 退回后事件
279
- preClick (res) {
280
- this.$emit('preClick', res)
281
- },
282
- handleFormItemEvent (func, data, value) {
283
- this.$emit('x-form-item-emit-func', func, data, value)
284
- },
285
- // 给地址选择表单项赋值
286
- setFormValue (record) {
287
- this.$refs.workflowHandle.$refs.xAddForm.setForm(record)
288
- }
289
- }
290
- }
291
- </script>
292
-
293
- <style lang="less" scoped>
294
- .workflow-container {
295
- height: 100%;
296
- display: flex;
297
- flex-direction: column;
298
-
299
- .info-section {
300
- padding: 16px 24px;
301
- background-color: #fff;
302
- border-bottom: 1px solid #eaedf2;
303
- }
304
-
305
- .content-section {
306
- flex: 1;
307
- padding: 16px 24px;
308
-
309
- .content-card {
310
- border-radius: 8px;
311
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
312
- min-height: 100%;
313
-
314
- /deep/ .ant-card-body {
315
- padding: 12px 24px 24px;
316
- }
317
- }
318
- }
319
- }
320
-
321
- .modern-tabs {
322
- /deep/ .ant-tabs-nav {
323
- margin-bottom: 0;
324
- }
325
-
326
- /deep/ .ant-tabs-tab {
327
- padding: 12px 0;
328
- margin-right: 48px;
329
- font-size: 15px;
330
- }
331
-
332
- /deep/ .ant-tabs-tab-active {
333
- font-weight: 500;
334
- }
335
-
336
- /deep/ .ant-tabs-ink-bar {
337
- height: 3px;
338
- border-radius: 3px 3px 0 0;
339
- }
340
- }
341
-
342
- .message-tab {
343
- display: flex;
344
- align-items: center;
345
- gap: 6px;
346
- }
347
-
348
- .message-content {
349
-
350
- .leave-message-component {
351
- width: 100%;
352
- }
353
- }
354
-
355
- .log-content {
356
- margin-top: 16px;
357
- }
358
-
359
- /deep/ .step-label {
360
- &:not(:first-child) {
361
- margin-left: 16px;
362
- }
363
-
364
- .step-icon {
365
- position: relative;
366
- top: 1px;
367
- display: inline-block;
368
- width: 12px;
369
- height: 12px;
370
- background: #ffffff;
371
- border-radius: 50%;
372
- margin-right: 8px;
373
-
374
- &.blue {
375
- border: 3px solid #5B6B8F;
376
- }
377
-
378
- &.green {
379
- border: 3px solid #4CAF50;
380
- }
381
-
382
- &.gray {
383
- border: 3px solid #cfd8e3;
384
- }
385
- }
386
- }
387
-
388
- :deep(.ant-drawer-wrapper-body) {
389
- display: flex;
390
- flex-direction: column;
391
- }
392
-
393
- .loading-placeholder {
394
- display: flex;
395
- justify-content: center;
396
- align-items: center;
397
- height: 300px;
398
-
399
- /deep/ .ant-spin-text {
400
- color: #666;
401
- margin-top: 16px;
402
- }
403
- }
404
- </style>
1
+ <template>
2
+ <!-- 抽屉 -->
3
+ <a-drawer
4
+ :visible="visible"
5
+ width="95vw"
6
+ title="流程详情"
7
+ @close="onClose"
8
+ class="modern-workflow-drawer"
9
+ :bodyStyle="{ padding: '0', background: '#f5f7fa', flex: 1 }"
10
+ :headerStyle="{ borderBottom: '1px solid #eaedf2', padding: '16px 24px' }"
11
+ >
12
+ <div class="workflow-container">
13
+ <!-- 基础信息卡片 -->
14
+ <div class="info-section">
15
+ <workflow-base-information
16
+ v-if="details"
17
+ ref="baseInformation"
18
+ :workflow-id="workflowId"
19
+ :details="details"
20
+ :visible="visible"
21
+ class="base-info-card"
22
+ />
23
+ </div>
24
+
25
+ <!-- 内容区域 -->
26
+ <div class="content-section">
27
+ <a-card class="content-card" :bordered="false">
28
+ <a-tabs
29
+ :activeKey="activeKey"
30
+ @change="changeTab"
31
+ class="modern-tabs"
32
+ :tabBarStyle="{ marginBottom: '5px', borderBottom: '1px solid #eaedf2' }"
33
+ >
34
+ <!-- 查看/编辑进度标签页 -->
35
+ <a-tab-pane key="1" tab="开始工作">
36
+ <WorkFlowHandle
37
+ v-if="isWorkflowDataReady"
38
+ ref="workflowHandle"
39
+ :workflow-id="workflowId"
40
+ :workflowState="details.f_state === 1"
41
+ :complete-time="details.f_complete_time"
42
+ :stepsForChild="steps"
43
+ :visible="visible"
44
+ :taskName="details.f_task_name"
45
+ :details="details"
46
+ :renderCurrentNode="renderCurrentNode"
47
+ :initStepId="initStepId"
48
+ @refresh="stepChanged"
49
+ @success="success"
50
+ @nextClick="nextClick"
51
+ @preClick="preClick"
52
+ @x-form-item-emit-func="handleFormItemEvent"
53
+ class="handle-content"
54
+ />
55
+ <div v-else-if="activeKey === '1'" class="loading-placeholder">
56
+ <a-spin size="large" tip="正在加载工作流数据..."/>
57
+ </div>
58
+ </a-tab-pane>
59
+
60
+ <!-- 任务流转记录标签页 -->
61
+ <a-tab-pane key="2" tab="流转记录">
62
+ <workflow-log
63
+ v-if="activeKey === '2'"
64
+ :workflow-id="workflowId"
65
+ class="log-content"
66
+ />
67
+ </a-tab-pane>
68
+
69
+ <!-- 任务留言标签页 -->
70
+ <a-tab-pane key="4">
71
+ <span slot="tab" class="message-tab">
72
+ <span>任务留言</span>
73
+ <a-badge
74
+ :count="messageList.length"
75
+ :offset="[8, -4]"
76
+ :numberStyle="{ backgroundColor: '#5B6B8F', fontSize: '12px', padding: '0 6px', height: '18px', lineHeight: '18px', borderRadius: '9px' }"
77
+ />
78
+ </span>
79
+ <div class="message-content">
80
+ <template v-if="activeKey === '4' && details">
81
+ <leave-message
82
+ :workflowId="workflowId"
83
+ :projectName="details.f_task_name"
84
+ :data="messageList"
85
+ :loading="messageLoading"
86
+ @success="success"
87
+ class="leave-message-component"
88
+ />
89
+ </template>
90
+ </div>
91
+ </a-tab-pane>
92
+
93
+ <!-- 查看附件标签页 -->
94
+ <a-tab-pane key="5" tab="查看附件">
95
+ <template v-if="activeKey === '5' && details">
96
+ <file-item-group :workflow-id="workflowId" @search="getWorkFlowFiles"/>
97
+ </template>
98
+ </a-tab-pane>
99
+
100
+ <!-- 任务流转记录标签页 -->
101
+ <a-tab-pane key="6" tab="工作日志">
102
+ <worklog
103
+ v-if="activeKey === '6'"
104
+ :workflow-id="workflowId"
105
+ :details="details"
106
+ class="log-content"
107
+ />
108
+ </a-tab-pane>
109
+ </a-tabs>
110
+ </a-card>
111
+ </div>
112
+ </div>
113
+ </a-drawer>
114
+ </template>
115
+
116
+ <script>
117
+ import { mapState } from 'vuex'
118
+ import workflowBaseInformation from '@vue2-client/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowBaseInformation.vue'
119
+ import WorkFlowHandle from '@vue2-client/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandle.vue'
120
+ import XFormTable from '@vue2-client/base-client/components/common/XFormTable/XFormTable'
121
+ import { postByServiceName } from '@vue2-client/services/api/restTools'
122
+ import { workFlowViewApi } from '@vue2-client/services/api/workFlow'
123
+ import WorkflowLog from '@vue2-client/pages/WorkflowDetail/WorkflowPageDetail/WorkflowLog.vue'
124
+ import LeaveMessage from '@vue2-client/pages/WorkflowDetail/WorkflowPageDetail/LeaveMessage.vue'
125
+ import XUploadFilesView from '@vue2-client/base-client/components/common/XUploadFilesView/index.vue'
126
+ import FileItemGroup from '@vue2-client/components/FileImageItem/FileItemGroup.vue'
127
+ import worklog from '@vue2-client/pages/WorkflowDetail/WorkflowPageDetail/worklog.vue'
128
+
129
+ export default {
130
+ name: 'WorkflowDetail',
131
+ components: {
132
+ FileItemGroup,
133
+ workflowBaseInformation,
134
+ WorkFlowHandle,
135
+ XFormTable,
136
+ WorkflowLog,
137
+ LeaveMessage,
138
+ XUploadFilesView,
139
+ worklog
140
+ },
141
+ props: {},
142
+ data () {
143
+ return {
144
+ // 页面宽度
145
+ screenWidth: document.documentElement.clientWidth,
146
+ // 页面高度
147
+ screenHeight: document.documentElement.clientHeight,
148
+ // 控制当前标签页
149
+ activeKey: '1',
150
+ // 保存流程和留言信息
151
+ steps: undefined,
152
+ // 基础信息
153
+ details: undefined,
154
+ // 给XFormTable增加额外查询条件
155
+ fixedAddForm: {},
156
+ fixedQueryForm: {},
157
+ // 留言数据
158
+ messageList: [],
159
+ messageLoading: true,
160
+ workflowId: '',
161
+ initStepId: null,
162
+ visible: false,
163
+ // 控制流程是否可操作
164
+ renderCurrentNode: true
165
+ }
166
+ },
167
+ expose: ['setFormValue'],
168
+ computed: {
169
+ ...mapState('account', { currUser: 'user' }),
170
+ ...mapState('setting', ['isMobile']),
171
+ // 检查 WorkFlowHandle 组件渲染所需的数据是否都已准备好
172
+ isWorkflowDataReady () {
173
+ return this.activeKey === '1' &&
174
+ this.details &&
175
+ this.details.f_state !== undefined &&
176
+ this.steps !== undefined
177
+ }
178
+ },
179
+ mounted () {
180
+ // this.init()
181
+ },
182
+ methods: {
183
+ // 内部组件更新了当前步骤后的回调
184
+ stepChanged () {
185
+ this.initStepId = null
186
+ this.loading = true
187
+ this.reload()
188
+ },
189
+ // 获取所有步骤
190
+ getSteps () {
191
+ return postByServiceName(workFlowViewApi.getStepNoteAndHandler, {
192
+ workflowId: this.workflowId,
193
+ curUserId: String(this.currUser.id)
194
+ })
195
+ .then(res => {
196
+ this.steps = res
197
+ }, err => {
198
+ console.log(err)
199
+ })
200
+ },
201
+ // 关闭抽屉的回调
202
+ onClose () {
203
+ if (this.$refs.workflowHandle !== undefined) {
204
+ this.$refs.workflowHandle.onClose()
205
+ }
206
+ this.visible = false
207
+ this.activeKey = '1'
208
+ this.details = undefined
209
+ this.fixedAddForm = {}
210
+ this.fixedQueryForm = {}
211
+ this.steps = undefined
212
+ this.messageList = []
213
+ this.currStepId = null
214
+ this.$emit('drawerOnClose')
215
+ },
216
+ // 获取基础信息
217
+ getBaseInfo () {
218
+ this.loading = true
219
+ return postByServiceName(workFlowViewApi.getWorkFlowBasicInfo, {
220
+ workflowId: this.workflowId
221
+ })
222
+ .then(res => {
223
+ // 主动传入得优先级较高
224
+ if (this.currStepId) {
225
+ res.f_sub_state = this.steps.find(item => item.id === this.currStepId)?.name
226
+ } else {
227
+ res.f_sub_state = this.steps.find(item => item.id === res.f_step_id)?.name
228
+ }
229
+ this.details = res
230
+ }, err => {
231
+ console.log(err)
232
+ })
233
+ },
234
+ // 获取附件列表
235
+ getWorkFlowFiles (date, callback, errorCallback) {
236
+ postByServiceName(workFlowViewApi.getWorkFlowAttachments, {
237
+ workflowId: this.workflowId,
238
+ uploadDate: date
239
+ })
240
+ .then(res => {
241
+ res.files = [
242
+ ...(res.images || []),
243
+ ...(res.files || []),
244
+ ]
245
+ callback(res)
246
+ })
247
+ .catch((e) => errorCallback(e))
248
+ },
249
+ async reload () {
250
+ await this.getSteps()
251
+ await this.getBaseInfo()
252
+ this.fixedQueryForm.a_f_workflow_id = this.workflowId
253
+ this.fixedAddForm.a_f_workflow_id = this.workflowId
254
+ },
255
+ // 初始化两张固定表
256
+ async init ({ workflowId, stepId, renderCurrentNode = true, visible = true }) {
257
+ this.workflowId = workflowId
258
+ if (stepId) {
259
+ this.initStepId = stepId
260
+ }
261
+ this.visible = visible
262
+ this.renderCurrentNode = renderCurrentNode
263
+ await this.reload()
264
+ },
265
+ // 切换标签页
266
+ changeTab (id) {
267
+ this.activeKey = id
268
+ },
269
+ // 提交完成后事件
270
+ success (res) {
271
+ this.visible = false
272
+ this.$emit('success', res)
273
+ },
274
+ // 提交完成后事件
275
+ nextClick (res) {
276
+ this.$emit('nextClick', res)
277
+ },
278
+ // 退回后事件
279
+ preClick (res) {
280
+ this.$emit('preClick', res)
281
+ },
282
+ handleFormItemEvent (func, data, value) {
283
+ this.$emit('x-form-item-emit-func', func, data, value)
284
+ },
285
+ // 给地址选择表单项赋值
286
+ setFormValue (record) {
287
+ this.$refs.workflowHandle.$refs.xAddForm.setForm(record)
288
+ }
289
+ }
290
+ }
291
+ </script>
292
+
293
+ <style lang="less" scoped>
294
+ .workflow-container {
295
+ height: 100%;
296
+ display: flex;
297
+ flex-direction: column;
298
+
299
+ .info-section {
300
+ padding: 16px 24px;
301
+ background-color: #fff;
302
+ border-bottom: 1px solid #eaedf2;
303
+ }
304
+
305
+ .content-section {
306
+ flex: 1;
307
+ padding: 16px 24px;
308
+
309
+ .content-card {
310
+ border-radius: 8px;
311
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
312
+ min-height: 100%;
313
+
314
+ /deep/ .ant-card-body {
315
+ padding: 12px 24px 24px;
316
+ }
317
+ }
318
+ }
319
+ }
320
+
321
+ .modern-tabs {
322
+ /deep/ .ant-tabs-nav {
323
+ margin-bottom: 0;
324
+ }
325
+
326
+ /deep/ .ant-tabs-tab {
327
+ padding: 12px 0;
328
+ margin-right: 48px;
329
+ font-size: 15px;
330
+ }
331
+
332
+ /deep/ .ant-tabs-tab-active {
333
+ font-weight: 500;
334
+ }
335
+
336
+ /deep/ .ant-tabs-ink-bar {
337
+ height: 3px;
338
+ border-radius: 3px 3px 0 0;
339
+ }
340
+ }
341
+
342
+ .message-tab {
343
+ display: flex;
344
+ align-items: center;
345
+ gap: 6px;
346
+ }
347
+
348
+ .message-content {
349
+
350
+ .leave-message-component {
351
+ width: 100%;
352
+ }
353
+ }
354
+
355
+ .log-content {
356
+ margin-top: 16px;
357
+ }
358
+
359
+ /deep/ .step-label {
360
+ &:not(:first-child) {
361
+ margin-left: 16px;
362
+ }
363
+
364
+ .step-icon {
365
+ position: relative;
366
+ top: 1px;
367
+ display: inline-block;
368
+ width: 12px;
369
+ height: 12px;
370
+ background: #ffffff;
371
+ border-radius: 50%;
372
+ margin-right: 8px;
373
+
374
+ &.blue {
375
+ border: 3px solid #5B6B8F;
376
+ }
377
+
378
+ &.green {
379
+ border: 3px solid #4CAF50;
380
+ }
381
+
382
+ &.gray {
383
+ border: 3px solid #cfd8e3;
384
+ }
385
+ }
386
+ }
387
+
388
+ :deep(.ant-drawer-wrapper-body) {
389
+ display: flex;
390
+ flex-direction: column;
391
+ }
392
+
393
+ .loading-placeholder {
394
+ display: flex;
395
+ justify-content: center;
396
+ align-items: center;
397
+ height: 300px;
398
+
399
+ /deep/ .ant-spin-text {
400
+ color: #666;
401
+ margin-top: 16px;
402
+ }
403
+ }
404
+ </style>