Импорт пресетов сборок из ZIP-пакета
Release / release (push) Successful in 30s
CI / test (push) Successful in 23s

Крупные сборки раздают готовый комплект настроек архивом. Панель разбирает
его сама: находит серверный .ini, песочницу и точки появления, показывает,
что нашла (сколько модов, карт, параметров), и только по подтверждению
раскладывает файлы в новый или существующий профиль.

Порты, пароли и название сервера при этом можно оставить свои — они относятся
к машине, а не к сборке; у нового профиля они берутся из активного. Прежние
конфиги остаются рядом как .bak, мир не трогается, а импорт в работающий
профиль отклоняется: PZ перезаписал бы файлы своими при остановке.

Посторонние .ini из архива (настройки модов) за конфиг сервера не
принимаются: он опознаётся по знакомым параметрам.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-06 17:18:44 +03:00
co-authored by Claude Opus 5
parent 1e659678b9
commit aec932f68f
12 changed files with 1022 additions and 7 deletions
+47
View File
@@ -255,6 +255,53 @@
<div id="profile-cards" class="cards"></div>
<h3 data-i18n="import.title"></h3>
<div class="card import-card">
<p class="muted small" data-i18n="import.fileHint"></p>
<input type="file" id="preset-file" accept=".zip">
<div id="preset-details" hidden>
<div class="cfg-field" id="preset-pick" hidden>
<label for="preset-set" data-i18n="import.set"></label>
<select id="preset-set"></select>
</div>
<div class="preset-summary" id="preset-summary"></div>
<div class="fields">
<div class="cfg-field">
<label for="preset-target" data-i18n="import.target"></label>
<select id="preset-target">
<option value="new" data-i18n="import.targetNew"></option>
<option value="existing" data-i18n="import.targetExisting"></option>
</select>
</div>
<div class="cfg-field" id="preset-new-fields">
<label for="preset-id" data-i18n="import.newID"></label>
<input type="text" id="preset-id" autocomplete="off">
<div class="hint" data-i18n="profiles.idHint"></div>
</div>
<div class="cfg-field" id="preset-existing-fields" hidden>
<label for="preset-profile" data-i18n="import.profile"></label>
<select id="preset-profile"></select>
<div class="hint" data-i18n="import.overwriteHint"></div>
</div>
</div>
<p class="muted small" data-i18n="import.keep"></p>
<div class="preset-keep">
<label class="checkbox"><input type="checkbox" data-keep="ports" checked>
<span data-i18n="import.keepPorts"></span></label>
<label class="checkbox"><input type="checkbox" data-keep="access" checked>
<span data-i18n="import.keepAccess"></span></label>
<label class="checkbox"><input type="checkbox" data-keep="identity" checked>
<span data-i18n="import.keepIdentity"></span></label>
</div>
<button class="btn btn-primary" id="btn-preset-import" data-i18n="import.apply"></button>
</div>
</div>
<h3 data-i18n="profiles.newTitle"></h3>
<form id="profile-add-form" class="fields">
<div class="cfg-field">