|
|
|
@ -16,6 +16,7 @@ |
|
|
|
class="header-sub-title" |
|
|
|
:class="{ active: activeUnderstandingSubIndex === idx }" |
|
|
|
@click="activeUnderstandingSubIndex = idx" |
|
|
|
@contextmenu.prevent="onSubTitleContextMenu('understanding', idx, $event)" |
|
|
|
> |
|
|
|
{{ sub }} |
|
|
|
</div> |
|
|
|
@ -24,9 +25,15 @@ |
|
|
|
<i class="el-icon-plus"></i> 插入 |
|
|
|
</el-button> |
|
|
|
<el-dropdown-menu slot="dropdown"> |
|
|
|
<el-dropdown-item command="subTitle"> |
|
|
|
<i class="el-icon-menu"></i> 小标题 |
|
|
|
</el-dropdown-item> |
|
|
|
<el-dropdown-item command="background"> |
|
|
|
<i class="el-icon-picture-outline"></i> 背景 |
|
|
|
</el-dropdown-item> |
|
|
|
<el-dropdown-item command="removeBackground" :disabled="!sixStepsSharedBackground"> |
|
|
|
<i class="el-icon-delete"></i> 删除背景 |
|
|
|
</el-dropdown-item> |
|
|
|
<el-dropdown-item command="icon"> |
|
|
|
<i class="el-icon-s-opportunity"></i> 图标 |
|
|
|
</el-dropdown-item> |
|
|
|
@ -36,15 +43,32 @@ |
|
|
|
</el-dropdown-menu> |
|
|
|
</el-dropdown> |
|
|
|
</template> |
|
|
|
<!-- 任务页:插入按钮 --> |
|
|
|
<el-dropdown v-else-if="overrideTitle === '任务'" trigger="click" @command="handleInsertCommand" class="header-insert"> |
|
|
|
<!-- 后五步(判断、规划、准备、执行、评估):小标题 + 插入按钮 --> |
|
|
|
<template v-else-if="currentStepIndex >= 1 && currentStepIndex <= 5"> |
|
|
|
<div |
|
|
|
v-for="(sub, idx) in getStepContent(currentStepIndex).subTitles" |
|
|
|
:key="idx" |
|
|
|
class="header-sub-title" |
|
|
|
:class="{ active: activeStepSubIndex === idx }" |
|
|
|
@click="activeStepSubIndex = idx" |
|
|
|
@contextmenu.prevent="onSubTitleContextMenu('step', idx, $event)" |
|
|
|
> |
|
|
|
{{ sub }} |
|
|
|
</div> |
|
|
|
<el-dropdown trigger="click" @command="handleStepInsertCommand" class="header-insert"> |
|
|
|
<el-button size="small" type="primary" plain> |
|
|
|
<i class="el-icon-plus"></i> 插入 |
|
|
|
</el-button> |
|
|
|
<el-dropdown-menu slot="dropdown"> |
|
|
|
<el-dropdown-item command="subTitle"> |
|
|
|
<i class="el-icon-menu"></i> 小标题 |
|
|
|
</el-dropdown-item> |
|
|
|
<el-dropdown-item command="background"> |
|
|
|
<i class="el-icon-picture-outline"></i> 背景 |
|
|
|
</el-dropdown-item> |
|
|
|
<el-dropdown-item command="removeBackground" :disabled="!sixStepsSharedBackground"> |
|
|
|
<i class="el-icon-delete"></i> 删除背景 |
|
|
|
</el-dropdown-item> |
|
|
|
<el-dropdown-item command="icon"> |
|
|
|
<i class="el-icon-s-opportunity"></i> 图标 |
|
|
|
</el-dropdown-item> |
|
|
|
@ -53,17 +77,59 @@ |
|
|
|
</el-dropdown-item> |
|
|
|
</el-dropdown-menu> |
|
|
|
</el-dropdown> |
|
|
|
</template> |
|
|
|
<!-- 任务页:小标题 + 插入按钮 --> |
|
|
|
<template v-else-if="overrideTitle === '任务'"> |
|
|
|
<div |
|
|
|
v-for="(sub, idx) in taskSubTitles" |
|
|
|
:key="idx" |
|
|
|
class="header-sub-title" |
|
|
|
:class="{ active: activeTaskSubIndex === idx }" |
|
|
|
@click="activeTaskSubIndex = idx" |
|
|
|
@contextmenu.prevent="onSubTitleContextMenu('task', idx, $event)" |
|
|
|
> |
|
|
|
{{ sub }} |
|
|
|
</div> |
|
|
|
<el-dropdown trigger="click" @command="handleInsertCommand" class="header-insert"> |
|
|
|
<el-button size="small" type="primary" plain> |
|
|
|
<i class="el-icon-plus"></i> 插入 |
|
|
|
</el-button> |
|
|
|
<el-dropdown-menu slot="dropdown"> |
|
|
|
<el-dropdown-item command="subTitle"> |
|
|
|
<i class="el-icon-menu"></i> 小标题 |
|
|
|
</el-dropdown-item> |
|
|
|
<el-dropdown-item command="background"> |
|
|
|
<i class="el-icon-picture-outline"></i> 背景 |
|
|
|
</el-dropdown-item> |
|
|
|
<el-dropdown-item command="removeBackground" :disabled="!taskPageBackground"> |
|
|
|
<i class="el-icon-delete"></i> 删除背景 |
|
|
|
</el-dropdown-item> |
|
|
|
<el-dropdown-item command="icon"> |
|
|
|
<i class="el-icon-s-opportunity"></i> 图标 |
|
|
|
</el-dropdown-item> |
|
|
|
<el-dropdown-item command="textbox"> |
|
|
|
<i class="el-icon-edit-outline"></i> 文本框 |
|
|
|
</el-dropdown-item> |
|
|
|
</el-dropdown-menu> |
|
|
|
</el-dropdown> |
|
|
|
</template> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<div class="overlay-body" :style="overlayBodyStyle"> |
|
|
|
<div class="overlay-content" :class="{ 'task-page': overrideTitle === '任务', 'understanding-page': currentStepIndex === 0 && !overrideTitle }"> |
|
|
|
<div class="overlay-content" :class="{ |
|
|
|
'task-page': overrideTitle === '任务', |
|
|
|
'understanding-page': currentStepIndex === 0 && !overrideTitle, |
|
|
|
'step-page': currentStepIndex >= 1 && currentStepIndex <= 5 |
|
|
|
}"> |
|
|
|
<!-- 任务页:插入工具栏 + 可编辑画布 --> |
|
|
|
<task-page-content |
|
|
|
v-if="overrideTitle === '任务'" |
|
|
|
ref="taskPage" |
|
|
|
:room-id="roomId" |
|
|
|
:background-image="taskPageBackground" |
|
|
|
:task-sub-titles="taskSubTitles" |
|
|
|
@background-change="taskPageBackground = $event" |
|
|
|
@task-sub-titles-change="taskSubTitles = $event" |
|
|
|
class="task-page-body" |
|
|
|
/> |
|
|
|
<!-- 理解步骤:4 子标题 + 可编辑画布 --> |
|
|
|
@ -72,10 +138,21 @@ |
|
|
|
ref="understandingStep" |
|
|
|
:background-image="sixStepsSharedBackground" |
|
|
|
:active-sub-index="activeUnderstandingSubIndex" |
|
|
|
:sub-titles="understandingSubTitles" |
|
|
|
@background-change="sixStepsSharedBackground = $event" |
|
|
|
class="understanding-page-body" |
|
|
|
/> |
|
|
|
<!-- 判断、规划、准备、执行、评估:使用共享背景 --> |
|
|
|
<!-- 判断、规划、准备、执行、评估:可编辑画布,六步共享背景 --> |
|
|
|
<step-canvas-content |
|
|
|
v-else-if="currentStepIndex >= 1 && currentStepIndex <= 5" |
|
|
|
ref="stepCanvas" |
|
|
|
:key="currentStepIndex" |
|
|
|
:content="getStepContent(currentStepIndex)" |
|
|
|
:active-sub-index="activeStepSubIndex" |
|
|
|
:background-image="sixStepsSharedBackground" |
|
|
|
@background-change="sixStepsSharedBackground = $event" |
|
|
|
class="step-canvas-body" |
|
|
|
/> |
|
|
|
<div v-else class="blank-placeholder"> |
|
|
|
<i class="el-icon-document"></i> |
|
|
|
<p>{{ currentStepTitle }} - 内容区域</p> |
|
|
|
@ -84,6 +161,27 @@ |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<!-- 小标题右键菜单 --> |
|
|
|
<div |
|
|
|
v-if="subTitleContextMenu.visible" |
|
|
|
ref="subTitleContextMenuRef" |
|
|
|
class="sub-title-context-menu" |
|
|
|
:style="{ left: subTitleContextMenu.x + 'px', top: subTitleContextMenu.y + 'px' }" |
|
|
|
@click.stop |
|
|
|
> |
|
|
|
<div class="context-menu-item" @click="editSubTitle"> |
|
|
|
<i class="el-icon-edit"></i> |
|
|
|
<span>编辑</span> |
|
|
|
</div> |
|
|
|
<div class="context-menu-item" @click="insertNewPage"> |
|
|
|
<i class="el-icon-document-add"></i> |
|
|
|
<span>插入新的一页</span> |
|
|
|
</div> |
|
|
|
<div class="context-menu-item context-menu-item-danger" @click="deleteSubTitle"> |
|
|
|
<i class="el-icon-delete"></i> |
|
|
|
<span>删除</span> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<!-- 右侧栏:任务 + 1-6 步,垂直排列 --> |
|
|
|
<div class="overlay-sidebar"> |
|
|
|
<div class="sidebar-steps"> |
|
|
|
@ -112,10 +210,21 @@ |
|
|
|
<script> |
|
|
|
import TaskPageContent from './TaskPageContent.vue' |
|
|
|
import UnderstandingStepContent from './UnderstandingStepContent.vue' |
|
|
|
import StepCanvasContent from './StepCanvasContent.vue' |
|
|
|
import { |
|
|
|
createRollCallTextBoxes, |
|
|
|
createSubTitleTemplate, |
|
|
|
createIntentBriefingTemplate, |
|
|
|
createTaskPlanningTemplate, |
|
|
|
createSimpleTitleTemplate, |
|
|
|
SUB_TITLE_TEMPLATE_NAMES, |
|
|
|
SIMPLE_TITLE_NAMES |
|
|
|
} from './rollCallTemplate' |
|
|
|
import { ensurePagesStructure, createEmptySubContent } from './subContentPages' |
|
|
|
|
|
|
|
export default { |
|
|
|
name: 'SixStepsOverlay', |
|
|
|
components: { TaskPageContent, UnderstandingStepContent }, |
|
|
|
components: { TaskPageContent, UnderstandingStepContent, StepCanvasContent }, |
|
|
|
props: { |
|
|
|
roomId: { |
|
|
|
type: [Number, String], |
|
|
|
@ -155,10 +264,35 @@ export default { |
|
|
|
return { |
|
|
|
taskPageBackground: null, |
|
|
|
sixStepsSharedBackground: null, |
|
|
|
understandingSubTitles: ['点名', '接收解析任务', 'XXXX', 'XXXX'], |
|
|
|
activeUnderstandingSubIndex: 0 |
|
|
|
understandingSubTitles: ['点名', '任务目标', '自身任务', '对接任务'], |
|
|
|
activeUnderstandingSubIndex: 0, |
|
|
|
taskSubTitles: [], |
|
|
|
activeTaskSubIndex: 0, |
|
|
|
activeStepSubIndex: 0, |
|
|
|
stepContents: {}, |
|
|
|
subTitleContextMenu: { |
|
|
|
visible: false, |
|
|
|
x: 0, |
|
|
|
y: 0, |
|
|
|
target: null, |
|
|
|
index: -1 |
|
|
|
} |
|
|
|
} |
|
|
|
}, |
|
|
|
watch: { |
|
|
|
currentStepIndex() { |
|
|
|
this.activeStepSubIndex = 0 |
|
|
|
}, |
|
|
|
overrideTitle() { |
|
|
|
this.activeTaskSubIndex = 0 |
|
|
|
} |
|
|
|
}, |
|
|
|
mounted() { |
|
|
|
document.addEventListener('click', this.onDocumentClickForSubTitleMenu) |
|
|
|
}, |
|
|
|
beforeDestroy() { |
|
|
|
document.removeEventListener('click', this.onDocumentClickForSubTitleMenu) |
|
|
|
}, |
|
|
|
computed: { |
|
|
|
currentStepTitle() { |
|
|
|
if (this.overrideTitle) return this.overrideTitle |
|
|
|
@ -166,14 +300,7 @@ export default { |
|
|
|
}, |
|
|
|
overlayBodyStyle() { |
|
|
|
if (this.overrideTitle === '任务') return {} |
|
|
|
if (this.currentStepIndex >= 1 && this.sixStepsSharedBackground) { |
|
|
|
return { |
|
|
|
backgroundImage: `url(${this.sixStepsSharedBackground})`, |
|
|
|
backgroundSize: '100% 100%', |
|
|
|
backgroundPosition: 'center', |
|
|
|
backgroundRepeat: 'no-repeat' |
|
|
|
} |
|
|
|
} |
|
|
|
if (this.currentStepIndex >= 1 && this.currentStepIndex <= 5) return {} |
|
|
|
return {} |
|
|
|
} |
|
|
|
}, |
|
|
|
@ -181,15 +308,209 @@ export default { |
|
|
|
close() { |
|
|
|
this.$emit('close') |
|
|
|
}, |
|
|
|
getStepContent(stepIndex) { |
|
|
|
let step = this.stepContents[stepIndex] |
|
|
|
if (step) { |
|
|
|
if (!step.subContents && step.subTitles) { |
|
|
|
step.subContents = step.subTitles.map(() => createEmptySubContent()) |
|
|
|
if (step.icons?.length || step.textBoxes?.length) { |
|
|
|
step.subContents[0] = createEmptySubContent() |
|
|
|
step.subContents[0].pages[0] = { icons: step.icons || [], textBoxes: step.textBoxes || [] } |
|
|
|
} |
|
|
|
} |
|
|
|
return step |
|
|
|
} |
|
|
|
{ |
|
|
|
const defaultSubTitles = stepIndex === 1 |
|
|
|
? ['相关规定', '敌情', '意图通报', '威胁判断'] |
|
|
|
: stepIndex === 2 |
|
|
|
? ['任务规划', '职责分工', '点名', '第一次进度检查', '点名', '第二次进度检查', '点名', '产品生成'] |
|
|
|
: stepIndex === 3 |
|
|
|
? ['点名', '集体协同'] |
|
|
|
: stepIndex === 4 |
|
|
|
? ['任务执行'] |
|
|
|
: stepIndex === 5 |
|
|
|
? ['评估'] |
|
|
|
: [] |
|
|
|
this.$set(this.stepContents, stepIndex, { |
|
|
|
subTitles: defaultSubTitles, |
|
|
|
subContents: defaultSubTitles.map(() => createEmptySubContent()) |
|
|
|
}) |
|
|
|
return this.stepContents[stepIndex] |
|
|
|
} |
|
|
|
}, |
|
|
|
async addSubTitle(target) { |
|
|
|
try { |
|
|
|
const { value } = await this.$prompt('请输入小标题名称', '插入小标题', { |
|
|
|
confirmButtonText: '确定', |
|
|
|
cancelButtonText: '取消', |
|
|
|
inputValue: '新标题', |
|
|
|
inputPattern: /\S+/, |
|
|
|
inputErrorMessage: '请输入小标题名称' |
|
|
|
}) |
|
|
|
if (value && value.trim()) { |
|
|
|
if (target === 'understanding') { |
|
|
|
this.understandingSubTitles.push(value.trim()) |
|
|
|
} else if (target === 'task') { |
|
|
|
this.taskSubTitles.push(value.trim()) |
|
|
|
} else if (target === 'step') { |
|
|
|
const step = this.getStepContent(this.currentStepIndex) |
|
|
|
step.subTitles.push(value.trim()) |
|
|
|
step.subContents.push(createEmptySubContent()) |
|
|
|
} |
|
|
|
} |
|
|
|
} catch (_) {} |
|
|
|
}, |
|
|
|
handleInsertCommand(cmd) { |
|
|
|
if (cmd === 'subTitle') { |
|
|
|
this.addSubTitle('task') |
|
|
|
return |
|
|
|
} |
|
|
|
if (this.$refs.taskPage) { |
|
|
|
this.$refs.taskPage.handleInsertCommand(cmd) |
|
|
|
} |
|
|
|
}, |
|
|
|
handleUnderstandingInsertCommand(cmd) { |
|
|
|
if (cmd === 'subTitle') { |
|
|
|
this.addSubTitle('understanding') |
|
|
|
return |
|
|
|
} |
|
|
|
if (this.$refs.understandingStep) { |
|
|
|
this.$refs.understandingStep.handleInsertCommand(cmd) |
|
|
|
} |
|
|
|
}, |
|
|
|
handleStepInsertCommand(cmd) { |
|
|
|
if (cmd === 'subTitle') { |
|
|
|
this.addSubTitle('step') |
|
|
|
return |
|
|
|
} |
|
|
|
if (this.$refs.stepCanvas) { |
|
|
|
this.$refs.stepCanvas.handleInsertCommand(cmd) |
|
|
|
} |
|
|
|
}, |
|
|
|
onSubTitleContextMenu(target, index, event) { |
|
|
|
const arr = target === 'understanding' ? this.understandingSubTitles |
|
|
|
: target === 'task' ? this.taskSubTitles |
|
|
|
: this.getStepContent(this.currentStepIndex).subTitles |
|
|
|
const sourceName = arr && arr[index] ? arr[index] : '' |
|
|
|
this.subTitleContextMenu = { |
|
|
|
visible: true, |
|
|
|
x: event.clientX, |
|
|
|
y: event.clientY, |
|
|
|
target, |
|
|
|
index, |
|
|
|
sourceName |
|
|
|
} |
|
|
|
}, |
|
|
|
closeSubTitleContextMenu() { |
|
|
|
this.subTitleContextMenu.visible = false |
|
|
|
}, |
|
|
|
onDocumentClickForSubTitleMenu(e) { |
|
|
|
if (!this.subTitleContextMenu.visible) return |
|
|
|
const el = this.$refs.subTitleContextMenuRef |
|
|
|
if (el && el.contains(e.target)) return |
|
|
|
this.closeSubTitleContextMenu() |
|
|
|
}, |
|
|
|
getSubTitleArray(target) { |
|
|
|
const t = target ?? this.subTitleContextMenu?.target |
|
|
|
if (t === 'understanding') return this.understandingSubTitles |
|
|
|
if (t === 'task') return this.taskSubTitles |
|
|
|
if (t === 'step') return this.getStepContent(this.currentStepIndex).subTitles |
|
|
|
return [] |
|
|
|
}, |
|
|
|
async editSubTitle() { |
|
|
|
const { target, index } = this.subTitleContextMenu |
|
|
|
const arr = this.getSubTitleArray(target) |
|
|
|
this.closeSubTitleContextMenu() |
|
|
|
if (index < 0 || index >= arr.length) return |
|
|
|
try { |
|
|
|
const { value } = await this.$prompt('请输入小标题名称', '编辑小标题', { |
|
|
|
confirmButtonText: '确定', |
|
|
|
cancelButtonText: '取消', |
|
|
|
inputValue: arr[index], |
|
|
|
inputPattern: /\S+/, |
|
|
|
inputErrorMessage: '请输入小标题名称' |
|
|
|
}) |
|
|
|
if (value && value.trim()) { |
|
|
|
this.$set(arr, index, value.trim()) |
|
|
|
} |
|
|
|
} catch (_) {} |
|
|
|
}, |
|
|
|
getTemplateBoxes(sourceName, newName, canvas) { |
|
|
|
const w = canvas ? canvas.offsetWidth : 800 |
|
|
|
const h = canvas ? canvas.offsetHeight : 500 |
|
|
|
if (sourceName === '点名') return createRollCallTextBoxes(w, h) |
|
|
|
if (sourceName === '意图通报') return createIntentBriefingTemplate(w, h) |
|
|
|
if (sourceName === '任务规划') return createTaskPlanningTemplate(w, h) |
|
|
|
if (SIMPLE_TITLE_NAMES.includes(sourceName)) return createSimpleTitleTemplate(newName, w, h) |
|
|
|
if (SUB_TITLE_TEMPLATE_NAMES.includes(sourceName)) return createSubTitleTemplate(newName, w, h) |
|
|
|
return [] |
|
|
|
}, |
|
|
|
async insertNewPage() { |
|
|
|
const { target, index, sourceName } = this.subTitleContextMenu |
|
|
|
this.closeSubTitleContextMenu() |
|
|
|
if (!sourceName) return |
|
|
|
const subIdx = index |
|
|
|
if (target === 'task') { |
|
|
|
this.$message.info('任务页暂不支持多页') |
|
|
|
return |
|
|
|
} |
|
|
|
if (target === 'understanding') { |
|
|
|
this.$nextTick(() => { |
|
|
|
const canvas = this.$refs.understandingStep?.$refs?.canvas |
|
|
|
const boxes = this.getTemplateBoxes(sourceName, sourceName, canvas) |
|
|
|
if (this.$refs.understandingStep) { |
|
|
|
this.$refs.understandingStep.addPageToSubIndex(subIdx, boxes) |
|
|
|
} |
|
|
|
}) |
|
|
|
} else if (target === 'step') { |
|
|
|
const step = this.getStepContent(this.currentStepIndex) |
|
|
|
const sub = step.subContents[subIdx] |
|
|
|
if (!sub) return |
|
|
|
ensurePagesStructure(sub) |
|
|
|
const canvas = this.$refs.stepCanvas?.$refs?.canvas |
|
|
|
const boxes = this.getTemplateBoxes(sourceName, sourceName, canvas) |
|
|
|
sub.pages.push({ icons: [], textBoxes: [...boxes] }) |
|
|
|
sub.currentPageIndex = sub.pages.length - 1 |
|
|
|
} |
|
|
|
}, |
|
|
|
deleteSubTitle() { |
|
|
|
const { target, index } = { ...this.subTitleContextMenu } |
|
|
|
this.closeSubTitleContextMenu() |
|
|
|
const arr = this.getSubTitleArray(target) |
|
|
|
if (index < 0 || index >= arr.length) return |
|
|
|
arr.splice(index, 1) |
|
|
|
if (target === 'step') { |
|
|
|
const step = this.getStepContent(this.currentStepIndex) |
|
|
|
if (step.subContents && step.subContents.length > index) { |
|
|
|
step.subContents.splice(index, 1) |
|
|
|
} |
|
|
|
} |
|
|
|
if (target === 'understanding') { |
|
|
|
if (this.activeUnderstandingSubIndex >= arr.length && arr.length > 0) { |
|
|
|
this.activeUnderstandingSubIndex = arr.length - 1 |
|
|
|
} else if (arr.length === 0) { |
|
|
|
this.activeUnderstandingSubIndex = 0 |
|
|
|
} else if (this.activeUnderstandingSubIndex > index) { |
|
|
|
this.activeUnderstandingSubIndex-- |
|
|
|
} |
|
|
|
} else if (target === 'task') { |
|
|
|
if (this.activeTaskSubIndex >= arr.length && arr.length > 0) { |
|
|
|
this.activeTaskSubIndex = arr.length - 1 |
|
|
|
} else if (arr.length === 0) { |
|
|
|
this.activeTaskSubIndex = 0 |
|
|
|
} else if (this.activeTaskSubIndex > index) { |
|
|
|
this.activeTaskSubIndex-- |
|
|
|
} |
|
|
|
} else if (target === 'step') { |
|
|
|
if (this.activeStepSubIndex >= arr.length && arr.length > 0) { |
|
|
|
this.activeStepSubIndex = arr.length - 1 |
|
|
|
} else if (arr.length === 0) { |
|
|
|
this.activeStepSubIndex = 0 |
|
|
|
} else if (this.activeStepSubIndex > index) { |
|
|
|
this.activeStepSubIndex-- |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
@ -401,13 +722,15 @@ export default { |
|
|
|
height: 100%; |
|
|
|
} |
|
|
|
|
|
|
|
.overlay-content.understanding-page { |
|
|
|
.overlay-content.understanding-page, |
|
|
|
.overlay-content.step-page { |
|
|
|
padding: 0; |
|
|
|
height: 100%; |
|
|
|
} |
|
|
|
|
|
|
|
.task-page-body, |
|
|
|
.understanding-page-body { |
|
|
|
.understanding-page-body, |
|
|
|
.step-canvas-body { |
|
|
|
height: 100%; |
|
|
|
} |
|
|
|
|
|
|
|
@ -436,4 +759,36 @@ export default { |
|
|
|
font-size: 12px; |
|
|
|
color: #cbd5e1; |
|
|
|
} |
|
|
|
|
|
|
|
.sub-title-context-menu { |
|
|
|
position: fixed; |
|
|
|
z-index: 10000; |
|
|
|
min-width: 120px; |
|
|
|
padding: 4px 0; |
|
|
|
background: #fff; |
|
|
|
border-radius: 8px; |
|
|
|
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12); |
|
|
|
border: 1px solid rgba(0, 0, 0, 0.08); |
|
|
|
} |
|
|
|
|
|
|
|
.sub-title-context-menu .context-menu-item { |
|
|
|
display: flex; |
|
|
|
align-items: center; |
|
|
|
gap: 8px; |
|
|
|
padding: 8px 16px; |
|
|
|
font-size: 14px; |
|
|
|
color: #1e293b; |
|
|
|
cursor: pointer; |
|
|
|
transition: background 0.2s; |
|
|
|
} |
|
|
|
|
|
|
|
.sub-title-context-menu .context-menu-item:hover { |
|
|
|
background: rgba(0, 138, 255, 0.08); |
|
|
|
color: #008aff; |
|
|
|
} |
|
|
|
|
|
|
|
.sub-title-context-menu .context-menu-item-danger:hover { |
|
|
|
background: rgba(239, 68, 68, 0.08); |
|
|
|
color: #ef4444; |
|
|
|
} |
|
|
|
</style> |
|
|
|
|