Исправлены create UI, PWA-иконки, tooltip A2HS и breakpoint админ-меню 1015px.
devops-tools/wrapped/wrapped-build/pipeline/head This commit looks good
devops-tools/wrapped/wrapped-deploy/pipeline/head This commit looks good

This commit is contained in:
Sergey Antropoff
2026-07-29 21:03:51 +03:00
parent 54749e5e12
commit eef8c4ec57
9 changed files with 80 additions and 106 deletions
+1 -1
View File
@@ -4,7 +4,7 @@
const nav = document.getElementById("admin-nav");
if (!top || !toggle || !nav) return;
const mq = window.matchMedia("(max-width: 860px)");
const mq = window.matchMedia("(max-width: 1015px)");
const syncLabel = () => {
const open = top.classList.contains("is-nav-open");
+17 -57
View File
@@ -1,14 +1,12 @@
(() => {
const t = (k, vars) => window.WrappedI18n.t(k, vars);
/** @type {{ file: File, label: string }[]} */
/** @type {File[]} */
const files = [];
let settings = null;
let captchaWidgetId = null;
const els = {
text: document.getElementById("payload-text"),
textLabel: document.getElementById("text-label"),
templateChips: document.getElementById("template-chips"),
lang: document.getElementById("text-language"),
langChip: document.getElementById("lang-chip"),
langChipText: document.getElementById("lang-chip-text"),
@@ -18,7 +16,8 @@
editor: document.getElementById("code-editor"),
ttl: document.getElementById("ttl-seconds"),
maxOpens: document.getElementById("max-opens"),
availableFrom: document.getElementById("available-from"),
availableFromDate: document.getElementById("available-from-date"),
availableFromTime: document.getElementById("available-from-time"),
password: document.getElementById("password"),
generatePassword: document.getElementById("generate-password"),
dropzone: document.getElementById("dropzone"),
@@ -114,7 +113,7 @@
function estimatePayloadBytes() {
const textBytes = new TextEncoder().encode(els.text?.value || "").length;
const fileBytes = files.reduce((sum, entry) => sum + (Number(entry.file.size) || 0), 0);
const fileBytes = files.reduce((sum, f) => sum + (Number(f.size) || 0), 0);
return textBytes + fileBytes;
}
@@ -142,21 +141,9 @@
function renderFiles() {
els.fileList.innerHTML = "";
files.forEach((entry, idx) => {
const f = entry.file;
files.forEach((f, idx) => {
const li = document.createElement("li");
li.className = "file-list-item";
const meta = document.createElement("span");
meta.innerHTML = `${escapeHtml(f.name)} <small>(${escapeHtml(f.type || "file")} · ${window.WrappedUI.formatBytes(f.size)})</small>`;
const labelInput = document.createElement("input");
labelInput.type = "text";
labelInput.className = "file-label-input";
labelInput.maxLength = 120;
labelInput.placeholder = t("create.itemLabelPlaceholder");
labelInput.value = entry.label || "";
labelInput.addEventListener("input", () => {
entry.label = labelInput.value;
});
li.innerHTML = `<span>${escapeHtml(f.name)} <small>(${escapeHtml(f.type || "file")} · ${window.WrappedUI.formatBytes(f.size)})</small></span>`;
const btn = document.createElement("button");
btn.type = "button";
btn.textContent = "×";
@@ -164,8 +151,6 @@
files.splice(idx, 1);
renderFiles();
});
li.appendChild(meta);
li.appendChild(labelInput);
li.appendChild(btn);
els.fileList.appendChild(li);
});
@@ -186,7 +171,7 @@
showError(t("create.mimeDenied") + `: ${f.type || f.name}`);
continue;
}
files.push({ file: f, label: "" });
files.push(f);
}
renderFiles();
}
@@ -245,31 +230,11 @@
.join("");
}
function renderTemplates() {
if (!els.templateChips) return;
els.templateChips.innerHTML = "";
const keys = [
{ id: "access", key: "create.tpl.access" },
{ id: "code", key: "create.tpl.code" },
{ id: "fileNote", key: "create.tpl.fileNote" },
];
for (const item of keys) {
const btn = document.createElement("button");
btn.type = "button";
btn.className = "template-chip";
btn.textContent = t(`create.tpl.${item.id}.name`);
btn.addEventListener("click", () => {
els.text.value = t(`create.tpl.${item.id}.body`);
refreshHighlight();
refreshSizeMeter();
});
els.templateChips.appendChild(btn);
}
}
function datetimeLocalToIso(value) {
if (!value) return null;
const d = new Date(value);
function availableFromToIso() {
const date = (els.availableFromDate?.value || "").trim();
if (!date) return null;
const time = (els.availableFromTime?.value || "").trim() || "00:00";
const d = new Date(`${date}T${time}`);
if (Number.isNaN(d.getTime())) return null;
return d.toISOString();
}
@@ -351,7 +316,6 @@
settings = await resp.json();
fillTtl();
fillMaxOpens();
renderTemplates();
loadCaptcha();
setLanguage("plaintext", { silent: true });
refreshHighlight();
@@ -525,18 +489,15 @@
const items = [];
const contentTypes = [];
if (text.trim()) {
const textItem = {
items.push({
type: "text",
language: els.lang.value,
content: text,
};
const label = (els.textLabel?.value || "").trim();
if (label) textItem.label = label.slice(0, 120);
items.push(textItem);
});
contentTypes.push("text/plain");
}
for (const entry of files) {
const item = await window.WrappedCrypto.fileToItem(entry.file, entry.label);
for (const f of files) {
const item = await window.WrappedCrypto.fileToItem(f);
items.push(item);
contentTypes.push(item.mime);
}
@@ -550,7 +511,7 @@
const password = els.password.value || "";
const maxOpens = Number(els.maxOpens?.value || 1);
const availableFromIso = datetimeLocalToIso(els.availableFrom?.value || "");
const availableFromIso = availableFromToIso();
els.wrapBtn.disabled = true;
window.WrappedUI.showBusy(t("create.working"));
try {
@@ -638,7 +599,6 @@
window.WrappedI18n.onChange(() => {
fillTtl();
fillMaxOpens();
renderTemplates();
refreshExpiresMeta();
refreshSuccessBadges();
refreshSizeMeter();