uiMedia.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. $(() => {
  2. function buildThumbnail(mediaItem) {
  3. if (mediaItem.ui)
  4. return mediaItem.ui;
  5. let img = document.createElement("img");
  6. let container = document.createElement("li");
  7. let loadingImg = document.createElement("div");
  8. container.classList.add("pch-image");
  9. container.classList.add("loading");
  10. loadingImg.classList.add("spinner");
  11. loadingImg.innerHTML = "<span class='spinner-grow'></span>";
  12. container.dataset.md5sum = mediaItem.md5sum;
  13. img.loading = "lazy";
  14. let requestSize = mediaItem.resize(450, 450);
  15. img.src = `${mediaItem.thumbnail}?w=${requestSize.width}&h=${requestSize.height}&q=4`;
  16. img.classList.add("img-fluid");
  17. img.classList.add("img-thumbnail");
  18. img.addEventListener("load", () => {
  19. container.classList.remove("loading");
  20. container.classList.remove("spinner-grow");
  21. });
  22. container.style.width = `${requestSize.width}px`;
  23. container.appendChild(loadingImg);
  24. container.appendChild(img);
  25. container.addEventListener("click", () => {
  26. document.location.hash = mediaItem.md5sum;
  27. });
  28. return mediaItem.ui = {
  29. root: container,
  30. img: img
  31. };
  32. }
  33. function buildYear(date) {
  34. let result = document.createElement('h3');
  35. result.textContent = date.getUTCFullYear();
  36. return result;
  37. }
  38. function buildMonth(date) {
  39. let result = document.createElement('h4');
  40. result.textContent = date.toLocaleString('default', { month: 'long' });
  41. return result;
  42. }
  43. function redraw(container, media) {
  44. buildThumbnail(media);
  45. if (!media.ui)
  46. return;
  47. let yearUpdated = !container.dataset.lastItemYear || container.dataset.lastItemYear != media.date.getUTCFullYear();
  48. if (yearUpdated) {
  49. container.appendChild(buildYear(media.date));
  50. container.dataset.lastItemYear = media.date.getUTCFullYear();
  51. }
  52. if (yearUpdated || container.dataset.lastItemMonth === undefined || container.dataset.lastItemMonth != media.date.getUTCMonth()) {
  53. container.appendChild(buildMonth(media.date));
  54. container.dataset.lastItemMonth = media.date.getUTCMonth();
  55. }
  56. container.appendChild(media.ui.root);
  57. }
  58. MediaStorage.Instance.addEventListener("rebuildMedia", (evt) => {
  59. let newContainer = document.getElementById('pch-mediaList');
  60. newContainer.textContent = '';
  61. newContainer.dataset.lastItemYear = null;
  62. newContainer.dataset.lastItemMonth = null;
  63. for (let i of MediaStorage.Instance.medias)
  64. redraw(newContainer, i);
  65. });
  66. MediaStorage.Instance.addEventListener("newMedia", (evt) => {
  67. let container = document.getElementById('pch-mediaList');
  68. redraw(container, evt.detail);
  69. });
  70. function _displayMediaFullPage(fileName, imgUrl, metaData, downloadLink) {
  71. return new Promise(ok => {
  72. document.getElementById("pch-fullPagePreviewContainer").classList.add("loading");
  73. document.getElementById("pch-fullPageMedia-title").innerText = fileName;
  74. document.getElementById("pch-fullPagePreview").onceLoaded = ok;
  75. document.getElementById("pch-fullPagePreview").src = imgUrl;
  76. document.getElementById("pch-fullPageDetail").innerText = "";
  77. let metaList = document.createElement("ul");
  78. for (let i in metaData || {}) {
  79. let li = document.createElement("li");
  80. li.innerText = `${i}: ${metaData[i]}`;
  81. metaList.appendChild(li);
  82. }
  83. document.getElementById("pch-fullPageDetail").appendChild(metaList);
  84. if (downloadLink) {
  85. document.getElementById("pch-fullPageDetail-dlButton").classList.remove("hidden");
  86. document.getElementById("pch-fullPageDetail-dlButton").dataset["link"] = downloadLink;
  87. } else {
  88. document.getElementById("pch-fullPageDetail-dlButton").classList.add("hidden");
  89. }
  90. });
  91. }
  92. window.displayMediaFullPage = function(mediaItem) {
  93. document.getElementById("pch-fullPageMedia").classList.remove("hidden");
  94. if (!mediaItem)
  95. return _displayMediaFullPage("Error", null, {}, null);
  96. let containerSize = document.getElementById("pch-fullPageMedia").getBoundingClientRect();
  97. let requestSize = mediaItem.resize(containerSize.width, containerSize.height);
  98. document.getElementById("pch-fullPagePreview").parentNode.style.maxWidth = "100%";
  99. document.getElementById("pch-fullPagePreview").parentNode.style.maxHeight = "100%";
  100. let meta = {
  101. ...mediaItem.meta,
  102. date: mediaItem.date || undefined,
  103. filename: mediaItem.fileName || undefined
  104. };
  105. return _displayMediaFullPage(mediaItem.fileName, `${mediaItem.thumbnail}?w=${requestSize.width}&h=${requestSize.height}&q=6`, meta, mediaItem.original);
  106. }
  107. document.getElementById("pch-fullPageMedia-closeBt")
  108. .addEventListener("click", () => {
  109. document.getElementById("pch-fullPageMedia").classList.add("hidden");
  110. history.pushState({}, '', '#');
  111. });
  112. document.getElementById("pch-fullPagePreview").addEventListener("load", () => {
  113. document.getElementById("pch-fullPagePreviewContainer").classList.remove("loading");
  114. let domItem = document.getElementById("pch-fullPagePreview");
  115. domItem.onceLoaded && domItem.onceLoaded();
  116. domItem.onceLoaded = null;
  117. });
  118. document.getElementById('pch-fullPageDetail-dlButton').addEventListener("click", (evt) => {
  119. if (!evt.target?.dataset?.link)
  120. return;
  121. let link = document.createElement('a');
  122. link.target='_blank';
  123. link.setAttribute("download", "");
  124. link.href = evt.target.dataset.link;
  125. link.click();
  126. });
  127. });