- 5종 약관(map/resourcepack/mod/installer/installer-rp) markdown 시드 + manifest/terms/ 노출 - 사이트 /op/agreement 목록 + Notion 스타일 markdown 에디터 (슬래시 명령어, 미리보기) - 메인 installer: 음악퀴즈 선택 직후 약관 동의 페이지(맵·모드·설치기) 추가 - rp installer: 음악퀴즈 선택 직후 약관 동의 페이지(리소스팩·설치기) 추가 - rp installer 취소 버그 수정: buildResourcepackZip 단계간 + archive.abort() 폴링 - rp installer 취소 UX: 즉시 "취소 중…" 표시, 취소 시 installFailed 알림 생략 - 0.2.6 → 0.3.0 (큰 기능) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
100 lines
4.0 KiB
Plaintext
100 lines
4.0 KiB
Plaintext
<!doctype html>
|
|
<html lang="ko">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<title><%= t('dashboard.browserTitle') %></title>
|
|
<link rel="stylesheet" href="/static/styles.css" />
|
|
</head>
|
|
<body class="siteBody">
|
|
<%- include('../partials/navbar', { userId }) %>
|
|
|
|
<main class="pageWrap">
|
|
<section class="dashboardHeader">
|
|
<h1><%= t('dashboard.title') %></h1>
|
|
<div class="dashboardActions">
|
|
<a class="secondaryButton" href="/op/list"><%= t('dashboard.editList') %></a>
|
|
<a class="secondaryButton" href="/op/datapack"><%= t('dashboard.editDatapack') %></a>
|
|
<a class="secondaryButton" href="/op/agreement"><%= t('dashboard.editTerms') %></a>
|
|
<form method="post" action="/op/dashboard/create" class="inlineForm">
|
|
<button type="submit" class="primaryButton"><%= t('dashboard.addPack') %></button>
|
|
</form>
|
|
<button type="button" class="secondaryButton" id="deleteToggle"><%= t('dashboard.deletePack') %></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"><%= t('dashboard.emptyHint') %></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><%= t('dashboard.select') %></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><%= t('dashboard.mcShort') %> <%= item.definition.mcVersion %></li>
|
|
<li><%= t('site.platform') %> <%= item.definition.platform.type %></li>
|
|
<li><%= t('site.modsFolder') %> <%= item.definition.modsFolder || t('site.noneFallback') %></li>
|
|
</ul>
|
|
<% } %>
|
|
</a>
|
|
</article>
|
|
<% }) %>
|
|
</section>
|
|
<div class="deleteConfirmRow" id="deleteConfirm" hidden>
|
|
<button type="button" class="secondaryButton" id="deleteCancel"><%= t('common.cancel') %></button>
|
|
<button type="submit" class="dangerButton"><%= t('dashboard.confirmDelete') %></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>
|