{"id":861,"date":"2025-10-24T10:32:05","date_gmt":"2025-10-24T10:32:05","guid":{"rendered":"https:\/\/sxolikes-katharistries.gr\/wordpress\/?page_id=861"},"modified":"2026-01-08T15:18:54","modified_gmt":"2026-01-08T15:18:54","slug":"%cf%80%ce%b1%cf%81%ce%bf%cf%85%cf%83%ce%b9%ce%b5%cf%82-%ce%bc%ce%b5%ce%bb%cf%89%ce%bd","status":"publish","type":"page","link":"https:\/\/sxolikes-katharistries.gr\/wordpress\/%cf%80%ce%b1%cf%81%ce%bf%cf%85%cf%83%ce%b9%ce%b5%cf%82-%ce%bc%ce%b5%ce%bb%cf%89%ce%bd\/","title":{"rendered":"\u03a0\u0391\u03a1\u039f\u03a5\u03a3\u0399\u0395\u03a3 \u039c\u0395\u039b\u03a9\u039d"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"861\" class=\"elementor elementor-861\">\n\t\t\t\t<div class=\"elementor-element elementor-element-979ee4a e-flex e-con-boxed e-con e-parent\" data-id=\"979ee4a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1777052 elementor-widget elementor-widget-html\" data-id=\"1777052\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"el\">\r\n<head>\r\n    <meta charset=\"UTF-8\">\r\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n    <title>\ud83d\udccb \u03a0\u03b1\u03c1\u03bf\u03c5\u03c3\u03af\u03b5\u03c2 \u039c\u03b5\u03bb\u03ce\u03bd<\/title>\r\n    <style>\r\n        body { font-family: sans-serif; background: #f3f6fa; margin: 0; padding: 10px; }\r\n        h2 { text-align: center; color: #1e3a8a; margin-bottom: 10px; }\r\n        .counter-box { text-align: center; background: #fff; width: 140px; margin: 0 auto 15px auto; padding: 10px; border-radius: 10px; border: 2px solid #2563eb; box-shadow: 0 2px 5px rgba(0,0,0,0.1); }\r\n        .counter-box div { font-size: 11px; color: #666; text-transform: uppercase; }\r\n        .counter-box span { font-size: 24px; font-weight: bold; color: #16a34a; }\r\n        .controls { text-align: center; margin-bottom: 15px; display: flex; justify-content: center; gap: 8px; flex-wrap: wrap; }\r\n        .btn { padding: 10px 15px; border-radius: 6px; border: none; color: white; cursor: pointer; font-weight: bold; font-size: 12px; }\r\n        .btn-blue { background: #2563eb; }\r\n        .btn-red { background: #dc2626; }\r\n        .btn-gray { background: #4b5563; }\r\n        table { width: 100%; border-collapse: collapse; background: white; table-layout: fixed; }\r\n        th, td { padding: 8px 2px; text-align: center; border: 1px solid #ccc; font-size: 12px; word-wrap: break-word; }\r\n        th { background: #1e3a8a; color: white; text-transform: uppercase; font-size: 11px; }\r\n        .presence-btn { width: 100%; padding: 10px 0; border: none; border-radius: 4px; color: white; font-weight: bold; cursor: pointer; }\r\n        .bg-green { background: #16a34a; }\r\n        .bg-red { background: #dc2626; }\r\n        .bg-wait { background: #9ca3af; }\r\n    <\/style>\r\n<\/head>\r\n<body>\r\n\r\n<div id=\"membersApp\">\r\n    <h2>\ud83d\udccb \u03a0\u03b1\u03c1\u03bf\u03c5\u03c3\u03af\u03b5\u03c2 \u039c\u03b5\u03bb\u03ce\u03bd<\/h2>\r\n    <div class=\"counter-box\"><div>\u03a0\u03b1\u03c1\u03ce\u03bd<\/div><span id=\"presentCount\">0<\/span><\/div>\r\n    <div class=\"controls\">\r\n        <button class=\"btn btn-blue\" onclick=\"loadMembers()\">\ud83d\udd04 \u0391\u039d\u0391\u039d\u0395\u03a9\u03a3\u0397<\/button>\r\n        <button class=\"btn btn-red\" onclick=\"resetAll()\">\u26a0\ufe0f \u0395\u03a0\u0391\u039d\u0391\u03a6\u039f\u03a1\u0391<\/button>\r\n        <button class=\"btn btn-gray\" onclick=\"exportPresence()\">\ud83d\udcbe CSV<\/button>\r\n    <\/div>\r\n    <div id=\"membersList\">\u03a6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7...<\/div>\r\n<\/div>\r\n\r\n<script>\r\n    const scriptURL = \"https:\/\/script.google.com\/macros\/s\/AKfycbymMRdW9zabW-xPNMK14vrSPAVuG5sNnEtl44c7OVAnXhhySfuHLveUX9tioyK-4Jw\/exec\";\r\n    let localMembers = [];\r\n\r\n    async function loadMembers() {\r\n        const container = document.getElementById(\"membersList\");\r\n        container.innerHTML = \"<div style='text-align:center; padding:20px;'>\u23f3 \u03a3\u03c5\u03b3\u03c7\u03c1\u03bf\u03bd\u03b9\u03c3\u03bc\u03cc\u03c2...<\/div>\";\r\n        try {\r\n            const res = await fetch(`${scriptURL}?action=getMembers&t=${new Date().getTime()}`);\r\n            localMembers = await res.json();\r\n            renderTable();\r\n        } catch(err) {\r\n            container.innerHTML = \"<div style='color:red; text-align:center;'>\u274c \u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03a3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2.<\/div>\";\r\n        }\r\n    }\r\n\r\n    function renderTable() {\r\n        let count = 0;\r\n        let html = `<table><tr><th style=\"width:40%\">\u038c\u03bd\u03bf\u03bc\u03b1<\/th><th style=\"width:20%\">Status<\/th><th style=\"width:25%\">\u0395\u03bd\u03ad\u03c1\u03b3\u03b5\u03b9\u03b1<\/th><th style=\"width:15%\">AM<\/th><\/tr>`;\r\n        localMembers.forEach(m => {\r\n            const isPresent = m.\u03c0\u03b1\u03c1\u03bf\u03c5\u03c3\u03af\u03b1 === \"\u039d\u03b1\u03b9\";\r\n            if(isPresent) count++;\r\n            html += `<tr>\r\n                <td style=\"text-align:left; padding-left:5px;\">${m.\u03b5\u03c0\u03ce\u03bd\u03c5\u03bc\u03bf} ${m.\u03cc\u03bd\u03bf\u03bc\u03b1[0]}.<\/td>\r\n                <td id=\"status-${m.\u03bc\u03b7\u03c4\u03c1\u03ce\u03bf}\" style=\"color:${isPresent ? 'green' : '#555'}; font-weight:bold;\">${isPresent ? '\u039d\u0391\u0399 \u2705' : '\u039f\u03a7\u0399'}<\/td>\r\n                <td><button id=\"btn-${m.\u03bc\u03b7\u03c4\u03c1\u03ce\u03bf}\" class=\"presence-btn ${isPresent ? 'bg-red' : 'bg-green'}\" onclick=\"togglePresence('${m.\u03bc\u03b7\u03c4\u03c1\u03ce\u03bf}')\">${isPresent ? '\u0391\u039a\u03a5\u03a1\u03a9\u03a3\u0397' : '\u03a0\u0391\u03a1\u03a9\u039d'}<\/button><\/td>\r\n                <td>${m.\u03bc\u03b7\u03c4\u03c1\u03ce\u03bf}<\/td>\r\n            <\/tr>`;\r\n        });\r\n        document.getElementById(\"membersList\").innerHTML = html + \"<\/table>\";\r\n        document.getElementById(\"presentCount\").innerText = count;\r\n    }\r\n\r\n    async function togglePresence(id) {\r\n        const btn = document.getElementById(`btn-${id}`);\r\n        const originalText = btn.innerText;\r\n        btn.innerText = \"\u23f3\";\r\n        btn.disabled = true;\r\n        try {\r\n            const res = await fetch(`${scriptURL}?action=togglePresence&id=${encodeURIComponent(id)}`);\r\n            const data = await res.json();\r\n            if(data.result === \"OK\") {\r\n                const idx = localMembers.findIndex(m => m.\u03bc\u03b7\u03c4\u03c1\u03ce\u03bf.toString() === id.toString());\r\n                const isNowPresent = localMembers[idx].\u03c0\u03b1\u03c1\u03bf\u03c5\u03c3\u03af\u03b1 !== \"\u039d\u03b1\u03b9\";\r\n                localMembers[idx].\u03c0\u03b1\u03c1\u03bf\u03c5\u03c3\u03af\u03b1 = isNowPresent ? \"\u039d\u03b1\u03b9\" : \"\u0391\u03c0\u03ce\u03bd\";\r\n                \/\/ \u0395\u03bd\u03b7\u03bc\u03ad\u03c1\u03c9\u03c3\u03b7 \u03ce\u03c1\u03b1\u03c2 \u03c4\u03bf\u03c0\u03b9\u03ba\u03ac \u03b3\u03b9\u03b1 \u03c4\u03bf CSV\r\n                localMembers[idx].\u03ce\u03c1\u03b1 = isNowPresent ? new Date().toLocaleString('el-GR') : \"\";\r\n                renderTable();\r\n            }\r\n        } catch(e) { \r\n            alert(\"\u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2\"); \r\n            btn.innerText = originalText;\r\n        } finally {\r\n            btn.disabled = false;\r\n        }\r\n    }\r\n\r\n    async function resetAll() {\r\n        if(!confirm(\"\u26a0\ufe0f \u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03bc\u03b7\u03b4\u03b5\u03bd\u03af\u03c3\u03b5\u03c4\u03b5 \u03cc\u03bb\u03b5\u03c2 \u03c4\u03b9\u03c2 \u03c0\u03b1\u03c1\u03bf\u03c5\u03c3\u03af\u03b5\u03c2;\")) return;\r\n        document.getElementById(\"membersList\").innerHTML = \"<div style='text-align:center;'>\u23f3 \u0395\u03c0\u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac...<\/div>\";\r\n        try {\r\n            const res = await fetch(`${scriptURL}?action=resetAll&t=${new Date().getTime()}`);\r\n            const data = await res.json();\r\n            if(data.result === \"OK\") {\r\n                alert(\"\u2705 \u0397 \u03bb\u03af\u03c3\u03c4\u03b1 \u03bc\u03b7\u03b4\u03b5\u03bd\u03af\u03c3\u03c4\u03b7\u03ba\u03b5!\");\r\n                loadMembers();\r\n            }\r\n        } catch(e) { alert(\"\u03a3\u03c6\u03ac\u03bb\u03bc\u03b1\"); loadMembers(); }\r\n    }\r\n\r\n    function exportPresence() {\r\n        let csv = \"\\uFEFF\u0395\u03c0\u03ce\u03bd\u03c5\u03bc\u03bf,\u038c\u03bd\u03bf\u03bc\u03b1,\u03a0\u03b1\u03c1\u03bf\u03c5\u03c3\u03af\u03b1,\u0391\u03c1. \u039c\u03b7\u03c4\u03c1\u03ce\u03bf\u03c5,\u0397\u03bc\u03b5\u03c1\u03bf\u03bc\u03b7\u03bd\u03af\u03b1 & \u038f\u03c1\u03b1\\n\";\r\n        localMembers.forEach(m => {\r\n            let timeVal = (m.\u03c0\u03b1\u03c1\u03bf\u03c5\u03c3\u03af\u03b1 === \"\u039d\u03b1\u03b9\" && m.\u03ce\u03c1\u03b1) ? m.\u03ce\u03c1\u03b1 : \"\";\r\n            csv += `\"${m.\u03b5\u03c0\u03ce\u03bd\u03c5\u03bc\u03bf}\",\"${m.\u03cc\u03bd\u03bf\u03bc\u03b1}\",\"${m.\u03c0\u03b1\u03c1\u03bf\u03c5\u03c3\u03af\u03b1}\",\"${m.\u03bc\u03b7\u03c4\u03c1\u03ce\u03bf}\",\"${timeVal}\"\\n`;\r\n        });\r\n        const blob = new Blob([csv], {type:\"text\/csv;charset=utf-8\"});\r\n        const a = document.createElement(\"a\");\r\n        const dateStr = new Date().toLocaleDateString('el-GR').replace(\/\\\/\/g, '-');\r\n        a.href = URL.createObjectURL(blob);\r\n        a.download = `Parousies_${dateStr}.csv`;\r\n        a.click();\r\n    }\r\n\r\n    loadMembers();\r\n<\/script>\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>\ud83d\udccb \u03a0\u03b1\u03c1\u03bf\u03c5\u03c3\u03af\u03b5\u03c2 \u039c\u03b5\u03bb\u03ce\u03bd \ud83d\udccb \u03a0\u03b1\u03c1\u03bf\u03c5\u03c3\u03af\u03b5\u03c2 \u039c\u03b5\u03bb\u03ce\u03bd \u03a0\u03b1\u03c1\u03ce\u03bd0 \ud83d\udd04 \u0391\u039d\u0391\u039d\u0395\u03a9\u03a3\u0397 \u26a0\ufe0f \u0395\u03a0\u0391\u039d\u0391\u03a6\u039f\u03a1\u0391 \ud83d\udcbe CSV \u03a6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":"","_members_access_role":[],"_members_access_error":""},"class_list":["post-861","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/sxolikes-katharistries.gr\/wordpress\/wp-json\/wp\/v2\/pages\/861","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sxolikes-katharistries.gr\/wordpress\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/sxolikes-katharistries.gr\/wordpress\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/sxolikes-katharistries.gr\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sxolikes-katharistries.gr\/wordpress\/wp-json\/wp\/v2\/comments?post=861"}],"version-history":[{"count":193,"href":"https:\/\/sxolikes-katharistries.gr\/wordpress\/wp-json\/wp\/v2\/pages\/861\/revisions"}],"predecessor-version":[{"id":2729,"href":"https:\/\/sxolikes-katharistries.gr\/wordpress\/wp-json\/wp\/v2\/pages\/861\/revisions\/2729"}],"wp:attachment":[{"href":"https:\/\/sxolikes-katharistries.gr\/wordpress\/wp-json\/wp\/v2\/media?parent=861"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}