Исправлены create UI, PWA-иконки, tooltip A2HS и breakpoint админ-меню 1015px.
This commit is contained in:
@@ -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
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user