aegon-lv97 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/gen-ai/build-report/chartStreamRefs.ts +227 -0
  2. package/gen-ai/build-report/coherence-check/index.vue +559 -0
  3. package/gen-ai/build-report/components/ReportChapterWorkspace.vue +4571 -0
  4. package/gen-ai/build-report/components/ReportConfigPanel.vue +727 -0
  5. package/gen-ai/build-report/components/ReportGenerateSettingsPanel.vue +2361 -0
  6. package/gen-ai/build-report/components/ReportGeneratingPanel.vue +1765 -0
  7. package/gen-ai/build-report/components/ReportPromptPanel.vue +625 -0
  8. package/gen-ai/build-report/components/ReportSourceFileSummary.vue +665 -0
  9. package/gen-ai/build-report/components/ReportSourcesPanel.vue +1327 -0
  10. package/gen-ai/build-report/components/ReportTemplateDetail.vue +191 -0
  11. package/gen-ai/build-report/components/ReportTemplateEditorFormPanel.vue +667 -0
  12. package/gen-ai/build-report/components/ReportTemplatePicker.vue +302 -0
  13. package/gen-ai/build-report/components/ReportWorkflowSidebar.vue +148 -0
  14. package/gen-ai/build-report/components/paramsSetting.vue +886 -0
  15. package/gen-ai/build-report/components/reportEdit.vue +2283 -0
  16. package/gen-ai/build-report/index.vue +856 -0
  17. package/gen-ai/build-report/report-domain.ts +1133 -0
  18. package/gen-ai/build-report/report-template-data.ts +295 -0
  19. package/gen-ai/build-report/useReportWorkflow.ts +1386 -0
  20. package/gen-ai/common/assets/NotoSans-SC.woff2 +0 -0
  21. package/gen-ai/common/assets/NotoSans-TC.woff2 +0 -0
  22. package/gen-ai/common/assets/NotoSans.woff2 +0 -0
  23. package/gen-ai/common/assets/fonts.css +278 -0
  24. package/gen-ai/common/assets/pagination.css +163 -0
  25. package/gen-ai/common/directives/btnLoading.ts +455 -0
  26. package/gen-ai/common/directives/debounce.ts +98 -0
  27. package/gen-ai/common/directives/index.ts +30 -0
  28. package/gen-ai/common/en.md +417 -0
  29. package/gen-ai/common/index.ts +36 -0
  30. package/gen-ai/common/types/component-expose.ts +9 -0
  31. package/gen-ai/common/utils/api-res-status.ts +7 -0
  32. package/gen-ai/common/utils/navigation.ts +59 -0
  33. package/gen-ai/common/utils/remote-request.ts +45 -0
  34. package/gen-ai/common/utils/scroll.ts +577 -0
  35. package/gen-ai/components/AIExport/docx-export.ts +950 -0
  36. package/gen-ai/components/AIExport/docxExport.ts +2566 -0
  37. package/gen-ai/components/AIExport/index.ts +52 -0
  38. package/gen-ai/components/AIExport/parseMarkdownHtml.ts +653 -0
  39. package/gen-ai/components/CapsuleScrollbar.vue +149 -0
  40. package/gen-ai/components/ChapterTitleScroll.vue +468 -0
  41. package/gen-ai/components/EntryHeroNavCards.vue +379 -0
  42. package/gen-ai/components/GenAiPagination.vue +52 -0
  43. package/gen-ai/components/ModelCard.vue +1114 -0
  44. package/gen-ai/components/Preview/FilePreviewPage.vue +949 -0
  45. package/gen-ai/components/Preview/PreviewCapsuleScroll.vue +205 -0
  46. package/gen-ai/components/Preview/PreviewOutlineTree.vue +148 -0
  47. package/gen-ai/components/Preview/index.ts +11 -0
  48. package/gen-ai/components/Preview/preview.ts +724 -0
  49. package/gen-ai/components/PromptField.vue +505 -0
  50. package/gen-ai/components/RecentReportsTable.vue +974 -0
  51. package/gen-ai/components/ReportCollapsibleSection.vue +172 -0
  52. package/gen-ai/components/ReportHistoryList.vue +637 -0
  53. package/gen-ai/components/ReportSectionConfirmPopover.vue +251 -0
  54. package/gen-ai/components/editor/ChapterTiptapEditor.vue +3718 -0
  55. package/gen-ai/components/editor/StructureBlockView.vue +441 -0
  56. package/gen-ai/components/editor/TiptapToolbar.vue +1036 -0
  57. package/gen-ai/components/editor/TypewriterDocEditor.vue +422 -0
  58. package/gen-ai/components/editor/_StructureOrgNode.vue +326 -0
  59. package/gen-ai/components/editor/index.ts +28 -0
  60. package/gen-ai/components/editor/parseMarkdownHtml.ts +754 -0
  61. package/gen-ai/components/editor/reviewCitationTip.ts +163 -0
  62. package/gen-ai/gen-entry/api/index.ts +32 -0
  63. package/gen-ai/gen-entry/index.vue +287 -0
  64. package/gen-ai/gen-entry/types/index.ts +4 -0
  65. package/gen-ai/i.mark +2 -0
  66. package/gen-ai/management-center/index.vue +1815 -0
  67. package/gen-ai/management-center/mockData.ts +248 -0
  68. package/gen-ai/management-center/types/index.ts +37 -0
  69. package/gen-ai/model-manager/TemplateEditorFormPanel.vue +661 -0
  70. package/gen-ai/model-manager/api/index.ts +32 -0
  71. package/gen-ai/model-manager/api/mockApi.ts +33 -0
  72. package/gen-ai/model-manager/index.vue +1583 -0
  73. package/gen-ai/model-manager/mockData.ts +177 -0
  74. package/gen-ai/model-manager/template-detail-shared.ts +154 -0
  75. package/gen-ai/model-manager/template-editor.vue +345 -0
  76. package/gen-ai/model-manager/types/index.ts +40 -0
  77. package/gen-ai/model-manager/utils.ts +25 -0
  78. package/package.json +12 -0
@@ -0,0 +1,665 @@
1
+ <template>
2
+ <ReportCollapsibleSection
3
+ ref="sectionRef"
4
+ v-model:open="panelOpen"
5
+ title="編輯者"
6
+ card-hover
7
+ @before-collapse="handleBeforeCollapse"
8
+ >
9
+ <template #actions>
10
+ <button
11
+ v-if="canManageReportEditors"
12
+ ref="addBtnRef"
13
+ type="button"
14
+ class="report-icon-btn"
15
+ aria-label="添加"
16
+ @click.stop="toggleAddOpen"
17
+ >
18
+ <el-icon>
19
+ <Plus />
20
+ </el-icon>
21
+ </button>
22
+ <button
23
+ v-if="canManageReportEditors"
24
+ ref="shareBtnRef"
25
+ type="button"
26
+ class="report-icon-btn"
27
+ aria-label="轉移發起人"
28
+ @click.stop="toggleShareOpen"
29
+ >
30
+ <el-icon>
31
+ <Share />
32
+ </el-icon>
33
+ </button>
34
+ </template>
35
+
36
+ <div class="report-editor-panel">
37
+ <ul class="report-editor-list">
38
+ <li v-for="editor in editors" :key="editor.id" class="report-editor-list__row">
39
+ <span class="report-editor-list__name" :title="`${editor.name}(${editor.employeeId})`">
40
+ {{ editor.name }}({{ editor.employeeId }})
41
+ </span>
42
+ <span class="report-editor-list__dept">{{ editor.department }}</span>
43
+ <span class="report-editor-list__role">{{ editorRoleLabel(editor.role) }}</span>
44
+ <span class="report-editor-list__action">
45
+ <button
46
+ v-if="canManageReportEditors && editor.role !== 'initiator'"
47
+ type="button"
48
+ class="report-icon-btn"
49
+ :aria-label="`移除${editor.name}`"
50
+ @click="requestRemoveEditor(editor, $event)"
51
+ >
52
+ <el-icon>
53
+ <Close />
54
+ </el-icon>
55
+ </button>
56
+ </span>
57
+ </li>
58
+ </ul>
59
+ </div>
60
+ </ReportCollapsibleSection>
61
+
62
+ <el-popover
63
+ :visible="addOpen"
64
+ :virtual-ref="shareToggleRef"
65
+ placement="bottom-start"
66
+ :width="popoverWidth"
67
+ :popper-options="popperOptions"
68
+ :popper-style="addPopperStyle"
69
+ popper-class="report-config-popover"
70
+ :transition="popoverInstant ? 'report-config-popover-instant' : 'report-config-popover-fade'"
71
+ :gpu-acceleration="false"
72
+ :teleported="true"
73
+ >
74
+ <div class="report-source-transfer">
75
+ <h4 class="report-source-transfer__title">添加編輯者</h4>
76
+ <label class="report-source-transfer__field">
77
+ <span class="report-source-transfer__label">用戶</span>
78
+ <el-select
79
+ v-model="addSelectedUser"
80
+ class="report-source-transfer__select"
81
+ filterable
82
+ clearable
83
+ placeholder="請選擇用戶"
84
+ >
85
+ <el-option
86
+ v-for="user in addEditorOptions"
87
+ :key="user.id"
88
+ :label="`${user.name}(${user.employeeId})`"
89
+ :value="user.id"
90
+ />
91
+ </el-select>
92
+ </label>
93
+ <div class="report-source-transfer__actions">
94
+ <button type="button" class="report-source-transfer__btn" @click="addOpen = false">
95
+ 取消
96
+ </button>
97
+ <button
98
+ type="button"
99
+ class="report-source-transfer__btn report-source-transfer__btn--primary"
100
+ @click="confirmAdd"
101
+ >
102
+ 確認
103
+ </button>
104
+ </div>
105
+ </div>
106
+ </el-popover>
107
+
108
+ <el-popover
109
+ :visible="shareOpen"
110
+ :virtual-ref="shareToggleRef"
111
+ placement="bottom-start"
112
+ :width="popoverWidth"
113
+ :popper-options="popperOptions"
114
+ :popper-style="sharePopperStyle"
115
+ popper-class="report-config-popover"
116
+ :transition="popoverInstant ? 'report-config-popover-instant' : 'report-config-popover-fade'"
117
+ :gpu-acceleration="false"
118
+ :teleported="true"
119
+ >
120
+ <div class="report-source-transfer">
121
+ <h4 class="report-source-transfer__title">轉移報告發起人權限</h4>
122
+ <label class="report-source-transfer__field">
123
+ <span class="report-source-transfer__label">用戶</span>
124
+ <el-select
125
+ v-model="transferSelectedUser"
126
+ class="report-source-transfer__select"
127
+ filterable
128
+ clearable
129
+ placeholder="請選擇用戶"
130
+ >
131
+ <el-option
132
+ v-for="user in transferUserOptions"
133
+ :key="user.id"
134
+ :label="`${user.name}(${user.employeeId})`"
135
+ :value="user.id"
136
+ />
137
+ </el-select>
138
+ </label>
139
+ <div class="report-source-transfer__actions">
140
+ <button type="button" class="report-source-transfer__btn" @click="shareOpen = false">
141
+ 取消
142
+ </button>
143
+ <button
144
+ type="button"
145
+ class="report-source-transfer__btn report-source-transfer__btn--primary"
146
+ @click="confirmTransfer"
147
+ >
148
+ 確認
149
+ </button>
150
+ </div>
151
+ </div>
152
+ </el-popover>
153
+
154
+ <ReportSectionConfirmPopover
155
+ :visible="deleteConfirmOpen"
156
+ :virtual-ref="deleteConfirmVirtualRef"
157
+ :boundary-el="sectionBoundaryEl"
158
+ :trigger-btn="deleteConfirmTriggerBtn"
159
+ :message="deleteConfirmMessage"
160
+ :instant="popoverInstant"
161
+ @confirm="confirmRemoveEditor"
162
+ @cancel="closeDeleteConfirm"
163
+ />
164
+ </template>
165
+
166
+ <script setup lang="ts">
167
+ import { Close, Plus, Share } from '@element-plus/icons-vue'
168
+ import { ElIcon, ElMessage, ElOption, ElPopover, ElSelect } from 'element-plus'
169
+ import { computed, nextTick, onMounted, onUnmounted, ref, watch } from 'vue'
170
+ import {
171
+ //0917-1:原 MOCK_UMS_EDITOR_USERS 改名同步
172
+ UMS_EDITOR_CANDIDATES,
173
+ //0917-1
174
+ type ReportEditor,
175
+ type ReportEditorRole,
176
+ } from '../useReportWorkflow'
177
+ import { useReportWorkflow } from '../useReportWorkflow'
178
+ import { ReportCollapsibleSection, ReportSectionConfirmPopover } from '../../common'
179
+ const workflow = useReportWorkflow()
180
+ const { reportEditors, canManageReportEditors } = workflow
181
+
182
+ const editors = reportEditors
183
+ const addOpen = ref(false)
184
+ const shareOpen = ref(false)
185
+ const popoverInstant = ref(false)
186
+ const addSelectedUser = ref('')
187
+ const transferSelectedUser = ref('')
188
+
189
+ const addBtnRef = ref<HTMLElement | null>(null)
190
+ const shareBtnRef = ref<HTMLElement | null>(null)
191
+ const sectionRef = ref<InstanceType<typeof ReportCollapsibleSection> | null>(null)
192
+
193
+ const shareToggleRef = computed(() => sectionRef.value?.toggleRef ?? null)
194
+
195
+ const popoverWidthPx = ref(240)
196
+ const arrowAlignKey = ref(0)
197
+ const popoverWidth = computed(() => popoverWidthPx.value)
198
+
199
+ const addEditorOptions = computed(() => {
200
+ const existingIds = new Set(editors.value.map((editor) => editor.employeeId))
201
+ //0917-1:原 MOCK_UMS_EDITOR_USERS 引用
202
+ return UMS_EDITOR_CANDIDATES.filter((user) => !existingIds.has(user.employeeId))
203
+ })
204
+
205
+ const transferUserOptions = computed(() => {
206
+ const currentInitiator = editors.value.find((editor) => editor.role === 'initiator')
207
+ //0917-1:原 MOCK_UMS_EDITOR_USERS 引用
208
+ const candidates = new Map<string, (typeof UMS_EDITOR_CANDIDATES)[number]>()
209
+
210
+ for (const user of UMS_EDITOR_CANDIDATES) {
211
+ if (user.id !== currentInitiator?.id) {
212
+ candidates.set(user.id, user)
213
+ }
214
+ }
215
+ //0917-1
216
+ for (const editor of editors.value) {
217
+ if (editor.id !== currentInitiator?.id) {
218
+ candidates.set(editor.id, {
219
+ id: editor.id,
220
+ name: editor.name,
221
+ employeeId: editor.employeeId,
222
+ department: editor.department,
223
+ })
224
+ }
225
+ }
226
+
227
+ return Array.from(candidates.values())
228
+ })
229
+
230
+ const panelOpen = ref(true)
231
+
232
+ const deleteConfirmOpen = ref(false)
233
+ const deleteConfirmMessage = ref('')
234
+ const deleteConfirmVirtualRef = ref<HTMLElement | null>(null)
235
+ const deleteConfirmTriggerBtn = ref<HTMLElement | null>(null)
236
+ const deleteTargetId = ref<string | null>(null)
237
+
238
+ const sectionBoundaryEl = computed(() => sectionRef.value?.rootRef ?? null)
239
+
240
+ function editorRoleLabel(role: ReportEditorRole) {
241
+ return role === 'initiator' ? '發起人' : '編輯者'
242
+ }
243
+
244
+ function requestRemoveEditor(editor: ReportEditor, event: MouseEvent) {
245
+ if (!canManageReportEditors.value) return
246
+ const btn = event.currentTarget as HTMLElement
247
+ deleteConfirmVirtualRef.value = (btn.closest('.report-editor-list__row') as HTMLElement) ?? btn
248
+ deleteConfirmTriggerBtn.value = btn
249
+ deleteTargetId.value = editor.id
250
+ deleteConfirmMessage.value = `確定刪除「${editor.name}(${editor.employeeId})」?`
251
+ deleteConfirmOpen.value = true
252
+ }
253
+
254
+ function confirmRemoveEditor() {
255
+ if (deleteTargetId.value) {
256
+ editors.value = editors.value.filter((item) => item.id !== deleteTargetId.value)
257
+ }
258
+ closeDeleteConfirm()
259
+ }
260
+
261
+ function closeDeleteConfirm() {
262
+ deleteConfirmOpen.value = false
263
+ deleteTargetId.value = null
264
+ }
265
+
266
+ function hasOpenOverlays() {
267
+ return addOpen.value || shareOpen.value || deleteConfirmOpen.value
268
+ }
269
+
270
+ function closeAllOverlays() {
271
+ addOpen.value = false
272
+ shareOpen.value = false
273
+ deleteConfirmOpen.value = false
274
+ deleteTargetId.value = null
275
+ }
276
+
277
+ function handleBeforeCollapse(done: (hadOpenOverlays: boolean) => void) {
278
+ const hadOpen = hasOpenOverlays()
279
+ if (hadOpen) {
280
+ popoverInstant.value = true
281
+ closeAllOverlays()
282
+ window.setTimeout(() => {
283
+ popoverInstant.value = false
284
+ }, 320)
285
+ }
286
+ done(hadOpen)
287
+ }
288
+
289
+ function getSectionContentWidth() {
290
+ const sectionEl = sectionRef.value?.rootRef
291
+ if (!sectionEl) return 240
292
+ const styles = getComputedStyle(sectionEl)
293
+ const paddingX = parseFloat(styles.paddingLeft) + parseFloat(styles.paddingRight)
294
+ return Math.round(sectionEl.clientWidth - paddingX)
295
+ }
296
+
297
+ function getArrowPopperStyle(triggerBtn: HTMLElement | null): Record<string, string> {
298
+ void arrowAlignKey.value
299
+ void panelOpen.value
300
+ const sectionEl = sectionRef.value?.rootRef
301
+ if (!triggerBtn || !sectionEl) return {}
302
+ const sectionRect = sectionEl.getBoundingClientRect()
303
+ const paddingLeft = parseFloat(getComputedStyle(sectionEl).paddingLeft)
304
+ const btnRect = triggerBtn.getBoundingClientRect()
305
+ const left = btnRect.left + btnRect.width / 2 - sectionRect.left - paddingLeft - 8
306
+ return { '--report-config-arrow-left': `${left}px` }
307
+ }
308
+
309
+ const addPopperStyle = computed(() => getArrowPopperStyle(addBtnRef.value))
310
+
311
+ const sharePopperStyle = computed(() => getArrowPopperStyle(shareBtnRef.value))
312
+
313
+ const popperOptions = computed(() => {
314
+ const boundary = sectionRef.value?.rootRef
315
+ return {
316
+ modifiers: [
317
+ {
318
+ name: 'preventOverflow',
319
+ options: {
320
+ boundary: boundary ?? 'viewport',
321
+ padding: 0,
322
+ altAxis: true,
323
+ },
324
+ },
325
+ {
326
+ name: 'flip',
327
+ enabled: false,
328
+ },
329
+ ],
330
+ }
331
+ })
332
+
333
+ function syncPopoverWidth() {
334
+ popoverWidthPx.value = getSectionContentWidth()
335
+ arrowAlignKey.value += 1
336
+ }
337
+
338
+ function toggleAddOpen() {
339
+ if (!canManageReportEditors.value) return
340
+ syncPopoverWidth()
341
+ shareOpen.value = false
342
+ addOpen.value = !addOpen.value
343
+ if (addOpen.value) {
344
+ void nextTick(() => {
345
+ arrowAlignKey.value += 1
346
+ })
347
+ }
348
+ }
349
+
350
+ function toggleShareOpen() {
351
+ if (!canManageReportEditors.value) return
352
+ syncPopoverWidth()
353
+ addOpen.value = false
354
+ shareOpen.value = !shareOpen.value
355
+ if (shareOpen.value) {
356
+ void nextTick(() => {
357
+ arrowAlignKey.value += 1
358
+ })
359
+ }
360
+ }
361
+
362
+ function confirmAdd() {
363
+ if (!canManageReportEditors.value) {
364
+ addOpen.value = false
365
+ return
366
+ }
367
+
368
+ //0917-1:原 MOCK_UMS_EDITOR_USERS 引用
369
+ const candidate = UMS_EDITOR_CANDIDATES.find((user) => user.id === addSelectedUser.value)
370
+ //0917-1
371
+ if (!candidate) {
372
+ addOpen.value = false
373
+ return
374
+ }
375
+
376
+ const alreadyExists = editors.value.some((editor) => editor.employeeId === candidate.employeeId)
377
+ if (alreadyExists) {
378
+ ElMessage.warning('該用戶已是報告編輯者')
379
+ addOpen.value = false
380
+ addSelectedUser.value = ''
381
+ return
382
+ }
383
+
384
+ editors.value.push({
385
+ id: candidate.id,
386
+ name: candidate.name,
387
+ employeeId: candidate.employeeId,
388
+ department: candidate.department,
389
+ role: 'editor',
390
+ })
391
+ addSelectedUser.value = ''
392
+ addOpen.value = false
393
+ ElMessage.success('已添加編輯者')
394
+ }
395
+
396
+ function confirmTransfer() {
397
+ if (!canManageReportEditors.value) {
398
+ shareOpen.value = false
399
+ return
400
+ }
401
+
402
+ const targetId = transferSelectedUser.value
403
+ if (!targetId) {
404
+ shareOpen.value = false
405
+ return
406
+ }
407
+
408
+ const currentInitiator = editors.value.find((editor) => editor.role === 'initiator')
409
+ let target = editors.value.find((editor) => editor.id === targetId)
410
+
411
+ if (!target) {
412
+ //0917-1:原 MOCK_UMS_EDITOR_USERS 引用
413
+ const umsUser = UMS_EDITOR_CANDIDATES.find((user) => user.id === targetId)
414
+ //0917-1
415
+ if (!umsUser) {
416
+ shareOpen.value = false
417
+ return
418
+ }
419
+ target = {
420
+ id: umsUser.id,
421
+ name: umsUser.name,
422
+ employeeId: umsUser.employeeId,
423
+ department: umsUser.department,
424
+ role: 'editor',
425
+ }
426
+ editors.value.push(target)
427
+ }
428
+
429
+ if (currentInitiator) {
430
+ currentInitiator.role = 'editor'
431
+ }
432
+ target.role = 'initiator'
433
+
434
+ transferSelectedUser.value = ''
435
+ shareOpen.value = false
436
+ ElMessage.success('已轉移報告發起人權限')
437
+ }
438
+
439
+ watch(panelOpen, (open) => {
440
+ if (!open) closeAllOverlays()
441
+ })
442
+
443
+ let sectionResizeObserver: ResizeObserver | null = null
444
+
445
+ onMounted(() => {
446
+ void nextTick(() => {
447
+ syncPopoverWidth()
448
+ const sectionEl = sectionRef.value?.rootRef
449
+ if (sectionEl) {
450
+ sectionResizeObserver = new ResizeObserver(() => syncPopoverWidth())
451
+ sectionResizeObserver.observe(sectionEl)
452
+ }
453
+ })
454
+ window.addEventListener('resize', syncPopoverWidth)
455
+ })
456
+
457
+ onUnmounted(() => {
458
+ window.removeEventListener('resize', syncPopoverWidth)
459
+ sectionResizeObserver?.disconnect()
460
+ })
461
+ </script>
462
+
463
+ <style scoped>
464
+ .report-editor-panel {
465
+ box-sizing: border-box;
466
+ }
467
+
468
+ .report-editor-list {
469
+ margin: 0;
470
+ padding: 0;
471
+ list-style: none;
472
+ max-height: calc(36px * 20);
473
+ overflow-x: hidden;
474
+ overflow-y: auto;
475
+ scrollbar-width: thin;
476
+ scrollbar-color: #999 transparent;
477
+ }
478
+
479
+ .report-editor-list::-webkit-scrollbar {
480
+ width: 3px !important;
481
+ height: 8px !important;
482
+ }
483
+
484
+ .report-editor-list::-webkit-scrollbar-track {
485
+ background: transparent !important;
486
+ }
487
+
488
+ .report-editor-list::-webkit-scrollbar-thumb {
489
+ width: 3px !important;
490
+ min-height: 8px !important;
491
+ border-radius: 4px;
492
+ background-color: #999 !important;
493
+ }
494
+
495
+ .report-editor-list::-webkit-scrollbar-corner {
496
+ background: transparent !important;
497
+ }
498
+
499
+ .report-editor-list__row {
500
+ display: grid;
501
+ grid-template-columns: minmax(0, 1fr) auto auto 24px;
502
+ align-items: center;
503
+ gap: 10px;
504
+ height: 36px;
505
+ padding: 0 10px;
506
+ border-radius: 4px;
507
+ font-size: 12px;
508
+ line-height: 1.5;
509
+ color: #303133;
510
+ background: #fff;
511
+ box-sizing: border-box;
512
+ }
513
+
514
+ .report-editor-list__name {
515
+ overflow: hidden;
516
+ text-overflow: ellipsis;
517
+ white-space: nowrap;
518
+ }
519
+
520
+ .report-editor-list__dept,
521
+ .report-editor-list__role {
522
+ white-space: nowrap;
523
+ color: #303133;
524
+ }
525
+
526
+ .report-editor-list__action {
527
+ display: flex;
528
+ justify-content: flex-end;
529
+ }
530
+
531
+ .report-source-transfer__title {
532
+ margin: 0 0 12px;
533
+ font-size: 14px;
534
+ font-weight: 700;
535
+ color: #303133;
536
+ }
537
+
538
+ .report-source-transfer__field {
539
+ display: grid;
540
+ gap: 6px;
541
+ }
542
+
543
+ .report-source-transfer__label {
544
+ font-size: 13px;
545
+ color: #909399;
546
+ }
547
+
548
+ .report-source-transfer__select {
549
+ width: 100%;
550
+ }
551
+
552
+ .report-source-transfer__select :deep(.el-select__wrapper) {
553
+ min-height: 32px;
554
+ }
555
+
556
+ .report-source-transfer__actions {
557
+ display: flex;
558
+ justify-content: flex-end;
559
+ gap: 8px;
560
+ margin-top: 12px;
561
+ }
562
+
563
+ .report-source-transfer__btn {
564
+ min-width: 72px;
565
+ padding: 6px 10px;
566
+ border: 1px solid #dcdfe6;
567
+ border-radius: 4px;
568
+ background: #fff;
569
+ font-size: 12px;
570
+ color: #606266;
571
+ cursor: pointer;
572
+ }
573
+
574
+ .report-source-transfer__btn--primary {
575
+ border-color: #c53355;
576
+ background: #c53355;
577
+ color: #fff;
578
+ }
579
+
580
+ .report-source-transfer__btn--primary:hover {
581
+ background: #fff;
582
+ color: #c53355;
583
+ }
584
+ </style>
585
+
586
+ <style>
587
+ /* 編輯者列表滾動條強制尺寸(避免 scoped 未生效) */
588
+ .report-editor-list::-webkit-scrollbar {
589
+ width: 3px !important;
590
+ height: 8px !important;
591
+ }
592
+
593
+ .report-editor-list::-webkit-scrollbar-track {
594
+ background: transparent !important;
595
+ }
596
+
597
+ .report-editor-list::-webkit-scrollbar-thumb {
598
+ width: 3px !important;
599
+ min-height: 8px !important;
600
+ border-radius: 4px;
601
+ background-color: #999 !important;
602
+ }
603
+
604
+ .report-editor-list::-webkit-scrollbar-corner {
605
+ background: transparent !important;
606
+ }
607
+
608
+ .report-icon-btn {
609
+ display: inline-flex;
610
+ align-items: center;
611
+ justify-content: center;
612
+ width: 24px;
613
+ height: 24px;
614
+ padding: 0;
615
+ border: 0;
616
+ background: none;
617
+ color: #4e5969;
618
+ cursor: pointer;
619
+ border-radius: 4px;
620
+ vertical-align: middle;
621
+ }
622
+
623
+ .report-icon-btn:hover {
624
+ color: #c53355;
625
+ background: #fff5f6;
626
+ }
627
+
628
+ .report-config-popover.el-popover.el-popper {
629
+ max-width: 100%;
630
+ padding: 12px;
631
+ box-sizing: border-box;
632
+ overflow: hidden;
633
+ }
634
+
635
+ .report-config-popover.el-popper[data-popper-placement^='bottom'] .el-popper__arrow {
636
+ left: var(--report-config-arrow-left) !important;
637
+ right: auto !important;
638
+ top: -6px !important;
639
+ transform: translateX(-50%) !important;
640
+ }
641
+
642
+ .report-config-popover.el-popper[data-popper-placement^='bottom'] .el-popper__arrow::before {
643
+ bottom: -1px;
644
+ }
645
+
646
+ .report-config-popover-fade-enter-active,
647
+ .report-config-popover-fade-leave-active {
648
+ transition: opacity 0.12s ease;
649
+ }
650
+
651
+ .report-config-popover-fade-enter-from,
652
+ .report-config-popover-fade-leave-to {
653
+ opacity: 0;
654
+ }
655
+
656
+ .report-config-popover-instant-enter-active,
657
+ .report-config-popover-instant-leave-active {
658
+ transition: none !important;
659
+ }
660
+
661
+ .report-config-popover-instant-enter-from,
662
+ .report-config-popover-instant-leave-to {
663
+ opacity: 0;
664
+ }
665
+ </style>