{"id":8612,"date":"2025-12-02T09:11:39","date_gmt":"2025-12-02T04:11:39","guid":{"rendered":"https:\/\/thpc.edu.kz\/?page_id=8612"},"modified":"2025-12-02T09:12:58","modified_gmt":"2025-12-02T04:12:58","slug":"olymp-admin","status":"publish","type":"page","link":"https:\/\/thpc.edu.kz\/?page_id=8612&lang=ru","title":{"rendered":"Olymp Admin"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"8612\" class=\"elementor elementor-8612\">\n\t\t\t\t<div class=\"elementor-element elementor-element-45d0c30 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent\" data-id=\"45d0c30\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7df4918 elementor-widget elementor-widget-text-editor\" data-id=\"7df4918\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t    \n    <div id=\"olymp-login-panel\" style=\"max-width:440px;margin:40px auto;text-align:center;\">\n        <h2>\u0412\u0445\u043e\u0434 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0449\u0435\u0433\u043e<\/h2>\n        <input id=\"olymp-pin-input\" type=\"password\" \n            placeholder=\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 PIN\" \n            style=\"width:100%;padding:10px;font-size:18px;margin-top:10px;border-radius:6px;border:1px solid #ccc;\">\n        <button id=\"olymp-pin-btn\" \n            style=\"margin-top:12px;padding:10px 18px;font-size:18px;border:none;background:#2271b1;color:#fff;border-radius:6px;cursor:pointer;\">\n            \u0412\u043e\u0439\u0442\u0438\n        <\/button>\n        <div id=\"olymp-pin-error\" style=\"color:#b10000;margin-top:8px;font-weight:bold;\"><\/div>\n    <\/div>\n\n    <div id=\"olymp-admin-panel\" style=\"display:none;margin-top:30px;\">\n\t\t<div style=\"display: flex; justify-content: space-between;\">\n\t\t\t<h2>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432<\/h2>\n\t\t\t<button id=\"olymp-refresh-btn\" style=\"background:#2271b1;color:#fff;border:none;border-radius:4px;cursor:pointer;\">\ud83d\uddd8 \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c<\/button>\n\t\t<\/div>\n\n        <table id=\"olymp-table\" class=\"wp-list-table widefat fixed striped\" style=\"margin-top:15px;\">\n            <thead>\n                <tr>\n                    <th>\u0422\u0435\u0441\u0442<\/th>\n                    <th>\u0424\u0418\u041e<\/th>\n                    <th>\u041a\u043e\u043b\u043b\u0435\u0434\u0436<\/th>\n                    <th>\u0411\u0430\u043b\u043b\u044b<\/th>\n                    <th>\u0412\u0440\u0435\u043c\u044f<\/th>\n                    <th>\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435<\/th>\n                <\/tr>\n            <\/thead>\n            <tbody><\/tbody>\n        <\/table>\n    <\/div>\n\n    <script>\n    const ajaxUrl = \"\/wp-admin\/admin-ajax.php\";\n\n    function loadLockedRows(pin) {\n        return fetch(ajaxUrl, {\n            method: \"POST\",\n            credentials: \"same-origin\",\n            body: new URLSearchParams({\n                action: \"olymp_get_locked_pcs_public\",\n                pin: pin\n            })\n        }).then(r => r.json());\n    }\n\n    function unlockPC(pin, pc, quiz) {\n        return fetch(ajaxUrl, {\n            method: \"POST\",\n            credentials: \"same-origin\",\n            body: new URLSearchParams({\n                action: \"olymp_unlock_pc_public\",\n                pin: pin,\n                pc_id: pc,\n                quiz_id: quiz\n            })\n        }).then(r => r.json());\n    }\n\n    document.addEventListener('DOMContentLoaded', function() {\n        const panel = document.getElementById('olymp-admin-panel');\n        const loginPanel = document.getElementById('olymp-login-panel');\n        const pinInput = document.getElementById('olymp-pin-input');\n        const pinBtn = document.getElementById('olymp-pin-btn');\n\n        const PIN_KEY = \"olymp_panel_pin\";\n\n        function renderRows(rows, pin) {\n            const tbody = document.querySelector('#olymp-table tbody');\n            tbody.innerHTML = \"\";\n\n            if (!rows || rows.length === 0) {\n                tbody.innerHTML = '<tr><td colspan=\"8\" style=\"text-align:center;\">\u041d\u0435\u0442 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445<\/td><\/tr>';\n                return;\n            }\n\n            rows.forEach(row => {\n                const tr = document.createElement('tr');\n                tr.innerHTML = `\n                    <td>${row.quiz_name}<\/td>\n                    <td>${row.fio}<\/td>\n                    <td>${row.college}<\/td>\n                    <td>${row.score}<\/td>\n                    <td>${row.updated_at}<\/td>\n                    <td><button data-pc=\"${row.pc_id}\" data-quiz=\"${row.quiz_id}\" class=\"unlock-btn\" style=\"background:#46b450;color:#fff;border:none;padding:6px 12px;border-radius:4px;cursor:pointer;\">\u0420\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c<\/button><\/td>\n                `;\n                tbody.appendChild(tr);\n            });\n\n            \/\/ \u043d\u0430\u0432\u0435\u0441\u0438\u043c \u043a\u043d\u043e\u043f\u043a\u0438\n            document.querySelectorAll(\".unlock-btn\").forEach(btn => {\n                btn.onclick = () => {\n                    btn.disabled = true;\n                    btn.textContent = \"\u23f3...\";\n\n                    unlockPC(pin, btn.dataset.pc, btn.dataset.quiz).then(res => {\n                        if (res.success) {\n                            btn.closest(\"tr\").remove();\n                        } else {\n                            alert(\"\u041e\u0448\u0438\u0431\u043a\u0430: \" + (res.data || \"unknown\"));\n                            btn.disabled = false;\n                            btn.textContent = \"\u0420\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c\";\n                        }\n                    });\n                };\n            });\n        }\n\n        function tryLogin(pin) {\n            loadLockedRows(pin).then(res => {\n                if (!Array.isArray(res)) {\n                    document.getElementById('olymp-pin-error').textContent = \"\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 PIN\";\n                    return;\n                }\n\n                sessionStorage.setItem(PIN_KEY, pin);\n                loginPanel.style.display = \"none\";\n                panel.style.display = \"block\";\n\n                renderRows(res, pin);\n            });\n        }\n\n        pinBtn.onclick = () => tryLogin(pinInput.value.trim());\n\n        \/\/ \u0415\u0441\u043b\u0438 PIN \u0443\u0436\u0435 \u0432\u0432\u0435\u0434\u0451\u043d \u0440\u0430\u043d\u0435\u0435\n        const savedPin = sessionStorage.getItem(PIN_KEY);\n        if (savedPin) tryLogin(savedPin);\n\n        document.getElementById('olymp-refresh-btn').onclick = () => {\n            const pin = sessionStorage.getItem(PIN_KEY);\n            loadLockedRows(pin).then(res => {\n                if (Array.isArray(res)) {\n                    renderRows(res, pin);\n                }\n            });\n        };\n    });\n    <\/script>\n\n    \t\t\t\t\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":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"_acf_changed":false,"site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-8612","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/thpc.edu.kz\/index.php?rest_route=\/wp\/v2\/pages\/8612","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thpc.edu.kz\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/thpc.edu.kz\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/thpc.edu.kz\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/thpc.edu.kz\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=8612"}],"version-history":[{"count":7,"href":"https:\/\/thpc.edu.kz\/index.php?rest_route=\/wp\/v2\/pages\/8612\/revisions"}],"predecessor-version":[{"id":8620,"href":"https:\/\/thpc.edu.kz\/index.php?rest_route=\/wp\/v2\/pages\/8612\/revisions\/8620"}],"wp:attachment":[{"href":"https:\/\/thpc.edu.kz\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=8612"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}