96 lines
4.9 KiB
HTML
96 lines
4.9 KiB
HTML
{% extends "admin/base.html" %}
|
|
|
|
{% block title %}{{ t(key="new-article", lang=lang | default(value='sk')) }}{% endblock title %}
|
|
|
|
{% block content %}
|
|
<div class="space-y-2">
|
|
<div class="flex flex-wrap items-center justify-between gap-3">
|
|
<div>
|
|
<h1 class="text-2xl font-bold">{{ t(key="new-article", lang=lang | default(value='sk')) }}</h1>
|
|
<p class="text-sm opacity-70">{{ t(key="admin-blog-create-desc", lang=lang | default(value='sk')) }}</p>
|
|
</div>
|
|
<a href="/admin/blog/articles" class="btn btn-ghost btn-sm">{{ t(key="back-to-articles", lang=lang | default(value='sk')) }}</a>
|
|
</div>
|
|
|
|
<div class="card border border-base-300 bg-base-100 shadow-sm">
|
|
<div class="card-body">
|
|
<form method="post" action="/admin/blog/articles" class="space-y-2">
|
|
<div class="form-control">
|
|
<label class="label"><span class="label-text">{{ t(key="title", lang=lang | default(value='sk')) }}</span></label>
|
|
<input type="text" name="title" required class="input input-bordered w-full">
|
|
</div>
|
|
|
|
<div class="form-control">
|
|
<label class="label"><span class="label-text">{{ t(key="excerpt", lang=lang | default(value='sk')) }}</span></label>
|
|
<textarea name="excerpt" rows="4" class="textarea textarea-bordered w-full"></textarea>
|
|
</div>
|
|
|
|
<div class="form-control">
|
|
<label class="label"><span class="label-text">{{ t(key="content", lang=lang | default(value='sk')) }}</span></label>
|
|
<textarea name="content" rows="18" required class="textarea textarea-bordered w-full"></textarea>
|
|
</div>
|
|
|
|
<div class="form-control">
|
|
<label class="label"><span class="label-text">{{ t(key="featured-image-id", lang=lang | default(value='sk')) }}</span></label>
|
|
<div class="flex flex-wrap gap-2">
|
|
<input type="text" name="featured_image_id" data-blog-image-id class="input input-bordered min-w-0 flex-1">
|
|
<input type="file" accept="image/jpeg,image/png,image/webp,image/gif" data-blog-image-file class="file-input file-input-bordered min-w-0 flex-1">
|
|
<button type="button" class="btn btn-outline btn-sm" data-blog-image-upload data-uploading="{{ t(key="image-uploading", lang=lang | default(value='sk')) }}" data-ready="{{ t(key="upload-featured-image", lang=lang | default(value='sk')) }}">{{ t(key="upload-featured-image", lang=lang | default(value='sk')) }}</button>
|
|
</div>
|
|
<p class="text-sm opacity-70" data-blog-image-status>{{ t(key="image-upload-help", lang=lang | default(value='sk')) }}</p>
|
|
<img data-blog-image-preview alt="" class="mt-2 hidden max-h-48 rounded border border-base-300 object-cover">
|
|
</div>
|
|
|
|
<label class="label cursor-pointer justify-start gap-2">
|
|
<input type="checkbox" name="published" class="checkbox checkbox-sm">
|
|
<span class="label-text">{{ t(key="published", lang=lang | default(value='sk')) }}</span>
|
|
</label>
|
|
|
|
<div class="flex flex-wrap gap-2 pt-2">
|
|
<button type="submit" class="btn btn-neutral btn-sm">{{ t(key="create", lang=lang | default(value='sk')) }}</button>
|
|
<a href="/admin/blog/articles" class="btn btn-ghost btn-sm">{{ t(key="cancel", lang=lang | default(value='sk')) }}</a>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<script>
|
|
(function () {
|
|
const fileInput = document.querySelector('[data-blog-image-file]');
|
|
const idInput = document.querySelector('[data-blog-image-id]');
|
|
const uploadButton = document.querySelector('[data-blog-image-upload]');
|
|
const status = document.querySelector('[data-blog-image-status]');
|
|
const preview = document.querySelector('[data-blog-image-preview]');
|
|
if (!fileInput || !idInput || !uploadButton || !status || !preview) return;
|
|
|
|
function setPreview(filename) {
|
|
if (!filename) return;
|
|
preview.src = '/images/' + filename;
|
|
preview.classList.remove('hidden');
|
|
}
|
|
|
|
uploadButton.addEventListener('click', async function () {
|
|
const file = fileInput.files && fileInput.files[0];
|
|
if (!file) return;
|
|
uploadButton.disabled = true;
|
|
uploadButton.textContent = uploadButton.dataset.uploading;
|
|
const formData = new FormData();
|
|
formData.append('file', file);
|
|
try {
|
|
const response = await fetch('/images/upload', { method: 'POST', body: formData });
|
|
if (!response.ok) throw new Error('upload failed');
|
|
const result = await response.json();
|
|
idInput.value = result.filename;
|
|
setPreview(result.filename);
|
|
status.textContent = '{{ t(key="image-uploaded", lang=lang | default(value='sk')) }}';
|
|
} catch (_error) {
|
|
status.textContent = '{{ t(key="image-upload-error", lang=lang | default(value='sk')) }}';
|
|
} finally {
|
|
uploadButton.disabled = false;
|
|
uploadButton.textContent = uploadButton.dataset.ready;
|
|
}
|
|
});
|
|
})();
|
|
</script>
|
|
{% endblock content %}
|