{"id":535,"date":"2026-04-16T17:45:03","date_gmt":"2026-04-16T08:45:03","guid":{"rendered":"https:\/\/hydrogen.sandboxwork.com\/?page_id=535"},"modified":"2026-04-25T23:11:00","modified_gmt":"2026-04-25T14:11:00","slug":"report","status":"publish","type":"page","link":"https:\/\/hydrogen.sandboxwork.com\/?page_id=535","title":{"rendered":"\u30d5\u30a1\u30a4\u30eb\u9001\u4fe1"},"content":{"rendered":"\n<p class=\"txtStyle1\"><span>\u4e3b\u306a\u4f7f\u7528\u7528\u9014<\/span>\u8b1b\u5e2b\u3078\u306e\u30d5\u30a1\u30a4\u30eb\u63d0\u51fa\u3084\u3001\u30c1\u30a7\u30c3\u30af\u4f9d\u983c\u7b49<\/p>\n\n\n\n<!-- ===== \u751f\u5f92\u7528\u30da\u30fc\u30b8 (WordPress \u30ab\u30b9\u30bf\u30e0HTML\u30d6\u30ed\u30c3\u30af\u306b\u8cbc\u308a\u4ed8\u3051) ===== -->\n<div class=\"cls-wrapper\">\n  <div class=\"cls-header\">\n    <p class=\"cls-desc\">\u540d\u524d\u306f\u5fc5\u9808\u3067\u3059\u3002\u63d0\u51fa\u30d5\u30a1\u30a4\u30eb\u3092\u6dfb\u4ed8\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u5148\u751f\u306e\u30b3\u30e1\u30f3\u30c8\u306f\u4e0b\u306e\u5c65\u6b74\u6b04\u306b\u81ea\u52d5\u3067\u8868\u793a\u3055\u308c\u307e\u3059\u3002<\/p>\n  <\/div>\n\n  <div class=\"cls-row\">\n    <label class=\"cls-label\" for=\"cls-name\">\u540d\u524d<\/label>\n    <input type=\"text\" id=\"cls-name\" class=\"cls-input\" placeholder=\"\u540d\u524d\u3068\u5c65\u6b74\u306f\u9023\u52d5\u3057\u3066\u3044\u307e\u3059\" maxlength=\"50\">\n  <\/div>\n\n  <div class=\"cls-row\">\n    <label class=\"cls-label\" for=\"cls-file\">\u63d0\u51fa\u30d5\u30a1\u30a4\u30eb <span class=\"cls-optional\">(\u5fc5\u9808\u30fb\u6700\u592710MB)<\/span><\/label>\n    <div class=\"cls-fileinput\">\n      <label for=\"cls-file\" class=\"cls-filebtn\">\u30d5\u30a1\u30a4\u30eb\u3092\u9078\u629e<\/label>\n      <input type=\"file\" id=\"cls-file\" accept=\".zip,.html,.css,.js,.txt,.jpg,.jpeg,.png,.gif,.webp,.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx\" hidden>\n      <span id=\"cls-file-info\" class=\"cls-fileinfo\">\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093<\/span>\n      <button type=\"button\" id=\"cls-file-clear\" class=\"cls-btn cls-btn-sm cls-btn-ghost\" style=\"display:none;\">\u524a\u9664<\/button>\n    <\/div>\n  <\/div>\n\n  <div class=\"cls-controls\">\n    <button type=\"button\" id=\"cls-submit\" class=\"cls-btn cls-btn-primary\">\u63d0\u51fa\u3059\u308b<\/button>\n    <button type=\"button\" id=\"cls-clear\" class=\"cls-btn cls-btn-ghost\">\u30af\u30ea\u30a2<\/button>\n  <\/div>\n\n  <div id=\"cls-message\" class=\"cls-message\" aria-live=\"polite\"><\/div>\n\n  <div class=\"cls-history-section\">\n    <div class=\"cls-history-head\">\n      <h4 class=\"cls-history-title\">\u3053\u308c\u307e\u3067\u306e\u63d0\u51fa\u3068\u5148\u751f\u306e\u30b3\u30e1\u30f3\u30c8<\/h4>\n      <div class=\"cls-history-actions\">\n        <span id=\"cls-status\" class=\"cls-status\"><\/span>\n        <button type=\"button\" id=\"cls-refresh\" class=\"cls-btn cls-btn-sm\">\u66f4\u65b0<\/button>\n      <\/div>\n    <\/div>\n    <div id=\"cls-history\" class=\"cls-history\">\n      <p class=\"cls-empty\">\u540d\u524d\u3092\u5165\u529b\u3059\u308b\u3068\u3001\u3042\u306a\u305f\u306e\u63d0\u51fa\u5c65\u6b74\u304c\u3053\u3053\u306b\u8868\u793a\u3055\u308c\u307e\u3059\u3002<\/p>\n    <\/div>\n  <\/div>\n<\/div>\n\n<!-- ===== \u78ba\u8a8d\u30e2\u30fc\u30c0\u30eb ===== -->\n<div id=\"cls-modal\" class=\"cls-modal\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"cls-modal-title\">\n  <div class=\"cls-modal-box\">\n    <h4 id=\"cls-modal-title\" class=\"cls-modal-title\">\u63d0\u51fa\u5185\u5bb9\u306e\u78ba\u8a8d<\/h4>\n    <div class=\"cls-modal-body\">\n      <div class=\"cls-modal-row\">\n        <span class=\"cls-modal-key\">\u540d\u524d<\/span>\n        <span id=\"cls-modal-name\" class=\"cls-modal-val\"><\/span>\n      <\/div>\n      <div class=\"cls-modal-row\">\n        <span class=\"cls-modal-key\">\u30d5\u30a1\u30a4\u30eb<\/span>\n        <span id=\"cls-modal-file\" class=\"cls-modal-val\"><\/span>\n      <\/div>\n      <p class=\"cls-modal-q\">\u3053\u306e\u5185\u5bb9\u3067\u63d0\u51fa\u3057\u307e\u3059\u304b?<\/p>\n    <\/div>\n    <div class=\"cls-modal-actions\">\n      <button type=\"button\" id=\"cls-modal-cancel\" class=\"cls-btn cls-btn-ghost\">\u30ad\u30e3\u30f3\u30bb\u30eb<\/button>\n      <button type=\"button\" id=\"cls-modal-ok\" class=\"cls-btn cls-btn-primary\">\u63d0\u51fa\u3059\u308b<\/button>\n    <\/div>\n  <\/div>\n<\/div>\n\n<style>\n  .cls-wrapper {\n    max-width: 100%;\n    margin: 2em auto;\n    padding: 24px;\n    background: #fff;\n    border: 1px solid #e5e7eb;\n    border-radius: 10px;\n    font-family: -apple-system, BlinkMacSystemFont, \"Hiragino Sans\", \"Yu Gothic\", sans-serif;\n    color: #1f2937;\n    box-sizing: border-box;\n  }\n\n  .cls-wrapper *,\n  .cls-wrapper *::before,\n  .cls-wrapper *::after {\n    box-sizing: border-box;\n  }\n\n  .cls-header {\n    margin-bottom: 16px;\n  }\n\n  .cls-desc {\n    margin: 0;\n    font-size: .9rem;\n    color: #6b7280;\n    line-height: 1.6;\n  }\n\n  .cls-row {\n    margin-bottom: 12px;\n  }\n\n  .cls-label {\n    display: block;\n    font-size: .85rem;\n    font-weight: 600;\n    color: #374151;\n    margin-bottom: 6px;\n  }\n\n  .cls-optional {\n    font-size: .75rem;\n    color: #9ca3af;\n    font-weight: 400;\n    margin-left: 4px;\n  }\n\n  .cls-input {\n    width: 100%;\n    padding: 10px 12px;\n    font-size: .95rem;\n    color: #111827;\n    background: #f9fafb;\n    border: 1px solid #d1d5db;\n    border-radius: 6px;\n    outline: none;\n    font-family: inherit;\n    transition: border-color .15s, box-shadow .15s;\n  }\n\n  .cls-input:focus {\n    border-color: #2563eb;\n    background: #fff;\n    box-shadow: 0 0 0 3px rgba(37, 99, 235, .15);\n  }\n\n  .cls-fileinput {\n    display: flex;\n    align-items: center;\n    gap: 10px;\n    flex-wrap: wrap;\n    padding: 10px 12px;\n    background: #f9fafb;\n    border: 1px solid #d1d5db;\n    border-radius: 6px;\n  }\n\n  .cls-filebtn {\n    display: inline-block;\n    padding: 7px 14px;\n    background: #fff;\n    border: 1px solid #d1d5db;\n    border-radius: 4px;\n    cursor: pointer;\n    font-size: .85rem;\n    font-weight: 600;\n    color: #374151;\n    transition: all .15s;\n  }\n\n  .cls-filebtn:hover {\n    background: #f3f4f6;\n  }\n\n  .cls-fileinfo {\n    font-size: .85rem;\n    color: #6b7280;\n    flex: 1;\n    min-width: 150px;\n    word-break: break-all;\n  }\n\n  .cls-fileinfo.selected {\n    color: #059669;\n    font-weight: 600;\n  }\n\n  .cls-controls {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 8px;\n    margin-bottom: 12px;\n  }\n\n  .cls-btn {\n    padding: 9px 18px;\n    font-size: .9rem;\n    font-weight: 600;\n    font-family: inherit;\n    color: #374151;\n    background: #f3f4f6;\n    border: 1px solid #d1d5db;\n    border-radius: 6px;\n    cursor: pointer;\n    transition: all .15s;\n  }\n\n  .cls-btn:hover {\n    background: #e5e7eb;\n  }\n\n  .cls-btn:disabled {\n    opacity: .5;\n    cursor: not-allowed;\n  }\n\n  .cls-btn-sm {\n    padding: 5px 12px;\n    font-size: .8rem;\n  }\n\n  .cls-btn-primary {\n    color: #fff;\n    background: #2563eb;\n    border-color: #2563eb;\n  }\n\n  .cls-btn-primary:hover {\n    background: #1d4ed8;\n    border-color: #1d4ed8;\n  }\n\n  .cls-btn-ghost {\n    background: transparent;\n    color: #6b7280;\n  }\n\n  .cls-btn-ghost:hover {\n    background: #f3f4f6;\n    color: #374151;\n  }\n\n  .cls-message {\n    min-height: 1.2em;\n    margin-bottom: 12px;\n    padding: 0 4px;\n    font-size: .9rem;\n  }\n\n  .cls-message.cls-info {\n    color: #4b5563;\n  }\n\n  .cls-message.cls-ok {\n    color: #059669;\n    font-weight: 600;\n  }\n\n  .cls-message.cls-err {\n    color: #dc2626;\n    font-weight: 600;\n  }\n\n  .cls-history-section {\n    margin-top: 32px;\n    padding-top: 20px;\n    border-top: 2px solid #e5e7eb;\n  }\n\n  .cls-history-head {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    margin-bottom: 14px;\n    flex-wrap: wrap;\n    gap: 10px;\n  }\n\n  .cls-history-title {\n    margin: 0;\n    font-size: 1.05rem;\n    font-weight: 700;\n    color: #111827;\n  }\n\n  .cls-history-actions {\n    display: flex;\n    align-items: center;\n    gap: 10px;\n  }\n\n  .cls-status {\n    font-size: .75rem;\n    color: #6b7280;\n  }\n\n  .cls-empty {\n    color: #9ca3af;\n    font-size: .9rem;\n    padding: 20px;\n    text-align: center;\n    background: #f9fafb;\n    border-radius: 6px;\n    margin: 0;\n  }\n\n  .cls-sub {\n    margin-bottom: 16px;\n    border: 1px solid #e5e7eb;\n    border-radius: 8px;\n    overflow: hidden;\n    background: #fff;\n  }\n\n  .cls-sub-head {\n    padding: 10px 14px;\n    background: #f9fafb;\n    border-bottom: 1px solid #e5e7eb;\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    flex-wrap: wrap;\n    gap: 8px;\n  }\n\n  .cls-sub-time {\n    font-size: .85rem;\n    color: #4b5563;\n    font-weight: 600;\n  }\n\n  .cls-sub-badge {\n    font-size: .7rem;\n    padding: 2px 8px;\n    background: #dbeafe;\n    color: #1e40af;\n    border-radius: 10px;\n    font-weight: 600;\n  }\n\n  .cls-sub-filerow {\n    padding: 10px 14px;\n    background: #eff6ff;\n    border-top: 1px solid #dbeafe;\n    font-size: .85rem;\n    display: flex;\n    align-items: center;\n    gap: 10px;\n    flex-wrap: wrap;\n  }\n\n  .cls-sub-filelabel {\n    color: #1e40af;\n    font-weight: 600;\n  }\n\n  .cls-sub-filelink {\n    color: #2563eb;\n    text-decoration: none;\n    font-weight: 600;\n    padding: 4px 10px;\n    background: #fff;\n    border: 1px solid #bfdbfe;\n    border-radius: 4px;\n    font-size: .8rem;\n  }\n\n  .cls-sub-filelink:hover {\n    background: #dbeafe;\n  }\n\n  .cls-sub-comments {\n    padding: 12px 14px;\n    background: #fffbeb;\n    border-top: 1px solid #fde68a;\n  }\n\n  .cls-sub-comments-title {\n    margin: 0 0 8px;\n    font-size: .85rem;\n    font-weight: 700;\n    color: #92400e;\n  }\n\n  .cls-sub-no-comment {\n    font-size: .85rem;\n    color: #9ca3af;\n    margin: 0;\n    font-style: italic;\n  }\n\n  .cls-comment {\n    padding: 8px 10px;\n    background: #fff;\n    border: 1px solid #fde68a;\n    border-radius: 4px;\n    margin-bottom: 6px;\n    font-size: .88rem;\n    line-height: 1.6;\n  }\n\n  .cls-comment:last-child {\n    margin-bottom: 0;\n  }\n\n  .cls-comment-time {\n    display: block;\n    font-size: .7rem;\n    color: #92400e;\n    font-weight: 600;\n    margin-bottom: 3px;\n  }\n\n  .cls-comment-text {\n    color: #1f2937;\n    white-space: pre-wrap;\n    word-break: break-word;\n  }\n\n  .cls-new-mark {\n    display: inline-block;\n    margin-left: 6px;\n    padding: 1px 6px;\n    background: #dc2626;\n    color: #fff;\n    font-size: .65rem;\n    border-radius: 8px;\n    font-weight: 700;\n  }\n\n  .cls-modal {\n    display: none;\n    position: fixed;\n    inset: 0;\n    background: rgba(17, 24, 39, .6);\n    z-index: 99999;\n    align-items: center;\n    justify-content: center;\n    padding: 16px;\n    font-family: -apple-system, BlinkMacSystemFont, \"Hiragino Sans\", \"Yu Gothic\", sans-serif;\n  }\n\n  .cls-modal.show {\n    display: flex;\n  }\n\n  .cls-modal-box {\n    background: #fff;\n    border-radius: 10px;\n    padding: 24px;\n    max-width: 480px;\n    width: 100%;\n    box-shadow: 0 10px 30px rgba(0, 0, 0, .25);\n    box-sizing: border-box;\n  }\n\n  .cls-modal-title {\n    margin: 0 0 16px;\n    font-size: 1.1rem;\n    font-weight: 700;\n    color: #111827;\n  }\n\n  .cls-modal-body {\n    margin-bottom: 20px;\n  }\n\n  .cls-modal-row {\n    display: flex;\n    padding: 8px 0;\n    border-bottom: 1px solid #f3f4f6;\n    font-size: .9rem;\n  }\n\n  .cls-modal-key {\n    flex: 0 0 80px;\n    color: #6b7280;\n    font-weight: 600;\n  }\n\n  .cls-modal-val {\n    flex: 1;\n    color: #111827;\n    word-break: break-all;\n  }\n\n  .cls-modal-q {\n    margin: 14px 0 0;\n    font-size: .95rem;\n    color: #374151;\n  }\n\n  .cls-modal-actions {\n    display: flex;\n    justify-content: flex-end;\n    gap: 8px;\n  }\n<\/style>\n\n<script>\n  (function () {\n    \/* ============ \u5148\u751f\u304c\u8a2d\u5b9a ============ *\/\n    var API_BASE = '\/classroom';\n    var POLL_INTERVAL_SEC = 15;\n    var MAX_FILE_SIZE = 10 * 1024 * 1024;\n    \/* =================================== *\/\n\n    var $name = document.getElementById('cls-name');\n    var $file = document.getElementById('cls-file');\n    var $fileInfo = document.getElementById('cls-file-info');\n    var $fileClr = document.getElementById('cls-file-clear');\n    var $submit = document.getElementById('cls-submit');\n    var $clear = document.getElementById('cls-clear');\n    var $refresh = document.getElementById('cls-refresh');\n    var $msg = document.getElementById('cls-message');\n    var $status = document.getElementById('cls-status');\n    var $history = document.getElementById('cls-history');\n\n    var $modal = document.getElementById('cls-modal');\n    var $modalName = document.getElementById('cls-modal-name');\n    var $modalFile = document.getElementById('cls-modal-file');\n    var $modalCancel = document.getElementById('cls-modal-cancel');\n    var $modalOk = document.getElementById('cls-modal-ok');\n\n    try {\n      var s = localStorage.getItem('cls_name');\n      if (s) $name.value = s;\n    } catch (e) {}\n\n    function getSeenSet() {\n      try {\n        return new Set(JSON.parse(localStorage.getItem('cls_seen_comments') || '[]'));\n      } catch (e) {\n        return new Set();\n      }\n    }\n\n    function saveSeenSet(set) {\n      try {\n        localStorage.setItem('cls_seen_comments', JSON.stringify(Array.from(set)));\n      } catch (e) {}\n    }\n\n    $name.addEventListener('input', function () {\n      try {\n        localStorage.setItem('cls_name', $name.value);\n      } catch (e) {}\n      scheduleFetch(500);\n    });\n\n    function escapeHtml(s) {\n      return String(s).replace(\/[&<>\"']\/g, function (c) {\n        return {\n          '&': '&amp;',\n          '<': '&lt;',\n          '>': '&gt;',\n          '\"': '&quot;',\n          \"'\": '&#39;'\n        }[c];\n      });\n    }\n\n    function formatSize(bytes) {\n      if (bytes < 1024) return bytes + ' B';\n      if (bytes < 1024 * 1024) return (bytes \/ 1024).toFixed(1) + ' KB';\n      return (bytes \/ 1024 \/ 1024).toFixed(2) + ' MB';\n    }\n\n    function msg(text, type) {\n      $msg.textContent = text;\n      $msg.className = 'cls-message cls-' + (type || 'info');\n    }\n\n    $file.addEventListener('change', function () {\n      var f = $file.files[0];\n\n      if (!f) {\n        $fileInfo.textContent = '\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093';\n        $fileInfo.className = 'cls-fileinfo';\n        $fileClr.style.display = 'none';\n        return;\n      }\n\n      var allowedExt = \/\\.(zip|html|css|js|txt|jpg|jpeg|png|gif|webp|pdf|doc|docx|xls|xlsx|ppt|pptx)$\/i;\n\n      if (!allowedExt.test(f.name)) {\n        msg('\u2717 \u3053\u306e\u30d5\u30a1\u30a4\u30eb\u5f62\u5f0f\u306f\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3067\u304d\u307e\u305b\u3093', 'err');\n        $file.value = '';\n        $fileInfo.textContent = '\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093';\n        $fileInfo.className = 'cls-fileinfo';\n        $fileClr.style.display = 'none';\n        return;\n      }\n\n      if (f.size > MAX_FILE_SIZE) {\n        msg('\u2717 \u30d5\u30a1\u30a4\u30eb\u30b5\u30a4\u30ba\u304c\u5927\u304d\u3059\u304e\u307e\u3059(\u6700\u592710MB)', 'err');\n        $file.value = '';\n        $fileInfo.textContent = '\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093';\n        $fileInfo.className = 'cls-fileinfo';\n        $fileClr.style.display = 'none';\n        return;\n      }\n\n      $fileInfo.textContent = f.name + ' (' + formatSize(f.size) + ')';\n      $fileInfo.className = 'cls-fileinfo selected';\n      $fileClr.style.display = 'inline-block';\n      msg('', 'info');\n    });\n\n    $fileClr.addEventListener('click', function () {\n      $file.value = '';\n      $fileInfo.textContent = '\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093';\n      $fileInfo.className = 'cls-fileinfo';\n      $fileClr.style.display = 'none';\n    });\n\n    $clear.addEventListener('click', function () {\n      if (!confirm('\u5165\u529b\u5185\u5bb9\u3092\u30af\u30ea\u30a2\u3057\u307e\u3059\u304b?')) return;\n\n      $file.value = '';\n      $fileInfo.textContent = '\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093';\n      $fileInfo.className = 'cls-fileinfo';\n      $fileClr.style.display = 'none';\n      msg('', 'info');\n    });\n\n    $refresh.addEventListener('click', function () {\n      fetchHistory(true);\n    });\n\n    $submit.addEventListener('click', function () {\n      var n = $name.value.trim();\n      var f = $file.files[0];\n\n      if (!n) {\n        msg('\u540d\u524d\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044', 'err');\n        $name.focus();\n        return;\n      }\n\n      if (!f) {\n        msg('\u63d0\u51fa\u30d5\u30a1\u30a4\u30eb\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044', 'err');\n        return;\n      }\n\n      $modalName.textContent = n;\n      $modalFile.textContent = f.name + ' (' + formatSize(f.size) + ')';\n      openModal();\n    });\n\n    function openModal() {\n      $modal.classList.add('show');\n      $modalOk.focus();\n    }\n\n    function closeModal() {\n      $modal.classList.remove('show');\n    }\n\n    $modalCancel.addEventListener('click', closeModal);\n\n    $modal.addEventListener('click', function (e) {\n      if (e.target === $modal) closeModal();\n    });\n\n    document.addEventListener('keydown', function (e) {\n      if (e.key === 'Escape' && $modal.classList.contains('show')) closeModal();\n    });\n\n    $modalOk.addEventListener('click', function () {\n      closeModal();\n      doSubmit();\n    });\n\n    function doSubmit() {\n      $submit.disabled = true;\n\n      var f = $file.files[0];\n      msg('\u30d5\u30a1\u30a4\u30eb\u3092\u9001\u4fe1\u4e2d\u2026(\u6642\u9593\u304c\u304b\u304b\u308b\u5834\u5408\u304c\u3042\u308a\u307e\u3059)', 'info');\n\n      var fd = new FormData();\n      fd.append('name', $name.value.trim());\n      fd.append('file', f);\n\n      fetch(API_BASE + '\/save.php', {\n        method: 'POST',\n        body: fd,\n        credentials: 'same-origin'\n      })\n        .then(function (r) {\n          return r.json().then(function (d) {\n            return {\n              ok: r.ok,\n              data: d\n            };\n          });\n        })\n        .then(function (res) {\n          $submit.disabled = false;\n\n          if (res.ok && res.data && res.data.success) {\n            msg('\u2713 \u63d0\u51fa\u3057\u307e\u3057\u305f (' + res.data.datetime + ')', 'ok');\n\n            $file.value = '';\n            $fileInfo.textContent = '\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093';\n            $fileInfo.className = 'cls-fileinfo';\n            $fileClr.style.display = 'none';\n\n            fetchHistory(true);\n          } else {\n            msg('\u2717 ' + ((res.data && res.data.error) || '\u9001\u4fe1\u306b\u5931\u6557\u3057\u307e\u3057\u305f'), 'err');\n          }\n        })\n        .catch(function (e) {\n          $submit.disabled = false;\n          msg('\u2717 \u901a\u4fe1\u30a8\u30e9\u30fc: ' + e.message, 'err');\n        });\n    }\n\n    var fetchTimer = null;\n\n    function scheduleFetch(delay) {\n      clearTimeout(fetchTimer);\n      fetchTimer = setTimeout(function () {\n        fetchHistory(false);\n      }, delay);\n    }\n\n    function fetchHistory(manual) {\n      var n = $name.value.trim();\n\n      if (!n) {\n        $history.innerHTML = '<p class=\"cls-empty\">\u540d\u524d\u3092\u5165\u529b\u3059\u308b\u3068\u3001\u3042\u306a\u305f\u306e\u63d0\u51fa\u5c65\u6b74\u304c\u3053\u3053\u306b\u8868\u793a\u3055\u308c\u307e\u3059\u3002<\/p>';\n        return;\n      }\n\n      if (manual) $status.textContent = '\u53d6\u5f97\u4e2d\u2026';\n\n      fetch(API_BASE + '\/mine.php?name=' + encodeURIComponent(n), {\n        credentials: 'same-origin'\n      })\n        .then(function (r) {\n          return r.json();\n        })\n        .then(function (data) {\n          renderHistory(data.submissions || [], n);\n\n          var now = new Date();\n          $status.textContent =\n            '\u6700\u7d42\u66f4\u65b0: ' +\n            now.getHours() + ':' +\n            String(now.getMinutes()).padStart(2, '0') + ':' +\n            String(now.getSeconds()).padStart(2, '0');\n        })\n        .catch(function () {\n          $status.textContent = '\u53d6\u5f97\u5931\u6557';\n        });\n    }\n\n    function renderHistory(subs, name) {\n      if (!subs.length) {\n        $history.innerHTML = '<p class=\"cls-empty\">\u307e\u3060\u63d0\u51fa\u304c\u3042\u308a\u307e\u305b\u3093\u3002\u4e0a\u306e\u30d5\u30a9\u30fc\u30e0\u304b\u3089\u63d0\u51fa\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>';\n        return;\n      }\n\n      var seen = getSeenSet();\n      var html = '';\n\n      subs.forEach(function (s) {\n        var cmts = s.comments || [];\n        var fileInfo = s.file || null;\n        var cmtHtml = '';\n\n        if (!cmts.length) {\n          cmtHtml = '<p class=\"cls-sub-no-comment\">(\u307e\u3060\u30b3\u30e1\u30f3\u30c8\u306f\u3042\u308a\u307e\u305b\u3093)<\/p>';\n        } else {\n          cmts.forEach(function (c, idx) {\n            var cid = s.id + '#' + idx;\n            var isNew = !seen.has(cid);\n\n            if (isNew) seen.add(cid);\n\n            cmtHtml += '<div class=\"cls-comment\">'\n              + '<span class=\"cls-comment-time\">' + escapeHtml(c.datetime || '') + (isNew ? '<span class=\"cls-new-mark\">NEW<\/span>' : '') + '<\/span>'\n              + '<div class=\"cls-comment-text\">' + escapeHtml(c.text || '') + '<\/div>'\n              + '<\/div>';\n          });\n        }\n\n        var fileHtml = '';\n\n        if (fileInfo && fileInfo.original_name) {\n          var dlUrl = API_BASE + '\/download.php?id=' + encodeURIComponent(s.id) + '&name=' + encodeURIComponent(name);\n\n          fileHtml = '<div class=\"cls-sub-filerow\">'\n            + '<span class=\"cls-sub-filelabel\">\ud83d\udcce \u6dfb\u4ed8\u30d5\u30a1\u30a4\u30eb:<\/span>'\n            + '<span>' + escapeHtml(fileInfo.original_name) + ' (' + formatSize(fileInfo.size || 0) + ')<\/span>'\n            + '<a class=\"cls-sub-filelink\" href=\"' + dlUrl + '\">\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9<\/a>'\n            + '<\/div>';\n        }\n\n        html += '<div class=\"cls-sub\">'\n          + '<div class=\"cls-sub-head\">'\n          + '<span class=\"cls-sub-time\">' + escapeHtml(s.datetime || '') + '<\/span>'\n          + '<span class=\"cls-sub-badge\">' + (cmts.length ? '\u30b3\u30e1\u30f3\u30c8 ' + cmts.length + '\u4ef6' : '\u672a\u30b3\u30e1\u30f3\u30c8') + '<\/span>'\n          + '<\/div>'\n          + fileHtml\n          + '<div class=\"cls-sub-comments\">'\n          + '<h5 class=\"cls-sub-comments-title\">\ud83d\udcac \u5148\u751f\u306e\u30b3\u30e1\u30f3\u30c8<\/h5>'\n          + cmtHtml\n          + '<\/div>'\n          + '<\/div>';\n      });\n\n      $history.innerHTML = html;\n      saveSeenSet(seen);\n    }\n\n    setInterval(function () {\n      fetchHistory(false);\n    }, POLL_INTERVAL_SEC * 1000);\n\n    window.addEventListener('focus', function () {\n      fetchHistory(false);\n    });\n\n    if ($name.value.trim()) fetchHistory(true);\n  })();\n<\/script>\n\n\n\n<p class=\"has-text-align-right wp-block-paragraph\"><a href=\"https:\/\/hydrogen.sandboxwork.com\/classroom\/teacher.php\" target=\"_blank\" rel=\"noreferrer noopener\"><span class=\"swl-fz u-fz-xs\">\u8b1b\u5e2b\u7528\u30da\u30fc\u30b8<\/span><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4e3b\u306a\u4f7f\u7528\u7528\u9014\u8b1b\u5e2b\u3078\u306e\u30d5\u30a1\u30a4\u30eb\u63d0\u51fa\u3084\u3001\u30c1\u30a7\u30c3\u30af\u4f9d\u983c\u7b49 \u540d\u524d\u306f\u5fc5\u9808\u3067\u3059\u3002\u63d0\u51fa\u30d5\u30a1\u30a4\u30eb\u3092\u6dfb\u4ed8\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u5148\u751f\u306e\u30b3\u30e1\u30f3\u30c8\u306f\u4e0b\u306e\u5c65\u6b74\u6b04\u306b\u81ea\u52d5\u3067\u8868\u793a\u3055\u308c\u307e\u3059\u3002 \u540d\u524d \u63d0\u51fa\u30d5\u30a1\u30a4\u30eb (\u5fc5\u9808\u30fb\u6700\u592710MB) \u30d5\u30a1\u30a4\u30eb\u3092\u9078\u629e \u9078\u629e\u3055\u308c\u3066 [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":5,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"swell_btn_cv_data":"","vkexunit_cta_each_option":"","footnotes":""},"class_list":["post-535","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/hydrogen.sandboxwork.com\/index.php?rest_route=\/wp\/v2\/pages\/535","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hydrogen.sandboxwork.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/hydrogen.sandboxwork.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/hydrogen.sandboxwork.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/hydrogen.sandboxwork.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=535"}],"version-history":[{"count":35,"href":"https:\/\/hydrogen.sandboxwork.com\/index.php?rest_route=\/wp\/v2\/pages\/535\/revisions"}],"predecessor-version":[{"id":808,"href":"https:\/\/hydrogen.sandboxwork.com\/index.php?rest_route=\/wp\/v2\/pages\/535\/revisions\/808"}],"wp:attachment":[{"href":"https:\/\/hydrogen.sandboxwork.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=535"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}