Last modified by Super Admin on 2026/04/05 18:59

From version Icon 43.1 Icon
edited by Super Admin
on 2026/03/12 17:54
Change comment: There is no comment for this version
To version Icon 48.1 Icon
edited by Super Admin
on 2026/03/13 21:13
Change comment: There is no comment for this version

Summary

Details

Icon Page properties
Content
... ... @@ -100,10 +100,47 @@
100 100   #end
101 101  #end
102 102  
103 +## --- 学校ページ非表示チェック ---
104 +#set($schoolHidden = $doc.getValue('hidden'))
105 +#if($schoolHidden == 1)
106 + #if($isViewerAdmin)
107 + ## 管理者: 黄色バナー + ページ内容は通常表示(プレビュー)
108 +<div class="school-hidden-banner admin">
109 + <svg class="ico" viewBox="0 0 24 24"><path d="M17.94 17.94A10.07 10.07 0 0112 20c-7 0-11-8-11-8a18.45 18.45 0 015.06-5.94M9.9 4.24A9.12 9.12 0 0112 4c7 0 11 8 11 8a18.5 18.5 0 01-2.16 3.19m-6.72-1.07a3 3 0 01-4.24-4.24"/><line x1="1" y1="1" x2="23" y2="23"/></svg>
110 + <div>
111 + <strong>このページは非表示になっています</strong>(管理者のみ閲覧可能)
112 + #set($hBy = $!doc.getValue('hiddenBy'))
113 + #set($hAt = $!doc.getValue('hiddenAt'))
114 + #set($hReason = $!doc.getValue('hiddenReason'))
115 + <div class="school-hidden-detail">
116 + 非表示: $!escapetool.xml($hAt) / $!escapetool.xml($hBy)
117 + #if($hReason && $hReason != '') ・ 理由: $!escapetool.xml($hReason)#end
118 + </div>
119 + <a href="$xwiki.getURL('SeitokaiAdmin.SchoolManagement', 'view')" style="color:#92400e;text-decoration:underline">学校ページ管理へ</a>
120 + </div>
121 +</div>
122 + #else
123 + ## 一般ユーザー・ゲスト: 非公開メッセージを表示して停止
124 +<div class="school-hidden-public">
125 + <svg class="ico" viewBox="0 0 24 24" style="width:2.5em;height:2.5em"><path d="M17.94 17.94A10.07 10.07 0 0112 20c-7 0-11-8-11-8a18.45 18.45 0 015.06-5.94M9.9 4.24A9.12 9.12 0 0112 4c7 0 11 8 11 8a18.5 18.5 0 01-2.16 3.19m-6.72-1.07a3 3 0 01-4.24-4.24"/><line x1="1" y1="1" x2="23" y2="23"/></svg>
126 + <h2>このページは現在公開されていません</h2>
127 + <p>このページは管理者により非公開に設定されています。</p>
128 + <a href="$xwiki.getURL('Schools.WebHome', 'view')" class="btn-back-list">学校一覧に戻る</a>
129 +</div>
130 +{{/html}}
131 +{{/velocity}}
132 +#stop
133 + #end
134 +#end
135 +
103 103  ## --- 投稿固定/解除処理 ---
104 104  #set($pinAction = $!request.action)
105 -#if(($pinAction == 'pin' || $pinAction == 'unpin') && ($viewerAccountType == 'admin' || $viewerAccountType == 'verified') && $services.csrf.isTokenValid($request.form_token))
106 - #set($postObjNum = $mathtool.toInteger($!request.postObj))
138 +#if(($pinAction == 'pin' || $pinAction == 'unpin') && ($viewerAccountType == 'admin' || ($viewerAccountType == 'verified' && $viewerSchoolCode == $schoolCode)) && $services.csrf.isTokenValid($request.form_token))
139 + #set($pinPostObjStr = $!request.postObj)
140 + #if(!$pinPostObjStr.matches('^\d+$'))
141 + ## 不正な値 → 無視
142 + #else
143 + #set($postObjNum = $mathtool.toInteger($pinPostObjStr))
107 107   #set($postObj = $doc.getObject('SeitokaiCode.ActivityPostClass', $postObjNum))
108 108   #if($postObj)
109 109   #if($pinAction == 'pin')
... ... @@ -123,12 +123,15 @@
123 123   $response.sendRedirect($doc.getURL('view'))
124 124   #stop
125 125   #end
163 + #end## /matches
126 126  #end
127 127  
128 128  ## --- 特色ある活動 選定/解除処理 ---
129 129  #set($featAction = $!request.action)
130 -#if(($featAction == 'feature' || $featAction == 'unfeature') && ($viewerAccountType == 'admin' || $viewerAccountType == 'verified' || $viewerAccountType == 'referred') && $services.csrf.isTokenValid($request.form_token))
131 - #set($actObjNum = $mathtool.toInteger($!request.actObj))
168 +#if(($featAction == 'feature' || $featAction == 'unfeature') && ($viewerAccountType == 'admin' || (($viewerAccountType == 'verified' || $viewerAccountType == 'referred') && $viewerSchoolCode == $schoolCode)) && $services.csrf.isTokenValid($request.form_token))
169 + #set($featActObjStr = $!request.actObj)
170 + #if($featActObjStr.matches('^\d+$'))
171 + #set($actObjNum = $mathtool.toInteger($featActObjStr))
132 132   #set($actObj = $doc.getObject('SeitokaiCode.ActivityClass', $actObjNum))
133 133   #if($actObj)
134 134   #if($featAction == 'feature')
... ... @@ -160,6 +160,7 @@
160 160   $response.sendRedirect($doc.getURL('view'))
161 161   #stop
162 162   #end
203 + #end## /matches
163 163  #end
164 164  
165 165  ## --- ユーザー情報取得 ---
... ... @@ -238,7 +238,7 @@
238 238  ## --- ① 学校基本情報 + 連絡先(左右グリッド・折りたたみ対応) ---
239 239  <div class="school-info-grid">
240 240   <div class="school-info-card collapsed" id="card-basic-info">
241 - <h2 onclick="toggleInfoCard('card-basic-info')"><span><svg class="ico ico-md" viewBox="0 0 24 24"><path d="M4 19.5A2.5 2.5 0 016.5 17H20"/><path d="M6.5 2H20v20H6.5A2.5 2.5 0 014 19.5v-15A2.5 2.5 0 016.5 2z"/></svg> 学校基本情報</span><span class="collapse-toggle"><span class="collapse-label-open">たたむ</span><span class="collapse-label-closed">開く</span> <span class="collapse-arrow">▼</span></span></h2>
282 + <h2 role="button" tabindex="0" aria-expanded="false" onclick="toggleInfoCard('card-basic-info')" onkeydown="if(event.key==='Enter'||event.key===' '){event.preventDefault();toggleInfoCard('card-basic-info')}"><span><svg class="ico ico-md" viewBox="0 0 24 24"><path d="M4 19.5A2.5 2.5 0 016.5 17H20"/><path d="M6.5 2H20v20H6.5A2.5 2.5 0 014 19.5v-15A2.5 2.5 0 016.5 2z"/></svg> 学校基本情報</span><span class="collapse-toggle"><span class="collapse-label-open">たたむ</span><span class="collapse-label-closed">開く</span> <span class="collapse-arrow">▼</span></span></h2>
242 242   <table class="wiki-table school-info-table">
243 243   <tr><th>学校コード</th><td>$!escapetool.xml($!schoolCode)</td></tr>
244 244   <tr><th>学校名</th><td>$!escapetool.xml($!schoolName)</td></tr>
... ... @@ -247,7 +247,7 @@
247 247   <tr><th>共学・別学</th><td>$!escapetool.xml($!coeducation)</td></tr>
248 248   <tr><th>設置者</th><td>$!escapetool.xml($!establishment)</td></tr>
249 249   <tr><th>学校種</th><td>$!escapetool.xml($!schoolLevel)</td></tr>
250 - <tr><th>課程</th><td>#if($schoolSystem && $schoolSystem != '' && $schoolSystem != '[]')$!escapetool.xml($!schoolSystem)#end</td></tr>
291 + <tr><th>課程</th><td>#if($schoolSystem && !$schoolSystem.isEmpty())#foreach($ss in $schoolSystem)#if($foreach.count > 1) / #end$!escapetool.xml($ss)#end#end</td></tr>
251 251   <tr><th>公式サイト</th><td>#if($website && $website != '')<a href="$!escapetool.xml($website)" target="_blank" rel="noopener">$!escapetool.xml($website)</a>#else<span class="text-placeholder">未登録</span>#end</td></tr>
252 252   </table>
253 253   #set($infoEditDate = $!doc.getValue('lastInfoEditedDate'))
... ... @@ -258,7 +258,7 @@
258 258   </div>
259 259  
260 260   <div class="school-info-card collapsed" id="card-contact">
261 - <h2 onclick="toggleInfoCard('card-contact')"><span><svg class="ico ico-md" viewBox="0 0 24 24"><path d="M22 16.92v3a2 2 0 01-2.18 2 19.79 19.79 0 01-8.63-3.07 19.5 19.5 0 01-6-6 19.79 19.79 0 01-3.07-8.67A2 2 0 014.11 2h3a2 2 0 012 1.72c.127.96.361 1.903.7 2.81a2 2 0 01-.45 2.11L8.09 9.91a16 16 0 006 6l1.27-1.27a2 2 0 012.11-.45c.907.339 1.85.573 2.81.7A2 2 0 0122 16.92z"/></svg> 連絡先・SNS</span><span class="collapse-toggle"><span class="collapse-label-open">たたむ</span><span class="collapse-label-closed">開く</span> <span class="collapse-arrow">▼</span></span></h2>
302 + <h2 role="button" tabindex="0" aria-expanded="false" onclick="toggleInfoCard('card-contact')" onkeydown="if(event.key==='Enter'||event.key===' '){event.preventDefault();toggleInfoCard('card-contact')}"><span><svg class="ico ico-md" viewBox="0 0 24 24"><path d="M22 16.92v3a2 2 0 01-2.18 2 19.79 19.79 0 01-8.63-3.07 19.5 19.5 0 01-6-6 19.79 19.79 0 01-3.07-8.67A2 2 0 014.11 2h3a2 2 0 012 1.72c.127.96.361 1.903.7 2.81a2 2 0 01-.45 2.11L8.09 9.91a16 16 0 006 6l1.27-1.27a2 2 0 012.11-.45c.907.339 1.85.573 2.81.7A2 2 0 0122 16.92z"/></svg> 連絡先・SNS</span><span class="collapse-toggle"><span class="collapse-label-open">たたむ</span><span class="collapse-label-closed">開く</span> <span class="collapse-arrow">▼</span></span></h2>
262 262   <table class="wiki-table school-info-table">
263 263   <tr><th>問い合わせ先</th><td>#if($contactInfo && $contactInfo != '')$!escapetool.xml($contactInfo)#else<span class="text-placeholder">未登録</span>#end</td></tr>
264 264   <tr><th>生徒会Web</th><td>#if($seitokaiWebsite && $seitokaiWebsite != '')<a href="$!escapetool.xml($seitokaiWebsite)" target="_blank" rel="noopener"><svg class="ico" viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><path d="M2 12h20"/><path d="M12 2a15.3 15.3 0 014 10 15.3 15.3 0 01-4 10 15.3 15.3 0 01-4-10 15.3 15.3 0 014-10z"/></svg> $!escapetool.xml($seitokaiWebsite)</a>#else<span class="text-placeholder">未登録</span>#end</td></tr>
... ... @@ -305,7 +305,7 @@
305 305  
306 306  ## --- ③④⑤ 日常の活動・選挙・定例活動 ---
307 307  <div class="school-section-grid">
308 - #if($dailyActivities && $dailyActivities != '')
349 + #if($dailyActivities && !$dailyActivities.isEmpty())
309 309   <div class="school-section-card">
310 310   <h3><svg class="ico" viewBox="0 0 24 24"><path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="16" y1="13" x2="8" y2="13"/><line x1="16" y1="17" x2="8" y2="17"/></svg> 日常の活動</h3>
311 311   <div class="card-inner">
... ... @@ -312,7 +312,7 @@
312 312   <p class="activity-hint">活動時間の多い順に上位3つ</p>
313 313   <div class="tag-container">
314 314   #set($daIdx = 1)
315 - #foreach($da in $dailyActivities.split(","))
356 + #foreach($da in $dailyActivities)
316 316   <span class="tag tag-accent">${daIdx}. $!escapetool.xml($da.trim())</span>
317 317   #set($daIdx = $daIdx + 1)
318 318   #end
... ... @@ -363,7 +363,7 @@
363 363   #end
364 364  
365 365   ## --- ⑦ 予算 ---
366 - #set($hasBudget = ($budgetProcess && $budgetProcess != '') || ($studentFee && $studentFee != '') || ($budgetScale && $budgetScale != ''))
407 + #set($hasBudget = ($budgetProcess && !$budgetProcess.isEmpty()) || ($studentFee && $studentFee != '') || ($budgetScale && $budgetScale != ''))
367 367   #if($hasBudget)
368 368   ## 公開範囲チェック
369 369   #set($canViewBudget = true)
... ... @@ -374,12 +374,12 @@
374 374   <div class="school-section-card">
375 375   <h3><svg class="ico" viewBox="0 0 24 24"><line x1="12" y1="1" x2="12" y2="23"/><path d="M17 5H9.5a3.5 3.5 0 000 7h5a3.5 3.5 0 010 7H6"/></svg> 予算 #if($visibilityBudget != 'public')<span class="visibility-badge visibility-${visibilityBudget}">#if($visibilityBudget == 'members')<svg class="ico" viewBox="0 0 24 24"><path d="M17 21v-2a4 4 0 00-4-4H5a4 4 0 00-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M23 21v-2a4 4 0 00-3-3.87"/><path d="M16 3.13a4 4 0 010 7.75"/></svg> 登録者限定#else<svg class="ico" viewBox="0 0 24 24"><path d="M2 20h20"/><path d="M5 20V10l7-5 7 5v10"/><path d="M9 20v-5h6v5"/></svg> 校内限定#end</span>#end</h3>
376 376   <div class="card-inner">
377 - #if($budgetProcess && $budgetProcess != '')
418 + #if($budgetProcess && !$budgetProcess.isEmpty())
378 378   <div class="info-row">
379 379   <span class="info-label">作成過程の生徒関与</span>
380 380   <span class="info-value">
381 381   <div class="selection-display">
382 - #foreach($bp in $budgetProcess.split(","))
423 + #foreach($bp in $budgetProcess)
383 383   <span class="selection-item">$!escapetool.xml($bp.trim())</span>
384 384   #end
385 385   </div>
... ... @@ -398,12 +398,12 @@
398 398   <span class="info-value">$!escapetool.xml($!budgetScale)</span>
399 399   </div>
400 400   #end
401 - #if($budgetAllocation && $budgetAllocation != '')
442 + #if($budgetAllocation && !$budgetAllocation.isEmpty())
402 402   <div class="info-row">
403 403   <span class="info-label">主な予算配分</span>
404 404   <span class="info-value">
405 405   <div class="selection-display">
406 - #foreach($ba in $budgetAllocation.split(","))
447 + #foreach($ba in $budgetAllocation)
407 407   <span class="selection-item">$!escapetool.xml($ba.trim())</span>
408 408   #end
409 409   </div>
... ... @@ -436,12 +436,12 @@
436 436   <span class="info-label">見直しの有無(3年以内)</span>
437 437   <span class="info-value"><span class="tag tag-primary tag-sm">$!escapetool.xml($!ruleReviewStatus)</span></span>
438 438   </div>
439 - #if($ruleReviewContent && $ruleReviewContent != '')
480 + #if($ruleReviewContent && !$ruleReviewContent.isEmpty())
440 440   <div class="info-row">
441 441   <span class="info-label">見直しの内容</span>
442 442   <span class="info-value">
443 443   <div class="selection-display">
444 - #foreach($rc in $ruleReviewContent.split(","))
485 + #foreach($rc in $ruleReviewContent)
445 445   <span class="selection-item">$!escapetool.xml($rc.trim())</span>
446 446   #end
447 447   </div>
... ... @@ -448,12 +448,12 @@
448 448   </span>
449 449   </div>
450 450   #end
451 - #if($ruleReviewProposer && $ruleReviewProposer != '')
492 + #if($ruleReviewProposer && !$ruleReviewProposer.isEmpty())
452 452   <div class="info-row">
453 453   <span class="info-label">見直しの提案者</span>
454 454   <span class="info-value">
455 455   <div class="selection-display">
456 - #foreach($rp in $ruleReviewProposer.split(","))
497 + #foreach($rp in $ruleReviewProposer)
457 457   <span class="selection-item">$!escapetool.xml($rp.trim())</span>
458 458   #end
459 459   </div>
... ... @@ -460,12 +460,12 @@
460 460   </span>
461 461   </div>
462 462   #end
463 - #if($ruleReviewImplementer && $ruleReviewImplementer != '')
504 + #if($ruleReviewImplementer && !$ruleReviewImplementer.isEmpty())
464 464   <div class="info-row">
465 465   <span class="info-label">見直しの実施者</span>
466 466   <span class="info-value">
467 467   <div class="selection-display">
468 - #foreach($ri in $ruleReviewImplementer.split(","))
509 + #foreach($ri in $ruleReviewImplementer)
469 469   <span class="selection-item">$!escapetool.xml($ri.trim())</span>
470 470   #end
471 471   </div>
... ... @@ -627,7 +627,7 @@
627 627  <div class="activity-thread" data-fiscal-year="$!escapetool.xml($actFY)">
628 628   <div class="activity-thread-header">
629 629   <div class="activity-thread-title">
630 - <h3 #if($actFeatured == '1')class="featured-title"#end>$!escapetool.xml($!actTitle) #if($actFeatured == '1')<svg class="ico ico-fixed-14" viewBox="0 0 24 24" fill="currentColor" stroke="none" class="ico-star-offset"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>#end</h3>
671 + <h3 #if($actFeatured == '1')class="featured-title"#end>$!escapetool.xml($!actTitle) #if($actFeatured == '1')<svg class="ico ico-fixed-14 ico-star-offset" viewBox="0 0 24 24" fill="currentColor" stroke="none"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>#end</h3>
631 631   <span class="activity-meta">$!escapetool.xml($!actCommittee) | $!escapetool.xml($!actPeriod) #if($actFY != 'unknown')| $!escapetool.xml($actFY)年度#end</span>
632 632   </div>
633 633   <div class="thread-meta-row">
... ... @@ -757,9 +757,6 @@
757 757   #elseif($postUserRole == 'graduate')
758 758   <span class="badge badge-role-graduate badge-sm"><svg class="ico" viewBox="0 0 24 24"><path d="M22 10l-10-5L2 10l10 5 10-5z"/><path d="M6 12v5c0 1.66 2.69 3 6 3s6-1.34 6-3v-5"/></svg> 卒業生</span>
759 759   #end
760 - #if($postGrade && $postGrade != '')
761 - <span class="badge badge-grade badge-sm">$postGrade</span>
762 - #end
763 763   </span>
764 764   <span class="thread-post-date">$!postDate</span>
765 765   #set($postEdited = $!post.getValue('edited'))
... ... @@ -998,6 +998,9 @@
998 998   var card = document.getElementById(cardId);
999 999   if (!card) return;
1000 1000   card.classList.toggle('collapsed');
1039 + var isCollapsed = card.classList.contains('collapsed');
1040 + var h2 = card.querySelector('h2[role="button"]');
1041 + if (h2) h2.setAttribute('aria-expanded', !isCollapsed);
1001 1001  }
1002 1002  
1003 1003  // 投稿の編集(インライン編集フォームを開く)