Invitations redesign

This commit is contained in:
Booteille 2024-12-08 11:50:19 +01:00
parent 5219414b10
commit 50a77ac5fa
No known key found for this signature in database
GPG Key ID: 0AB6C6CA01272646
3 changed files with 50 additions and 53 deletions

View File

@ -206,4 +206,16 @@ tr.deleted {
tr.deleted { tr.deleted {
background: repeating-linear-gradient(-45deg, transparent 0 2rem, var(--bulma-danger-05) 2rem 4rem); background: repeating-linear-gradient(-45deg, transparent 0 2rem, var(--bulma-danger-05) 2rem 4rem);
} }
}
.modal-card-title {
width: 100%
}
.modal-card-title p {
width: 95%
}
.files-list {
list-style: disc;
} }

View File

@ -1,5 +1,5 @@
import { filesize } from "~/lib/filesize.esm.min.js"; import { filesize } from "~/lib/filesize.esm.min.js";
import { addToast, hideNode, showNode } from "~/lib/utils.js"; import { addToast, formatDate, hideNode, showNode } from "~/lib/utils.js";
const updateButtonsStatus = () => { const updateButtonsStatus = () => {
const targetSelectionDOM = document.querySelectorAll(".target-selection"); const targetSelectionDOM = document.querySelectorAll(".target-selection");
@ -159,7 +159,9 @@ const toggleVisibility = () => {
if (t.show) { if (t.show) {
itemDOM.setAttribute("data-visibility", "shown"); itemDOM.setAttribute("data-visibility", "shown");
showNode(itemDOM); showNode(itemDOM);
itemDOM.querySelector(".selection .icon").classList.add("is-hidden"); itemDOM
.querySelector(".selection .icon")
.classList.add("is-hidden");
} else { } else {
itemDOM.setAttribute("data-visibility", "hidden"); itemDOM.setAttribute("data-visibility", "hidden");
@ -170,7 +172,9 @@ const toggleVisibility = () => {
hideNode(itemDOM); hideNode(itemDOM);
} }
itemDOM.querySelector(".selection .icon").classList.remove("is-hidden") itemDOM
.querySelector(".selection .icon")
.classList.remove("is-hidden");
} }
itemDOM.querySelector(".selection input").click(); itemDOM.querySelector(".selection input").click();
@ -194,18 +198,20 @@ const getTokensBody = () => {
return tokens; return tokens;
}; };
const fillModal = (event) => { const fillModal = (buttonDOM) => {
const buttonDOM = event.target; const modalDOM = document.getElementById("modal-files-list");
const modalDOM = document.querySelector(".modal.files-info");
// Cleanup the modal // Cleanup the modal
modalDOM.querySelector(".files-list").replaceChildren(); modalDOM.querySelector(".files-list").replaceChildren();
modalDOM.querySelector("h1").innerText = i18n.listFiles modalDOM.querySelector("header .modal-card-title p").innerText =
.replace("XX1", buttonDOM.dataset.token) i18n.listFiles
.replace("XX2", buttonDOM.dataset.guest); .replace("XX1", buttonDOM.dataset.token)
.replace("XX2", buttonDOM.dataset.guest);
const files = JSON.parse(buttonDOM.dataset.files) || []; const files = buttonDOM.dataset.files
? JSON.parse(buttonDOM.dataset.files)
: [];
const itemList = new DocumentFragment(); const itemList = new DocumentFragment();
files.forEach((file) => { files.forEach((file) => {
@ -213,15 +219,15 @@ const fillModal = (event) => {
"XXX", "XXX",
formatDate(file.delay * 86400 + file.created_at) formatDate(file.delay * 86400 + file.created_at)
); );
const item = modalDOM const item = document.querySelector("template#item").content.cloneNode(true)
.querySelector("template#item") .children[0];
.content.cloneNode(true);
console.debug(file.name);
item.querySelector(".file-link").href = file.url; item.querySelector(".file-link").href = file.url;
item.querySelector(".file-link").value = file.name; item.querySelector(".file-link").innerText = file.name;
item.querySelector(".file-size").innerText = `${filesize( item.querySelector(".file-size").innerText = `(${filesize(
file.size file.size
)}, ${expires}`; )}, ${expires})`;
itemList.appendChild(item); itemList.appendChild(item);
}); });
@ -230,18 +236,13 @@ const fillModal = (event) => {
}; };
document.addEventListener("DOMContentLoaded", () => { document.addEventListener("DOMContentLoaded", () => {
document.querySelectorAll(".modal-button.action-files-info").forEach( document
(button) => .querySelectorAll(".js-modal-trigger.action-files-info")
(button.onclick = (event) => { .forEach((node) => {
fillModal(event); node.addEventListener("click", () => {
fillModal(node);
document.querySelector(".modal.files-info").showModal(); });
}) });
);
document.querySelector(".close-modal").onclick = () => {
document.querySelector(".modal").close();
};
document document
.querySelectorAll(".selection input") .querySelectorAll(".selection input")

View File

@ -7,7 +7,7 @@
<div class="message is-info"> <div class="message is-info">
<div class="message-body"> <div class="message-body">
<p> <p>
<%= l('Rows in purple mean that the invitations have expired.') %> <%= l('Hatched lines mean that the invitations have expired.') %>
</p> </p>
</div> </div>
</div> </div>
@ -60,48 +60,32 @@
<td class="actions is-vcentered"> <td class="actions is-vcentered">
% if ($e->files) { % if ($e->files) {
<a <a
class="button modal-button action-files-info" class="js-modal-trigger button action-files-info is-primary"
href="#files-info" href="#files-info"
data-files='<%= $e->files %>' data-files="<%= $e->files %>"
data-token="<%= $e->token %>" data-token="<%= $e->token %>"
data-guest="<%= $e->guest_mail %>" data-guest="<%= $e->guest_mail %>"
data-target="modal-files-list"
> >
<%= l('Files') %> <%= l('Files') %>
</a> </a>
% } % }
</td> </td>
</tr> </tr>
% }); % });
</tbody> </tbody>
</table> </table>
</div> </div>
<dialog class="modal files-info">
<section>
<header>
<h1><%= l('Files sent in invitation XX1 by XX2') %></h1>
</header>
<div class="content">
<ul class="files-list"></ul>
</div>
<footer class="actions">
<button autofocus class="button close-modal"><%= l('Close') %></button>
</footer>
</section>
</dialog>
</div> </div>
<div id="modal-files-list" class="modal files-info">
<div id="modal-language-selector" class="modal files-info">
<div class="modal-background"></div> <div class="modal-background"></div>
<div class="modal-card"> <div class="modal-card">
<header class="modal-card-head is-shadowless"> <header class="modal-card-head is-shadowless">
<p class="modal-card-title"> <div class="modal-card-title">
<%= l('Files sent in invitation XX1 by XX2') %> <p class="is-inline-block wb-word"><%= l('Files sent in invitation XX1 by XX2') %></p>
<button class="delete is-pulled-right" aria-label="close"></button> <button class="delete is-pulled-right" aria-label="close"></button>
</p> </div>
</header> </header>
<section class="modal-card-body"> <section class="modal-card-body">