From 8f502f6d4d32977aa26b2bd3a46d320294ef015b Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Tue, 12 Aug 2025 22:19:46 +0900 Subject: [PATCH] =?UTF-8?q?fix(chat):=20=EC=BA=90=EB=A6=AD=ED=84=B0=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80/=EC=88=98=EC=A0=95=20=ED=8F=BC=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=20=EB=B2=84=ED=8A=BC=20=EB=A1=9C=EC=A7=81=20=EB=B0=8F?= =?UTF-8?q?=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 수정 모드 이미지 변경 강제 제거, 시스템 프롬프트 필수 규칙 추가, 저장 버튼 라벨 조건부 표기(저장/수정) - 수정 모드: 변경사항 또는 새 이미지 선택 시에만 저장 활성화, 등록 모드: 유효성만 충족 시 저장 가능 - 왜: 수정 UX 개선 및 필수 입력 요건 충족 --- src/views/Chat/CharacterForm.vue | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/views/Chat/CharacterForm.vue b/src/views/Chat/CharacterForm.vue index c8af1b1..e2dd4b1 100644 --- a/src/views/Chat/CharacterForm.vue +++ b/src/views/Chat/CharacterForm.vue @@ -270,6 +270,7 @@ outlined auto-grow rows="4" + :rules="systemPromptRules" />
- 저장 + {{ isEdit ? '수정' : '저장' }} @@ -994,7 +995,7 @@ export default { v => (v && v.trim().length > 0) || '한 줄 소개를 입력하세요' ], imageRules: [ - v => !this.isEdit || !!v || !!this.character.imageUrl || '이미지를 선택하세요' + v => (this.isEdit ? true : (!!v || '이미지를 선택하세요')) ], genderOptions: ['남성', '여성', '기타'], mbtiOptions: [ @@ -1003,11 +1004,25 @@ export default { 'ISTJ', 'ISFJ', 'ESTJ', 'ESFJ', 'ISTP', 'ISFP', 'ESTP', 'ESFP' ], - typeOptions: ['Clone', 'Character'] + typeOptions: ['Clone', 'Character'], + systemPromptRules: [ + v => (this.isEdit ? true : (!!v && v.trim().length > 0) || '시스템 프롬프트를 입력하세요') + ] } }, computed: { + isSaveDisabled() { + if (this.isLoading) return true; + if (!this.isFormValid) return true; + if (!this.isEdit) return false; // 등록 시에는 변경 감지 없이 유효성만 확인 + + // 수정 시에는 변경 사항이 있는 경우에만 저장 가능 + const changed = this.getChangedFields(); + const hasNonIdField = Object.keys(changed || {}).some(k => k !== 'id'); + const imageChanged = !!this.character.image; // 새 이미지 선택 여부 + return !(hasNonIdField || imageChanged); + } }, watch: {