forked from MarseyWorld/MarseyWorld
161 lines
7.1 KiB
HTML
161 lines
7.1 KiB
HTML
{% extends "default.html" %}
|
|
{% block pagetitle %}Submit Hats{% endblock %}
|
|
{% block pagetype %}message{% endblock %}
|
|
{% block content %}
|
|
{% if error %}{{macros.alert(error, true)}}{% endif %}
|
|
{% if msg %}{{macros.alert(msg, false)}}{% endif %}
|
|
|
|
<div class="mx-4">
|
|
<h2 class="mt-5">Submit Hat</h2>
|
|
<div class="settings-section rounded">
|
|
<div class="d-lg-flex">
|
|
<div class="body w-lg-100">
|
|
<form action="/submit/hats" method="post" enctype="multipart/form-data">
|
|
<input type="hidden" name="formkey" value="{{v|formkey}}">
|
|
|
|
<div id="image-upload-block">
|
|
<div><label class="mt-3">Image</label></div>
|
|
|
|
<img loading="lazy" id="image-preview" class="d-none" style="max-width:50%;border:5px white solid">
|
|
<label class="btn btn-secondary m-0" for="file-upload">
|
|
<div id="filename-show">Select Image</div>
|
|
<input autocomplete="off" id="file-upload" accept="image/*" type="file" name="image" {% if g.is_tor %}disabled{% endif %} hidden>
|
|
</label>
|
|
</div>
|
|
|
|
<div id="hat-design-reference-block" class="mt-3">
|
|
<a href="/i/hat-template.png" class="font-weight-bold">Hat Template</a> — 100x130px (do not resize), circle is profile picture, do not include circle in final submission.
|
|
</div>
|
|
|
|
<label class="mt-3" for="name">Name</label>
|
|
<input autocomplete="off" type="text" id="name" class="form-control" name="name" maxlength="50" pattern='[a-zA-Z0-9\-() ,_]{1,50}' placeholder="Required" value="{{name}}" required>
|
|
|
|
<label class="mt-3" for="author">Author</label>
|
|
<input autocomplete="off" type="text" id="author" class="form-control" name="author" maxlength="30" pattern='[a-zA-Z0-9_\-]{3,30}' placeholder="Required" value="{{username}}" required>
|
|
|
|
<label class="mt-3" for="description">Description</label>
|
|
<input autocomplete="off" type="text" id="description" class="form-control" name="description" maxlength="300" pattern='[^<>&\n\t]{1,300}' placeholder="Required" value="{{description}}" required>
|
|
|
|
<div class="footer mt-5">
|
|
<div class="d-flex">
|
|
<input id="submit-hat" disabled type="submit" onclick="disable(this)" class="btn btn-primary ml-auto" value="Submit Hat">
|
|
</div>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<script nonce="{{g.nonce}}">
|
|
document.onpaste = function(event) {
|
|
files = structuredClone(event.clipboardData.files);
|
|
|
|
filename = files[0]
|
|
|
|
if (filename)
|
|
{
|
|
filename = filename.name.toLowerCase()
|
|
f=document.getElementById('file-upload');
|
|
f.files = files;
|
|
document.getElementById('filename-show').textContent = filename;
|
|
if (IMAGE_FORMATS.some(s => filename.endsWith(s)))
|
|
{
|
|
const fileReader = new FileReader();
|
|
fileReader.readAsDataURL(f.files[0]);
|
|
fileReader.addEventListener("load", function () {
|
|
document.getElementById('image-preview').setAttribute('src', this.result);
|
|
document.getElementById('image-preview').classList.remove('d-none');
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
document.getElementById('file-upload').addEventListener('change', function(){
|
|
f=document.getElementById('file-upload');
|
|
document.getElementById('filename-show').textContent = document.getElementById('file-upload').files[0].name.substr(0, 20);
|
|
filename = f.files[0].name.toLowerCase()
|
|
if (IMAGE_FORMATS.some(s => filename.endsWith(s)))
|
|
{
|
|
const fileReader = new FileReader();
|
|
fileReader.readAsDataURL(f.files[0]);
|
|
fileReader.addEventListener("load", function () {
|
|
document.getElementById('image-preview').setAttribute('src', this.result);
|
|
document.getElementById('image-preview').classList.remove('d-none');
|
|
});
|
|
document.getElementById('submit-hat').disabled = false;
|
|
}
|
|
})
|
|
|
|
function approve_hat(t, name) {
|
|
postToast(t, `/admin/approve/hat/${name}`,
|
|
{
|
|
"description": document.getElementById(`${name}-description`).value,
|
|
"name": document.getElementById(`${name}-name`).value,
|
|
"price": document.getElementById(`${name}-price`).value,
|
|
},
|
|
() => {
|
|
document.getElementById(`${name}-hat`).remove()
|
|
}
|
|
);
|
|
}
|
|
|
|
function remove_hat(t, name) {
|
|
postToast(t, `/remove/hat/${name}`,
|
|
{
|
|
},
|
|
() => {
|
|
document.getElementById(`${name}-hat`).remove()
|
|
}
|
|
);
|
|
}
|
|
</script>
|
|
|
|
<h2 class="mt-5 mx-4">Pending Carp Approval</h2>
|
|
<div class="row mt-5 mx-4">
|
|
<div class="col px-0">
|
|
<div class="settings">
|
|
{% for hat in hats %}
|
|
<div id="{{hat.name}}-hat" class="settings-section rounded">
|
|
<div class="d-lg-flex">
|
|
<div class="body w-lg-100">
|
|
<input type="hidden" name="formkey" value="{{v|formkey}}">
|
|
|
|
<div><label class="mt-3">Image</label></div>
|
|
<img loading="lazy" src="/asset_submissions/hats/{{hat.name}}.webp?s={{range(1, 10000000)|random}}" style="max-width:50%;border:5px white solid">
|
|
|
|
<div class="profile-pic-100-wrapper ml-4 mt-4">
|
|
<img loading="lazy" alt="avatar" src="{{v.profile_url}}" class="profile-pic-100">
|
|
<img loading="lazy" class="profile-pic-100-hat" src="/asset_submissions/hats/{{hat.name}}.webp?s={{range(1, 10000000)|random}}">
|
|
</div>
|
|
|
|
<div><label class="mt-3" for="{{hat.name}}-submitter">Submitter</label></div>
|
|
<input autocomplete="off" type="text" id="{{hat.name}}-submitter" class="form-control" maxlength="30" value="{{hat.submitter.username}}" readonly>
|
|
|
|
<label class="mt-3" for="{{hat.name}}-author">Author</label>
|
|
<input autocomplete="off" type="text" id="{{hat.name}}-author" class="form-control" maxlength="30" value="{{hat.author.username}}" readonly>
|
|
|
|
<label class="mt-3" for="{{hat.name}}-name">Name</label>
|
|
<input autocomplete="off" type="text" id="{{hat.name}}-name" class="form-control" name="name" maxlength="30" value="{{hat.name}}" pattern='hat[a-zA-Z0-9]{1,24}' placeholder="Required" required {% if v.admin_level < PERMS['MODERATE_PENDING_SUBMITTED_HATS'] %}readonly{% endif %}>
|
|
>
|
|
|
|
<label class="mt-3" for="{{hat.name}}-description">Description</label>
|
|
<input autocomplete="off" type="text" id="{{hat.name}}-description" class="form-control" name="description" maxlength="300" value="{{hat.description}}" pattern='[^<>&\n\t]{1,300}' placeholder="Required" required {% if v.admin_level < PERMS['MODERATE_PENDING_SUBMITTED_HATS'] %}readonly{% endif %}>
|
|
|
|
<div><label class="mt-3" for="{{hat.name}}-price">Price</label></div>
|
|
<input autocomplete="off" type="number" id="{{hat.name}}-price" class="form-control" name="price" min="0" value="{{hat.price}}" placeholder="Required" required {% if v.admin_level < PERMS['MODERATE_PENDING_SUBMITTED_HATS'] %}readonly{% endif %}>
|
|
</div>
|
|
</div>
|
|
<div class="d-flex my-4 mx-3">
|
|
<button type="button" class="btn btn-primary ml-auto" onclick="remove_hat(this, '{{hat.name}}')">Remove</button>
|
|
{% if v.admin_level >= PERMS['MODERATE_PENDING_SUBMITTED_HATS'] %}
|
|
<button type="button" class="btn btn-primary ml-3" onclick="approve_hat(this, '{{hat.name}}')">Approve</button>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endblock %}
|