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

From version Icon 111.1 Icon
edited by Super Admin
on 2026/03/24 21:32
Change comment: There is no comment for this version
To version Icon 116.1 Icon
edited by Super Admin
on 2026/03/27 15:41
Change comment: There is no comment for this version

Summary

Details

Icon Page properties
Content
... ... @@ -409,106 +409,6 @@
409 409  </div>
410 410  #end
411 411  
412 -## --- 入力進捗ガイド(自校ユーザー向け) ---
413 -#if(!$isGuest && $canEdit)
414 - #set($stepItems = [])
415 - #set($completedCount = 0)
416 - #set($totalSteps = 8)
417 - ## 1. 基本情報(生徒数)
418 - #if($studentCount && $studentCount != '' && $studentCount != '0')
419 - #set($discard = $stepItems.add({'name': '基本情報(生徒数・学級数)', 'done': true}))
420 - #set($completedCount = $completedCount + 1)
421 - #else
422 - #set($discard = $stepItems.add({'name': '基本情報(生徒数・学級数)', 'done': false}))
423 - #end
424 - ## 2. 生徒会組織
425 - #if($orgChart && $orgChart != '')
426 - #set($discard = $stepItems.add({'name': '生徒会組織', 'done': true}))
427 - #set($completedCount = $completedCount + 1)
428 - #else
429 - #set($discard = $stepItems.add({'name': '生徒会組織', 'done': false}))
430 - #end
431 - ## 3. 日常の活動
432 - #if($dailyActivities && $dailyActivities != '')
433 - #set($discard = $stepItems.add({'name': '日常の活動', 'done': true}))
434 - #set($completedCount = $completedCount + 1)
435 - #else
436 - #set($discard = $stepItems.add({'name': '日常の活動', 'done': false}))
437 - #end
438 - ## 4. 生徒総会
439 - #if($assemblyFormat && $assemblyFormat != '')
440 - #set($discard = $stepItems.add({'name': '生徒総会', 'done': true}))
441 - #set($completedCount = $completedCount + 1)
442 - #else
443 - #set($discard = $stepItems.add({'name': '生徒総会', 'done': false}))
444 - #end
445 - ## 5. 選挙
446 - #if($electionExists && $electionExists != '')
447 - #set($discard = $stepItems.add({'name': '選挙', 'done': true}))
448 - #set($completedCount = $completedCount + 1)
449 - #else
450 - #set($discard = $stepItems.add({'name': '選挙', 'done': false}))
451 - #end
452 - ## 6. 校則の見直し
453 - #if($ruleReviewStatus && $ruleReviewStatus != '')
454 - #set($discard = $stepItems.add({'name': '校則・生徒会会則の見直し', 'done': true}))
455 - #set($completedCount = $completedCount + 1)
456 - #else
457 - #set($discard = $stepItems.add({'name': '校則・生徒会会則の見直し', 'done': false}))
458 - #end
459 - ## 7. 予算
460 - #set($budgetFilled = false)
461 - #if(($budgetScale && $budgetScale != '') || ($studentFee && $studentFee != '')) #set($budgetFilled = true) #end
462 - #if($budgetFilled)
463 - #set($discard = $stepItems.add({'name': '予算', 'done': true}))
464 - #set($completedCount = $completedCount + 1)
465 - #else
466 - #set($discard = $stepItems.add({'name': '予算', 'done': false}))
467 - #end
468 - ## 8. 活動報告
469 - #set($activityCount = $doc.getObjects('SeitokaiCode.ActivityClass').size())
470 - #if($activityCount > 0)
471 - #set($discard = $stepItems.add({'name': '活動報告', 'done': true}))
472 - #set($completedCount = $completedCount + 1)
473 - #else
474 - #set($discard = $stepItems.add({'name': '活動報告(まだ投稿がありません)', 'done': false}))
475 - #end
476 - ## 全完了なら非表示
477 - #if($completedCount < $totalSteps)
478 - #set($progressPct = $mathtool.mul($mathtool.div($completedCount, $totalSteps), 100))
479 - #set($progressPctInt = $mathtool.toInteger($progressPct))
480 - #set($firstMissing = false)
481 -<div class="progress-guide" style="margin-bottom:var(--sp-4);">
482 - <div class="progress-guide-header">
483 - <span class="progress-guide-title"><svg class="ico" viewBox="0 0 24 24" style="width:1.1em;height:1.1em;vertical-align:-2px;"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg> 学校情報の入力状況</span>
484 - <span class="progress-guide-count">${completedCount} / ${totalSteps} 完了</span>
485 - </div>
486 - <div class="progress-bar-track">
487 - <div class="progress-bar-fill" style="width:${progressPctInt}%"></div>
488 - </div>
489 - <ul class="progress-step-list">
490 - #foreach($step in $stepItems)
491 - #if($step.done)
492 - <li class="progress-step done"><svg class="ico" viewBox="0 0 24 24" style="width:0.9em;height:0.9em;"><path d="M20 6L9 17l-5-5"/></svg> $step.name</li>
493 - #else
494 - #if(!$firstMissing)
495 - <li class="progress-step next"><svg class="ico" viewBox="0 0 24 24" style="width:0.9em;height:0.9em;"><circle cx="12" cy="12" r="10"/></svg> $step.name <span class="progress-next-label">← 次はここ!</span></li>
496 - #set($firstMissing = true)
497 - #else
498 - <li class="progress-step pending"><svg class="ico" viewBox="0 0 24 24" style="width:0.9em;height:0.9em;"><rect x="3" y="3" width="18" height="18" rx="2"/></svg> $step.name</li>
499 - #end
500 - #end
501 - #end
502 - </ul>
503 - <div style="margin-top:var(--sp-3);">
504 - <a href="$doc.getURL('view', 'sheet=SeitokaiCode.SchoolEditForm')" class="btn-primary-sm">
505 - <svg class="ico" viewBox="0 0 24 24" style="width:0.9em;height:0.9em;"><path d="M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7"/><path d="M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z"/></svg> 編集画面を開く
506 - </a>
507 - </div>
508 -</div>
509 - #end
510 -#end
511 -
512 512  ## --- ① 学校基本情報 ---
513 513  <div class="school-info-card collapsed" id="card-basic-info">
514 514   <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>
... ... @@ -1104,13 +1104,13 @@
1104 1104  
1105 1105  <div class="activity-toolbar">
1106 1106   <div class="activity-fy-tabs">
1107 - <button class="activity-fy-tab active" onclick="switchActivityFY('$currentFYStr', this)">$currentFYStr 年度</button>
1007 + <button class="activity-fy-tab" onclick="switchActivityFY('$currentFYStr', this)">$currentFYStr 年度</button>
1108 1108   #foreach($fy in $fySet)
1109 1109   #if($fy != $currentFYStr)
1110 1110   <button class="activity-fy-tab" onclick="switchActivityFY('$fy', this)">$fy 年度</button>
1111 1111   #end
1112 1112   #end
1113 - <button class="activity-fy-tab" onclick="switchActivityFY('all', this)">全期間</button>
1013 + <button class="activity-fy-tab active" onclick="switchActivityFY('all', this)">全期間</button>
1114 1114   </div>
1115 1115   <div class="activity-toolbar-right">
1116 1116   <button class="btn-view-toggle" id="btnViewToggle" onclick="toggleCompactView()" title="タイトルのみ表示">
... ... @@ -1149,22 +1149,64 @@
1149 1149  
1150 1150  {{/html}}
1151 1151  
1152 -## 特色ある活動を先頭に表示するため、並び替え用リストを作成
1153 -#set($featuredActivities = [])
1154 -#set($normalActivities = [])
1155 -#if($activities && $activities.size() > 0)
1156 - #foreach($act in $activities)
1157 - #set($isFeatured = $!act.getValue('featured'))
1158 - #if($isFeatured == '1')
1159 - #set($discard = $featuredActivities.add($foreach.index))
1052 +## 活動を「年度降順 + 特色あり先頭」で並び替え
1053 +## Step1: fySet から年度を降順ソート(Velocity ネイティブ実装)
1054 +#set($fyNums = [])
1055 +#foreach($fy in $fySet)
1056 + #if($fy && $fy != '' && $fy != 'unknown')
1057 + #set($discard = $fyNums.add($fy))
1058 + #end
1059 +#end
1060 +## 最大値を順番に取り出して降順リストを構築(最大20年度まで対応)
1061 +#set($fyDesc = [])
1062 +#set($fyRemaining = [])
1063 +#foreach($fy in $fyNums)
1064 + #set($discard = $fyRemaining.add($fy))
1065 +#end
1066 +#foreach($dummy in [1..20])
1067 + #if($fyRemaining.isEmpty())#break#end
1068 + #set($fyMax = $fyRemaining.get(0))
1069 + #foreach($fy in $fyRemaining)
1070 + #if($fy > $fyMax)#set($fyMax = $fy)#end
1071 + #end
1072 + #set($discard = $fyDesc.add($fyMax))
1073 + #set($fyNextRem = [])
1074 + #set($fyMaxRemoved = false)
1075 + #foreach($fy in $fyRemaining)
1076 + #if(!$fyMaxRemoved && $fy == $fyMax)
1077 + #set($fyMaxRemoved = true)
1160 1160   #else
1161 - #set($discard = $normalActivities.add($foreach.index))
1079 + #set($discard = $fyNextRem.add($fy))
1162 1162   #end
1163 1163   #end
1082 + #set($fyRemaining = $fyNextRem)
1164 1164  #end
1084 +## 年度未設定の活動は末尾に表示(fySetに'unknown'は入らないため無条件追加)
1085 +#set($discard = $fyDesc.add('unknown'))
1086 +## Step2: 年度降順で featured → normal の順にインデックスを収集
1165 1165  #set($orderedActivityIndices = [])
1166 -#set($discard = $orderedActivityIndices.addAll($featuredActivities))
1167 -#set($discard = $orderedActivityIndices.addAll($normalActivities))
1088 +#foreach($curFY in $fyDesc)
1089 + ## 同年度の特色あり活動を先頭に
1090 + #set($actIdx2 = 0)
1091 + #foreach($act in $activities)
1092 + #set($aFY2 = $!act.getValue('fiscalYear'))
1093 + #if(!$aFY2 || $aFY2 == '') #set($aFY2 = 'unknown') #end
1094 + #if($aFY2 == $curFY && $act.getValue('featured') == '1')
1095 + #set($discard = $orderedActivityIndices.add($actIdx2))
1096 + #end
1097 + #set($actIdx2 = $actIdx2 + 1)
1098 + #end
1099 + ## 同年度の通常活動
1100 + #set($actIdx2 = 0)
1101 + #foreach($act in $activities)
1102 + #set($aFY2 = $!act.getValue('fiscalYear'))
1103 + #if(!$aFY2 || $aFY2 == '') #set($aFY2 = 'unknown') #end
1104 + #if($aFY2 == $curFY && $act.getValue('featured') != '1')
1105 + #set($discard = $orderedActivityIndices.add($actIdx2))
1106 + #end
1107 + #set($actIdx2 = $actIdx2 + 1)
1108 + #end
1109 +#end
1168 1168  
1169 1169  #if($activities && $activities.size() > 0)
1170 1170   #foreach($actIdx in $orderedActivityIndices)
... ... @@ -1673,7 +1673,7 @@
1673 1673  }
1674 1674  // ページ読み込み時の初期化
1675 1675  document.addEventListener('DOMContentLoaded', function() {
1676 - // 年度タブを降順にソート(「全期間」タブは末尾に固定)
1618 + // 年度タブを降順にソート(「全期間」タブは先頭に固定)
1677 1677   var tabContainer = document.querySelector('.activity-fy-tabs');
1678 1678   if (tabContainer) {
1679 1679   var tabs = Array.from(tabContainer.querySelectorAll('.activity-fy-tab'));
... ... @@ -1690,11 +1690,11 @@
1690 1690   var bYear = parseInt(b.textContent) || 0;
1691 1691   return bYear - aYear;
1692 1692   });
1693 - // DOM再配置
1694 - fyTabs.forEach(function(t) { tabContainer.appendChild(t); });
1635 + // DOM再配置(全期間を先頭、年度タブを降順で続ける)
1695 1695   if (allTab) { tabContainer.appendChild(allTab); }
1637 + fyTabs.forEach(function(t) { tabContainer.appendChild(t); });
1696 1696   }
1697 - // デフォルトで現在の年度を表示
1639 + // デフォルトで全期間を表示
1698 1698   var defaultTab = document.querySelector('.activity-fy-tab.active');
1699 1699   if (defaultTab) { defaultTab.click(); }
1700 1700   // 保存成功時のトースト通知