feat: paragraph movePosition

This commit is contained in:
teukkk 2025-07-14 15:52:21 +08:00
parent 77af823879
commit 117f882521
5 changed files with 64 additions and 4 deletions

View File

@ -159,6 +159,11 @@ export default {
optimization: 'Model optimization', optimization: 'Model optimization',
directly_return: 'Respond directly', directly_return: 'Respond directly',
}, },
movePosition: {
title: 'Move position',
moveUp: 'Move up',
moveDown: 'Move down'
},
generateQuestion: { generateQuestion: {
title: 'Generate Questions', title: 'Generate Questions',
successMessage: 'Successful', successMessage: 'Successful',

View File

@ -156,6 +156,11 @@ export default {
optimization: '模型优化', optimization: '模型优化',
directly_return: '直接回答', directly_return: '直接回答',
}, },
movePosition: {
title: '移动位置',
moveUp: '上移',
moveDown: '下移',
},
generateQuestion: { generateQuestion: {
title: '生成问题', title: '生成问题',
successMessage: '生成问题成功', successMessage: '生成问题成功',

View File

@ -156,6 +156,11 @@ export default {
optimization: '模型優化', optimization: '模型優化',
directly_return: '直接回答', directly_return: '直接回答',
}, },
movePosition: {
title: '移動位置',
moveUp: '上移',
moveDown: '下移'
},
generateQuestion: { generateQuestion: {
title: '生成問題', title: '生成問題',
successMessage: '生成問題成功', successMessage: '生成問題成功',

View File

@ -42,7 +42,7 @@
<el-icon><MoreFilled /></el-icon> <el-icon><MoreFilled /></el-icon>
</el-button> </el-button>
<template #dropdown> <template #dropdown>
<el-dropdown-menu> <el-dropdown-menu style="min-width: 140px;">
<el-dropdown-item @click.stop="openGenerateDialog(data)"> <el-dropdown-item @click.stop="openGenerateDialog(data)">
<el-icon><Connection /></el-icon> <el-icon><Connection /></el-icon>
{{ $t('views.document.generateQuestion.title') }}</el-dropdown-item {{ $t('views.document.generateQuestion.title') }}</el-dropdown-item
@ -51,6 +51,34 @@
<AppIcon iconName="app-migrate"></AppIcon> <AppIcon iconName="app-migrate"></AppIcon>
{{ $t('views.document.setting.migration') }}</el-dropdown-item {{ $t('views.document.setting.migration') }}</el-dropdown-item
> >
<el-dropdown-item>
<el-dropdown class="w-full" trigger="hover" :show-arrow="false" placement="right-start" popper-class="move-position-popper">
<div class="w-full flex-between" style="line-height: 22px;">
<div class="flex align-center">
<!-- TODO 更换icon -->
<AppIcon iconName="app-migrate"></AppIcon>
{{ $t('views.document.movePosition.title') }}
</div>
<el-icon class="color-input-placeholder" :size="16" style="margin-right: 0;"><ArrowRight /></el-icon>
</div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item
v-if="props.showMoveUp"
@click.stop="emit('move', 'up')"
>
{{ $t('views.document.movePosition.moveUp') }}
</el-dropdown-item>
<el-dropdown-item
v-if="props.showMoveDown"
@click.stop="emit('move', 'down')"
>
{{ $t('views.document.movePosition.moveDown') }}
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</el-dropdown-item>
<el-dropdown-item icon="Delete" @click.stop="deleteParagraph(data)">{{ <el-dropdown-item icon="Delete" @click.stop="deleteParagraph(data)">{{
$t('common.delete') $t('common.delete')
}}</el-dropdown-item> }}</el-dropdown-item>
@ -94,6 +122,8 @@ import { t } from '@/locales'
const props = defineProps<{ const props = defineProps<{
data: any data: any
disabled?: boolean disabled?: boolean
showMoveUp?: boolean
showMoveDown?: boolean
}>() }>()
const route = useRoute() const route = useRoute()
@ -106,7 +136,7 @@ const apiType = computed(() => {
return type as 'systemShare' | 'workspace' | 'systemManage' return type as 'systemShare' | 'workspace' | 'systemManage'
}) })
const emit = defineEmits(['changeState', 'deleteParagraph', 'refresh', 'refreshMigrateParagraph']) const emit = defineEmits(['changeState', 'deleteParagraph', 'refresh', 'refreshMigrateParagraph','move'])
const loading = ref(false) const loading = ref(false)
const changeStateloading = ref(false) const changeStateloading = ref(false)
const show = ref(false) const show = ref(false)
@ -229,3 +259,11 @@ function refreshMigrateParagraph() {
} }
} }
</style> </style>
<style lang="scss">
.move-position-popper {
.el-popper__arrow {
display: none;
}
}
</style>

View File

@ -109,9 +109,12 @@
<ParagraphCard <ParagraphCard
:data="item" :data="item"
:showMoveUp="index !== 0"
:showMoveDown="index < paragraphDetail.length-1"
class="mb-8 w-full" class="mb-8 w-full"
@changeState="changeState" @changeState="changeState"
@deleteParagraph="deleteParagraph" @deleteParagraph="deleteParagraph"
@move="(val: string)=>onEnd(null, {paragraph_id: item.id,new_position: val==='up'?index-1:index+1}, index)"
@refresh="refresh" @refresh="refresh"
@refreshMigrateParagraph="refreshMigrateParagraph" @refreshMigrateParagraph="refreshMigrateParagraph"
:disabled="shareDisabled" :disabled="shareDisabled"
@ -328,8 +331,8 @@ function openGenerateDialog(row?: any) {
GenerateRelatedDialogRef.value.open(arr, 'paragraph') GenerateRelatedDialogRef.value.open(arr, 'paragraph')
} }
function onEnd(event?: any) { function onEnd(event?: any, params?: any, index?: number) {
const obj = { const obj =params ?? {
paragraph_id: paragraphDetail.value[event.newIndex].id, // ID paragraph_id: paragraphDetail.value[event.newIndex].id, // ID
new_position: paragraphDetail.value[event.newIndex + 1].position, // new_position: paragraphDetail.value[event.newIndex + 1].position, //
} }
@ -339,6 +342,10 @@ function onEnd(event?: any) {
obj, obj,
loading, loading,
) )
if(params) {
const movedItem = paragraphDetail.value.splice(index as number, 1)[0]
paragraphDetail.value.splice(params.new_position, 0, movedItem)
}
} }
onMounted(() => { onMounted(() => {