Remove minified files from git tracking
This commit is contained in:
parent
c00f4af397
commit
06d5772970
|
@ -14,6 +14,7 @@ stop-upload
|
|||
themes/*
|
||||
!themes/default
|
||||
!themes/default/*
|
||||
themes/default/public/js/minified
|
||||
.stignore
|
||||
.stfolder/
|
||||
TODO
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,191 +0,0 @@
|
|||
// themes/default/public/js/lib/utils.js
|
||||
var formatDate = (unixTimestamp) => new Date(unixTimestamp * 1e3).toLocaleString(window.navigator.language, {
|
||||
year: "numeric",
|
||||
month: "long",
|
||||
day: "numeric",
|
||||
weekday: "long",
|
||||
hour: "2-digit",
|
||||
minute: "2-digit"
|
||||
});
|
||||
|
||||
// themes/default/public/js/files.js
|
||||
var addItem = (item) => {
|
||||
const files = JSON.parse(localStorage.getItem(`${prefix}files`)) || [];
|
||||
files.push(item);
|
||||
localStorage.setItem(`${prefix}files`, JSON.stringify(files));
|
||||
};
|
||||
var deleteFromStorage = (serverKey) => {
|
||||
let files = JSON.parse(localStorage.getItem(`${prefix}files`)) || [];
|
||||
files = files.filter((file) => file.short !== serverKey);
|
||||
localStorage.setItem(`${prefix}files`, JSON.stringify(files));
|
||||
};
|
||||
var itemExists = (serverKey) => {
|
||||
const files = JSON.parse(localStorage.getItem(`${prefix}files`)) || [];
|
||||
return files.some((file) => file.short === serverKey);
|
||||
};
|
||||
var updateSelection = (event) => {
|
||||
document.querySelectorAll(".item .checkbox input").forEach((node) => {
|
||||
node.checked = event.target.checked;
|
||||
});
|
||||
checkItemSelection();
|
||||
};
|
||||
var purgeExpired = () => {
|
||||
const files = JSON.parse(localStorage.getItem(`${prefix}files`));
|
||||
files.forEach((file) => {
|
||||
const fileDOM = document.querySelector(`.item-${file.short}`);
|
||||
if (fileDOM == null ? void 0 : fileDOM.classList.contains("deleted")) {
|
||||
deleteFromStorage(file.short);
|
||||
fileDOM.remove();
|
||||
}
|
||||
});
|
||||
};
|
||||
var exportStorage = () => {
|
||||
const exportStorageDOM = document.getElementById("action-export-storage");
|
||||
const storageData = [localStorage.getItem(`${prefix}files`)];
|
||||
const exportFile = new Blob(storageData, { type: "application/json" });
|
||||
exportStorageDOM.href = window.URL.createObjectURL(exportFile);
|
||||
exportStorageDOM.download = "data.json";
|
||||
};
|
||||
var importStorage = (event) => {
|
||||
const reader = new FileReader();
|
||||
reader.addEventListener("loadend", () => {
|
||||
try {
|
||||
const newFiles = JSON.parse(
|
||||
String.fromCharCode.apply(null, new Uint8Array(reader.result))
|
||||
);
|
||||
let importedCounter = 0;
|
||||
newFiles.forEach((file) => {
|
||||
if (validURL(file.url) && !itemExists(file.short)) {
|
||||
addItem(file);
|
||||
importedCounter++;
|
||||
}
|
||||
});
|
||||
populateFilesTable();
|
||||
} catch (err) {
|
||||
alert(err);
|
||||
}
|
||||
});
|
||||
reader.readAsArrayBuffer(event.target.files[0]);
|
||||
};
|
||||
var validURL = (str) => {
|
||||
try {
|
||||
return new URL(str).host ? true : false;
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
var deleteFile = (node) => {
|
||||
const serverKey = node.dataset.serverKey;
|
||||
const deleteUrl = new URL(
|
||||
`${actionURL}d/${serverKey}/${node.dataset.actionKey}`
|
||||
);
|
||||
deleteUrl.searchParams.append("_format", "json");
|
||||
fetch(deleteUrl, {
|
||||
method: "GET"
|
||||
}).then((response) => {
|
||||
if (!response.ok) {
|
||||
throw new Error("Network error while deleting file");
|
||||
}
|
||||
return response.json();
|
||||
}).then((data) => {
|
||||
if (data.success) {
|
||||
node.remove();
|
||||
deleteFromStorage(serverKey);
|
||||
} else {
|
||||
alert(data.msg);
|
||||
}
|
||||
checkItemSelection();
|
||||
});
|
||||
};
|
||||
var checkItemSelection = () => {
|
||||
const deleteSelectionDOM = document.getElementById("action-delete-selection");
|
||||
if (document.querySelectorAll(".item .checkbox input:checked").length > 0) {
|
||||
deleteSelectionDOM.disabled = false;
|
||||
} else {
|
||||
deleteSelectionDOM.disabled = true;
|
||||
}
|
||||
};
|
||||
var deleteSelection = () => {
|
||||
document.querySelectorAll(".item:has(.checkbox input:checked)").forEach((node) => deleteFile(node));
|
||||
};
|
||||
var populateFilesTable = () => {
|
||||
const itemsTableDOM = document.getElementById("items-table");
|
||||
itemsTableDOM.replaceChildren();
|
||||
let files = localStorage.getItem(`${prefix}files`);
|
||||
if (files === null) {
|
||||
const filesWithoutPrefix = localStorage.getItem("files");
|
||||
if (filesWithoutPrefix !== null) {
|
||||
if (confirm(i18n.importFilesWithoutPrefix)) {
|
||||
localStorage.setItem(`${prefix}files`, filesWithoutPrefix);
|
||||
files = JSON.parse(filesWithoutPrefix);
|
||||
} else {
|
||||
localStorage.setItem(`${prefix}files`, JSON.stringify([]));
|
||||
files = [];
|
||||
}
|
||||
} else {
|
||||
files = [];
|
||||
}
|
||||
} else {
|
||||
files = JSON.parse(files);
|
||||
}
|
||||
files.sort((a, b) => b.created_at - a.created_at);
|
||||
files.forEach((file) => {
|
||||
const itemDOM = document.querySelector("template#item").content.cloneNode(true).children[0];
|
||||
itemDOM.classList.add(`item-${file.short}`);
|
||||
itemDOM.dataset.serverKey = file.short;
|
||||
itemDOM.dataset.actionKey = file.token;
|
||||
itemDOM.querySelector(".name").innerText = file.name;
|
||||
itemDOM.querySelector(".download a").href = file.url;
|
||||
itemDOM.querySelector(".delete-at-first-view .icon").classList.add(file.del_at_first_view ? "fa-eraser" : "fa-close");
|
||||
itemDOM.querySelector(".created-at").innerText = formatDate(
|
||||
file.created_at
|
||||
);
|
||||
itemDOM.querySelector(".expires-at").innerText = file.delay == 0 ? i18n.noExpiration : formatDate(file.delay * 86400 + file.created_at);
|
||||
itemDOM.querySelector(
|
||||
".mail a"
|
||||
).href = `${actionURL}m?links=["${file.short}"]`;
|
||||
itemDOM.querySelector(".action-delete-item").onclick = () => deleteFile(itemDOM);
|
||||
itemDOM.querySelector(".checkbox input").onclick = () => {
|
||||
checkItemSelection();
|
||||
};
|
||||
itemsTableDOM.append(itemDOM);
|
||||
console.debug(file.short, file.token);
|
||||
fetch(counterURL, {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
|
||||
},
|
||||
body: new URLSearchParams({
|
||||
short: file.short,
|
||||
token: file.token
|
||||
})
|
||||
}).then((response) => {
|
||||
if (!response.ok) {
|
||||
throw new Error(`Request error: ${response.statusText}`);
|
||||
}
|
||||
return response.json();
|
||||
}).then((data) => {
|
||||
const countDOM = itemDOM.querySelector(".counter");
|
||||
if (data.success) {
|
||||
countDOM.innerText = data.counter;
|
||||
if (data.deleted) {
|
||||
countDOM.parentElement.classList.add("deleted");
|
||||
}
|
||||
} else {
|
||||
alert(data.msg);
|
||||
countDOM.parentElement.remove();
|
||||
if (data.missing) {
|
||||
deleteFromStorage(data.short);
|
||||
}
|
||||
}
|
||||
}).catch((error) => console.error(error));
|
||||
});
|
||||
};
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
populateFilesTable();
|
||||
document.getElementById("action-select-all").onclick = updateSelection;
|
||||
document.getElementById("action-export-storage").onclick = exportStorage;
|
||||
document.getElementById("action-purge-expired").onclick = purgeExpired;
|
||||
document.getElementById("action-import-storage").onchange = importStorage;
|
||||
document.getElementById("action-delete-selection").onclick = deleteSelection;
|
||||
});
|
|
@ -1,235 +0,0 @@
|
|||
// themes/default/public/js/lib/filesize.esm.min.js
|
||||
var t = "array";
|
||||
var i = "bit";
|
||||
var o = "bits";
|
||||
var e = "byte";
|
||||
var n = "bytes";
|
||||
var r = "";
|
||||
var a = "exponent";
|
||||
var b = "function";
|
||||
var s = "iec";
|
||||
var l = "Invalid number";
|
||||
var p = "Invalid rounding method";
|
||||
var u = "jedec";
|
||||
var c = "object";
|
||||
var d = ".";
|
||||
var f = "round";
|
||||
var g = "s";
|
||||
var m = "si";
|
||||
var B = "kbit";
|
||||
var y = "kB";
|
||||
var h = " ";
|
||||
var M = "string";
|
||||
var x = "0";
|
||||
var w = { symbol: { iec: { bits: ["bit", "Kibit", "Mibit", "Gibit", "Tibit", "Pibit", "Eibit", "Zibit", "Yibit"], bytes: ["B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"] }, jedec: { bits: ["bit", "Kbit", "Mbit", "Gbit", "Tbit", "Pbit", "Ebit", "Zbit", "Ybit"], bytes: ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"] } }, fullform: { iec: ["", "kibi", "mebi", "gibi", "tebi", "pebi", "exbi", "zebi", "yobi"], jedec: ["", "kilo", "mega", "giga", "tera", "peta", "exa", "zetta", "yotta"] } };
|
||||
function E(E2, { bits: T = false, pad: j = false, base: N = -1, round: P = 2, locale: S = r, localeOptions: k = {}, separator: G = r, spacer: K = h, symbols: Y = {}, standard: Z = r, output: v = M, fullform: O = false, fullforms: $ = [], exponent: z = -1, roundingMethod: I = f, precision: L = 0 } = {}) {
|
||||
let D = z, q = Number(E2), A = [], C = 0, F = r;
|
||||
Z === m ? (N = 10, Z = u) : Z === s || Z === u ? N = 2 : 2 === N ? Z = s : (N = 10, Z = u);
|
||||
const H = 10 === N ? 1e3 : 1024, J = true === O, Q = q < 0, R = Math[I];
|
||||
if ("bigint" != typeof E2 && isNaN(E2)) throw new TypeError(l);
|
||||
if (typeof R !== b) throw new TypeError(p);
|
||||
if (Q && (q = -q), (-1 === D || isNaN(D)) && (D = Math.floor(Math.log(q) / Math.log(H)), D < 0 && (D = 0)), D > 8 && (L > 0 && (L += 8 - D), D = 8), v === a) return D;
|
||||
if (0 === q) A[0] = 0, F = A[1] = w.symbol[Z][T ? o : n][D];
|
||||
else {
|
||||
C = q / (2 === N ? Math.pow(2, 10 * D) : Math.pow(1e3, D)), T && (C *= 8, C >= H && D < 8 && (C /= H, D++));
|
||||
const t2 = Math.pow(10, D > 0 ? P : 0);
|
||||
A[0] = R(C * t2) / t2, A[0] === H && D < 8 && -1 === z && (A[0] = 1, D++), F = A[1] = 10 === N && 1 === D ? T ? B : y : w.symbol[Z][T ? o : n][D];
|
||||
}
|
||||
if (Q && (A[0] = -A[0]), L > 0 && (A[0] = A[0].toPrecision(L)), A[1] = Y[A[1]] || A[1], true === S ? A[0] = A[0].toLocaleString() : S.length > 0 ? A[0] = A[0].toLocaleString(S, k) : G.length > 0 && (A[0] = A[0].toString().replace(d, G)), j && P > 0) {
|
||||
const t2 = A[0].toString(), i2 = G || (t2.match(/(\D)/g) || []).pop() || d, o2 = t2.toString().split(i2), e2 = o2[1] || r, n2 = e2.length, a2 = P - n2;
|
||||
A[0] = `${o2[0]}${i2}${e2.padEnd(n2 + a2, x)}`;
|
||||
}
|
||||
return J && (A[1] = $[D] ? $[D] : w.fullform[Z][D] + (T ? i : e) + (1 === A[0] ? r : g)), v === t ? A : v === c ? { value: A[0], symbol: A[1], exponent: D, unit: F } : A.join(K);
|
||||
}
|
||||
|
||||
// themes/default/public/js/list-invitations.js
|
||||
var updateButtonsStatus = () => {
|
||||
const targetSelectionDOM = document.querySelectorAll(".target-selection");
|
||||
if (document.querySelectorAll(".column.selection .checkbox input:checked").length > 0) {
|
||||
targetSelectionDOM.forEach((node) => node.disabled = false);
|
||||
} else {
|
||||
targetSelectionDOM.forEach((node) => node.disabled = true);
|
||||
}
|
||||
};
|
||||
var invertSelection = () => {
|
||||
document.querySelectorAll(".item .column.selection input").forEach((node) => {
|
||||
node.click();
|
||||
});
|
||||
updateButtonsStatus();
|
||||
};
|
||||
var toggleHidden = () => {
|
||||
const invitationsListDOM = document.querySelector(".invitations-list");
|
||||
const toggleButtonDOM = document.querySelector(".action-toggle-hidden");
|
||||
const itemsHiddenDOM = invitationsListDOM.querySelectorAll(
|
||||
".item[data-visibility='0']"
|
||||
);
|
||||
if (invitationsListDOM.getAttribute("data-visibility") === "hidden") {
|
||||
toggleButtonDOM.innerText = i18n.hideText;
|
||||
itemsHiddenDOM.forEach((item) => showNode(item));
|
||||
invitationsListDOM.setAttribute("data-visibility", "shown");
|
||||
} else {
|
||||
toggleButtonDOM.innerText = i18n.showText;
|
||||
itemsHiddenDOM.forEach((item) => {
|
||||
hideNode(item);
|
||||
const checkbox = item.querySelector("input");
|
||||
if (checkbox.checked) {
|
||||
checkbox.click();
|
||||
}
|
||||
});
|
||||
invitationsListDOM.setAttribute("data-visibility", "hidden");
|
||||
}
|
||||
};
|
||||
var deleteInvitation = () => {
|
||||
if (confirm(i18n.confirmDeleteInvit)) {
|
||||
try {
|
||||
fetch(deleteURL, {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
|
||||
},
|
||||
body: getTokensBody()
|
||||
}).then((response) => {
|
||||
if (!response.ok) {
|
||||
throw new Error(`Request error: ${response.statusText}`);
|
||||
}
|
||||
return response.json();
|
||||
}).then((data) => {
|
||||
if (data.success) {
|
||||
data.tokens.forEach((t2) => {
|
||||
addToast(t2.msg, "success");
|
||||
document.getElementById(`row-${t2.token}`).remove();
|
||||
});
|
||||
data.failures.forEach((msg) => {
|
||||
addToast(msg, "error");
|
||||
});
|
||||
updateButtonsStatus();
|
||||
} else {
|
||||
data.failures.forEach((msg) => {
|
||||
addToast(msg, "error");
|
||||
});
|
||||
if (data.msg) {
|
||||
addToast(data.msg, "error");
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
}
|
||||
};
|
||||
var resendInvitation = () => {
|
||||
if (confirm(i18n.confirmResendMail)) {
|
||||
fetch(resendURL, {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
|
||||
},
|
||||
body: getTokensBody()
|
||||
}).then((response) => {
|
||||
if (!response.ok) {
|
||||
throw new Error(`Request error: ${response.statusText}`);
|
||||
}
|
||||
return response.json();
|
||||
}).then((data) => {
|
||||
if (data.success) {
|
||||
data.tokens.forEach((t2) => {
|
||||
const itemDOM = document.getElementById(`row-${t2.token}`);
|
||||
itemDOM.querySelector(".column.expiration-date").innerText = t2.expires;
|
||||
itemDOM.querySelector(".column.selection input").click();
|
||||
addToast(t2.msg, "success");
|
||||
});
|
||||
data.failures.forEach((msg) => {
|
||||
addToast(msg, "error");
|
||||
});
|
||||
updateButtonsStatus();
|
||||
}
|
||||
}).catch((error) => console.error(error));
|
||||
}
|
||||
};
|
||||
var toggleVisibility = () => {
|
||||
fetch(toggleURL, {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
|
||||
},
|
||||
body: getTokensBody()
|
||||
}).then((response) => {
|
||||
if (!response.ok) {
|
||||
throw new Error(`Request error: ${response.statusText}`);
|
||||
}
|
||||
return response.json();
|
||||
}).then((data) => {
|
||||
if (data.success) {
|
||||
data.tokens.forEach((t2) => {
|
||||
const itemDOM = document.getElementById(`row-${t2.token}`);
|
||||
if (t2.show) {
|
||||
itemDOM.setAttribute("data-visibility", 1);
|
||||
showNode(itemDOM);
|
||||
itemDOM.querySelector(".column.selection .icon.hide-source").remove();
|
||||
} else {
|
||||
itemDOM.setAttribute("data-visibility", 0);
|
||||
if (document.querySelector(".invitations-list").getAttribute("data-visibility") === "hidden") {
|
||||
hideNode(itemDOM);
|
||||
}
|
||||
itemDOM.querySelector(".column.selection").appendChild(
|
||||
document.querySelector("template#icon-hide-source").content.cloneNode(true)
|
||||
);
|
||||
}
|
||||
itemDOM.querySelector(".column.selection input").click();
|
||||
});
|
||||
updateButtonsStatus();
|
||||
} else {
|
||||
addToast(data.msg, "error");
|
||||
}
|
||||
}).catch((error) => console.error(error));
|
||||
};
|
||||
var getTokensBody = () => {
|
||||
const tokens = new URLSearchParams();
|
||||
document.querySelectorAll(".column.selection input:checked").forEach(
|
||||
(item) => tokens.append("tokens[]", item.getAttribute("data-token"))
|
||||
);
|
||||
return tokens;
|
||||
};
|
||||
var fillModal = (event) => {
|
||||
const buttonDOM = event.target;
|
||||
const modalDOM = document.querySelector(".modal.files-info");
|
||||
modalDOM.querySelector(".files-list").replaceChildren();
|
||||
modalDOM.querySelector("h1").innerText = i18n.listFiles.replace("XX1", buttonDOM.getAttribute("data-token")).replace("XX2", buttonDOM.getAttribute("data-guest"));
|
||||
const files = JSON.parse(buttonDOM.getAttribute("data-files")) || [];
|
||||
const itemList = new DocumentFragment();
|
||||
files.forEach((file) => {
|
||||
const expires = i18n.expiration.replace(
|
||||
"XXX",
|
||||
formatDate(file.delay * 86400 + file.created_at)
|
||||
);
|
||||
const item = modalDOM.querySelector("template#item").content.cloneNode(true);
|
||||
item.querySelector(".file-link").href = file.url;
|
||||
item.querySelector(".file-link").value = file.name;
|
||||
item.querySelector(".file-size").innerText = `${E(
|
||||
file.size
|
||||
)}, ${expires}`;
|
||||
itemList.appendChild(item);
|
||||
});
|
||||
modalDOM.querySelector(".files-list").appendChild(itemList);
|
||||
};
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
document.querySelectorAll(".modal-button.action-files-info").forEach(
|
||||
(button) => button.onclick = (event) => {
|
||||
fillModal(event);
|
||||
document.querySelector(".modal.files-info").showModal();
|
||||
}
|
||||
);
|
||||
document.querySelector(".close-modal").onclick = () => {
|
||||
document.querySelector(".modal").close();
|
||||
};
|
||||
document.querySelectorAll(".column.selection input").forEach((node) => node.onclick = updateButtonsStatus);
|
||||
document.querySelector(".action-invert-selection").onclick = invertSelection;
|
||||
document.querySelector(".action-toggle-hidden").onclick = toggleHidden;
|
||||
document.querySelector(".action-delete-invitation").onclick = deleteInvitation;
|
||||
document.querySelector(".action-resend-invitation").onclick = resendInvitation;
|
||||
document.querySelector(".action-toggle-visibility").onclick = toggleVisibility;
|
||||
});
|
||||
/*!
|
||||
2024 Jason Mulligan <jason.mulligan@avoidwork.com>
|
||||
@version 10.1.6
|
||||
*/
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue