Skip to content

Notice #315

@timmycapupura

Description

@timmycapupura
<title>活動取消通告生成器</title> <script src="https://cdn.tailwindcss.com"></script> <style> body { font-family: 'M PLUS Rounded 1c', sans-serif; background-color: #f9fafb; } @media print { @page { size: A4; margin: 0; } .no-print { display: none !important; } #preview-container { position: absolute; left: 0; top: 0; width: 210mm; height: 297mm; transform: none !important; margin: 0 !important; padding: 20mm !important; box-shadow: none !important; } } .a4-paper { width: 210mm; height: 297mm; padding: 20mm; background: white; box-shadow: 0 10px 25px rgba(0,0,0,0.1); margin: 0 auto; box-sizing: border-box; } input, select { border-radius: 8px !important; } </style>

資料輸入區 (圓體版)

        <div class="grid grid-cols-1 md:grid-cols-2 gap-4 mb-6">
            <div>
                <label class="block text-sm font-bold text-gray-600 mb-1">單位名稱</label>
                <input type="text" id="unitName" class="w-full p-2 border border-gray-300 focus:ring-2 focus:ring-blue-400 outline-none" value="香港小童群益會賽馬會屯門青少年綜合服務中心" oninput="updatePreview()">
            </div>
            <div>
                <label class="block text-sm font-bold text-gray-600 mb-1">通告日期</label>
                <input type="date" id="noticeDate" class="w-full p-2 border border-gray-300 focus:ring-2 focus:ring-blue-400 outline-none" oninput="updatePreview()">
            </div>
        </div>

        <div id="activities-list" class="space-y-4 mb-6">
            <!-- 活動項目會動態生成 -->
        </div>

        <button onclick="addActivity()" class="w-full py-2 bg-gray-100 border-2 border-dashed border-gray-300 rounded-xl text-gray-600 hover:bg-gray-200 transition mb-4 font-bold">+ 新增活動項目</button>
        
        <button onclick="window.print()" class="w-full py-4 bg-blue-600 text-white rounded-2xl font-bold text-lg hover:bg-blue-700 shadow-lg transition">
            列印或儲存為 PDF
        </button>
    </div>

    <!-- 預覽區 -->
    <div class="flex-1 bg-gray-200 p-4 rounded-2xl overflow-auto flex justify-center items-start min-h-[600px]">
        <div id="preview-container" class="a4-paper origin-top scale-[0.5] md:scale-[0.6] lg:scale-[0.5] xl:scale-[0.7]">
            <div class="text-center mb-10">
                <h1 class="text-3xl font-bold tracking-[0.3em] mb-4">香港小童群益會</h1>
                <div class="text-xl mb-6">
                    單位:<span id="p-unit" class="border-b-2 border-black min-w-[300px] inline-block px-4 font-bold"></span>
                </div>
                <h2 class="text-5xl font-bold tracking-widest mt-8 relative inline-block">
                    服務取消通告
                    <div class="absolute -bottom-2 left-0 w-full h-1 bg-black"></div>
                </h2>
            </div>

            <p class="text-xl leading-relaxed text-justify mb-10 font-bold">
                謹通知以下活動,因下列原因,予以取消,不便之處,敬請原諒!如有疑問,請聯絡本單位櫃位職員或活動負責人。
            </p>

            <table class="w-full border-collapse border-[2px] border-black mb-16 text-center text-xl">
                <thead>
                    <tr class="bg-gray-50 border-b-2 border-black h-14">
                        <th class="border-r-2 border-black w-[8%]"></th>
                        <th class="border-r-2 border-black w-[32%]">活動名稱</th>
                        <th class="border-r-2 border-black w-[18%]">活動編號</th>
                        <th class="border-r-2 border-black w-[18%]">活動日期</th>
                        <th class="w-[24%]">取消原因</th>
                    </tr>
                </thead>
                <tbody id="p-table-body">
                    <!-- 表格內容 -->
                </tbody>
            </table>

            <div class="flex flex-col items-end mt-20 pr-10">
                <div class="text-right space-y-4">
                    <div class="text-2xl font-bold">香港小童群益會</div>
                    <div class="text-xl font-bold">
                        <span id="p-unit-footer" class="border-b-2 border-black min-w-[280px] inline-block px-4 text-center"></span> ( 單位 ) 啟
                    </div>
                </div>
                <div id="p-date" class="text-xl font-bold mt-10"></div>
            </div>
        </div>
    </div>
</div>

<script>
    let activities = [{ name: '', code: '', date: '', reason: '' }];
    const reasons = ["活動人數不足", "因天氣惡劣關係", "負責職員病假", "場地維修/突發狀況", "導師因事請假"];

    function init() {
        document.getElementById('noticeDate').valueAsDate = new Date();
        renderInputs();
        updatePreview();
    }

    function renderInputs() {
        const container = document.getElementById('activities-list');
        container.innerHTML = activities.map((act, i) => `
            <div class="p-4 bg-blue-50/50 rounded-xl relative border border-blue-100">
                <button onclick="removeActivity(${i})" class="absolute top-2 right-2 text-gray-400 hover:text-red-500">✕</button>
                <div class="grid grid-cols-1 gap-2 mt-2">
                    <input type="text" placeholder="活動名稱" class="p-2 text-sm border rounded" value="${act.name}" oninput="updateAct(${i}, 'name', this.value)">
                    <div class="grid grid-cols-2 gap-2">
                        <input type="text" placeholder="活動編號" class="p-2 text-sm border rounded" value="${act.code}" oninput="updateAct(${i}, 'code', this.value)">
                        <input type="text" placeholder="活動日期" class="p-2 text-sm border rounded" value="${act.date}" oninput="updateAct(${i}, 'date', this.value)">
                    </div>
                    <div class="flex gap-2">
                        <input type="text" placeholder="原因" class="p-2 text-sm border rounded flex-1" value="${act.reason}" oninput="updateAct(${i}, 'reason', this.value)">
                        <select class="p-2 text-xs border rounded w-24" onchange="updateAct(${i}, 'reason', this.value); renderInputs(); updatePreview();">
                            <option value="">快速選擇</option>
                            ${reasons.map(r => `<option value="${r}">${r}</option>`).join('')}
                        </select>
                    </div>
                </div>
            </div>
        `).join('');
    }

    function updateAct(i, field, val) {
        activities[i][field] = val;
        updatePreview();
    }

    function addActivity() {
        activities.push({ name: '', code: '', date: '', reason: '' });
        renderInputs();
        updatePreview();
    }

    function removeActivity(i) {
        if (activities.length > 1) {
            activities.splice(i, 1);
            renderInputs();
            updatePreview();
        }
    }

    function updatePreview() {
        const unit = document.getElementById('unitName').value;
        const date = document.getElementById('noticeDate').value;
        const dateObj = new Date(date);
        
        document.getElementById('p-unit').innerText = unit || "__________________";
        document.getElementById('p-unit-footer').innerText = unit || "__________________";
        document.getElementById('p-date').innerText = date ? `${dateObj.getFullYear()} 年 ${dateObj.getMonth() + 1} 月 ${dateObj.getDate()} 日` : "    年    月    日";

        let html = '';
        const displayList = [...activities];
        while(displayList.length < 4) displayList.push({ name: '', code: '', date: '', reason: '' });

        displayList.forEach((act, i) => {
            html += `
                <tr class="h-20 border-b border-black">
                    <td class="border-r border-black font-bold">${i + 1}.</td>
                    <td class="border-r border-black px-2 leading-tight font-bold">${act.name}</td>
                    <td class="border-r border-black font-bold">${act.code}</td>
                    <td class="border-r border-black font-bold">${act.date}</td>
                    <td class="px-2 leading-tight font-bold">${act.reason}</td>
                </tr>
            `;
        });
        document.getElementById('p-table-body').innerHTML = html;
    }

    init();
</script>

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions