2025-05-24 14:35:35 +02:00

168 lines
7.3 KiB
HTML

{% extends "base.html" %}
{% block title %}Upload Image - SEREACT Web Client{% endblock %}
{% block content %}
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">
<h5 class="mb-0">
<i class="fas fa-upload"></i> Upload Image
</h5>
</div>
<div class="card-body">
<form method="POST" enctype="multipart/form-data">
<div class="mb-3">
<label for="file" class="form-label">
<i class="fas fa-file-image"></i> Select Image *
</label>
<input type="file" class="form-control" id="file" name="file"
accept="image/*" required>
<div class="form-text">
Supported formats: PNG, JPG, JPEG, GIF, BMP, WebP. Maximum size: 10MB.
</div>
</div>
<div class="mb-3">
<label for="description" class="form-label">
<i class="fas fa-align-left"></i> Description
</label>
<textarea class="form-control" id="description" name="description"
rows="3" placeholder="Enter image description (optional)"></textarea>
<div class="form-text">
A description of what the image contains or represents
</div>
</div>
<div class="mb-3">
<label for="tags" class="form-label">
<i class="fas fa-tags"></i> Tags
</label>
<input type="text" class="form-control" id="tags" name="tags"
placeholder="Enter tags separated by commas">
<div class="form-text">
Tags help organize and search for images. Example: nature, landscape, sunset
</div>
</div>
<div class="mb-3">
<label for="collection_id" class="form-label">
<i class="fas fa-folder"></i> Collection ID (Optional)
</label>
<input type="text" class="form-control" id="collection_id" name="collection_id"
placeholder="Enter collection ID">
<div class="form-text">
Optional collection ID to group related images
</div>
</div>
<div class="d-grid gap-2 d-md-flex justify-content-md-end">
<a href="{{ url_for('images') }}" class="btn btn-secondary">
<i class="fas fa-arrow-left"></i> Back to Images
</a>
<button type="submit" class="btn btn-primary">
<i class="fas fa-upload"></i> Upload Image
</button>
</div>
</form>
</div>
</div>
<div class="card mt-4">
<div class="card-header">
<h6 class="mb-0">
<i class="fas fa-info-circle"></i> Upload Information
</h6>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<h6><i class="fas fa-brain text-primary"></i> AI Processing</h6>
<ul class="small">
<li>Images are automatically processed with AI</li>
<li>Embeddings are generated for semantic search</li>
<li>Processing happens asynchronously in the background</li>
<li>You can search for images once processing is complete</li>
</ul>
</div>
<div class="col-md-6">
<h6><i class="fas fa-cloud text-info"></i> Storage</h6>
<ul class="small">
<li>Images are securely stored in Google Cloud Storage</li>
<li>Access is controlled by team membership</li>
<li>Metadata is stored in the database</li>
<li>Original filenames and formats are preserved</li>
</ul>
</div>
</div>
</div>
</div>
<div class="card mt-4">
<div class="card-header">
<h6 class="mb-0">
<i class="fas fa-lightbulb"></i> Tips for Better Results
</h6>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<h6><i class="fas fa-tags text-warning"></i> Tagging</h6>
<ul class="small">
<li>Use descriptive, specific tags</li>
<li>Include objects, colors, emotions, locations</li>
<li>Separate tags with commas</li>
<li>Use consistent naming conventions</li>
</ul>
</div>
<div class="col-md-6">
<h6><i class="fas fa-search text-success"></i> Searchability</h6>
<ul class="small">
<li>Good descriptions improve search accuracy</li>
<li>Include context and important details</li>
<li>Mention people, objects, and activities</li>
<li>Use natural language descriptions</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
{% block scripts %}
<script>
// Preview selected image
document.getElementById('file').addEventListener('change', function(e) {
const file = e.target.files[0];
if (file) {
// Validate file size
const maxSize = 10 * 1024 * 1024; // 10MB
if (file.size > maxSize) {
alert('File size exceeds 10MB limit. Please choose a smaller image.');
this.value = '';
return;
}
// Show file info
const fileInfo = document.createElement('div');
fileInfo.className = 'alert alert-info mt-2';
fileInfo.innerHTML = `
<i class="fas fa-info-circle"></i>
<strong>Selected:</strong> ${file.name} (${(file.size / 1024 / 1024).toFixed(2)} MB)
`;
// Remove existing file info
const existingInfo = this.parentNode.querySelector('.alert');
if (existingInfo) {
existingInfo.remove();
}
// Add new file info
this.parentNode.appendChild(fileInfo);
}
});
</script>
{% endblock %}