feat: add UMass Amherst theme support, implement HTML snippet management system, and update page rendering logic

This commit is contained in:
2026-07-06 23:50:55 +07:00
parent 3dc5a03484
commit e6d98edc45
364 changed files with 9967 additions and 36960 deletions
@@ -11,12 +11,16 @@
<title layout:title-pattern="$CONTENT_TITLE - $LAYOUT_TITLE">SIS Vietnam - Manage</title>
<!-- Custom fonts for this template-->
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css" rel="stylesheet" type="text/css">
<link href="https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,700,700i,800,800i,900,900i" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css" rel="stylesheet"
type="text/css">
<link
href="https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,700,700i,800,800i,900,900i"
rel="stylesheet">
<!-- Custom styles for this template-->
<link href="https://cdnjs.cloudflare.com/ajax/libs/startbootstrap-sb-admin-2/4.1.4/css/sb-admin-2.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/startbootstrap-sb-admin-2/4.1.4/css/sb-admin-2.min.css"
rel="stylesheet">
<!-- Project-wide CSS Variables & Custom Styles -->
<link rel="stylesheet" th:href="@{/css/custom.css}">
<!-- Admin Head Hook -->
@@ -32,11 +36,12 @@
<ul class="navbar-nav bg-gradient-primary sidebar sidebar-dark accordion" id="accordionSidebar">
<!-- Sidebar - Brand -->
<a class="sidebar-brand d-flex align-items-center justify-content-center" th:href="@{/manage}">
<div class="sidebar-brand-icon rotate-n-15">
<i class="fas fa-laugh-wink"></i>
<a class="sidebar-brand d-flex align-items-center justify-content-center" th:href="@{/manage}"
style="height: 130px;">
<div class="sidebar-brand-icon">
<img th:src="@{/images/LogoSIS_White.png}" alt="Logo" style="width: 100%;">
</div>
<div class="sidebar-brand-text mx-3">SIS Manage</div>
<!-- <div class="sidebar-brand-text mx-3">SIS Manage</div> -->
</a>
<!-- Divider -->
@@ -49,7 +54,8 @@
<i class="fas fa-fw fa-tachometer-alt"></i>
<span>Dashboard</span>
</a>
<div id="collapseDashboard" class="collapse" aria-labelledby="headingDashboard" data-parent="#accordionSidebar">
<div id="collapseDashboard" class="collapse" aria-labelledby="headingDashboard"
data-parent="#accordionSidebar">
<div class="bg-white py-2 collapse-inner rounded">
<a class="collapse-item" th:href="@{/manage}">Home</a>
<a class="collapse-item" th:href="@{/manage/updates}">Updates</a>
@@ -122,7 +128,8 @@
<i class="fas fa-fw fa-paint-brush"></i>
<span>Appearance</span>
</a>
<div id="collapseAppearance" class="collapse" aria-labelledby="headingAppearance" data-parent="#accordionSidebar">
<div id="collapseAppearance" class="collapse" aria-labelledby="headingAppearance"
data-parent="#accordionSidebar">
<div class="bg-white py-2 collapse-inner rounded">
<h6 class="collapse-header">Design Management:</h6>
<a class="collapse-item" th:href="@{/manage/themes}">Themes</a>
@@ -149,7 +156,8 @@
<i class="fas fa-fw fa-plug"></i>
<span>Plugins</span>
</a>
<div id="collapsePlugins" class="collapse" aria-labelledby="headingPlugins" data-parent="#accordionSidebar">
<div id="collapsePlugins" class="collapse" aria-labelledby="headingPlugins"
data-parent="#accordionSidebar">
<div class="bg-white py-2 collapse-inner rounded">
<h6 class="collapse-header">Plugin Management:</h6>
<a class="collapse-item" th:href="@{/manage/plugins}">Installed Plugins</a>
@@ -206,7 +214,8 @@
<i class="fas fa-fw fa-cogs"></i>
<span>Settings</span>
</a>
<div id="collapseSettings" class="collapse" aria-labelledby="headingSettings" data-parent="#accordionSidebar">
<div id="collapseSettings" class="collapse" aria-labelledby="headingSettings"
data-parent="#accordionSidebar">
<div class="bg-white py-2 collapse-inner rounded">
<h6 class="collapse-header">Configuration:</h6>
<a class="collapse-item" th:href="@{/manage/settings/general}">General</a>
@@ -227,8 +236,7 @@
<i class="fas fa-fw fa-wrench"></i>
<span>Tools</span>
</a>
<div id="collapseTools" class="collapse" aria-labelledby="headingTools"
data-parent="#accordionSidebar">
<div id="collapseTools" class="collapse" aria-labelledby="headingTools" data-parent="#accordionSidebar">
<div class="bg-white py-2 collapse-inner rounded">
<h6 class="collapse-header">System Tools:</h6>
<a class="collapse-item" th:href="@{/manage/tools/import-export}">Import / Export</a>
@@ -241,6 +249,35 @@
<!-- Divider -->
<hr class="sidebar-divider d-none d-md-block">
<!-- Dynamic Extensions Heading (only if dynamic menus exist) -->
<th:block th:if="${!dynamicAdminMenus.isEmpty()}">
<div class="sidebar-heading">
Extensions
</div>
<!-- Dynamic Menus Loop -->
<li class="nav-item" th:each="menu : ${dynamicAdminMenus}">
<!-- Dropdown Trigger -->
<a class="nav-link collapsed" href="#" data-toggle="collapse"
th:data-target="'#collapse_' + ${#strings.replace(menu.menuSlug, '-', '_')}"
aria-expanded="true">
<i th:class="${menu.iconUrl}"></i>
<span th:text="${menu.menuTitle}">Menu Title</span>
</a>
<!-- Dropdown Content -->
<div th:id="'collapse_' + ${#strings.replace(menu.menuSlug, '-', '_')}" class="collapse"
data-parent="#accordionSidebar">
<div class="bg-white py-2 collapse-inner rounded">
<a class="collapse-item" th:each="sub : ${menu.submenus}" th:href="@{${sub.url}}"
th:text="${sub.menuTitle}">Submenu</a>
</div>
</div>
</li>
<hr class="sidebar-divider d-none d-md-block">
</th:block>
<!-- Sidebar Toggler (Sidebar) -->
<div class="text-center d-none d-md-inline">
<button class="rounded-circle border-0" id="sidebarToggle"></button>
@@ -270,7 +307,8 @@
<li class="nav-item dropdown no-arrow">
<a class="nav-link dropdown-toggle" href="#" id="userDropdown" role="button"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="mr-2 d-none d-lg-inline text-gray-600 small" sec:authentication="name">Admin User</span>
<span class="mr-2 d-none d-lg-inline text-gray-600 small"
sec:authentication="name">Admin User</span>
<img class="img-profile rounded-circle"
src="https://startbootstrap.github.io/startbootstrap-sb-admin-2/img/undraw_profile.svg">
</a>
@@ -283,9 +321,10 @@
</a>
<div class="dropdown-divider"></div>
<form method="post" th:action="@{/manage/logout}" id="logoutForm" class="d-none">
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" />
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" />
</form>
<a class="dropdown-item" href="#" onclick="document.getElementById('logoutForm').submit(); return false;">
<a class="dropdown-item" href="#"
onclick="document.getElementById('logoutForm').submit(); return false;">
<i class="fas fa-sign-out-alt fa-sm fa-fw mr-2 text-gray-400"></i>
Logout
</a>
@@ -365,4 +404,4 @@
</body>
</html>
</html>