|
79 | 79 | <v-col v-for="persona in currentPersonas" :key="persona.persona_id" cols="12" sm="6" lg="4" |
80 | 80 | xl="3"> |
81 | 81 | <PersonaCard :persona="persona" @view="viewPersona(persona)" |
82 | | - @edit="editPersona(persona)" @move="openMovePersonaDialog(persona)" |
| 82 | + @edit="editPersona(persona)" @clone="openClonePersonaDialog(persona)" |
| 83 | + @move="openMovePersonaDialog(persona)" |
83 | 84 | @delete="confirmDeletePersona(persona)" /> |
84 | 85 | </v-col> |
85 | 86 | </v-row> |
|
230 | 231 | <MoveToFolderDialog v-model="showMoveDialog" :item-type="moveDialogType" :item="moveDialogItem" |
231 | 232 | @moved="showSuccess" @error="showError" /> |
232 | 233 |
|
| 234 | + <!-- 克隆人格对话框 --> |
| 235 | + <v-dialog v-model="showCloneDialog" max-width="450px"> |
| 236 | + <v-card> |
| 237 | + <v-card-title>{{ tm('cloneDialog.title') }}</v-card-title> |
| 238 | + <v-card-text> |
| 239 | + <p class="text-body-2 text-medium-emphasis mb-4"> |
| 240 | + {{ tm('cloneDialog.description', { name: cloningPersona?.persona_id ?? '' }) }} |
| 241 | + </p> |
| 242 | + <v-text-field v-model="cloneNewPersonaId" :label="tm('cloneDialog.newPersonaId')" |
| 243 | + :hint="tm('cloneDialog.newPersonaIdHint')" persistent-hint variant="outlined" |
| 244 | + density="comfortable" autofocus |
| 245 | + :rules="[v => !!v || tm('cloneDialog.validation.required')]" |
| 246 | + @keyup.enter="submitClonePersona" /> |
| 247 | + </v-card-text> |
| 248 | + <v-card-actions> |
| 249 | + <v-spacer /> |
| 250 | + <v-btn variant="text" @click="showCloneDialog = false"> |
| 251 | + {{ tm('buttons.cancel') }} |
| 252 | + </v-btn> |
| 253 | + <v-btn color="primary" variant="flat" @click="submitClonePersona" :loading="cloneLoading" |
| 254 | + :disabled="!cloneNewPersonaId"> |
| 255 | + {{ tm('buttons.clone') }} |
| 256 | + </v-btn> |
| 257 | + </v-card-actions> |
| 258 | + </v-card> |
| 259 | + </v-dialog> |
| 260 | + |
233 | 261 | <!-- 删除文件夹确认对话框 --> |
234 | 262 | <v-dialog v-model="showDeleteFolderDialog" max-width="450px"> |
235 | 263 | <v-card> |
@@ -340,6 +368,12 @@ export default defineComponent({ |
340 | 368 | moveDialogType: 'persona' as 'persona' | 'folder', |
341 | 369 | moveDialogItem: null as Persona | Folder | null, |
342 | 370 |
|
| 371 | + // 克隆对话框 |
| 372 | + showCloneDialog: false, |
| 373 | + cloningPersona: null as Persona | null, |
| 374 | + cloneNewPersonaId: '', |
| 375 | + cloneLoading: false, |
| 376 | +
|
343 | 377 | // 消息提示 |
344 | 378 | showMessage: false, |
345 | 379 | message: '', |
@@ -406,7 +440,7 @@ export default defineComponent({ |
406 | 440 | await this.initialize(); |
407 | 441 | }, |
408 | 442 | methods: { |
409 | | - ...mapActions(usePersonaStore, ['loadFolderTree', 'navigateToFolder', 'updateFolder', 'deleteFolder', 'deletePersona', 'refreshCurrentFolder', 'movePersonaToFolder']), |
| 443 | + ...mapActions(usePersonaStore, ['loadFolderTree', 'navigateToFolder', 'updateFolder', 'deleteFolder', 'deletePersona', 'refreshCurrentFolder', 'movePersonaToFolder', 'clonePersona']), |
410 | 444 |
|
411 | 445 | async initialize() { |
412 | 446 | await Promise.all([ |
@@ -472,6 +506,27 @@ export default defineComponent({ |
472 | 506 | this.showMoveDialog = true; |
473 | 507 | }, |
474 | 508 |
|
| 509 | + openClonePersonaDialog(persona: Persona) { |
| 510 | + this.cloningPersona = persona; |
| 511 | + this.cloneNewPersonaId = `${persona.persona_id}_copy`; |
| 512 | + this.showCloneDialog = true; |
| 513 | + }, |
| 514 | +
|
| 515 | + async submitClonePersona() { |
| 516 | + if (!this.cloneNewPersonaId || !this.cloningPersona) return; |
| 517 | +
|
| 518 | + this.cloneLoading = true; |
| 519 | + try { |
| 520 | + await this.clonePersona(this.cloningPersona.persona_id, this.cloneNewPersonaId); |
| 521 | + this.showSuccess(this.tm('cloneDialog.success')); |
| 522 | + this.showCloneDialog = false; |
| 523 | + } catch (error: any) { |
| 524 | + this.showError(error.message || this.tm('cloneDialog.error')); |
| 525 | + } finally { |
| 526 | + this.cloneLoading = false; |
| 527 | + } |
| 528 | + }, |
| 529 | +
|
475 | 530 | async handlePersonaDropped({ persona_id, target_folder_id }: { persona_id: string; target_folder_id: string | null }) { |
476 | 531 | try { |
477 | 532 | await this.movePersonaToFolder(persona_id, target_folder_id); |
|
0 commit comments