|
|
@@ -1,4 +1,139 @@
|
|
|
|
|
|
-function showShareUi() {
|
|
|
+$(() => {
|
|
|
+
|
|
|
+var windowDisplayed = false;
|
|
|
+var data = null;
|
|
|
+
|
|
|
+class ShareData {
|
|
|
+ dbId = 0;
|
|
|
+ typeId = "";
|
|
|
+ typeData = "";
|
|
|
+ accessToId = 0;
|
|
|
+ accessToData = "";
|
|
|
+ grant = 0;
|
|
|
+
|
|
|
+ constructor(data) {
|
|
|
+ this.dbId = data.id;
|
|
|
+ this.typeId = [ "unknown", "ldapAccount", "email", "link", "every one" ].indexOf(data.type);
|
|
|
+ this.typeData = data.typeData;
|
|
|
+ this.accessToId = [ "unknown", "item", "tag", "meta", "everything", "admin"].indexOf(data.accessTo);
|
|
|
+ this.accessToData = data.accessToData;
|
|
|
+ this.grant = [ "none", "read", "write", "read without meta"].indexOf(data.grant);
|
|
|
+ }
|
|
|
+
|
|
|
+ compare(b) {
|
|
|
+ if (this.typeId != b.typeId) return b.typeId - this.typeId;
|
|
|
+ if (this.accessToId != b.accessToId) return b.accessToId - this.accessToId;
|
|
|
+ if (this.grant != b.grant) return b.grant - this.grant;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function getData() {
|
|
|
+ return new Promise((ok) => {
|
|
|
+ if (data)
|
|
|
+ return ok(data);
|
|
|
+ $.get("/api/accessAdmin/list", {}, okData => {
|
|
|
+ data = okData;
|
|
|
+ ok(okData);
|
|
|
+ });
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
+async function buildShareItem(data) {
|
|
|
+ const htmlId = `collapseShareItem${data.dbId}`;
|
|
|
+ let container = document.createElement("li");
|
|
|
+ container.className = "accordion-item";
|
|
|
+ let header = document.createElement("h2");
|
|
|
+ header.className = "accordion-header";
|
|
|
+ let headerButton = document.createElement("button");
|
|
|
+ headerButton.className = "accordion-button bi " + (["bi-question-lg", "bi-database", "bi-envelope-at", "bi-link-45deg", "bi-people"][data.typeId]);
|
|
|
+ headerButton.type = "button";
|
|
|
+ headerButton.dataset.bsToggle = "collapse";
|
|
|
+ headerButton.dataset.bsTarget = `#${htmlId}`;
|
|
|
+ headerButton.textContent = data.typeData;
|
|
|
+ headerButton.ariaExpanded = false;
|
|
|
+ headerButton.ariaControls = htmlId;
|
|
|
+ let accordionBodyContainer = document.createElement("div");
|
|
|
+ accordionBodyContainer.className = "accordion-collapse collapse";
|
|
|
+ accordionBodyContainer.dataset.bsParent = "#pch-share-container";
|
|
|
+ accordionBodyContainer.id = htmlId;
|
|
|
+ let accordionBody = document.createElement("div");
|
|
|
+ accordionBody.className = "accordion-body";
|
|
|
+ let typeDivRow = document.createElement("div");
|
|
|
+ typeDivRow.className = "row";
|
|
|
+ let typeDiv = document.createElement("div");
|
|
|
+ typeDiv.className = "bi";
|
|
|
+ typeDiv.classList.add(["bi-question-lg", "bi-diagram-2", "bi-tags", "bi-braces-asterisk", "bi-people", "bi-gear"][data.accessToId]);
|
|
|
+ typeDiv.textContent = ["Unknown", "Single photo", "Tags", "Meta", "Everything", "Admin access"][data.accessToId];
|
|
|
+ if (data.accessToId === 1)
|
|
|
+ typeDiv.textContent += " (" +((await MediaStorage.Instance.getMedia(data.accessToData))?.fileName || "File not found") + ")";
|
|
|
+ else if (data.accessToId === 2)
|
|
|
+ typeDiv.textContent += ` (${data.accessToData})`;
|
|
|
+ else if (data.accessToId === 3)
|
|
|
+ typeDiv.textContent += ` (${data.accessToData})`;
|
|
|
+ if (data.accessToId !== 5) {
|
|
|
+ let grantDiv = document.createElement("div");
|
|
|
+ grantDiv.textContent = ["None", "Read Access", "Write Access", "Read Access (Strip meta)"][data.grant];
|
|
|
+ typeDiv.appendChild(grantDiv);
|
|
|
+ }
|
|
|
+
|
|
|
+ let deleteButtonRow = document.createElement("div");
|
|
|
+ let deleteButtonDiv = document.createElement("div");
|
|
|
+ let deleteButton = document.createElement("button");
|
|
|
+ deleteButtonRow.className = "row";
|
|
|
+ deleteButtonDiv.className = "col align-self-end";
|
|
|
+ deleteButton.className = "btn btn-danger";
|
|
|
+ deleteButton.textContent = "Revoke";
|
|
|
+ deleteButtonRow.appendChild(deleteButtonDiv);
|
|
|
+ deleteButtonDiv.appendChild(deleteButton);
|
|
|
+ deleteButton.addEventListener("click", () => {
|
|
|
+ console.log("Request to revoke " +data.dbId); // FIXME
|
|
|
+ });
|
|
|
+
|
|
|
+ header.appendChild(headerButton);
|
|
|
+ container.appendChild(header);
|
|
|
+ accordionBody.appendChild(typeDivRow);
|
|
|
+ typeDivRow.appendChild(typeDiv);
|
|
|
+ accordionBody.appendChild(deleteButtonRow);
|
|
|
+ accordionBodyContainer.appendChild(accordionBody);
|
|
|
+ container.appendChild(accordionBodyContainer);
|
|
|
+ return container;
|
|
|
+}
|
|
|
+
|
|
|
+async function buildShareItems(data) {
|
|
|
+ let container = document.createElement("ul");
|
|
|
+ for (let i of data)
|
|
|
+ container.appendChild(await buildShareItem(i));
|
|
|
+ return container;
|
|
|
+}
|
|
|
+
|
|
|
+window.showShareUi = async () => {
|
|
|
+ if (windowDisplayed)
|
|
|
+ return;
|
|
|
+ document.getElementById("pch-share-wrapper").classList.remove("hidden");
|
|
|
+ document.Title.pushTitle("Share");
|
|
|
+ document.body.classList.add("overlay-visible");
|
|
|
+ const data = ((await getData()) || []).map(x => new ShareData(x)).sort((a, b) => a.compare(b));
|
|
|
+ document.getElementById('pch-share-loading').classList.add("hidden");
|
|
|
+ const container = document.getElementById('pch-share-container');
|
|
|
+ container.innerHTML = "";
|
|
|
+ container.appendChild(await buildShareItems(data));
|
|
|
+ windowDisplayed = true;
|
|
|
}
|
|
|
|
|
|
+window.closeShareUi = () => {
|
|
|
+ if (!windowDisplayed)
|
|
|
+ return;
|
|
|
+ document.getElementById("pch-share-wrapper").classList.add("hidden");
|
|
|
+ document.body.classList.remove("overlay-visible");
|
|
|
+ windowDisplayed = false;
|
|
|
+ document.Title.pop();
|
|
|
+}
|
|
|
+
|
|
|
+document.onClosePopinRequested(() => { window.closeShareUi(); });
|
|
|
+document.getElementById("pch-share-closeBt").addEventListener("click", window.closeShareUi);
|
|
|
+
|
|
|
+setTimeout(() => LoadingTasks.push(window.showShareUi), 1500);
|
|
|
+});
|
|
|
+
|