Files
minecraft_launcher/views/op/dashboard.ejs
claude-bot 44847b8a55 Switch mods to per-folder auto-discovery and resourcepack to single zip
- PackDefinition: replace mods[]/resourcepacks[] with modsFolder (string) + resourcepackPath (string); drop PackAsset
- Editor: replace dynamic add/remove lists with two single inputs; remove the now-dead JS for adding/removing rows
- Server: expose GET /file/mods/<folder>/index.json that returns the list of .jar names; folder name restricted to [a-zA-Z0-9_-]+
- Installer: fetch the listing JSON and download each jar from /file/mods/<folder>/<file>.jar; download the single resourcepack from /file/resourcepacks/<file>.zip directly into resourcepacks/

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-10 20:51:44 +09:00

97 lines
3.6 KiB
Plaintext

<!doctype html>
<html lang="ko">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>관리자 대시보드</title>
<link rel="stylesheet" href="/static/styles.css" />
</head>
<body class="siteBody">
<%- include('../partials/navbar', { userId }) %>
<main class="pageWrap">
<section class="dashboardHeader">
<h1>음악퀴즈 목록</h1>
<div class="dashboardActions">
<form method="post" action="/op/dashboard/create" class="inlineForm">
<button type="submit" class="primaryButton">음악퀴즈 추가</button>
</form>
<button type="button" class="secondaryButton" id="deleteToggle">음악퀴즈 삭제</button>
</div>
</section>
<form method="post" action="/op/dashboard/delete" id="deleteForm" class="dashboardListForm">
<section class="cardRow horizontalScroll">
<% if (items.length === 0) { %>
<p class="muted">등록된 음악퀴즈가 없습니다. "음악퀴즈 추가" 버튼으로 새로 만들어 보세요.</p>
<% } %>
<% items.forEach(function (item) { %>
<article class="packCard editableCard" data-key="<%= item.key %>">
<label class="cardCheckbox" hidden>
<input type="checkbox" name="targetKey" value="<%= item.key %>" />
<span>선택</span>
</label>
<a class="cardLink" href="/op/dashboard/<%= item.key %>">
<h2><%= item.definition ? item.definition.name : item.key %></h2>
<p class="muted"><%= item.key %>.json</p>
<% if (item.definition) { %>
<ul class="metaList">
<li>MC <%= item.definition.mcVersion %></li>
<li>플랫폼 <%= item.definition.platform.type %></li>
<li>모드 폴더 <%= item.definition.modsFolder || '없음' %></li>
</ul>
<% } %>
</a>
</article>
<% }) %>
</section>
<div class="deleteConfirmRow" id="deleteConfirm" hidden>
<button type="button" class="secondaryButton" id="deleteCancel">취소</button>
<button type="submit" class="dangerButton">삭제 확인</button>
</div>
</form>
</main>
<script>
(function () {
var toggleButton = document.getElementById('deleteToggle')
var confirmRow = document.getElementById('deleteConfirm')
var cancelButton = document.getElementById('deleteCancel')
var checkboxLabels = document.querySelectorAll('.cardCheckbox')
var cardLinks = document.querySelectorAll('.cardLink')
function setSelectMode(active) {
confirmRow.hidden = !active
checkboxLabels.forEach(function (label) {
if (active) label.removeAttribute('hidden')
else label.setAttribute('hidden', '')
})
cardLinks.forEach(function (link) {
if (active) {
link.setAttribute('data-disabled', 'true')
link.addEventListener('click', preventNavigation)
} else {
link.removeAttribute('data-disabled')
link.removeEventListener('click', preventNavigation)
}
})
}
function preventNavigation(event) {
event.preventDefault()
}
toggleButton.addEventListener('click', function () {
setSelectMode(true)
})
cancelButton.addEventListener('click', function () {
setSelectMode(false)
document.querySelectorAll('input[name="targetKey"]').forEach(function (input) {
input.checked = false
})
})
})()
</script>
</body>
</html>