UI : liste scrollable, alignement auth, zones de dépôt retirées du DOM hors session
- `#list` plafonné à 55vh avec défilement interne (au lieu d'allonger la page).
- En-tête d'auth : suppression du <span> qui cassait l'alignement ; « Connecté : … »
et le bouton « Se déconnecter » sont alignés (flex, space-between).
- Les zones de dépôt (`#dropzone` + `#dirRow`, regroupées dans `#dropArea`) sont
retirées du DOM tant que l'on n'est pas connecté, réinsérées à la connexion.
- Ajout de `[hidden] { display: none !important }` : des règles `display` d'auteur
(`.btn`, `#queueRow`) neutralisaient l'attribut `hidden` — bouton de déconnexion
et barre « Tout annuler » restaient visibles hors contexte.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
parent
8eb0470474
commit
8d8cfb6fad
1 changed files with 45 additions and 21 deletions
|
|
@ -31,6 +31,9 @@
|
||||||
* {
|
* {
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
[hidden] {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
body {
|
body {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 2rem 1rem;
|
padding: 2rem 1rem;
|
||||||
|
|
@ -85,8 +88,12 @@
|
||||||
background: transparent;
|
background: transparent;
|
||||||
color: var(--accent);
|
color: var(--accent);
|
||||||
}
|
}
|
||||||
form.inline {
|
.authrow form {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
.authrow .btn {
|
||||||
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
label {
|
label {
|
||||||
display: block;
|
display: block;
|
||||||
|
|
@ -119,13 +126,19 @@
|
||||||
background: color-mix(in srgb, var(--accent) 8%, transparent);
|
background: color-mix(in srgb, var(--accent) 8%, transparent);
|
||||||
color: var(--text);
|
color: var(--text);
|
||||||
}
|
}
|
||||||
#dropzone.disabled {
|
#dropArea {
|
||||||
opacity: 0.5;
|
display: grid;
|
||||||
cursor: not-allowed;
|
gap: 1.25rem;
|
||||||
}
|
}
|
||||||
#list {
|
#list {
|
||||||
display: grid;
|
display: grid;
|
||||||
gap: 0.6rem;
|
gap: 0.6rem;
|
||||||
|
max-height: 55vh;
|
||||||
|
overflow-y: auto;
|
||||||
|
overscroll-behavior: contain;
|
||||||
|
}
|
||||||
|
#list:not(:empty) {
|
||||||
|
padding-right: 0.25rem;
|
||||||
}
|
}
|
||||||
.item {
|
.item {
|
||||||
border: 1px solid var(--border);
|
border: 1px solid var(--border);
|
||||||
|
|
@ -210,12 +223,10 @@
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="authrow">
|
<div class="authrow">
|
||||||
<span id="authState" class="muted">Chargement…</span>
|
<span id="authState" class="muted">Chargement…</span>
|
||||||
<span>
|
<a id="loginLink" class="btn" href="/auth/login" hidden>Se connecter</a>
|
||||||
<a id="loginLink" class="btn" href="/auth/login" hidden>Se connecter</a>
|
<form id="logoutForm" method="post" action="/auth/logout" hidden>
|
||||||
<form id="logoutForm" class="inline" method="post" action="/auth/logout" hidden>
|
<button class="btn secondary" type="submit">Se déconnecter</button>
|
||||||
<button class="btn secondary" type="submit">Se déconnecter</button>
|
</form>
|
||||||
</form>
|
|
||||||
</span>
|
|
||||||
</div>
|
</div>
|
||||||
<div id="banner" hidden></div>
|
<div id="banner" hidden></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -225,16 +236,18 @@
|
||||||
<select id="targetSelect"></select>
|
<select id="targetSelect"></select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="dropzone" class="card disabled">
|
<div id="dropArea">
|
||||||
<strong>Déposez fichiers ou dossiers ici</strong><br />
|
<div id="dropzone" class="card">
|
||||||
<span class="muted">ou cliquez pour parcourir</span>
|
<strong>Déposez fichiers ou dossiers ici</strong><br />
|
||||||
<input id="picker" type="file" multiple hidden />
|
<span class="muted">ou cliquez pour parcourir</span>
|
||||||
</div>
|
<input id="picker" type="file" multiple hidden />
|
||||||
|
</div>
|
||||||
|
|
||||||
<div id="dirRow" class="card" hidden>
|
<div id="dirRow" class="card" hidden>
|
||||||
<button id="dirBtn" type="button" class="btn secondary">Parcourir un dossier…</button>
|
<button id="dirBtn" type="button" class="btn secondary">Parcourir un dossier…</button>
|
||||||
<span class="muted"> — ou glissez un dossier dans la zone ci-dessus</span>
|
<span class="muted"> — ou glissez un dossier dans la zone ci-dessus</span>
|
||||||
<input id="dirPicker" type="file" webkitdirectory multiple hidden />
|
<input id="dirPicker" type="file" webkitdirectory multiple hidden />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="queueRow" class="card" hidden>
|
<div id="queueRow" class="card" hidden>
|
||||||
|
|
@ -252,6 +265,7 @@
|
||||||
const logoutForm = document.getElementById('logoutForm');
|
const logoutForm = document.getElementById('logoutForm');
|
||||||
const targetCard = document.getElementById('targetCard');
|
const targetCard = document.getElementById('targetCard');
|
||||||
const targetSelect = document.getElementById('targetSelect');
|
const targetSelect = document.getElementById('targetSelect');
|
||||||
|
const dropArea = document.getElementById('dropArea');
|
||||||
const dropzone = document.getElementById('dropzone');
|
const dropzone = document.getElementById('dropzone');
|
||||||
const picker = document.getElementById('picker');
|
const picker = document.getElementById('picker');
|
||||||
const dirRow = document.getElementById('dirRow');
|
const dirRow = document.getElementById('dirRow');
|
||||||
|
|
@ -272,6 +286,17 @@
|
||||||
let currentTarget = null;
|
let currentTarget = null;
|
||||||
let currentTargetAllowsDirs = false;
|
let currentTargetAllowsDirs = false;
|
||||||
|
|
||||||
|
// Les zones de dépôt ne sont présentes dans le DOM que si l'on est connecté.
|
||||||
|
const dropAreaAnchor = queueRow;
|
||||||
|
dropArea.remove();
|
||||||
|
function setDropAreaPresent(present) {
|
||||||
|
if (present) {
|
||||||
|
if (!dropArea.isConnected) dropAreaAnchor.before(dropArea);
|
||||||
|
} else if (dropArea.isConnected) {
|
||||||
|
dropArea.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function showBanner(message) {
|
function showBanner(message) {
|
||||||
banner.textContent = message;
|
banner.textContent = message;
|
||||||
banner.hidden = false;
|
banner.hidden = false;
|
||||||
|
|
@ -286,13 +311,12 @@
|
||||||
authenticated = Boolean(me && me.authenticated);
|
authenticated = Boolean(me && me.authenticated);
|
||||||
loginLink.hidden = authenticated;
|
loginLink.hidden = authenticated;
|
||||||
logoutForm.hidden = !authenticated;
|
logoutForm.hidden = !authenticated;
|
||||||
dropzone.classList.toggle('disabled', !authenticated);
|
setDropAreaPresent(authenticated);
|
||||||
authState.textContent = authenticated ? 'Connecté : ' + me.name : 'Non connecté';
|
authState.textContent = authenticated ? 'Connecté : ' + me.name : 'Non connecté';
|
||||||
if (authenticated) {
|
if (authenticated) {
|
||||||
loadTargets();
|
loadTargets();
|
||||||
} else {
|
} else {
|
||||||
targetCard.hidden = true;
|
targetCard.hidden = true;
|
||||||
dirRow.hidden = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue