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: {