Path is set by the loader upload form below, so the manual text input was redundant. Drop the field from the editor UI and stop overwriting the saved value on form submit so an uploaded loader keeps its path. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
150 lines
6.2 KiB
Plaintext
150 lines
6.2 KiB
Plaintext
<!doctype html>
|
|
<html lang="ko">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<title><%= packEntry?.name ?? packKey %> 편집</title>
|
|
<link rel="stylesheet" href="/static/styles.css" />
|
|
</head>
|
|
<body class="siteBody">
|
|
<%- include('../partials/navbar', { userId }) %>
|
|
|
|
<main class="pageWrap">
|
|
<section class="editorWrap">
|
|
<div class="editorHeader">
|
|
<div>
|
|
<p class="eyebrow">PACK EDITOR</p>
|
|
<h1><%= packEntry?.name ?? packKey %></h1>
|
|
</div>
|
|
<a class="ghostLink" href="/op/dashboard">목록으로</a>
|
|
</div>
|
|
|
|
<form method="post" class="editorForm">
|
|
<div class="gridTwo">
|
|
<label>
|
|
<span>서버팩 이름</span>
|
|
<input name="displayName" value="<%= packEntry?.name ?? '' %>" required />
|
|
</label>
|
|
<label>
|
|
<span>JSON 파일 이름</span>
|
|
<input name="fileName" value="<%= packKey %>" required />
|
|
</label>
|
|
</div>
|
|
|
|
<label>
|
|
<span>설명</span>
|
|
<textarea name="description"><%= pack.description ?? '' %></textarea>
|
|
</label>
|
|
|
|
<div class="gridTwo">
|
|
<label>
|
|
<span>마인크래프트 버전</span>
|
|
<select name="mcVersion" required>
|
|
<% releases.forEach((release) => { %>
|
|
<option value="<%= release.id %>" <%= release.id === pack.mcVersion ? 'selected' : '' %>><%= release.id %></option>
|
|
<% }) %>
|
|
</select>
|
|
</label>
|
|
<label>
|
|
<span>권장 JDK 버전</span>
|
|
<input type="number" name="recommendedJdkVersion" value="<%= pack.recommendedJdkVersion ?? 17 %>" min="8" required />
|
|
</label>
|
|
<label>
|
|
<span>클라이언트 로더 종류</span>
|
|
<select name="loaderType">
|
|
<option value="vanilla" <%= (pack.loaderType ?? 'vanilla') === 'vanilla' ? 'selected' : '' %>>vanilla</option>
|
|
<option value="forge" <%= pack.loaderType === 'forge' ? 'selected' : '' %>>forge</option>
|
|
<option value="fabric" <%= pack.loaderType === 'fabric' ? 'selected' : '' %>>fabric</option>
|
|
<option value="neoforge" <%= pack.loaderType === 'neoforge' ? 'selected' : '' %>>neoforge</option>
|
|
</select>
|
|
</label>
|
|
<label>
|
|
<span>로더 버전</span>
|
|
<input name="loaderVersion" value="<%= pack.loaderVersion ?? '' %>" placeholder="예: 0.16.14 / 47.3.0 / 21.4.111-beta" />
|
|
</label>
|
|
<label>
|
|
<span>packPath</span>
|
|
<input name="packPath" value="<%= pack.packPath %>" required />
|
|
</label>
|
|
<label>
|
|
<span>서버 최소 램</span>
|
|
<input type="number" name="serverMinRam" value="<%= pack.serverMinRam %>" required />
|
|
</label>
|
|
<label>
|
|
<span>서버 최대 램</span>
|
|
<input type="number" name="serverMaxRam" value="<%= pack.serverMaxRam %>" required />
|
|
</label>
|
|
<label>
|
|
<span>클라이언트 최소 램</span>
|
|
<input type="number" name="clientMinRam" value="<%= pack.clientMinRam %>" required />
|
|
</label>
|
|
<label>
|
|
<span>클라이언트 권장 램</span>
|
|
<input type="number" name="clientRecommendedRam" value="<%= pack.clientRecommendedRam %>" required />
|
|
</label>
|
|
</div>
|
|
|
|
<button class="primaryButton" type="submit">적용</button>
|
|
</form>
|
|
|
|
<section class="assetSection">
|
|
<div class="assetCard">
|
|
<h2>로더 설치파일 업로드</h2>
|
|
<form method="post" action="/op/dashboard/<%= packKey %>/assets/loader" enctype="multipart/form-data" class="assetForm">
|
|
<input type="file" name="asset" required />
|
|
<button class="primaryButton" type="submit">로더 업로드</button>
|
|
</form>
|
|
<% if (pack.loaderInstallerPath) { %>
|
|
<div class="assetItem">
|
|
<code><%= pack.loaderInstallerPath %></code>
|
|
<form method="post" action="/op/dashboard/<%= packKey %>/assets/loader/remove">
|
|
<input type="hidden" name="assetPath" value="<%= pack.loaderInstallerPath %>" />
|
|
<button class="dangerButton" type="submit">삭제</button>
|
|
</form>
|
|
</div>
|
|
<% } %>
|
|
</div>
|
|
|
|
<div class="assetCard">
|
|
<h2>리소스팩 업로드</h2>
|
|
<form method="post" action="/op/dashboard/<%= packKey %>/assets/resource-pack" enctype="multipart/form-data" class="assetForm">
|
|
<input type="file" name="asset" required />
|
|
<button class="primaryButton" type="submit">리소스팩 추가</button>
|
|
</form>
|
|
<div class="assetList">
|
|
<% (pack.resourcePackFiles ?? []).forEach((resourcePack) => { %>
|
|
<div class="assetItem">
|
|
<code><%= resourcePack %></code>
|
|
<form method="post" action="/op/dashboard/<%= packKey %>/assets/resource-pack/remove">
|
|
<input type="hidden" name="assetPath" value="<%= resourcePack %>" />
|
|
<button class="dangerButton" type="submit">삭제</button>
|
|
</form>
|
|
</div>
|
|
<% }) %>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="assetCard">
|
|
<h2>쉐이더 업로드</h2>
|
|
<form method="post" action="/op/dashboard/<%= packKey %>/assets/shader-pack" enctype="multipart/form-data" class="assetForm">
|
|
<input type="file" name="asset" required />
|
|
<button class="primaryButton" type="submit">쉐이더 추가</button>
|
|
</form>
|
|
<div class="assetList">
|
|
<% (pack.shaderPackFiles ?? []).forEach((shaderPack) => { %>
|
|
<div class="assetItem">
|
|
<code><%= shaderPack %></code>
|
|
<form method="post" action="/op/dashboard/<%= packKey %>/assets/shader-pack/remove">
|
|
<input type="hidden" name="assetPath" value="<%= shaderPack %>" />
|
|
<button class="dangerButton" type="submit">삭제</button>
|
|
</form>
|
|
</div>
|
|
<% }) %>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
</section>
|
|
</main>
|
|
</body>
|
|
</html>
|