Decider admin access to deciders by steam id

This commit is contained in:
anibus
2026-10-30 20:26:43 +03:00
parent 0212f8b6d0
commit f0ec7bbedb
8 changed files with 1896 additions and 165 deletions
+77 -6
View File
@@ -81,9 +81,9 @@
</div>
<div class="list-group" id="deciderList">
@for(d <- deciders) {
<a class="list-group-item" onclick="openDecider('@d.key')">
<a class="list-group-item" data-key="@d.key" onclick="openDecider('@d.key')">
<h4 class="list-group-item-heading">@d.name</h4>
<p class="list-group-item-text decider-key">@d.key &bull; maps: @d.maps.size</p>
<p class="list-group-item-text decider-key">@d.key &bull; maps: @d.maps.size &bull; owner: @d.ownerSteamId.getOrElse("-")</p>
</a>
}
@if(deciders.isEmpty) {
@@ -110,6 +110,17 @@
<label for="formKey">Key</label>
<input type="text" class="form-control" id="formKey" placeholder="e.g. dawn_of_war">
<p class="help-block">Unique decider identifier (letters, digits, hyphen, underscore)</p>
<p class="help-block" id="keyUrlBlock" style="display: none;">
URL: <a id="formKeyUrl" href="#" target="_blank" rel="noopener"></a>
<button type="button" class="btn btn-xs btn-default" id="btnCopyUrl"
title="Copy URL to clipboard">Copy</button>
</p>
</div>
<div class="form-group">
<label for="formOwner">Owner Steam ID</label>
<input type="text" class="form-control" id="formOwner" readonly>
<p class="help-block">Owner cannot be changed</p>
</div>
<div class="form-group">
@@ -218,6 +229,8 @@
<script src='@routes.Assets.at("lib/underscore/underscore.js")'></script>
<script>
var currentDeciderKey = null;
// Steam ID текущего пользователя: владелец нового десайдера.
var currentSteamId = '@request.session.get("steamId").getOrElse("")';
// CSRF: все AJAX-запросы отправляем с токеном из meta-тега,
// иначе Play отклоняет POST/DELETE с JSON-телом.
@@ -266,7 +279,21 @@
$('#deciderKey').val(decider.key);
$('#formKey').val(decider.key).prop('readonly', !!decider.key);
// Ссылка на десайдер: показываем только для уже созданных.
if (decider.key) {
var deciderPath = '/decider/' + encodeURIComponent(decider.key);
$('#formKeyUrl')
.attr('href', deciderPath)
.text(window.location.origin + deciderPath);
$('#keyUrlBlock').show();
} else {
$('#formKeyUrl').attr('href', '#').text('');
$('#keyUrlBlock').hide();
}
$('#btnDelete').toggle(!!decider.key);
$('#formOwner').val(decider.ownerSteamId || currentSteamId);
$('#formName').val(decider.name);
$('#formRules').val(decider.rules);
$('#formRaceCount').val(decider.raceCount);
@@ -288,11 +315,13 @@
// Превью карт: подгружаем список картинок, чтобы найти файлы любого формата.
ensureMapImages();
// Highlight selected in list
// Highlight selected in list (точное совпадение по ключу десайдера)
$('.list-group-item').removeClass('active');
$('.list-group-item').filter(function() {
return $(this).find('.decider-key').text().includes(decider.key);
}).addClass('active');
if (decider.key) {
$('.list-group-item').filter(function() {
return $(this).attr('data-key') === decider.key;
}).addClass('active');
}
}
// Close edit panel
@@ -644,12 +673,54 @@
});
}
// Копирование ссылки на десайдер в буфер обмена.
// navigator.clipboard доступен только в защищённом контексте (https/localhost),
// поэтому есть запасной вариант через скрытую textarea.
function copyDeciderUrl() {
var url = $('#formKeyUrl').text();
if (!url) return;
function done(ok) {
var btn = $('#btnCopyUrl');
btn.text(ok ? 'Copied!' : 'Copy failed');
setTimeout(function() { btn.text('Copy'); }, 1500);
}
function fallbackCopy() {
var textarea = $('<textarea>').val(url).css({
position: 'fixed',
top: 0,
left: 0,
opacity: 0
}).appendTo('body');
textarea[0].select();
var ok = false;
try {
ok = document.execCommand('copy');
} catch (e) {
ok = false;
}
textarea.remove();
done(ok);
}
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(url).then(function() {
done(true);
}, fallbackCopy);
} else {
fallbackCopy();
}
}
// Initialize: if there's only one decider, open it automatically
$(document).ready(function() {
// Nothing to do on load - user selects from list
$('#mapPickerModal').on('hidden.bs.modal', function() {
pickerTargetRow = null;
});
$('#btnCopyUrl').on('click', copyDeciderUrl);
});
</script>
</body>