76 lines
3.2 KiB
HTML
76 lines
3.2 KiB
HTML
<!doctype html>
|
|
<html lang="en" xml:lang="en">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<title>Immich Drop Uploader</title>
|
|
<script src="https://cdn.tailwindcss.com"></script>
|
|
</head>
|
|
<body class="min-h-screen bg-gray-50 text-gray-900">
|
|
<div class="mx-auto max-w-4xl p-6 space-y-6">
|
|
<!-- Ephemeral top banner -->
|
|
<div id="topBanner" class="hidden rounded-2xl border border-green-200 bg-green-50 p-3 text-green-700 text-center"></div>
|
|
|
|
<header class="flex items-center justify-between">
|
|
<h1 class="text-2xl font-semibold tracking-tight">Immich Drop Uploader</h1>
|
|
<div class="flex items-center gap-2">
|
|
<button id="btnPing" class="rounded-xl border px-3 py-1 text-sm">Test connection</button>
|
|
<span id="pingStatus" class="ml-2 text-sm text-gray-500"></span>
|
|
</div>
|
|
</header>
|
|
|
|
<!-- Dropzone -->
|
|
<section id="dropzone" class="rounded-2xl border-2 border-dashed p-10 text-center bg-white">
|
|
<div class="mx-auto h-12 w-12 opacity-70">
|
|
<!-- upload icon -->
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M12 16V8m0 0l-3 3m3-3 3 3M4 16a4 4 0 0 0 4 4h8a4 4 0 0 0 4-4v-1a1 1 0 1 0-2 0v1a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2v-1a1 1 0 1 0-2 0v1z"/></svg>
|
|
</div>
|
|
<p class="mt-3 font-medium">Drop images or videos here</p>
|
|
<p class="text-sm text-gray-600">...or</p>
|
|
|
|
<!-- Mobile-safe choose control: label wraps the hidden input -->
|
|
<div class="mt-3 relative inline-block">
|
|
<label class="rounded-2xl bg-black text-white px-4 py-2 hover:opacity-90 cursor-pointer select-none">
|
|
Choose files
|
|
<input id="fileInput"
|
|
type="file"
|
|
multiple
|
|
accept="image/*,video/*"
|
|
class="absolute inset-0 opacity-0 cursor-pointer" />
|
|
</label>
|
|
</div>
|
|
|
|
<div class="mt-4 text-sm text-gray-500">
|
|
We never show uploaded media and keep everything session-local. No account required.
|
|
</div>
|
|
</section>
|
|
|
|
<!-- Queue summary -->
|
|
<section id="summary" class="rounded-2xl border bg-white p-4 shadow-sm">
|
|
<div class="flex items-center justify-between text-sm">
|
|
<div class="flex gap-4">
|
|
<span>Queued/Processing: <b id="countQueued">0</b></span>
|
|
<span>Uploading: <b id="countUploading">0</b></span>
|
|
<span>Done: <b id="countDone">0</b></span>
|
|
<span>Duplicates: <b id="countDup">0</b></span>
|
|
<span>Errors: <b id="countErr">0</b></span>
|
|
</div>
|
|
<div class="flex gap-2">
|
|
<button id="btnClearFinished" class="rounded-xl border px-3 py-1 text-sm">Clear finished</button>
|
|
<button id="btnClearAll" class="rounded-xl border px-3 py-1 text-sm">Clear all</button>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- Items -->
|
|
<section id="items" class="space-y-3"></section>
|
|
|
|
<footer class="pt-4 pb-10 text-center text-xs text-gray-500">
|
|
Built for simple, account-less uploads to Immich. This page never lists media from the server and only shows your current session's items.
|
|
</footer>
|
|
</div>
|
|
|
|
<script src="/static/app.js"></script>
|
|
</body>
|
|
</html>
|