/** * 설문 작성/수정 폼 JavaScript */ let questionCount = 0; const questionTypes = { 'text': '단답형', 'textarea': '장문형', 'radio': '단일선택', 'checkbox': '다중선택', 'select': '드롭다운', 'rating': '평점', 'date': '날짜' }; // 페이지 로드 시 초기화 document.addEventListener('DOMContentLoaded', function() { initSurveyForm(); }); function initSurveyForm() { // 탭 전환 이벤트 initTabs(); // 템플릿 선택 이벤트 initTemplateSelection(); // 폼 검증 이벤트 initFormValidation(); // 기존 질문들의 타입에 따라 옵션 표시 document.querySelectorAll('.question-type-select').forEach(select => { updateQuestionType(select); }); // URL에서 template_id가 있으면 해당 템플릿 자동 선택 const templateId = document.getElementById('templateId')?.value; if (templateId > 0) { const templateCard = document.querySelector(`[data-template="${templateId}"]`); if (templateCard) { templateCard.click(); } } // 질문 개수 초기화 questionCount = document.querySelectorAll('.question-item').length; } // 탭 전환 기능 function initTabs() { document.querySelectorAll('.form-tab').forEach(tab => { tab.addEventListener('click', function() { const targetTab = this.dataset.tab; // 탭 활성화 document.querySelectorAll('.form-tab').forEach(t => t.classList.remove('active')); this.classList.add('active'); // 콘텐츠 표시 document.querySelectorAll('.tab-content').forEach(content => { content.classList.remove('active'); }); document.getElementById(targetTab).classList.add('active'); }); }); } // 템플릿 선택 기능 function initTemplateSelection() { document.querySelectorAll('.template-card').forEach(card => { card.addEventListener('click', function() { document.querySelectorAll('.template-card').forEach(c => c.classList.remove('selected')); this.classList.add('selected'); const templateId = this.dataset.template; document.getElementById('templateId').value = templateId; // 템플릿 질문 로드 if (templateId > 0) { loadTemplateQuestions(templateId); } else { // 직접 작성 선택 시 기존 질문들 초기화 document.getElementById('questionsList').innerHTML = ''; questionCount = 0; } }); }); } // 템플릿 질문 로드 function loadTemplateQuestions(templateId) { fetch(`ajax_get_template.php?st_id=${templateId}`) .then(response => response.json()) .then(data => { if (data.success) { // 기존 질문들 초기화 document.getElementById('questionsList').innerHTML = ''; questionCount = 0; // 템플릿 질문들 추가 data.questions.forEach((question, index) => { addTemplateQuestion(question, index + 1); }); // 기본 정보도 템플릿에서 가져오기 if (data.template.st_name) { document.querySelector('input[name="sv_title"]').value = data.template.st_name; } if (data.template.st_description) { document.querySelector('textarea[name="sv_description"]').value = data.template.st_description; } alert('템플릿이 적용되었습니다. 질문 설정 탭에서 확인해보세요.'); } else { alert('템플릿 로드 실패: ' + data.message); } }) .catch(error => { console.error('Error:', error); alert('템플릿 로드 중 오류가 발생했습니다.'); }); } // 템플릿 질문 추가 function addTemplateQuestion(questionData, questionNumber) { questionCount = questionNumber; const optionsHtml = ['radio', 'checkbox', 'select'].includes(questionData.stq_type) && questionData.stq_options.length > 0 ? `
${questionData.stq_options.map((option, index) => `
`).join('')}
` : ``; const questionHtml = `
${questionNumber}
${optionsHtml}
`; document.getElementById('questionsList').insertAdjacentHTML('beforeend', questionHtml); } // 질문 추가 function addQuestion() { questionCount++; const questionHtml = `
${questionCount}
`; document.getElementById('questionsList').insertAdjacentHTML('beforeend', questionHtml); updateQuestionNumbers(); } // 질문 타입 변경 function updateQuestionType(select) { const questionItem = select.closest('.question-item'); const optionsContainer = questionItem.querySelector('.options-container'); const questionType = select.value; if (['radio', 'checkbox', 'select'].includes(questionType)) { optionsContainer.style.display = 'block'; } else { optionsContainer.style.display = 'none'; } } // 질문 삭제 function removeQuestion(button) { if (confirm('이 질문을 삭제하시겠습니까?')) { button.closest('.question-item').remove(); updateQuestionNumbers(); } } // 질문 순서 변경 function moveQuestion(button, direction) { const questionItem = button.closest('.question-item'); const sibling = direction === 'up' ? questionItem.previousElementSibling : questionItem.nextElementSibling; if (sibling) { if (direction === 'up') { questionItem.parentNode.insertBefore(questionItem, sibling); } else { questionItem.parentNode.insertBefore(sibling, questionItem); } updateQuestionNumbers(); } } // 선택지 추가 function addOption(button) { const optionsList = button.previousElementSibling; const questionIndex = button.closest('.question-item').dataset.questionIndex; const optionCount = optionsList.children.length + 1; const optionHtml = `
`; optionsList.insertAdjacentHTML('beforeend', optionHtml); } // 선택지 삭제 function removeOption(button) { const optionsList = button.closest('.options-list'); if (optionsList.children.length > 2) { button.closest('.option-item').remove(); } else { alert('최소 2개의 선택지가 필요합니다.'); } } // 질문 번호 업데이트 function updateQuestionNumbers() { const questions = document.querySelectorAll('.question-item'); questions.forEach((question, index) => { const number = index + 1; question.querySelector('.question-number').textContent = number; question.dataset.questionIndex = number; // input name 속성 업데이트 const inputs = question.querySelectorAll('input, textarea, select'); inputs.forEach(input => { if (input.name && input.name.includes('questions[')) { input.name = input.name.replace(/questions\[\d+\]/, `questions[${number}]`); } }); }); questionCount = questions.length; } // 폼 검증 function initFormValidation() { document.getElementById('surveyForm').addEventListener('submit', function(e) { const title = document.querySelector('input[name="sv_title"]').value.trim(); const startDate = new Date(document.querySelector('input[name="sv_start_date"]').value); const endDate = new Date(document.querySelector('input[name="sv_end_date"]').value); if (!title) { alert('설문 제목을 입력해주세요.'); e.preventDefault(); return; } if (startDate >= endDate) { alert('종료일시는 시작일시보다 늦어야 합니다.'); e.preventDefault(); return; } const questions = document.querySelectorAll('.question-item'); if (questions.length === 0) { alert('최소 1개의 질문을 추가해주세요.'); e.preventDefault(); return; } // 질문 제목 검증 let hasEmptyQuestion = false; questions.forEach(question => { const titleInput = question.querySelector('input[name*="[title]"]'); if (!titleInput.value.trim()) { hasEmptyQuestion = true; } }); if (hasEmptyQuestion) { alert('모든 질문의 제목을 입력해주세요.'); e.preventDefault(); return; } }); }