OLDBOY/skin/board/oldboy_setting/write.skin.php
<?php
if (!defined('_GNUBOARD_')) exit;

include_once("{$board_skin_path}/db_update.php");
add_stylesheet('<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">', 0);
add_stylesheet('<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@300;400;500;700&display=swap">', 0);
add_stylesheet('<link rel="stylesheet" href="'.$board_skin_url.'/style.write.css">', 0);
add_stylesheet('<link rel="stylesheet" href="'.$board_skin_url.'/style.css">', 0);

// 중분류/소분류 배열 생성 (bo_1, bo_2 활용)
$mid_category_list = explode('|', $board['bo_1']);
$sub_category_list = explode('|', $board['bo_2']);
?>

<section id="bo_w">
    <div class="write-container">
        <form name="fwrite" id="fwrite" action="<?php echo $action_url ?>" onsubmit="return fwrite_submit(this);" method="post" enctype="multipart/form-data" autocomplete="off">
            <input type="hidden" name="w" value="<?php echo $w ?>">
            <input type="hidden" name="bo_table" value="<?php echo $bo_table ?>">
            <input type="hidden" name="wr_id" value="<?php echo $wr_id ?>">

            <div class="frm_row">
                <div class="frm_label">분류 설정</div>
                <div class="frm_content" style="display:flex; gap:12px; align-items:center;">
                    <?php if ($is_category) { ?>
                    <select name="ca_name" id="ca_name" required class="frm_select" style="width:180px;">
                        <option value="">대분류 선택</option>
                        <?php echo $category_option ?>
                    </select>
                    <?php } ?>
                    
                    <select name="as_mid_cat" class="frm_select" style="width:180px;">
                        <option value="">중분류 선택</option>
                        <?php foreach($mid_category_list as $m) { if(!trim($m)) continue; ?>
                            <option value="<?php echo $m; ?>" <?php echo ($write['as_mid_cat'] == $m) ? "selected" : ""; ?>><?php echo $m; ?></option>
                        <?php } ?>
                    </select>

                    <select name="as_sub_cat" class="frm_select" style="width:180px;">
                        <option value="">소분류 선택</option>
                        <?php foreach($sub_category_list as $s) { if(!trim($s)) continue; ?>
                            <option value="<?php echo $s; ?>" <?php echo ($write['as_sub_cat'] == $s) ? "selected" : ""; ?>><?php echo $s; ?></option>
                        <?php } ?>
                    </select>

                    <div style="background:rgba(255,255,255,0.05); padding:8px 15px; border-radius:10px; border:1px solid var(--border-color); margin-left:auto;">
                        <span style="font-size:0.85rem; color:var(--text-dim);">메모</span>
                        <label class="switch">
                            <input type="checkbox" id="memo_toggle" <?php echo $write['as_memo'] ? 'checked' : ''; ?>>
                            <span class="slider"></span>
                        </label>
                    </div>
                </div>
            </div>

            <div id="memo_section" style="display:none;">
                <div class="frm_row">
                    <div class="frm_label">메모 삭제</div>
                    <div class="frm_content">
                        <label class="switch">
                            <input type="checkbox" name="memo_del" value="1">
                            <span class="slider slider-delete"></span>
                        </label>
                    </div>
                </div>
                <div class="frm_row">
                    <div class="frm_label">메모 내용</div>
                    <div class="frm_content">
                        <textarea name="as_memo" id="as_memo" class="frm_textarea" rows="10"><?php echo $write['as_memo']; ?></textarea>
                    </div>
                </div>
            </div>

            <div class="frm_row">
                <div class="frm_label">제목</div>
                <div class="frm_content">
                    <input type="text" name="wr_subject" value="<?php echo $subject ?>" id="wr_subject" required class="frm_input" placeholder="제목을 입력하십시오.">
                </div>
            </div>

            <div class="frm_row">
                <div class="frm_label">추가 항목 설정</div>
                <div class="frm_content">
                    <div id="exfield_container">
                        <?php 
                        for ($i=1; $i<=20; $i++) { 
                            $v_subj = "wr_{$i}_subj";
                            $v_val = "wr_{$i}";
                            $is_active = ($i == 1 || $write[$v_subj] || $write[$v_val]) ? "active" : "";
                        ?>
                        <div class="exfield-slot <?php echo $is_active; ?>" id="ex_slot_<?php echo $i; ?>">
                            <div class="ex-item">
                                <span class="ex-tit">wr_<?php echo $i; ?>_subj (항목명) : </span>
                                <input type="text" name="wr_<?php echo $i; ?>_subj" value="<?php echo $write[$v_subj]; ?>" class="frm_input" placeholder="항목 / 제목">

                                <span class="ex-tit ex-tit2">wr_<?php echo $i; ?> (값) : </span>
                                <input type="text" name="wr_<?php echo $i; ?>" value="<?php echo $write[$v_val]; ?>" class="frm_input frm_input2" placeholder="값 / 코드">
                            </div>
                        </div>
                        <?php } ?>
                    </div>
                    <button type="button" class="file-btn-label btn-file-add" onclick="add_exfield_slot();">
                        <i class="fa-solid fa-plus"></i> 항목 추가하기
                    </button>
                </div>
            </div>

            <div class="frm_row">
                <div class="frm_label">태그</div>
                <div class="frm_content">
                    <input type="text" name="x2_tag" value="<?php echo $write['x2_tag']; ?>" id="x2_tag" class="frm_input" placeholder="태그를 입력 : 구분자 ,">
                </div>
            </div>

            <button type="button" class="btn-toggle-main" id="btn_extra_toggle">
                <i class="fa-solid fa-chevron-down"></i> 상세 내용 및 첨부파일 설정 (클릭하여 열기)
            </button>

            <div id="extra_section" style="display:none;">
                <div class="frm_row">
                    <div class="frm_label">글내용</div>
                    <div class="frm_content">
                        <?php echo $editor_html; ?>
                    </div>
                </div>

                <div class="frm_row">
                    <div class="frm_label">추가내용</div>
                    <div class="frm_content">
                        <textarea name="as_extra_content" class="frm_textarea" rows="5" placeholder="추가 상세 데이터를 입력하세요."><?php echo $write['as_extra_content']; ?></textarea>
                    </div>
                </div>

                <div class="frm_row">
                    <div class="frm_label">첨부파일</div>
                    <div class="frm_content" id="file_container">
                        <?php for ($i=0; $is_file && $i<$file_count; $i++) { 
                            $active_class = ($i == 0 || (isset($file[$i]['file']) && $file[$i]['file'])) ? "active" : "";
                        ?>
                        <div class="file-slot <?php echo $active_class; ?>" id="f_slot_<?php echo $i; ?>">
                            <div class="file-custom-wrapper" style="display:flex; align-items:center; margin-bottom:10px;">
                                <label for="bf_file_<?php echo $i; ?>" class="file-btn-label">파일 선택</label>
                                <input type="file" name="bf_file[]" id="bf_file_<?php echo $i; ?>" class="file-hidden" onchange="updateFileName(this)" style="display:none;">
                                <span class="file-name-display" style="color:var(--text-dim); font-size:0.85rem; margin-left:10px;">선택된 파일 없음</span>
                                <?php if($w == 'u' && isset($file[$i]['file']) && $file[$i]['file']) { ?>
                                    <span style="color:var(--accent-color); font-size:0.8rem; margin-left:10px;">[기존: <?php echo $file[$i]['source']; ?>]</span>
                                <?php } ?>
                            </div>
                            <input type="text" name="bf_content[]" value="<?php echo ($w == 'u') ? $file[$i]['bf_content'] : ''; ?>" class="frm_input" placeholder="파일 설명을 입력하세요.">
                        </div>
                        <?php } ?>
                        <button type="button" class="file-btn-label btn-file-add" onclick="add_file_slot();">+ 파일 슬롯 추가</button>
                    </div>
                </div>

                <div class="frm_row">
                    <div class="frm_label">링크</div>
                    <div class="frm_content">
                        <input type="text" name="wr_link1" value="<?php echo $write['wr_link1']; ?>" class="frm_input" placeholder="링크 #1" style="margin-bottom:10px;">
                        <input type="text" name="wr_link2" value="<?php echo $write['wr_link2']; ?>" class="frm_input" placeholder="링크 #2">
                    </div>
                </div>
            </div>

            <div class="write-foot">
                <a href="<?php echo get_pretty_url($bo_table); ?>" class="btn-back">취소</a>
                <button type="submit" id="btn_submit" class="btn-submit">데이터 저장</button>
            </div>
        </form>
    </div>
</section>

<script>
$(function() {
    // 메모 토글
    const hasMemo = "<?php echo trim($write['as_memo']); ?>";
    if(hasMemo || $('#memo_toggle').is(':checked')) $('#memo_section').show();
    $('#memo_toggle').on('change', function() {
        if($(this).is(':checked')) $('#memo_section').slideDown(250);
        else $('#memo_section').slideUp(250);
    });

    // 상세 섹션 토글
    const hasData = <?php echo ($write['wr_content'] || $write['as_extra_content'] || $write['wr_link1'] || (isset($file) && $file[0]['file'])) ? 'true' : 'false'; ?>;
    if(hasData) $('#extra_section').show();
    $('#btn_extra_toggle').on('click', function() {
        $('#extra_section').slideToggle(300);
        $(this).find('i').toggleClass('fa-chevron-down fa-chevron-up');
    });
});

function add_exfield_slot() {
    const $hiddenSlot = $('.exfield-slot:hidden').first();
    if ($hiddenSlot.length > 0) $hiddenSlot.css('display', 'flex').hide().fadeIn(250).addClass('active');
}

function updateFileName(obj) {
    const fileName = obj.files[0] ? obj.files[0].name : "선택된 파일 없음";
    $(obj).parent().find('.file-name-display').text(fileName);
}

function add_file_slot() {
    const $hiddenSlot = $('.file-slot:hidden').first();
    if ($hiddenSlot.length > 0) $hiddenSlot.slideDown(250).addClass('active');
}

function fwrite_submit(f) {
    <?php echo $editor_js; ?>
    if(f.memo_del && f.memo_del.checked) f.as_memo.value = '';
    document.getElementById("btn_submit").disabled = "disabled";
    return true;
}
</script>