Personal-Digital-Asset-Manager/templates/add_asset.html
Timothy Rogers 4f5c5fd09d
All checks were successful
Build and Publish Docker Image / build (push) Successful in 39s
Added spinner and fixed asset delete bug
2025-05-24 19:01:29 -04:00

199 lines
6.8 KiB
HTML

{% extends "base.html" %} {% block content %}
<div class="page-header">
<h1>Add New Digital Asset</h1>
</div>
<div class="form-container">
<form method="POST" enctype="multipart/form-data" class="form" id="assetForm">
<div class="form-group">
<label for="title" class="form-label">Title</label>
<input
type="text"
id="title"
name="title"
class="form-input"
required
/>
</div>
<div class="form-group">
<label for="description" class="form-label">Description</label>
<textarea
id="description"
name="description"
class="form-input"
></textarea>
</div>
<div class="form-group">
<label for="license_key">License Key</label>
<input
type="text"
class="form-control"
id="license_key"
name="license_key"
placeholder="Enter the asset's license key"
/>
<small class="form-text text-muted"
>Enter the license key that came with your purchased
asset</small
>
</div>
<div class="form-group">
<label for="featured_image" class="form-label"
>Featured Image</label
>
<div class="file-input-wrapper">
<input
type="file"
id="featured_image"
name="featured_image"
class="file-input"
required
accept="image/*"
/>
<label for="featured_image" class="file-input-label">
<i class="fas fa-cloud-upload-alt"></i>
<span>Choose a file...</span>
</label>
<div class="file-input-preview"></div>
</div>
</div>
<div class="form-group">
<label for="additional_files" class="form-label"
>Additional Files</label
>
<div class="file-input-wrapper">
<input
type="file"
id="additional_files"
name="additional_files"
class="file-input"
multiple
/>
<label for="additional_files" class="file-input-label">
<i class="fas fa-cloud-upload-alt"></i>
<span>Choose files...</span>
</label>
<div class="selected-files"></div>
</div>
</div>
<div class="form-actions">
<button type="submit" class="button button-primary" id="submitBtn">
<i class="fas fa-save"></i> Save Asset
</button>
<a href="{{ url_for('index') }}" class="button button-secondary">
<i class="fas fa-times"></i> Cancel
</a>
</div>
</form>
</div>
{% endblock %} {% block scripts %}
<script>
// Initialize Trumbowyg
$("#description").trumbowyg({
btns: [
["viewHTML"],
["undo", "redo"],
["formatting"],
["strong", "em", "del"],
["link"],
["insertImage"],
["justifyLeft", "justifyCenter", "justifyRight"],
["unorderedList", "orderedList"],
["horizontalRule"],
["removeformat"],
["fullscreen"],
],
autogrow: true,
resetCss: true,
removeformatPasted: true,
svgPath:
"https://cdnjs.cloudflare.com/ajax/libs/Trumbowyg/2.27.3/ui/icons.svg",
});
document.addEventListener("DOMContentLoaded", function () {
const form = document.getElementById("assetForm");
const loadingOverlay = document.querySelector(".loading-overlay");
const loadingText = document.querySelector(".loading-text");
// Featured image preview
const featuredInput = document.getElementById("featured_image");
const featuredPreview = document.querySelector(".file-input-preview");
featuredInput.addEventListener("change", function () {
const file = this.files[0];
if (file) {
const reader = new FileReader();
reader.onload = function (e) {
featuredPreview.innerHTML = `
<div class="preview-image">
<img src="${e.target.result}" alt="Preview">
<span class="filename">${file.name}</span>
</div>
`;
};
reader.readAsDataURL(file);
}
});
// Additional files list
const additionalInput = document.getElementById("additional_files");
const selectedFiles = document.querySelector(".selected-files");
additionalInput.addEventListener("change", function () {
selectedFiles.innerHTML = "";
Array.from(this.files).forEach((file) => {
selectedFiles.innerHTML += `
<div class="selected-file">
<i class="fas fa-file"></i>
<span>${file.name}</span>
</div>
`;
});
});
form.addEventListener("submit", function (e) {
e.preventDefault();
const formData = new FormData(form);
loadingOverlay.style.display = "flex";
loadingText.textContent = "Processing...";
const xhr = new XMLHttpRequest();
xhr.open("POST", "{{ url_for('add_asset') }}", true);
xhr.onload = function() {
if (xhr.status === 200) {
const response = JSON.parse(xhr.responseText);
if (response.success) {
window.location.href = response.redirect;
} else {
loadingText.textContent = "Failed: " + response.error;
setTimeout(() => {
loadingOverlay.style.display = "none";
}, 2000);
}
} else {
loadingText.textContent = "Upload failed! Please try again.";
setTimeout(() => {
loadingOverlay.style.display = "none";
}, 2000);
}
};
xhr.onerror = function() {
loadingText.textContent = "Network error! Please try again.";
setTimeout(() => {
loadingOverlay.style.display = "none";
}, 2000);
};
xhr.send(formData);
});
});
</script>
{% endblock %}