Decider admin access to deciders by steam id
This commit is contained in:
@@ -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 • maps: @d.maps.size</p>
|
||||
<p class="list-group-item-text decider-key">@d.key • maps: @d.maps.size • 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>
|
||||
|
||||
Reference in New Issue
Block a user