AutorÃa | Ultima modificación | Ver Log |
{"version":3,"file":"embedthumbnailinsert.min.js","sources":["../../src/embed/embedthumbnailinsert.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Tiny media plugin embed thumbnail upload class.\n *\n * This handles the embed thumbnail upload using drag-drop.\n *\n * @module tiny_media/embed/embedthumbnailinsert\n * @copyright 2024
Stevani Andolo <stevani@hotmail.com.au>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Selectors from '../selectors';\nimport Dropzone from 'core/dropzone';\nimport uploadFile from 'editor_tiny/uploader';\nimport {prefetchStrings} from 'core/prefetch';\nimport {getStrings} from 'core/str';\nimport {component} from \"../common\";\nimport {\n showElements,\n startMediaLoading,\n stopMediaLoading,\n setPropertiesFromData,\n body,\n footer,\n} from '../helpers';\nimport {EmbedThumbnailPreview} from './embedthumbnailpreview';\nimport {EmbedHandler} from './embedhandler';\nimport {displayFilepicker} from 'editor_tiny/utils';\n\nprefetchStrings(component, [\n 'insertmediathumbnail',\n 'uploading',\n 'loadingembedthumbnail',\n 'addmediathumbnaildrop',\n]);\n\nexport class EmbedThumbnailInsert {\n\n constructor(data) {\n setPropertiesFromData(this, data); // Creates dynamic properties based on \"data\" param.\n }\n\n /**\n *
Init the dropzone and lang strings.\n *\n * @param {object} mediaData Object of selected media data\n */\n init = async(mediaData) => {\n this.mediaData = mediaData; // Current selected media data passed from embedPreview.\n const langStringKeys = [\n 'insertmediathumbnail',\n 'uploading',\n 'loadingembedthumbnail',\n 'addmediathumbnaildrop',\n ];\n const langStringvalues = await getStrings([...langStringKeys].map((key) => ({key, component})));\n this.langStrings = Object.fromEntries(langStringKeys.map((key, index) => [key, langStringvalues[index]]));\n this.currentModal.uploadThumbnailModal.setTitle(this.langStrings.insertmediathumbnail);\n\n // Let's init the dropzone if canShowDropZone is true.\n if (this.canShowDropZone) {\n const dropZoneEle = document.querySelector(Selectors.EMBED.elements.dropzoneContainer);\n const dropZone = new Dropzone(\n dropZoneE
le,\n this.acceptedImageTypes,\n files => {\n this.handleUploadedFile(files);\n }\n );\n dropZone.setLabel(this.langStrings.addmediathumbnaildrop);\n dropZone.init();\n }\n\n this.registerInsertMediaThumbnailEvents(this.thumbnailModalRoot);\n };\n\n /**\n * Load and display a preview thumbnail based on the provided URL, and handles thumbnail loading events.\n *\n * @param {string} url - The URL of the thumbnail to load and display.\n */\n loadPreviewThumbnail = (url) => {\n this.media.poster = url;\n\n let templateContext = {\n bodyTemplate: Selectors.EMBED.template.body.mediaThumbnailBody,\n footerTemplate: Selectors.EMBED.template.footer.mediaThumbnailFooter,\n selector: Selectors.EMBED.type,\n };\n\n Promise.all([body(templateContext, this.thumbnailModalRoot), footer(templateContext, this.thumbnailModalRoot)])\n
.then(() => {\n const mediaThumbnail = new EmbedThumbnailPreview(this);\n mediaThumbnail.init(this.mediaData);\n return;\n })\n .catch(error => {\n window.console.log(error);\n });\n };\n\n /**\n * Handles media preview on file picker callback.\n *\n * @param {object} params Object of uploaded file\n */\n filePickerCallback = (params) => {\n if (params.url) {\n this.loadPreviewThumbnail(params.url);\n }\n };\n\n /**\n * Updates the content of the loader icon.\n *\n * @param {HTMLElement} root - The root element containing the loader icon.\n * @param {object} langStrings - An object containing language strings.\n * @param {number|null} progress - The progress percentage (optional).\n */\n updateLoaderIcon = (root, langStrings, progress = null) => {\n const loaderIconState = root.querySelector(Selectors.EMBED.elements.
loaderIconContainer + ' div');\n loaderIconState.innerHTML = (progress !== null) ?\n `${langStrings.uploading} ${Math.round(progress)}%` :\n langStrings.loadingembedthumbnail;\n };\n\n /**\n * Handles changes in the media URL input field and loads a preview of the media if the URL has changed.\n */\n urlChanged() {\n const url = this.thumbnailModalRoot.querySelector(Selectors.EMBED.elements.fromUrl).value;\n if (url && url !== this.currentUrl) {\n this.loadPreviewThumbnail(url);\n }\n }\n\n /**\n * Handles the uploaded file, initiates the upload process, and updates the UI during the upload.\n *\n * @param {FileList} files - The list of files to upload (usually from a file input field).\n * @returns {Promise<void>} A promise that resolves when the file is uploaded and processed.\n */\n handleUploadedFile = async(files) => {\n try {\n startMediaLoad
ing(this.thumbnailModalRoot, Selectors.EMBED.type);\n const fileURL = await uploadFile(this.editor, 'image', files[0], files[0].name, (progress) => {\n this.updateLoaderIcon(this.thumbnailModalRoot, this.langStrings, progress);\n });\n\n // Set the loader icon content to \"loading\" after the file upload completes.\n this.updateLoaderIcon(this.thumbnailModalRoot, this.langStrings);\n this.filePickerCallback({url: fileURL});\n } catch (error) {\n // Handle the error.\n const urlWarningLabelEle = this.thumbnailModalRoot.querySelector(Selectors.EMBED.elements.urlWarning);\n urlWarningLabelEle.innerHTML = error.error !== undefined ? error.error : error;\n showElements(Selectors.EMBED.elements.urlWarning, this.thumbnailModalRoot);\n stopMediaLoading(this.thumbnailModalRoot, Selectors.EMBED.type);\n }\n };\n\n /**\n * Registers events for insert thumbnail modal.\n
*\n * @param {HTMLElement} root - The root element containing the loader icon.\n */\n registerInsertMediaThumbnailEvents = (root) => {\n const urlEle = root.querySelector(Selectors.EMBED.elements.fromUrl);\n if (urlEle) {\n urlEle.addEventListener('input', () => {\n (new EmbedHandler(this)).toggleUrlButton(urlEle, this.thumbnailModalRoot);\n });\n }\n\n // Handles add media url.\n const addUrlEle = root.querySelector(Selectors.EMBED.actions.addUrl);\n if (addUrlEle) {\n addUrlEle.addEventListener('click', () => {\n startMediaLoading(this.thumbnailModalRoot, Selectors.EMBED.type);\n this.urlChanged();\n });\n }\n\n // Handle repository browsing.\n const imageBrowser = root.querySelector(Selectors.IMAGE.actions.imageBrowser);\n if (imageBrowser) {\n imageBrowser.addEventListener('click', async(e) => {\n e.preventDefa
ult();\n const params = await displayFilepicker(this.editor, 'image');\n this.filePickerCallback(params);\n });\n }\n };\n}\n"],"names":["component","constructor","data","async","mediaData","langStringKeys","langStringvalues","map","key","langStrings","Object","fromEntries","index","currentModal","uploadThumbnailModal","setTitle","this","insertmediathumbnail","canShowDropZone","dropZoneEle","document","querySelector","Selectors","EMBED","elements","dropzoneContainer","dropZone","Dropzone","acceptedImageTypes","files","handleUploadedFile","setLabel","addmediathumbnaildrop","init","registerInsertMediaThumbnailEvents","thumbnailModalRoot","url","media","poster","templateContext","bodyTemplate","template","body","mediaThumbnailBody","footerTemplate","footer","mediaThumbnailFooter","selector","type","Promise","all","then","EmbedThumbnailPreview","catch","error","window","console","log","params","loadPreviewThumbnail","root","progress","loaderIconState","loaderIco
nContainer","innerHTML","uploading","Math","round","loadingembedthumbnail","fileURL","editor","name","updateLoaderIcon","filePickerCallback","urlWarning","undefined","urlEle","fromUrl","addEventListener","EmbedHandler","toggleUrlButton","addUrlEle","actions","addUrl","urlChanged","imageBrowser","IMAGE","e","preventDefault","value","currentUrl"],"mappings":"01BA2CgBA,kBAAW,CACvB,uBACA,YACA,wBACA,8DAKAC,YAAYC,mCASLC,MAAAA,iBACEC,UAAYA,gBACXC,eAAiB,CACnB,uBACA,YACA,wBACA,yBAEEC,uBAAyB,mBAAW,IAAID,gBAAgBE,KAAKC,OAAUA,IAAAA,IAAKR,UAAAA,+BAC7ES,YAAcC,OAAOC,YAAYN,eAAeE,KAAI,CAACC,IAAKI,QAAU,CAACJ,IAAKF,iBAAiBM,gBAC3FC,aAAaC,qBAAqBC,SAASC,KAAKP,YAAYQ,sBAG7DD,KAAKE,gBAAiB,OAChBC,YAAcC,SAASC,cAAcC,mBAAUC,MAAMC,SAASC,mBAC9DC,SAAW,IAAIC,kBACjBR,YACAH,KAAKY,oBACLC,aACSC,mBAAmBD,UAGhCH,SAASK,SAASf,KAAKP,YAAYuB,uBACnCN,SAASO,YAGRC,mCAAmClB,KAAKmB,oEAQzBC,WACfC,MAAMC,OAASF,QAEhBG,gBAAkB,CAClBC,aAAclB,mBAAUC,MAAMkB,SAASC,KAAKC,mBAC5CC,eAAgBtB,mBAAUC,MAAMkB,SAASI,OAAOC,qBAChDC,SAAUzB,mBAAUC,MAAMyB,MAG9BC,QAAQC,IAAI,EAAC,iBAAK
X,gBAAiBvB,KAAKmB,qBAAqB,mBAAOI,gBAAiBvB,KAAKmB,sBACrFgB,MAAK,KACqB,IAAIC,6CAAsBpC,MAClCiB,KAAKjB,KAAKZ,cAG5BiD,OAAMC,QACHC,OAAOC,QAAQC,IAAIH,wDASTI,SACdA,OAAOtB,UACFuB,qBAAqBD,OAAOtB,iDAWtB,SAACwB,KAAMnD,iBAAaoD,gEAAW,WACxCC,gBAAkBF,KAAKvC,cAAcC,mBAAUC,MAAMC,SAASuC,oBAAsB,QAC1FD,gBAAgBE,UAA0B,OAAbH,mBACHpD,YAAYwD,sBAAaC,KAAKC,MAAMN,eACvCpD,YAAY2D,oEAmBlBjE,MAAAA,2CAEKa,KAAKmB,mBAAoBb,mBAAUC,MAAMyB,YACrDqB,cAAgB,qBAAWrD,KAAKsD,OAAQ,QAASzC,MAAM,GAAIA,MAAM,GAAG0C,MAAOV,gBACxEW,iBAAiBxD,KAAKmB,mBAAoBnB,KAAKP,YAAaoD,kBAIhEW,iBAAiBxD,KAAKmB,mBAAoBnB,KAAKP,kBAC/CgE,mBAAmB,CAACrC,IAAKiC,UAChC,MAAOf,OAEsBtC,KAAKmB,mBAAmBd,cAAcC,mBAAUC,MAAMC,SAASkD,YACvEV,eAA4BW,IAAhBrB,MAAMA,MAAsBA,MAAMA,MAAQA,gCAC5DhC,mBAAUC,MAAMC,SAASkD,WAAY1D,KAAKmB,kDACtCnB,KAAKmB,mBAAoBb,mBAAUC,MAAMyB,qEAS5BY,aAC5BgB,OAAShB,KAAKvC,cAAcC,mBAAUC,MAAMC,SAASqD,SACvDD,QACAA,OAAOE,iBAAiB,SAAS,SACxBC,2BAAa/D,MAAOgE,gBAAgBJ,OAAQ5D,KAAKmB,6BAKxD8C,UAAYrB,KAAKvC,cAAcC,mBAAUC,MAAM2D,QAAQC,QACzDF,WACAA,UAAUH,iBAAiB,SAAS,oCACd9D,KAAKmB,mBAAoBb,mBAAUC,MAAMyB
,WACtDoC,sBAKPC,aAAezB,KAAKvC,cAAcC,mBAAUgE,MAAMJ,QAAQG,cAC5DA,cACAA,aAAaP,iBAAiB,SAAS3E,MAAAA,IACnCoF,EAAEC,uBACI9B,aAAe,4BAAkB1C,KAAKsD,OAAQ,cAC/CG,mBAAmBf,iDAtJV1C,KAAMd,MA0FhCkF,mBACUhD,IAAMpB,KAAKmB,mBAAmBd,cAAcC,mBAAUC,MAAMC,SAASqD,SAASY,MAChFrD,KAAOA,MAAQpB,KAAK0E,iBACf/B,qBAAqBvB"}