uiShare.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. $(() => {
  2. var windowDisplayed = false;
  3. var data = null;
  4. class ShareData {
  5. dbId = 0;
  6. typeId = "";
  7. typeData = "";
  8. accessToId = 0;
  9. accessToData = "";
  10. grant = 0;
  11. constructor(data) {
  12. this.dbId = data.id;
  13. this.typeId = [ "unknown", "ldapAccount", "email", "link", "every one" ].indexOf(data.type);
  14. this.typeData = data.typeData;
  15. this.accessToId = [ "unknown", "item", "tag", "meta", "everything", "admin"].indexOf(data.accessTo);
  16. this.accessToData = data.accessToData;
  17. this.grant = [ "none", "read", "write", "read without meta"].indexOf(data.grant);
  18. }
  19. compare(b) {
  20. if (this.typeId != b.typeId) return b.typeId - this.typeId;
  21. if (this.accessToId != b.accessToId) return b.accessToId - this.accessToId;
  22. if (this.grant != b.grant) return b.grant - this.grant;
  23. return 0;
  24. }
  25. }
  26. function getData() {
  27. return new Promise((ok) => {
  28. if (data)
  29. return ok(data);
  30. $.get("/api/accessAdmin/list", {}, okData => {
  31. data = okData;
  32. ok(okData);
  33. });
  34. });
  35. }
  36. async function buildShareItem(data) {
  37. const htmlId = `collapseShareItem${data.dbId}`;
  38. let container = document.createElement("li");
  39. container.className = "accordion-item";
  40. let header = document.createElement("h2");
  41. header.className = "accordion-header";
  42. let headerButton = document.createElement("button");
  43. headerButton.className = "accordion-button bi " + (["bi-question-lg", "bi-database", "bi-envelope-at", "bi-link-45deg", "bi-people"][data.typeId]);
  44. headerButton.type = "button";
  45. headerButton.dataset.bsToggle = "collapse";
  46. headerButton.dataset.bsTarget = `#${htmlId}`;
  47. headerButton.textContent = data.typeData;
  48. headerButton.ariaExpanded = false;
  49. headerButton.ariaControls = htmlId;
  50. let accordionBodyContainer = document.createElement("div");
  51. accordionBodyContainer.className = "accordion-collapse collapse";
  52. accordionBodyContainer.dataset.bsParent = "#pch-share-container";
  53. accordionBodyContainer.id = htmlId;
  54. let accordionBody = document.createElement("div");
  55. accordionBody.className = "accordion-body";
  56. let typeDivRow = document.createElement("div");
  57. typeDivRow.className = "row";
  58. let typeDiv = document.createElement("div");
  59. typeDiv.className = "bi";
  60. typeDiv.classList.add(["bi-question-lg", "bi-diagram-2", "bi-tags", "bi-braces-asterisk", "bi-people", "bi-gear"][data.accessToId]);
  61. typeDiv.textContent = ["Unknown", "Single photo", "Tags", "Meta", "Everything", "Admin access"][data.accessToId];
  62. if (data.accessToId === 1)
  63. typeDiv.textContent += " (" +((await MediaStorage.Instance.getMedia(data.accessToData))?.fileName || "File not found") + ")";
  64. else if (data.accessToId === 2)
  65. typeDiv.textContent += ` (${data.accessToData})`;
  66. else if (data.accessToId === 3)
  67. typeDiv.textContent += ` (${data.accessToData})`;
  68. if (data.accessToId !== 5) {
  69. let grantDiv = document.createElement("div");
  70. grantDiv.textContent = ["None", "Read Access", "Write Access", "Read Access (Strip meta)"][data.grant];
  71. typeDiv.appendChild(grantDiv);
  72. }
  73. let deleteButtonRow = document.createElement("div");
  74. let deleteButtonDiv = document.createElement("div");
  75. let deleteButton = document.createElement("button");
  76. deleteButtonRow.className = "row";
  77. deleteButtonDiv.className = "col align-self-end";
  78. deleteButton.className = "btn btn-danger";
  79. deleteButton.textContent = "Revoke";
  80. deleteButtonRow.appendChild(deleteButtonDiv);
  81. deleteButtonDiv.appendChild(deleteButton);
  82. deleteButton.addEventListener("click", () => {
  83. console.log("Request to revoke " +data.dbId); // FIXME
  84. });
  85. header.appendChild(headerButton);
  86. container.appendChild(header);
  87. accordionBody.appendChild(typeDivRow);
  88. typeDivRow.appendChild(typeDiv);
  89. accordionBody.appendChild(deleteButtonRow);
  90. accordionBodyContainer.appendChild(accordionBody);
  91. container.appendChild(accordionBodyContainer);
  92. return container;
  93. }
  94. async function buildShareItems(data) {
  95. let container = document.createElement("ul");
  96. for (let i of data)
  97. container.appendChild(await buildShareItem(i));
  98. return container;
  99. }
  100. window.showShareUi = async () => {
  101. if (windowDisplayed)
  102. return;
  103. document.getElementById("pch-share-wrapper").classList.remove("hidden");
  104. document.Title.pushTitle("Share");
  105. document.body.classList.add("overlay-visible");
  106. const data = ((await getData()) || []).map(x => new ShareData(x)).sort((a, b) => a.compare(b));
  107. document.getElementById('pch-share-loading').classList.add("hidden");
  108. const container = document.getElementById('pch-share-container');
  109. container.innerHTML = "";
  110. container.appendChild(await buildShareItems(data));
  111. windowDisplayed = true;
  112. }
  113. window.closeShareUi = () => {
  114. if (!windowDisplayed)
  115. return;
  116. document.getElementById("pch-share-wrapper").classList.add("hidden");
  117. document.body.classList.remove("overlay-visible");
  118. windowDisplayed = false;
  119. document.Title.pop();
  120. }
  121. document.onClosePopinRequested(() => { window.closeShareUi(); });
  122. document.getElementById("pch-share-closeBt").addEventListener("click", window.closeShareUi);
  123. setTimeout(() => LoadingTasks.push(window.showShareUi), 1500);
  124. });