Source: utils/template/functions/media.js

  1. import { createLightboxImage } from "../../../media/viewer/imagePreview.js";
  2. import { initVideo } from "../../../media/viewer/videoPlayer.js";
  3. import { VideoPlayerShortcuts } from "../../../media/player/VideoPlayerShortcuts.js";
  4. import { VideoPlayerUtils } from "../../../media/player/VideoPlayerUtils.js";
  5. import { guessIFDOKey, getHTMLOfIFDOIcon } from "../../../media/viewer/iFDO.js";
  6. /**
  7. *
  8. *
  9. * @param {string} src
  10. * @param {string} width (optional)
  11. * @param {string} height (optional)
  12. * @param {string} srcset (optional)
  13. * @returns {HTMLElement} div placeholder
  14. */
  15. export function displayImage(src, width, height, srcset) {
  16. src = src || 'https://broken-image-url';
  17. const target = document.createElement("div");
  18. target.classList.add("image-wrapper");
  19. if (width != null && height != null) {
  20. const container = createLightboxImage(src, width, height, srcset);
  21. target.appendChild(container)
  22. }
  23. else {
  24. const img = new Image();
  25. img.onload = () => {
  26. const container = createLightboxImage(src, img.width, img.height, srcset);
  27. target.appendChild(container);
  28. };
  29. img.src = src;
  30. if (srcset != null)
  31. img.srcset = srcset;
  32. }
  33. return target;
  34. }
  35. // static video player instance
  36. let videoPlayerDiv = null;
  37. /**
  38. *
  39. * @param {string} media
  40. * @param {string} width
  41. * @param {string} height
  42. * @param {string} thumbnail (optional)
  43. * @param {string} cover (optional)
  44. * @param {string} poster (optional)
  45. * @returns {HTMLElement} div placeholder
  46. */
  47. export function displayVideo(media, width, height, thumbnail, cover, poster) {
  48. if (videoPlayerDiv) {
  49. videoPlayerDiv.remove();
  50. videoPlayerDiv = null;
  51. }
  52. if (media == null)
  53. return undefined
  54. videoPlayerDiv = document.createElement("div");
  55. videoPlayerDiv.classList.add("video");
  56. const video = initVideo({
  57. 'media': media,
  58. 'thumbnail': thumbnail,
  59. 'cover': cover,
  60. 'poster': poster || VideoPlayerUtils.getPoster(),
  61. 'initPlayerWithKeyFocus': true
  62. });
  63. const videoContainer = document.createElement('div');
  64. if (width && height) {
  65. videoContainer.style = `width: 100%; height: 0; padding-bottom: calc(100% * ${height}/${width}); position: relative;`
  66. video.style = 'position: absolute; width: 100%; height: 100%';
  67. }
  68. else {
  69. console.warn('The video player is initialized without width and height. As a result, the dimensions of the video player are not known until the video is loaded. This can lead to sudden changes in the layout when the video player is displayed.')
  70. }
  71. videoContainer.append(video)
  72. videoPlayerDiv.appendChild(videoContainer)
  73. return videoPlayerDiv;
  74. }
  75. // static video player keyboard shortcut instance
  76. let shortcutsWindow = null;
  77. /**
  78. * @returns {HTMLElement} div placeholder
  79. *
  80. */
  81. export function displayVideoPlayerKeys() {
  82. const target = document.createElement("div");
  83. const keyboardShortcutLink = document.createElement("a");
  84. keyboardShortcutLink.style = "display: inline-block; text-decoration: none;";
  85. keyboardShortcutLink.href = "#";
  86. keyboardShortcutLink.innerHTML = "<i class='fas fa-keyboard'></i> Keyboard Shortcuts";
  87. keyboardShortcutLink.onclick = e => {
  88. e.preventDefault();
  89. if (!shortcutsWindow)
  90. shortcutsWindow = new VideoPlayerShortcuts();
  91. if (!shortcutsWindow.isOpened)
  92. shortcutsWindow.open();
  93. else
  94. shortcutsWindow.close();
  95. }
  96. if (!videoPlayerDiv)
  97. target.style.display = 'None';
  98. target.appendChild(keyboardShortcutLink);
  99. return target;
  100. }
  101. /**
  102. * @param {object} featureProperties
  103. * @returns {HTMLElement} div placeholder
  104. *
  105. */
  106. export function displayIFDOIcons(featureProperties) {
  107. const containerElement = document.createElement('div');
  108. containerElement.classList.add('inline-block-container-ifdo-icon');
  109. containerElement.setAttribute('data-config-remove-empty-column', false);
  110. let containerChildrenHTML = "";
  111. for (const [featurePropertiesKey, featurePropertiesValue] of Object.entries(featureProperties)) {
  112. const iFDOKey = guessIFDOKey(featurePropertiesKey);
  113. const iFDOValue = featurePropertiesValue;
  114. if (iFDOKey && iFDOValue)
  115. containerChildrenHTML += getHTMLOfIFDOIcon(iFDOKey, iFDOValue);
  116. }
  117. containerElement.innerHTML = containerChildrenHTML;
  118. containerElement.addEventListener("append", e => {
  119. containerElement.parentNode.parentNode.classList.add("no-copy");
  120. containerElement.parentNode.parentNode.setAttribute("data-button-expansion", true);
  121. })
  122. return containerElement;
  123. }