From ccb3c5a0b47ca6ec09d4c87b35cb44ee8e18635b Mon Sep 17 00:00:00 2001 From: Markos Gogoulos Date: Sun, 26 Apr 2026 17:34:50 +0300 Subject: [PATCH] wtv --- .../dist/mediacms-moodle-v1.0.0.zip | Bin 175546 -> 175416 bytes .../filter/mediacms/classes/text_filter.php | 2 +- .../filter/mediacms/launch.php | 10 ---------- .../mediacms/amd/build/autoconvert.min.js | 2 +- .../mediacms/amd/build/autoconvert.min.js.map | 2 +- .../mediacms/amd/build/iframeembed.min.js | 2 +- .../mediacms/amd/build/iframeembed.min.js.map | 2 +- .../tiny/mediacms/amd/build/options.min.js | 2 +- .../mediacms/amd/build/options.min.js.map | 2 +- .../tiny/mediacms/amd/build/selectors.min.js | 2 +- .../mediacms/amd/build/selectors.min.js.map | 2 +- .../tiny/mediacms/amd/src/autoconvert.js | 1 - .../tiny/mediacms/amd/src/iframeembed.js | 10 ---------- .../tiny/mediacms/amd/src/options.js | 1 - .../tiny/mediacms/amd/src/selectors.js | 1 - .../tiny/mediacms/classes/plugininfo.php | 1 - .../tiny/mediacms/lang/en/tiny_mediacms.php | 3 --- .../tiny/mediacms/settings.php | 8 -------- .../templates/iframe_embed_options.mustache | 10 +--------- 19 files changed, 10 insertions(+), 53 deletions(-) diff --git a/lms-plugins/mediacms-moodle/dist/mediacms-moodle-v1.0.0.zip b/lms-plugins/mediacms-moodle/dist/mediacms-moodle-v1.0.0.zip index ad26dbb5696301e03724e7d3e061867b893ee10c..c3a7b3872fd866c36444f849eb0718b1fa37c175 100644 GIT binary patch delta 48045 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 delta 48105 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 Aga7~l diff --git a/lms-plugins/mediacms-moodle/filter/mediacms/classes/text_filter.php b/lms-plugins/mediacms-moodle/filter/mediacms/classes/text_filter.php index 3c642dbe..7b11d9aa 100644 --- a/lms-plugins/mediacms-moodle/filter/mediacms/classes/text_filter.php +++ b/lms-plugins/mediacms-moodle/filter/mediacms/classes/text_filter.php @@ -111,7 +111,7 @@ class text_filter extends \core_filters\text_filter { parse_str($parsed_url['query'], $query_params); // Extract embed-related parameters - $supported_params = ['showTitle', 'showRelated', 'showUserAvatar', 'linkTitle', 't', 'width', 'height']; + $supported_params = ['showTitle', 'showUserAvatar', 'linkTitle', 't', 'width', 'height']; foreach ($supported_params as $param) { if (isset($query_params[$param])) { $embed_params[$param] = $query_params[$param]; diff --git a/lms-plugins/mediacms-moodle/filter/mediacms/launch.php b/lms-plugins/mediacms-moodle/filter/mediacms/launch.php index 6b0d9b26..6192c6b2 100644 --- a/lms-plugins/mediacms-moodle/filter/mediacms/launch.php +++ b/lms-plugins/mediacms-moodle/filter/mediacms/launch.php @@ -22,7 +22,6 @@ $width = optional_param('width', 0, PARAM_INT); // Extract embed parameters $showTitle = optional_param('showTitle', '', PARAM_TEXT); -$showRelated = optional_param('showRelated', '', PARAM_TEXT); $showUserAvatar = optional_param('showUserAvatar', '', PARAM_TEXT); $linkTitle = optional_param('linkTitle', '', PARAM_TEXT); $startTime = optional_param('t', '', PARAM_TEXT); @@ -61,9 +60,6 @@ $custom_params = ["media_friendly_token=" . $mediatoken]; if ($showTitle !== '') { $custom_params[] = "embed_show_title=" . $showTitle; } -if ($showRelated !== '') { - $custom_params[] = "embed_show_related=" . $showRelated; -} if ($showUserAvatar !== '') { $custom_params[] = "embed_show_user_avatar=" . $showUserAvatar; } @@ -89,9 +85,6 @@ $page_params = [ if ($showTitle !== '') { $page_params['showTitle'] = $showTitle; } -if ($showRelated !== '') { - $page_params['showRelated'] = $showRelated; -} if ($showUserAvatar !== '') { $page_params['showUserAvatar'] = $showUserAvatar; } @@ -127,9 +120,6 @@ $hidden_fields = ''; } -if ($showRelated !== '') { - $hidden_fields .= ''; -} if ($showUserAvatar !== '') { $hidden_fields .= ''; } diff --git a/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/autoconvert.min.js b/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/autoconvert.min.js index 3cb705d4..ba33ec01 100755 --- a/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/autoconvert.min.js +++ b/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/autoconvert.min.js @@ -10,6 +10,6 @@ define("tiny_mediacms/autoconvert",["exports","./options"],(function(_exports,_o * @copyright 2024 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -const MEDIACMS_VIEW_URL_PATTERN=/^(https?:\/\/[^\/]+)\/view\?m=([a-zA-Z0-9_-]+)$/,parseMediaCMSUrl=text=>{if(!text||"string"!=typeof text)return null;const trimmed=text.trim(),match=trimmed.match(MEDIACMS_VIEW_URL_PATTERN);return match?{baseUrl:match[1],videoId:match[2],originalUrl:trimmed}:null},isDomainAllowed=(parsed,config)=>{const configuredBaseUrl=config.autoConvertBaseUrl||config.mediacmsBaseUrl;if(!configuredBaseUrl)return!0;try{const configuredUrl=new URL(configuredBaseUrl),pastedUrl=new URL(parsed.baseUrl);return configuredUrl.host===pastedUrl.host}catch(e){return!0}},generateEmbedHtml=function(parsed){let options=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const embedUrl=new URL("".concat(parsed.baseUrl,"/embed"));embedUrl.searchParams.set("m",parsed.videoId),embedUrl.searchParams.set("showTitle",!1!==options.showTitle?"1":"0"),embedUrl.searchParams.set("showRelated",!1!==options.showRelated?"1":"0"),embedUrl.searchParams.set("showUserAvatar",!1!==options.showUserAvatar?"1":"0"),embedUrl.searchParams.set("linkTitle",!1!==options.linkTitle?"1":"0");const html='';return html};_exports.setupAutoConvert=editor=>{const config=(0,_options.getData)(editor)||{};!1!==config.autoConvertEnabled&&(editor.on("paste",(e=>{handlePasteEvent(editor,e,config)})),editor.on("input",(e=>{handleInputEvent(editor,e,config)})))};const handlePasteEvent=(editor,e,config)=>{const clipboardData=e.clipboardData||window.clipboardData;if(!clipboardData)return;const text=clipboardData.getData("text/plain")||clipboardData.getData("text");if(!text)return;const parsed=parseMediaCMSUrl(text);if(!parsed)return;if(!isDomainAllowed(parsed,config))return;e.preventDefault(),e.stopPropagation();const embedHtml=generateEmbedHtml(parsed,config.autoConvertOptions||{});setTimeout((()=>{editor.insertContent(embedHtml),editor.selection.collapse(!1)}),0)},handleInputEvent=(editor,e,config)=>{if("insertFromPaste"!==e.inputType&&"insertText"!==e.inputType)return;const node=editor.selection.getNode();if(!node||"P"!==node.nodeName)return;const text=node.textContent||"",parsed=parseMediaCMSUrl(text);if(!parsed||!isDomainAllowed(parsed,config))return;const trimmedHtml=node.innerHTML.trim();if(trimmedHtml!==text.trim()&&!trimmedHtml.startsWith(text.trim()))return;const embedHtml=generateEmbedHtml(parsed,config.autoConvertOptions||{});setTimeout((()=>{const currentText=node.textContent||"",currentParsed=parseMediaCMSUrl(currentText);currentParsed&¤tParsed.originalUrl===parsed.originalUrl&&(editor.selection.select(node),editor.insertContent(embedHtml))}),100)};_exports.isMediaCMSUrl=text=>null!==parseMediaCMSUrl(text);_exports.convertToEmbed=function(url){let options=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const parsed=parseMediaCMSUrl(url);return parsed?generateEmbedHtml(parsed,options):null}})); +const MEDIACMS_VIEW_URL_PATTERN=/^(https?:\/\/[^\/]+)\/view\?m=([a-zA-Z0-9_-]+)$/,parseMediaCMSUrl=text=>{if(!text||"string"!=typeof text)return null;const trimmed=text.trim(),match=trimmed.match(MEDIACMS_VIEW_URL_PATTERN);return match?{baseUrl:match[1],videoId:match[2],originalUrl:trimmed}:null},isDomainAllowed=(parsed,config)=>{const configuredBaseUrl=config.autoConvertBaseUrl||config.mediacmsBaseUrl;if(!configuredBaseUrl)return!0;try{const configuredUrl=new URL(configuredBaseUrl),pastedUrl=new URL(parsed.baseUrl);return configuredUrl.host===pastedUrl.host}catch(e){return!0}},generateEmbedHtml=function(parsed){let options=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const embedUrl=new URL("".concat(parsed.baseUrl,"/embed"));embedUrl.searchParams.set("m",parsed.videoId),embedUrl.searchParams.set("showTitle",!1!==options.showTitle?"1":"0"),embedUrl.searchParams.set("showUserAvatar",!1!==options.showUserAvatar?"1":"0"),embedUrl.searchParams.set("linkTitle",!1!==options.linkTitle?"1":"0");const html='';return html};_exports.setupAutoConvert=editor=>{const config=(0,_options.getData)(editor)||{};!1!==config.autoConvertEnabled&&(editor.on("paste",(e=>{handlePasteEvent(editor,e,config)})),editor.on("input",(e=>{handleInputEvent(editor,e,config)})))};const handlePasteEvent=(editor,e,config)=>{const clipboardData=e.clipboardData||window.clipboardData;if(!clipboardData)return;const text=clipboardData.getData("text/plain")||clipboardData.getData("text");if(!text)return;const parsed=parseMediaCMSUrl(text);if(!parsed)return;if(!isDomainAllowed(parsed,config))return;e.preventDefault(),e.stopPropagation();const embedHtml=generateEmbedHtml(parsed,config.autoConvertOptions||{});setTimeout((()=>{editor.insertContent(embedHtml),editor.selection.collapse(!1)}),0)},handleInputEvent=(editor,e,config)=>{if("insertFromPaste"!==e.inputType&&"insertText"!==e.inputType)return;const node=editor.selection.getNode();if(!node||"P"!==node.nodeName)return;const text=node.textContent||"",parsed=parseMediaCMSUrl(text);if(!parsed||!isDomainAllowed(parsed,config))return;const trimmedHtml=node.innerHTML.trim();if(trimmedHtml!==text.trim()&&!trimmedHtml.startsWith(text.trim()))return;const embedHtml=generateEmbedHtml(parsed,config.autoConvertOptions||{});setTimeout((()=>{const currentText=node.textContent||"",currentParsed=parseMediaCMSUrl(currentText);currentParsed&¤tParsed.originalUrl===parsed.originalUrl&&(editor.selection.select(node),editor.insertContent(embedHtml))}),100)};_exports.isMediaCMSUrl=text=>null!==parseMediaCMSUrl(text);_exports.convertToEmbed=function(url){let options=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const parsed=parseMediaCMSUrl(url);return parsed?generateEmbedHtml(parsed,options):null}})); //# sourceMappingURL=autoconvert.min.js.map \ No newline at end of file diff --git a/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/autoconvert.min.js.map b/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/autoconvert.min.js.map index b4e265a2..9a02c863 100755 --- a/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/autoconvert.min.js.map +++ b/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/autoconvert.min.js.map @@ -1 +1 @@ -{"version":3,"file":"autoconvert.min.js","sources":["../src/autoconvert.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 .\n\n/**\n * Tiny MediaCMS Auto-convert module.\n *\n * This module automatically converts pasted MediaCMS URLs into embedded videos.\n * When a user pastes a MediaCMS video URL (e.g., https://deic.mediacms.io/view?m=JpBd1Zvdl),\n * it will be automatically converted to an iframe embed.\n *\n * @module tiny_mediacms/autoconvert\n * @copyright 2024\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport {getData} from './options';\n\n/**\n * Regular expression patterns for MediaCMS URLs.\n * Matches URLs like:\n * - https://deic.mediacms.io/view?m=JpBd1Zvdl\n * - https://example.mediacms.io/view?m=VIDEO_ID\n * - Custom domains configured in the plugin\n */\nconst MEDIACMS_VIEW_URL_PATTERN = /^(https?:\\/\\/[^\\/]+)\\/view\\?m=([a-zA-Z0-9_-]+)$/;\n\n/**\n * Check if a string is a valid MediaCMS view URL.\n *\n * @param {string} text - The text to check\n * @returns {Object|null} - Parsed URL info or null if not a valid MediaCMS URL\n */\nconst parseMediaCMSUrl = (text) => {\n if (!text || typeof text !== 'string') {\n return null;\n }\n\n const trimmed = text.trim();\n\n // Check for MediaCMS view URL pattern\n const match = trimmed.match(MEDIACMS_VIEW_URL_PATTERN);\n if (match) {\n return {\n baseUrl: match[1],\n videoId: match[2],\n originalUrl: trimmed,\n };\n }\n\n return null;\n};\n\n/**\n * Check if the pasted URL's domain is allowed based on configuration.\n *\n * @param {Object} parsed - Parsed URL info\n * @param {Object} config - Plugin configuration\n * @returns {boolean} - True if the domain is allowed\n */\nconst isDomainAllowed = (parsed, config) => {\n // If no specific base URL is configured, allow all MediaCMS domains\n const configuredBaseUrl = config.autoConvertBaseUrl || config.mediacmsBaseUrl;\n if (!configuredBaseUrl) {\n return true;\n }\n\n // Check if the URL's base matches the configured base URL\n try {\n const configuredUrl = new URL(configuredBaseUrl);\n const pastedUrl = new URL(parsed.baseUrl);\n return configuredUrl.host === pastedUrl.host;\n } catch (e) {\n // If URL parsing fails, allow the conversion\n return true;\n }\n};\n\n/**\n * Generate the iframe embed HTML for a MediaCMS video.\n *\n * @param {Object} parsed - Parsed URL info\n * @param {Object} options - Embed options\n * @returns {string} - The iframe HTML\n */\nconst generateEmbedHtml = (parsed, options = {}) => {\n // Build the embed URL with default options\n const embedUrl = new URL(`${parsed.baseUrl}/embed`);\n embedUrl.searchParams.set('m', parsed.videoId);\n\n // Apply default options (all enabled by default for best user experience)\n embedUrl.searchParams.set('showTitle', options.showTitle !== false ? '1' : '0');\n embedUrl.searchParams.set('showRelated', options.showRelated !== false ? '1' : '0');\n embedUrl.searchParams.set('showUserAvatar', options.showUserAvatar !== false ? '1' : '0');\n embedUrl.searchParams.set('linkTitle', options.linkTitle !== false ? '1' : '0');\n\n // Generate responsive iframe HTML matching the template output format.\n // Uses aspect-ratio CSS for responsive sizing (16:9 default).\n // The wrapper will be added by editor for UI (edit button), then stripped on save.\n const html = ``;\n\n return html;\n};\n\n/**\n * Set up auto-conversion for the editor.\n * This registers event handlers to detect pasted MediaCMS URLs.\n *\n * @param {TinyMCE} editor - The TinyMCE editor instance\n */\nexport const setupAutoConvert = (editor) => {\n const config = getData(editor) || {};\n\n // Check if auto-convert is enabled (default: true)\n if (config.autoConvertEnabled === false) {\n return;\n }\n\n // Handle paste events\n editor.on('paste', (e) => {\n handlePasteEvent(editor, e, config);\n });\n\n // Also handle input events for drag-and-drop text or keyboard paste\n editor.on('input', (e) => {\n handleInputEvent(editor, e, config);\n });\n};\n\n/**\n * Handle paste events to detect and convert MediaCMS URLs.\n *\n * @param {TinyMCE} editor - The TinyMCE editor instance\n * @param {Event} e - The paste event\n * @param {Object} config - Plugin configuration\n */\nconst handlePasteEvent = (editor, e, config) => {\n // Get pasted text from clipboard\n const clipboardData = e.clipboardData || window.clipboardData;\n if (!clipboardData) {\n return;\n }\n\n // Try to get plain text first\n const text = clipboardData.getData('text/plain') || clipboardData.getData('text');\n if (!text) {\n return;\n }\n\n // Check if it's a MediaCMS URL\n const parsed = parseMediaCMSUrl(text);\n if (!parsed) {\n return;\n }\n\n // Check if domain is allowed\n if (!isDomainAllowed(parsed, config)) {\n return;\n }\n\n // Prevent default paste behavior\n e.preventDefault();\n e.stopPropagation();\n\n // Generate and insert the embed HTML\n const embedHtml = generateEmbedHtml(parsed, config.autoConvertOptions || {});\n\n // Use a slight delay to ensure the editor is ready\n setTimeout(() => {\n editor.insertContent(embedHtml);\n // Move cursor after the inserted content\n editor.selection.collapse(false);\n }, 0);\n};\n\n/**\n * Handle input events to catch URLs that might have been pasted without triggering paste event.\n * This is a fallback for certain browsers/scenarios.\n *\n * @param {TinyMCE} editor - The TinyMCE editor instance\n * @param {Event} e - The input event\n * @param {Object} config - Plugin configuration\n */\nconst handleInputEvent = (editor, e, config) => {\n // Only process inputType 'insertFromPaste' if paste event didn't catch it\n if (e.inputType !== 'insertFromPaste' && e.inputType !== 'insertText') {\n return;\n }\n\n // Get the current node and check if it contains just a URL\n const node = editor.selection.getNode();\n if (!node || node.nodeName !== 'P') {\n return;\n }\n\n // Check if the paragraph contains only a MediaCMS URL\n const text = node.textContent || '';\n const parsed = parseMediaCMSUrl(text);\n\n if (!parsed || !isDomainAllowed(parsed, config)) {\n return;\n }\n\n // Don't convert if there's other content in the paragraph\n const trimmedHtml = node.innerHTML.trim();\n if (trimmedHtml !== text.trim() && !trimmedHtml.startsWith(text.trim())) {\n return;\n }\n\n // Generate the embed HTML\n const embedHtml = generateEmbedHtml(parsed, config.autoConvertOptions || {});\n\n // Replace the paragraph content with the embed\n // Use a slight delay to let the input event complete\n setTimeout(() => {\n // Re-check that the node still contains the URL (user might have typed more)\n const currentText = node.textContent || '';\n const currentParsed = parseMediaCMSUrl(currentText);\n\n if (currentParsed && currentParsed.originalUrl === parsed.originalUrl) {\n // Select and replace the entire node\n editor.selection.select(node);\n editor.insertContent(embedHtml);\n }\n }, 100);\n};\n\n/**\n * Check if a text is a MediaCMS URL (public helper).\n *\n * @param {string} text - The text to check\n * @returns {boolean} - True if it's a MediaCMS URL\n */\nexport const isMediaCMSUrl = (text) => {\n return parseMediaCMSUrl(text) !== null;\n};\n\n/**\n * Convert a MediaCMS URL to embed HTML (public helper).\n *\n * @param {string} url - The MediaCMS URL\n * @param {Object} options - Embed options\n * @returns {string|null} - The embed HTML or null if not a valid URL\n */\nexport const convertToEmbed = (url, options = {}) => {\n const parsed = parseMediaCMSUrl(url);\n if (!parsed) {\n return null;\n }\n return generateEmbedHtml(parsed, options);\n};\n"],"names":["MEDIACMS_VIEW_URL_PATTERN","parseMediaCMSUrl","text","trimmed","trim","match","baseUrl","videoId","originalUrl","isDomainAllowed","parsed","config","configuredBaseUrl","autoConvertBaseUrl","mediacmsBaseUrl","configuredUrl","URL","pastedUrl","host","e","generateEmbedHtml","options","embedUrl","searchParams","set","showTitle","showRelated","showUserAvatar","linkTitle","html","toString","editor","autoConvertEnabled","on","handlePasteEvent","handleInputEvent","clipboardData","window","getData","preventDefault","stopPropagation","embedHtml","autoConvertOptions","setTimeout","insertContent","selection","collapse","inputType","node","getNode","nodeName","textContent","trimmedHtml","innerHTML","startsWith","currentText","currentParsed","select","url"],"mappings":";;;;;;;;;;;;MAoCMA,0BAA4B,kDAQ5BC,iBAAoBC,WACjBA,MAAwB,iBAATA,YACT,WAGLC,QAAUD,KAAKE,OAGfC,MAAQF,QAAQE,MAAML,kCACxBK,MACO,CACHC,QAASD,MAAM,GACfE,QAASF,MAAM,GACfG,YAAaL,SAId,MAULM,gBAAkB,CAACC,OAAQC,gBAEvBC,kBAAoBD,OAAOE,oBAAsBF,OAAOG,oBACzDF,yBACM,YAKDG,cAAgB,IAAIC,IAAIJ,mBACxBK,UAAY,IAAID,IAAIN,OAAOJ,gBAC1BS,cAAcG,OAASD,UAAUC,KAC1C,MAAOC,UAEE,IAWTC,kBAAoB,SAACV,YAAQW,+DAAU,SAEnCC,SAAW,IAAIN,cAAON,OAAOJ,mBACnCgB,SAASC,aAAaC,IAAI,IAAKd,OAAOH,SAGtCe,SAASC,aAAaC,IAAI,aAAmC,IAAtBH,QAAQI,UAAsB,IAAM,KAC3EH,SAASC,aAAaC,IAAI,eAAuC,IAAxBH,QAAQK,YAAwB,IAAM,KAC/EJ,SAASC,aAAaC,IAAI,kBAA6C,IAA3BH,QAAQM,eAA2B,IAAM,KACrFL,SAASC,aAAaC,IAAI,aAAmC,IAAtBH,QAAQO,UAAsB,IAAM,WAKrEC,KAAO,uBAAgBP,SAASQ,iBAAzB,2HAIND,gCASsBE,eACvBpB,QAAS,oBAAQoB,SAAW,IAGA,IAA9BpB,OAAOqB,qBAKXD,OAAOE,GAAG,SAAUd,IAChBe,iBAAiBH,OAAQZ,EAAGR,WAIhCoB,OAAOE,GAAG,SAAUd,IAChBgB,iBAAiBJ,OAAQZ,EAAGR,mBAW9BuB,iBAAmB,CAACH,OAAQZ,EAAGR,gBAE3ByB,cAAgBjB,EAAEiB,eAAiBC,OAAOD,kBAC3CA,2BAKClC,KAAOkC,cAAcE,QAAQ,eAAiBF,cAAcE,QAAQ,YACrEpC,kBAKCQ,OAAST,iBAAiBC,UAC3BQ,kBAKAD,gBAAgBC,OAAQC,eAK7BQ,EAAEoB,iBACFpB,EAAEqB,wBAGIC,UAAYrB,kBAAkBV,OAAQC,OAAO+B,oBAAsB,IAGzEC,YAAW,KACPZ,OAAOa,cAAcH,WAErBV,OAAOc,UAAUC,UAAS,KAC3B,IAWDX,iBAAmB,CAACJ,OAAQZ,EAAGR,aAEb,oBAAhBQ,EAAE4B,WAAmD,eAAhB5B,EAAE4B,uBAKrCC,KAAOjB,OAAOc,UAAUI,cACzBD,MAA0B,MAAlBA,KAAKE,sBAKZhD,KAAO8C,KAAKG,aAAe,GAC3BzC,OAAST,iBAAiBC,UAE3BQ,SAAWD,gBAAgBC,OAAQC,qBAKlCyC,YAAcJ,KAAKK,UAAUjD,UAC/BgD,cAAgBlD,KAAKE,SAAWgD,YAAYE,WAAWpD,KAAKE,qBAK1DqC,UAAYrB,kBAAkBV,OAAQC,OAAO+B,oBAAsB,IAIzEC,YAAW,WAEDY,YAAcP,KAAKG,aAAe,GAClCK,cAAgBvD,iBAAiBsD,aAEnCC,eAAiBA,cAAchD,cAAgBE,OAAOF,cAEtDuB,OAAOc,UAAUY,OAAOT,MACxBjB,OAAOa,cAAcH,cAE1B,6BASuBvC,MACQ,OAA3BD,iBAAiBC,8BAUE,SAACwD,SAAKrC,+DAAU,SACpCX,OAAST,iBAAiByD,YAC3BhD,OAGEU,kBAAkBV,OAAQW,SAFtB"} \ No newline at end of file +{"version":3,"file":"autoconvert.min.js","sources":["../src/autoconvert.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 .\n\n/**\n * Tiny MediaCMS Auto-convert module.\n *\n * This module automatically converts pasted MediaCMS URLs into embedded videos.\n * When a user pastes a MediaCMS video URL (e.g., https://deic.mediacms.io/view?m=JpBd1Zvdl),\n * it will be automatically converted to an iframe embed.\n *\n * @module tiny_mediacms/autoconvert\n * @copyright 2024\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport {getData} from './options';\n\n/**\n * Regular expression patterns for MediaCMS URLs.\n * Matches URLs like:\n * - https://deic.mediacms.io/view?m=JpBd1Zvdl\n * - https://example.mediacms.io/view?m=VIDEO_ID\n * - Custom domains configured in the plugin\n */\nconst MEDIACMS_VIEW_URL_PATTERN = /^(https?:\\/\\/[^\\/]+)\\/view\\?m=([a-zA-Z0-9_-]+)$/;\n\n/**\n * Check if a string is a valid MediaCMS view URL.\n *\n * @param {string} text - The text to check\n * @returns {Object|null} - Parsed URL info or null if not a valid MediaCMS URL\n */\nconst parseMediaCMSUrl = (text) => {\n if (!text || typeof text !== 'string') {\n return null;\n }\n\n const trimmed = text.trim();\n\n // Check for MediaCMS view URL pattern\n const match = trimmed.match(MEDIACMS_VIEW_URL_PATTERN);\n if (match) {\n return {\n baseUrl: match[1],\n videoId: match[2],\n originalUrl: trimmed,\n };\n }\n\n return null;\n};\n\n/**\n * Check if the pasted URL's domain is allowed based on configuration.\n *\n * @param {Object} parsed - Parsed URL info\n * @param {Object} config - Plugin configuration\n * @returns {boolean} - True if the domain is allowed\n */\nconst isDomainAllowed = (parsed, config) => {\n // If no specific base URL is configured, allow all MediaCMS domains\n const configuredBaseUrl = config.autoConvertBaseUrl || config.mediacmsBaseUrl;\n if (!configuredBaseUrl) {\n return true;\n }\n\n // Check if the URL's base matches the configured base URL\n try {\n const configuredUrl = new URL(configuredBaseUrl);\n const pastedUrl = new URL(parsed.baseUrl);\n return configuredUrl.host === pastedUrl.host;\n } catch (e) {\n // If URL parsing fails, allow the conversion\n return true;\n }\n};\n\n/**\n * Generate the iframe embed HTML for a MediaCMS video.\n *\n * @param {Object} parsed - Parsed URL info\n * @param {Object} options - Embed options\n * @returns {string} - The iframe HTML\n */\nconst generateEmbedHtml = (parsed, options = {}) => {\n // Build the embed URL with default options\n const embedUrl = new URL(`${parsed.baseUrl}/embed`);\n embedUrl.searchParams.set('m', parsed.videoId);\n\n // Apply default options (all enabled by default for best user experience)\n embedUrl.searchParams.set('showTitle', options.showTitle !== false ? '1' : '0');\n embedUrl.searchParams.set('showUserAvatar', options.showUserAvatar !== false ? '1' : '0');\n embedUrl.searchParams.set('linkTitle', options.linkTitle !== false ? '1' : '0');\n\n // Generate responsive iframe HTML matching the template output format.\n // Uses aspect-ratio CSS for responsive sizing (16:9 default).\n // The wrapper will be added by editor for UI (edit button), then stripped on save.\n const html = ``;\n\n return html;\n};\n\n/**\n * Set up auto-conversion for the editor.\n * This registers event handlers to detect pasted MediaCMS URLs.\n *\n * @param {TinyMCE} editor - The TinyMCE editor instance\n */\nexport const setupAutoConvert = (editor) => {\n const config = getData(editor) || {};\n\n // Check if auto-convert is enabled (default: true)\n if (config.autoConvertEnabled === false) {\n return;\n }\n\n // Handle paste events\n editor.on('paste', (e) => {\n handlePasteEvent(editor, e, config);\n });\n\n // Also handle input events for drag-and-drop text or keyboard paste\n editor.on('input', (e) => {\n handleInputEvent(editor, e, config);\n });\n};\n\n/**\n * Handle paste events to detect and convert MediaCMS URLs.\n *\n * @param {TinyMCE} editor - The TinyMCE editor instance\n * @param {Event} e - The paste event\n * @param {Object} config - Plugin configuration\n */\nconst handlePasteEvent = (editor, e, config) => {\n // Get pasted text from clipboard\n const clipboardData = e.clipboardData || window.clipboardData;\n if (!clipboardData) {\n return;\n }\n\n // Try to get plain text first\n const text = clipboardData.getData('text/plain') || clipboardData.getData('text');\n if (!text) {\n return;\n }\n\n // Check if it's a MediaCMS URL\n const parsed = parseMediaCMSUrl(text);\n if (!parsed) {\n return;\n }\n\n // Check if domain is allowed\n if (!isDomainAllowed(parsed, config)) {\n return;\n }\n\n // Prevent default paste behavior\n e.preventDefault();\n e.stopPropagation();\n\n // Generate and insert the embed HTML\n const embedHtml = generateEmbedHtml(parsed, config.autoConvertOptions || {});\n\n // Use a slight delay to ensure the editor is ready\n setTimeout(() => {\n editor.insertContent(embedHtml);\n // Move cursor after the inserted content\n editor.selection.collapse(false);\n }, 0);\n};\n\n/**\n * Handle input events to catch URLs that might have been pasted without triggering paste event.\n * This is a fallback for certain browsers/scenarios.\n *\n * @param {TinyMCE} editor - The TinyMCE editor instance\n * @param {Event} e - The input event\n * @param {Object} config - Plugin configuration\n */\nconst handleInputEvent = (editor, e, config) => {\n // Only process inputType 'insertFromPaste' if paste event didn't catch it\n if (e.inputType !== 'insertFromPaste' && e.inputType !== 'insertText') {\n return;\n }\n\n // Get the current node and check if it contains just a URL\n const node = editor.selection.getNode();\n if (!node || node.nodeName !== 'P') {\n return;\n }\n\n // Check if the paragraph contains only a MediaCMS URL\n const text = node.textContent || '';\n const parsed = parseMediaCMSUrl(text);\n\n if (!parsed || !isDomainAllowed(parsed, config)) {\n return;\n }\n\n // Don't convert if there's other content in the paragraph\n const trimmedHtml = node.innerHTML.trim();\n if (trimmedHtml !== text.trim() && !trimmedHtml.startsWith(text.trim())) {\n return;\n }\n\n // Generate the embed HTML\n const embedHtml = generateEmbedHtml(parsed, config.autoConvertOptions || {});\n\n // Replace the paragraph content with the embed\n // Use a slight delay to let the input event complete\n setTimeout(() => {\n // Re-check that the node still contains the URL (user might have typed more)\n const currentText = node.textContent || '';\n const currentParsed = parseMediaCMSUrl(currentText);\n\n if (currentParsed && currentParsed.originalUrl === parsed.originalUrl) {\n // Select and replace the entire node\n editor.selection.select(node);\n editor.insertContent(embedHtml);\n }\n }, 100);\n};\n\n/**\n * Check if a text is a MediaCMS URL (public helper).\n *\n * @param {string} text - The text to check\n * @returns {boolean} - True if it's a MediaCMS URL\n */\nexport const isMediaCMSUrl = (text) => {\n return parseMediaCMSUrl(text) !== null;\n};\n\n/**\n * Convert a MediaCMS URL to embed HTML (public helper).\n *\n * @param {string} url - The MediaCMS URL\n * @param {Object} options - Embed options\n * @returns {string|null} - The embed HTML or null if not a valid URL\n */\nexport const convertToEmbed = (url, options = {}) => {\n const parsed = parseMediaCMSUrl(url);\n if (!parsed) {\n return null;\n }\n return generateEmbedHtml(parsed, options);\n};\n"],"names":["MEDIACMS_VIEW_URL_PATTERN","parseMediaCMSUrl","text","trimmed","trim","match","baseUrl","videoId","originalUrl","isDomainAllowed","parsed","config","configuredBaseUrl","autoConvertBaseUrl","mediacmsBaseUrl","configuredUrl","URL","pastedUrl","host","e","generateEmbedHtml","options","embedUrl","searchParams","set","showTitle","showUserAvatar","linkTitle","html","toString","editor","autoConvertEnabled","on","handlePasteEvent","handleInputEvent","clipboardData","window","getData","preventDefault","stopPropagation","embedHtml","autoConvertOptions","setTimeout","insertContent","selection","collapse","inputType","node","getNode","nodeName","textContent","trimmedHtml","innerHTML","startsWith","currentText","currentParsed","select","url"],"mappings":";;;;;;;;;;;;MAoCMA,0BAA4B,kDAQ5BC,iBAAoBC,WACjBA,MAAwB,iBAATA,YACT,WAGLC,QAAUD,KAAKE,OAGfC,MAAQF,QAAQE,MAAML,kCACxBK,MACO,CACHC,QAASD,MAAM,GACfE,QAASF,MAAM,GACfG,YAAaL,SAId,MAULM,gBAAkB,CAACC,OAAQC,gBAEvBC,kBAAoBD,OAAOE,oBAAsBF,OAAOG,oBACzDF,yBACM,YAKDG,cAAgB,IAAIC,IAAIJ,mBACxBK,UAAY,IAAID,IAAIN,OAAOJ,gBAC1BS,cAAcG,OAASD,UAAUC,KAC1C,MAAOC,UAEE,IAWTC,kBAAoB,SAACV,YAAQW,+DAAU,SAEnCC,SAAW,IAAIN,cAAON,OAAOJ,mBACnCgB,SAASC,aAAaC,IAAI,IAAKd,OAAOH,SAGtCe,SAASC,aAAaC,IAAI,aAAmC,IAAtBH,QAAQI,UAAsB,IAAM,KAC3EH,SAASC,aAAaC,IAAI,kBAA6C,IAA3BH,QAAQK,eAA2B,IAAM,KACrFJ,SAASC,aAAaC,IAAI,aAAmC,IAAtBH,QAAQM,UAAsB,IAAM,WAKrEC,KAAO,uBAAgBN,SAASO,iBAAzB,2HAIND,gCASsBE,eACvBnB,QAAS,oBAAQmB,SAAW,IAGA,IAA9BnB,OAAOoB,qBAKXD,OAAOE,GAAG,SAAUb,IAChBc,iBAAiBH,OAAQX,EAAGR,WAIhCmB,OAAOE,GAAG,SAAUb,IAChBe,iBAAiBJ,OAAQX,EAAGR,mBAW9BsB,iBAAmB,CAACH,OAAQX,EAAGR,gBAE3BwB,cAAgBhB,EAAEgB,eAAiBC,OAAOD,kBAC3CA,2BAKCjC,KAAOiC,cAAcE,QAAQ,eAAiBF,cAAcE,QAAQ,YACrEnC,kBAKCQ,OAAST,iBAAiBC,UAC3BQ,kBAKAD,gBAAgBC,OAAQC,eAK7BQ,EAAEmB,iBACFnB,EAAEoB,wBAGIC,UAAYpB,kBAAkBV,OAAQC,OAAO8B,oBAAsB,IAGzEC,YAAW,KACPZ,OAAOa,cAAcH,WAErBV,OAAOc,UAAUC,UAAS,KAC3B,IAWDX,iBAAmB,CAACJ,OAAQX,EAAGR,aAEb,oBAAhBQ,EAAE2B,WAAmD,eAAhB3B,EAAE2B,uBAKrCC,KAAOjB,OAAOc,UAAUI,cACzBD,MAA0B,MAAlBA,KAAKE,sBAKZ/C,KAAO6C,KAAKG,aAAe,GAC3BxC,OAAST,iBAAiBC,UAE3BQ,SAAWD,gBAAgBC,OAAQC,qBAKlCwC,YAAcJ,KAAKK,UAAUhD,UAC/B+C,cAAgBjD,KAAKE,SAAW+C,YAAYE,WAAWnD,KAAKE,qBAK1DoC,UAAYpB,kBAAkBV,OAAQC,OAAO8B,oBAAsB,IAIzEC,YAAW,WAEDY,YAAcP,KAAKG,aAAe,GAClCK,cAAgBtD,iBAAiBqD,aAEnCC,eAAiBA,cAAc/C,cAAgBE,OAAOF,cAEtDsB,OAAOc,UAAUY,OAAOT,MACxBjB,OAAOa,cAAcH,cAE1B,6BASuBtC,MACQ,OAA3BD,iBAAiBC,8BAUE,SAACuD,SAAKpC,+DAAU,SACpCX,OAAST,iBAAiBwD,YAC3B/C,OAGEU,kBAAkBV,OAAQW,SAFtB"} \ No newline at end of file diff --git a/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/iframeembed.min.js b/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/iframeembed.min.js index 81a092fb..97d61d05 100755 --- a/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/iframeembed.min.js +++ b/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/iframeembed.min.js @@ -1,3 +1,3 @@ -define("tiny_mediacms/iframeembed",["exports","core/templates","core/str","core/modal_events","./common","./iframemodal","./selectors","./options"],(function(_exports,_templates,_str,ModalEvents,_common,_iframemodal,_selectors,_options){function _getRequireWildcardCache(nodeInterop){if("function"!=typeof WeakMap)return null;var cacheBabelInterop=new WeakMap,cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function _defineProperty(obj,key,value){return key in obj?Object.defineProperty(obj,key,{value:value,enumerable:!0,configurable:!0,writable:!0}):obj[key]=value,obj}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_templates=_interopRequireDefault(_templates),ModalEvents=function(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule)return obj;if(null===obj||"object"!=typeof obj&&"function"!=typeof obj)return{default:obj};var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj))return cache.get(obj);var newObj={},hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj)if("default"!==key&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;desc&&(desc.get||desc.set)?Object.defineProperty(newObj,key,desc):newObj[key]=obj[key]}newObj.default=obj,cache&&cache.set(obj,newObj);return newObj}(ModalEvents),_iframemodal=_interopRequireDefault(_iframemodal),_selectors=_interopRequireDefault(_selectors);return _exports.default=class{constructor(editor){_defineProperty(this,"editor",null),_defineProperty(this,"currentModal",null),_defineProperty(this,"isUpdating",!1),_defineProperty(this,"selectedIframe",null),_defineProperty(this,"debounceTimer",null),_defineProperty(this,"iframeLibraryUrl","https://temp.web357.com/mediacms/deic-mediacms-embed-videos.html"),this.editor=editor}parseInput(input){if(!input||!input.trim())return null;const iframeMatch=(input=input.trim()).match(/]*src=["']([^"']+)["'][^>]*>/i);return iframeMatch?this.parseEmbedUrl(iframeMatch[1]):input.startsWith("http://")||input.startsWith("https://")?this.parseVideoUrl(input):null}parseVideoUrl(url){try{const urlObj=new URL(url),baseUrl="".concat(urlObj.protocol,"//").concat(urlObj.host);if("/view"===urlObj.pathname&&urlObj.searchParams.has("m"))return{baseUrl:baseUrl,videoId:urlObj.searchParams.get("m"),isEmbed:!1};if("/embed"===urlObj.pathname&&urlObj.searchParams.has("m")){const tParam=urlObj.searchParams.get("t"),widthParam=urlObj.searchParams.get("width"),heightParam=urlObj.searchParams.get("height");return{baseUrl:baseUrl,videoId:urlObj.searchParams.get("m"),isEmbed:!0,showTitle:"1"===urlObj.searchParams.get("showTitle"),linkTitle:"1"===urlObj.searchParams.get("linkTitle"),showRelated:"1"===urlObj.searchParams.get("showRelated"),showUserAvatar:"1"===urlObj.searchParams.get("showUserAvatar"),width:widthParam?parseInt(widthParam):null,height:heightParam?parseInt(heightParam):null,startAt:tParam?this.secondsToTimeString(parseInt(tParam)):null}}if(urlObj.pathname.includes("/filter/mediacms/launch.php")&&urlObj.searchParams.has("token")){const tParam=urlObj.searchParams.get("t"),widthParam=urlObj.searchParams.get("width"),heightParam=urlObj.searchParams.get("height");return{baseUrl:baseUrl,videoId:urlObj.searchParams.get("token"),rawUrl:url,isLtiLaunch:!0,showTitle:"1"===urlObj.searchParams.get("showTitle"),linkTitle:"1"===urlObj.searchParams.get("linkTitle"),showRelated:"1"===urlObj.searchParams.get("showRelated"),showUserAvatar:"1"===urlObj.searchParams.get("showUserAvatar"),width:widthParam?parseInt(widthParam):null,height:heightParam?parseInt(heightParam):null,startAt:tParam?this.secondsToTimeString(parseInt(tParam)):null}}return{baseUrl:baseUrl,rawUrl:url,isGeneric:!0}}catch(e){return null}}parseEmbedUrl(url){return this.parseVideoUrl(url)}secondsToTimeString(seconds){const mins=Math.floor(seconds/60),secs=seconds%60;return"".concat(mins,":").concat(secs.toString().padStart(2,"0"))}timeStringToSeconds(timeStr){if(!timeStr||!timeStr.trim())return null;if((timeStr=timeStr.trim()).includes(":")){const parts=timeStr.split(":");return 60*(parseInt(parts[0])||0)+(parseInt(parts[1])||0)}const secs=parseInt(timeStr);return isNaN(secs)?null:secs}parseWidthHeight(value){if(!value)return null;const parsed=parseInt(value.trim());return isNaN(parsed)?null:parsed}computeAspectRatioCSS(values){const w=values.width||560,h=values.height||315;return"".concat(w," / ").concat(h)}buildEmbedUrl(parsed,options){if(parsed.isGeneric)return parsed.rawUrl;let url;if(parsed.isLtiLaunch){url=new URL(parsed.rawUrl);const token=url.searchParams.get("token"),courseid=url.searchParams.get("courseid");url.search="",url.searchParams.set("token",token),courseid&&url.searchParams.set("courseid",courseid)}else url=new URL("".concat(parsed.baseUrl,"/embed")),url.searchParams.set("m",parsed.videoId);if(url.searchParams.set("showTitle",options.showTitle?"1":"0"),url.searchParams.set("showRelated",options.showRelated?"1":"0"),url.searchParams.set("showUserAvatar",options.showUserAvatar?"1":"0"),url.searchParams.set("linkTitle",options.linkTitle?"1":"0"),options.startAtEnabled&&options.startAt){const seconds=this.timeStringToSeconds(options.startAt);null!==seconds&&seconds>0&&url.searchParams.set("t",seconds.toString())}return options.width&&url.searchParams.set("width",options.width),options.height&&url.searchParams.set("height",options.height),url.toString()}async getTemplateContext(){var _this=this;let data=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const editorData=(0,_options.getData)(this.editor),autoConvertOptions=(null==editorData?void 0:editorData.autoConvertOptions)||{},getDefault=function(key){let fallback=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return _this.isUpdating&&void 0!==data[key]?data[key]:void 0!==autoConvertOptions[key]?autoConvertOptions[key]:fallback},width=this.isUpdating&&data.width?data.width:560,height=this.isUpdating&&data.height?data.height:315;return{elementid:this.editor.getElement().id,isupdating:this.isUpdating,url:data.url||"",showTitle:getDefault("showTitle"),linkTitle:getDefault("linkTitle"),showRelated:getDefault("showRelated"),showUserAvatar:getDefault("showUserAvatar"),textLinkOnly:data.textLinkOnly||!1,startAtEnabled:data.startAtEnabled||!1,startAt:data.startAt||"0:00",width:width,height:height}}async displayDialogue(){this.selectedIframe=this.getSelectedIframe();const data=this.getCurrentIframeData();this.isUpdating=null!==data,this.currentModal=await _iframemodal.default.create({title:(0,_str.getString)("iframemodaltitle",_common.component),templateContext:await this.getTemplateContext(data||{})}),await this.registerEventListeners(this.currentModal)}getSelectedIframe(){const node=this.editor.selection.getNode();if("a"===node.nodeName.toLowerCase()&&"true"===node.getAttribute("data-mediacms-textlink"))return node;if("iframe"===node.nodeName.toLowerCase())return node;const iframe=node.querySelector("iframe");if(iframe)return iframe;const wrapper=node.closest(".tiny-mediacms-iframe-wrapper")||node.closest(".tiny-iframe-responsive");if(wrapper)return wrapper.querySelector("iframe");const textLink=node.closest('a[data-mediacms-textlink="true"]');return textLink||null}getCurrentIframeData(){var _parsed$showTitle2,_parsed$linkTitle2,_parsed$showRelated2,_parsed$showUserAvata2;if(!this.selectedIframe)return null;if("a"===this.selectedIframe.nodeName.toLowerCase()&&"true"===this.selectedIframe.getAttribute("data-mediacms-textlink")){var _parsed$showTitle,_parsed$linkTitle,_parsed$showRelated,_parsed$showUserAvata;const href=this.selectedIframe.getAttribute("href"),parsed=this.parseInput(href);return{url:href,width:(null==parsed?void 0:parsed.width)||560,height:(null==parsed?void 0:parsed.height)||315,showTitle:null===(_parsed$showTitle=null==parsed?void 0:parsed.showTitle)||void 0===_parsed$showTitle||_parsed$showTitle,linkTitle:null===(_parsed$linkTitle=null==parsed?void 0:parsed.linkTitle)||void 0===_parsed$linkTitle||_parsed$linkTitle,showRelated:null===(_parsed$showRelated=null==parsed?void 0:parsed.showRelated)||void 0===_parsed$showRelated||_parsed$showRelated,showUserAvatar:null===(_parsed$showUserAvata=null==parsed?void 0:parsed.showUserAvatar)||void 0===_parsed$showUserAvata||_parsed$showUserAvata,responsive:!0,textLinkOnly:!0,startAtEnabled:null!==(null==parsed?void 0:parsed.startAt),startAt:(null==parsed?void 0:parsed.startAt)||"0:00"}}const src=this.selectedIframe.getAttribute("src"),parsed=this.parseInput(src),style=this.selectedIframe.getAttribute("style")||"",maxWidthMatch=style.match(/max-width:\s*(\d+(?:\.\d+)?)px/),aspectRatioMatch=style.match(/aspect-ratio:\s*(\d+(?:\.\d+)?)\s*\/\s*(\d+(?:\.\d+)?)/),maxWidth=maxWidthMatch?parseInt(maxWidthMatch[1]):560;let height=315;if(aspectRatioMatch){const rw=parseFloat(aspectRatioMatch[1]),rh=parseFloat(aspectRatioMatch[2]);rw>0&&(height=Math.round(maxWidth*rh/rw))}return{url:src,width:maxWidth,height:height,showTitle:null===(_parsed$showTitle2=null==parsed?void 0:parsed.showTitle)||void 0===_parsed$showTitle2||_parsed$showTitle2,linkTitle:null===(_parsed$linkTitle2=null==parsed?void 0:parsed.linkTitle)||void 0===_parsed$linkTitle2||_parsed$linkTitle2,showRelated:null===(_parsed$showRelated2=null==parsed?void 0:parsed.showRelated)||void 0===_parsed$showRelated2||_parsed$showRelated2,showUserAvatar:null===(_parsed$showUserAvata2=null==parsed?void 0:parsed.showUserAvatar)||void 0===_parsed$showUserAvata2||_parsed$showUserAvata2,startAtEnabled:!(null==parsed||!parsed.startAt),startAt:(null==parsed?void 0:parsed.startAt)||"0:00"}}getFormValues(root){const form=root.querySelector(_selectors.default.IFRAME.elements.form);return{url:form.querySelector(_selectors.default.IFRAME.elements.url).value.trim(),showTitle:form.querySelector(_selectors.default.IFRAME.elements.showTitle).checked,linkTitle:form.querySelector(_selectors.default.IFRAME.elements.linkTitle).checked,showRelated:form.querySelector(_selectors.default.IFRAME.elements.showRelated).checked,showUserAvatar:form.querySelector(_selectors.default.IFRAME.elements.showUserAvatar).checked,textLinkOnly:form.querySelector(_selectors.default.IFRAME.elements.textLinkOnly).checked,startAtEnabled:form.querySelector(_selectors.default.IFRAME.elements.startAtEnabled).checked,startAt:form.querySelector(_selectors.default.IFRAME.elements.startAt).value.trim(),width:this.parseWidthHeight(form.querySelector(_selectors.default.IFRAME.elements.width).value),height:this.parseWidthHeight(form.querySelector(_selectors.default.IFRAME.elements.height).value)}}async generateIframeHtml(values){const parsed=this.parseInput(values.url);if(!parsed)return"";if(values.textLinkOnly){let viewUrl;viewUrl=parsed.isGeneric||parsed.isLtiLaunch?parsed.rawUrl:"".concat(parsed.baseUrl,"/view?m=").concat(parsed.videoId);const linkText=(str=>{const div=document.createElement("div");return div.textContent=str,div.innerHTML})(viewUrl),hrefUrl=viewUrl.replace(/"/g,""");return'

').concat(linkText,"

")}const context={src:this.buildEmbedUrl(parsed,values),maxWidth:values.width||560,height:values.height||315,aspectRatioCSS:this.computeAspectRatioCSS(values)},{html:html}=await _templates.default.renderForPromise("tiny_mediacms/iframe_embed_output",context);return html}async updatePreview(root){let updateUrlField=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const values=this.getFormValues(root),previewContainer=root.querySelector(_selectors.default.IFRAME.elements.preview),urlWarning=root.querySelector(_selectors.default.IFRAME.elements.urlWarning);if(!values.url)return previewContainer.innerHTML='Enter a video URL to see preview',void urlWarning.classList.add("d-none");const parsed=this.parseInput(values.url);if(!parsed)return previewContainer.innerHTML='Invalid URL format',void urlWarning.classList.remove("d-none");urlWarning.classList.add("d-none");const embedUrl=this.buildEmbedUrl(parsed,values);if(updateUrlField&&!parsed.isGeneric){root.querySelector(_selectors.default.IFRAME.elements.form).querySelector(_selectors.default.IFRAME.elements.url).value=embedUrl}if(values.textLinkOnly){let viewUrl;viewUrl=parsed.isGeneric||parsed.isLtiLaunch?parsed.rawUrl:"".concat(parsed.baseUrl,"/view?m=").concat(parsed.videoId);const linkText=(str=>{const div=document.createElement("div");return div.textContent=str,div.innerHTML})(viewUrl),hrefUrl=viewUrl.replace(/"/g,""");previewContainer.innerHTML='\n
\n Text link preview:
\n ').concat(linkText,"\n
\n ")}else{const previewWidth=Math.min(values.width||560,400),previewHeight=Math.round(previewWidth*(values.height||315)/(values.width||560));previewContainer.innerHTML='\n \n \n ')}}handleInputChange(root){let updateUrlField=arguments.length>1&&void 0!==arguments[1]&&arguments[1];clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout((()=>{this.updatePreview(root,updateUrlField)}),500)}handleWidthChange(root){const form=root.querySelector(_selectors.default.IFRAME.elements.form),widthInput=form.querySelector(_selectors.default.IFRAME.elements.width),heightInput=form.querySelector(_selectors.default.IFRAME.elements.height),newWidth=parseInt(widthInput.value);!isNaN(newWidth)&&newWidth>0&&(heightInput.value=Math.round(9*newWidth/16)),this.handleInputChange(root)}handleHeightChange(root){this.handleInputChange(root)}async handleDialogueSubmission(modal){const root=modal.getRoot()[0],values=this.getFormValues(root);if(!values.url)return;const html=await this.generateIframeHtml(values);if(html)if(this.isUpdating&&this.selectedIframe){const wrapper=this.selectedIframe.closest(".tiny-mediacms-iframe-wrapper")||this.selectedIframe.closest(".tiny-iframe-responsive"),paragraphWrapper=wrapper?wrapper.closest("p"):this.selectedIframe.closest("p");paragraphWrapper?paragraphWrapper.outerHTML=html:wrapper?wrapper.outerHTML=html:this.selectedIframe.outerHTML=html,this.isUpdating=!1,setTimeout((()=>{this.editor.getBody().querySelectorAll("p:empty, p:blank").forEach((p=>{""!==p.innerHTML.trim()&&"
"!==p.innerHTML||p.remove()}))}),10),this.editor.fire("Change")}else{const node=this.editor.selection.getNode();"P"===node.nodeName&&""===node.innerHTML.trim()?node.outerHTML=html:this.editor.insertContent(html),setTimeout((()=>{this.editor.getBody().querySelectorAll("p").forEach((p=>{""!==p.innerHTML.trim()&&"
"!==p.innerHTML||p.remove()}))}),50)}}async handleRemove(modal){const confirmMessage=await(0,_str.getString)("removeiframeconfirm",_common.component);if(window.confirm(confirmMessage)){if(this.selectedIframe){const wrapper=this.selectedIframe.closest(".tiny-mediacms-iframe-wrapper")||this.selectedIframe.closest(".tiny-iframe-responsive");wrapper?wrapper.remove():this.selectedIframe.remove()}this.isUpdating=!1,modal.hide()}}async registerEventListeners(modal){await modal.getBody();const $root=modal.getRoot(),root=$root[0],form=root.querySelector(_selectors.default.IFRAME.elements.form);form.querySelector(_selectors.default.IFRAME.elements.url).addEventListener("input",(()=>this.handleInputChange(root))),[_selectors.default.IFRAME.elements.showTitle,_selectors.default.IFRAME.elements.linkTitle,_selectors.default.IFRAME.elements.showRelated,_selectors.default.IFRAME.elements.showUserAvatar,_selectors.default.IFRAME.elements.startAtEnabled].forEach((selector=>{form.querySelector(selector).addEventListener("change",(()=>this.handleInputChange(root,!0)))})),form.querySelector(_selectors.default.IFRAME.elements.textLinkOnly).addEventListener("change",(()=>this.handleInputChange(root,!1))),form.querySelector(_selectors.default.IFRAME.elements.startAt).addEventListener("input",(()=>this.handleInputChange(root,!0))),form.querySelector(_selectors.default.IFRAME.elements.width).addEventListener("input",(()=>this.handleWidthChange(root))),form.querySelector(_selectors.default.IFRAME.elements.height).addEventListener("input",(()=>this.handleHeightChange(root))),$root.on(ModalEvents.save,(()=>this.handleDialogueSubmission(modal))),$root.on(ModalEvents.hidden,(()=>{this.currentModal.destroy()}));const removeBtn=root.querySelector(_selectors.default.IFRAME.actions.remove);removeBtn&&removeBtn.addEventListener("click",(()=>this.handleRemove(modal)));form.querySelector(_selectors.default.IFRAME.elements.url).value&&this.updatePreview(root);const iframeLibraryTabBtn=form.querySelector(_selectors.default.IFRAME.elements.tabIframeLibraryBtn);if(iframeLibraryTabBtn){iframeLibraryTabBtn.addEventListener("click",(e=>{e.preventDefault(),e.stopPropagation(),this.switchToIframeLibraryTab(root),setTimeout((()=>this.handleIframeLibraryTabClick(root)),100)})),iframeLibraryTabBtn.addEventListener("shown.bs.tab",(()=>this.handleIframeLibraryTabClick(root)));const $iframeLibraryTabBtn=window.jQuery?window.jQuery(iframeLibraryTabBtn):null;$iframeLibraryTabBtn&&$iframeLibraryTabBtn.on("shown.bs.tab",(()=>this.handleIframeLibraryTabClick(root)))}const urlTabBtn=form.querySelector(_selectors.default.IFRAME.elements.tabUrlBtn);urlTabBtn&&urlTabBtn.addEventListener("click",(e=>{e.preventDefault(),e.stopPropagation(),this.switchToUrlTab(root)}));const uploadMediaBtn=form.querySelector(_selectors.default.IFRAME.elements.tabUploadMediaBtn);uploadMediaBtn&&uploadMediaBtn.addEventListener("click",(e=>{e.preventDefault(),e.stopPropagation(),this.switchToIframeLibraryTab(root);let uploadUrl="";const ltiConfig=(0,_options.getLti)(this.editor);if(ltiConfig&<iConfig.contentItemUrl)try{const urlObj=new URL(ltiConfig.contentItemUrl);urlObj.searchParams.set("action","upload"),uploadUrl=urlObj.toString()}catch(err){}if(!uploadUrl){let baseUrl="";try{const editorData=(0,_options.getData)(this.editor);editorData&&editorData.mediacmsBaseUrl&&(baseUrl=editorData.mediacmsBaseUrl)}catch(err){}if(!baseUrl)try{const urlObj=new URL(this.iframeLibraryUrl);baseUrl="".concat(urlObj.protocol,"//").concat(urlObj.host)}catch(err){}baseUrl=baseUrl.replace(/\/$/,""),uploadUrl=baseUrl?"".concat(baseUrl,"/upload"):""}if(uploadUrl){const pane=form.querySelector(_selectors.default.IFRAME.elements.paneIframeLibrary);if(pane){const iframeEl=pane.querySelector(_selectors.default.IFRAME.elements.iframeLibraryFrame),placeholderEl=pane.querySelector(_selectors.default.IFRAME.elements.iframeLibraryPlaceholder),loadingEl=pane.querySelector(_selectors.default.IFRAME.elements.iframeLibraryLoading);if(placeholderEl&&placeholderEl.classList.add("d-none"),loadingEl&&loadingEl.classList.remove("d-none"),iframeEl){iframeEl.classList.add("d-none");const loadHandler=()=>{this.handleIframeLibraryLoad(root),iframeEl.removeEventListener("load",loadHandler)};iframeEl.addEventListener("load",loadHandler),iframeEl.src=uploadUrl}}}})),this.registerIframeLibraryEventListeners(root),this.isUpdating?setTimeout((()=>this.updatePreview(root)),100):setTimeout((()=>this.handleIframeLibraryTabClick(root)),100)}switchToUrlTab(root){const form=root.querySelector(_selectors.default.IFRAME.elements.form),urlTabBtn=form.querySelector(_selectors.default.IFRAME.elements.tabUrlBtn),urlTabItem=form.querySelector(".tiny_iframecms_tab_url_item"),iframeLibraryTabBtn=form.querySelector(_selectors.default.IFRAME.elements.tabIframeLibraryBtn),urlPane=form.querySelector(_selectors.default.IFRAME.elements.paneUrl),iframeLibraryPane=form.querySelector(_selectors.default.IFRAME.elements.paneIframeLibrary);urlTabItem&&(urlTabItem.style.display=""),urlTabBtn&&(urlTabBtn.classList.add("active"),urlTabBtn.setAttribute("aria-selected","true")),iframeLibraryTabBtn&&(iframeLibraryTabBtn.classList.remove("active"),iframeLibraryTabBtn.setAttribute("aria-selected","false")),urlPane&&urlPane.classList.add("show","active"),iframeLibraryPane&&iframeLibraryPane.classList.remove("show","active")}switchToIframeLibraryTab(root){const form=root.querySelector(_selectors.default.IFRAME.elements.form),urlTabBtn=form.querySelector(_selectors.default.IFRAME.elements.tabUrlBtn),urlTabItem=form.querySelector(".tiny_iframecms_tab_url_item"),iframeLibraryTabBtn=form.querySelector(_selectors.default.IFRAME.elements.tabIframeLibraryBtn),urlPane=form.querySelector(_selectors.default.IFRAME.elements.paneUrl),iframeLibraryPane=form.querySelector(_selectors.default.IFRAME.elements.paneIframeLibrary);urlTabItem&&(urlTabItem.style.display="none"),urlTabBtn&&(urlTabBtn.classList.remove("active"),urlTabBtn.setAttribute("aria-selected","false")),iframeLibraryTabBtn&&(iframeLibraryTabBtn.classList.add("active"),iframeLibraryTabBtn.setAttribute("aria-selected","true")),urlPane&&urlPane.classList.remove("show","active"),iframeLibraryPane&&iframeLibraryPane.classList.add("show","active")}registerIframeLibraryEventListeners(root){window.addEventListener("message",(event=>{this.handleIframeLibraryMessage(root,event)}))}handleIframeLibraryTabClick(root){this.loadIframeLibrary(root)}loadIframeLibrary(root){const ltiConfig=(0,_options.getLti)(this.editor);null!=ltiConfig&<iConfig.contentItemUrl?this.loadIframeLibraryViaLti(root):this.loadIframeLibraryStatic(root)}loadIframeLibraryViaLti(root){const pane=root.querySelector(_selectors.default.IFRAME.elements.form).querySelector(_selectors.default.IFRAME.elements.paneIframeLibrary);if(!pane)return;const placeholderEl=pane.querySelector(_selectors.default.IFRAME.elements.iframeLibraryPlaceholder),loadingEl=pane.querySelector(_selectors.default.IFRAME.elements.iframeLibraryLoading),iframeEl=pane.querySelector(_selectors.default.IFRAME.elements.iframeLibraryFrame);if(!iframeEl)return;placeholderEl&&placeholderEl.classList.add("d-none"),loadingEl&&loadingEl.classList.remove("d-none"),iframeEl.classList.add("d-none");iframeEl.addEventListener("load",(()=>{this.handleIframeLibraryLoad(root)}));const ltiConfig=(0,_options.getLti)(this.editor);iframeEl.src=ltiConfig.contentItemUrl}loadIframeLibraryStatic(root){const pane=root.querySelector(_selectors.default.IFRAME.elements.form).querySelector(_selectors.default.IFRAME.elements.paneIframeLibrary);if(!pane)return;const placeholderEl=pane.querySelector(_selectors.default.IFRAME.elements.iframeLibraryPlaceholder),loadingEl=pane.querySelector(_selectors.default.IFRAME.elements.iframeLibraryLoading),iframeEl=pane.querySelector(_selectors.default.IFRAME.elements.iframeLibraryFrame);if(!iframeEl)return;placeholderEl&&placeholderEl.classList.add("d-none"),loadingEl&&loadingEl.classList.remove("d-none"),iframeEl.classList.add("d-none");const loadHandler=()=>{iframeEl.src===this.iframeLibraryUrl&&(this.handleIframeLibraryLoad(root),iframeEl.removeEventListener("load",loadHandler))};iframeEl.addEventListener("load",loadHandler),iframeEl.src=this.iframeLibraryUrl}handleIframeLibraryLoad(root){const pane=root.querySelector(_selectors.default.IFRAME.elements.form).querySelector(_selectors.default.IFRAME.elements.paneIframeLibrary);if(!pane)return;const placeholderEl=pane.querySelector(_selectors.default.IFRAME.elements.iframeLibraryPlaceholder),loadingEl=pane.querySelector(_selectors.default.IFRAME.elements.iframeLibraryLoading),iframeEl=pane.querySelector(_selectors.default.IFRAME.elements.iframeLibraryFrame);placeholderEl&&placeholderEl.classList.add("d-none"),loadingEl&&loadingEl.classList.add("d-none"),iframeEl&&iframeEl.classList.remove("d-none")}handleIframeLibraryMessage(root,event){const data=event.data;if(data)if("videoSelected"===data.type&&data.embedUrl)this.selectIframeLibraryVideo(root,data.embedUrl,data.videoId);else if("ltiDeepLinkingResponse"!==data.type&&"LtiDeepLinkingResponse"!==data.messageType)if("selectMedia"!==data.action&&"mediaSelected"!==data.action);else{const embedUrl=data.embedUrl||data.url||"";embedUrl&&this.selectIframeLibraryVideo(root,embedUrl)}else{const contentItems=data.content_items||data.contentItems||[];if(contentItems.length>0){const item=contentItems[0],embedUrl=item.url||item.embed_url||item.embedUrl||"",videoId=item.id||item.mediaId||"";embedUrl&&this.selectIframeLibraryVideo(root,embedUrl,videoId)}}}selectIframeLibraryVideo(root,embedUrl){root.querySelector(_selectors.default.IFRAME.elements.form).querySelector(_selectors.default.IFRAME.elements.url).value=embedUrl;const configureTabItem=root.querySelector(".tiny_iframecms_tab_url_item");configureTabItem&&(configureTabItem.style.display=""),this.switchToUrlTab(root),this.updatePreview(root)}},_exports.default})); +define("tiny_mediacms/iframeembed",["exports","core/templates","core/str","core/modal_events","./common","./iframemodal","./selectors","./options"],(function(_exports,_templates,_str,ModalEvents,_common,_iframemodal,_selectors,_options){function _getRequireWildcardCache(nodeInterop){if("function"!=typeof WeakMap)return null;var cacheBabelInterop=new WeakMap,cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function _defineProperty(obj,key,value){return key in obj?Object.defineProperty(obj,key,{value:value,enumerable:!0,configurable:!0,writable:!0}):obj[key]=value,obj}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_templates=_interopRequireDefault(_templates),ModalEvents=function(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule)return obj;if(null===obj||"object"!=typeof obj&&"function"!=typeof obj)return{default:obj};var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj))return cache.get(obj);var newObj={},hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj)if("default"!==key&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;desc&&(desc.get||desc.set)?Object.defineProperty(newObj,key,desc):newObj[key]=obj[key]}newObj.default=obj,cache&&cache.set(obj,newObj);return newObj}(ModalEvents),_iframemodal=_interopRequireDefault(_iframemodal),_selectors=_interopRequireDefault(_selectors);return _exports.default=class{constructor(editor){_defineProperty(this,"editor",null),_defineProperty(this,"currentModal",null),_defineProperty(this,"isUpdating",!1),_defineProperty(this,"selectedIframe",null),_defineProperty(this,"debounceTimer",null),_defineProperty(this,"iframeLibraryUrl","https://temp.web357.com/mediacms/deic-mediacms-embed-videos.html"),this.editor=editor}parseInput(input){if(!input||!input.trim())return null;const iframeMatch=(input=input.trim()).match(/]*src=["']([^"']+)["'][^>]*>/i);return iframeMatch?this.parseEmbedUrl(iframeMatch[1]):input.startsWith("http://")||input.startsWith("https://")?this.parseVideoUrl(input):null}parseVideoUrl(url){try{const urlObj=new URL(url),baseUrl="".concat(urlObj.protocol,"//").concat(urlObj.host);if("/view"===urlObj.pathname&&urlObj.searchParams.has("m"))return{baseUrl:baseUrl,videoId:urlObj.searchParams.get("m"),isEmbed:!1};if("/embed"===urlObj.pathname&&urlObj.searchParams.has("m")){const tParam=urlObj.searchParams.get("t"),widthParam=urlObj.searchParams.get("width"),heightParam=urlObj.searchParams.get("height");return{baseUrl:baseUrl,videoId:urlObj.searchParams.get("m"),isEmbed:!0,showTitle:"1"===urlObj.searchParams.get("showTitle"),linkTitle:"1"===urlObj.searchParams.get("linkTitle"),showUserAvatar:"1"===urlObj.searchParams.get("showUserAvatar"),width:widthParam?parseInt(widthParam):null,height:heightParam?parseInt(heightParam):null,startAt:tParam?this.secondsToTimeString(parseInt(tParam)):null}}if(urlObj.pathname.includes("/filter/mediacms/launch.php")&&urlObj.searchParams.has("token")){const tParam=urlObj.searchParams.get("t"),widthParam=urlObj.searchParams.get("width"),heightParam=urlObj.searchParams.get("height");return{baseUrl:baseUrl,videoId:urlObj.searchParams.get("token"),rawUrl:url,isLtiLaunch:!0,showTitle:"1"===urlObj.searchParams.get("showTitle"),linkTitle:"1"===urlObj.searchParams.get("linkTitle"),showUserAvatar:"1"===urlObj.searchParams.get("showUserAvatar"),width:widthParam?parseInt(widthParam):null,height:heightParam?parseInt(heightParam):null,startAt:tParam?this.secondsToTimeString(parseInt(tParam)):null}}return{baseUrl:baseUrl,rawUrl:url,isGeneric:!0}}catch(e){return null}}parseEmbedUrl(url){return this.parseVideoUrl(url)}secondsToTimeString(seconds){const mins=Math.floor(seconds/60),secs=seconds%60;return"".concat(mins,":").concat(secs.toString().padStart(2,"0"))}timeStringToSeconds(timeStr){if(!timeStr||!timeStr.trim())return null;if((timeStr=timeStr.trim()).includes(":")){const parts=timeStr.split(":");return 60*(parseInt(parts[0])||0)+(parseInt(parts[1])||0)}const secs=parseInt(timeStr);return isNaN(secs)?null:secs}parseWidthHeight(value){if(!value)return null;const parsed=parseInt(value.trim());return isNaN(parsed)?null:parsed}computeAspectRatioCSS(values){const w=values.width||560,h=values.height||315;return"".concat(w," / ").concat(h)}buildEmbedUrl(parsed,options){if(parsed.isGeneric)return parsed.rawUrl;let url;if(parsed.isLtiLaunch){url=new URL(parsed.rawUrl);const token=url.searchParams.get("token"),courseid=url.searchParams.get("courseid");url.search="",url.searchParams.set("token",token),courseid&&url.searchParams.set("courseid",courseid)}else url=new URL("".concat(parsed.baseUrl,"/embed")),url.searchParams.set("m",parsed.videoId);if(url.searchParams.set("showTitle",options.showTitle?"1":"0"),url.searchParams.set("showUserAvatar",options.showUserAvatar?"1":"0"),url.searchParams.set("linkTitle",options.linkTitle?"1":"0"),options.startAtEnabled&&options.startAt){const seconds=this.timeStringToSeconds(options.startAt);null!==seconds&&seconds>0&&url.searchParams.set("t",seconds.toString())}return options.width&&url.searchParams.set("width",options.width),options.height&&url.searchParams.set("height",options.height),url.toString()}async getTemplateContext(){var _this=this;let data=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const editorData=(0,_options.getData)(this.editor),autoConvertOptions=(null==editorData?void 0:editorData.autoConvertOptions)||{},getDefault=function(key){let fallback=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return _this.isUpdating&&void 0!==data[key]?data[key]:void 0!==autoConvertOptions[key]?autoConvertOptions[key]:fallback},width=this.isUpdating&&data.width?data.width:560,height=this.isUpdating&&data.height?data.height:315;return{elementid:this.editor.getElement().id,isupdating:this.isUpdating,url:data.url||"",showTitle:getDefault("showTitle"),linkTitle:getDefault("linkTitle"),showUserAvatar:getDefault("showUserAvatar"),textLinkOnly:data.textLinkOnly||!1,startAtEnabled:data.startAtEnabled||!1,startAt:data.startAt||"0:00",width:width,height:height}}async displayDialogue(){this.selectedIframe=this.getSelectedIframe();const data=this.getCurrentIframeData();this.isUpdating=null!==data,this.currentModal=await _iframemodal.default.create({title:(0,_str.getString)("iframemodaltitle",_common.component),templateContext:await this.getTemplateContext(data||{})}),await this.registerEventListeners(this.currentModal)}getSelectedIframe(){const node=this.editor.selection.getNode();if("a"===node.nodeName.toLowerCase()&&"true"===node.getAttribute("data-mediacms-textlink"))return node;if("iframe"===node.nodeName.toLowerCase())return node;const iframe=node.querySelector("iframe");if(iframe)return iframe;const wrapper=node.closest(".tiny-mediacms-iframe-wrapper")||node.closest(".tiny-iframe-responsive");if(wrapper)return wrapper.querySelector("iframe");const textLink=node.closest('a[data-mediacms-textlink="true"]');return textLink||null}getCurrentIframeData(){var _parsed$showTitle2,_parsed$linkTitle2,_parsed$showUserAvata2;if(!this.selectedIframe)return null;if("a"===this.selectedIframe.nodeName.toLowerCase()&&"true"===this.selectedIframe.getAttribute("data-mediacms-textlink")){var _parsed$showTitle,_parsed$linkTitle,_parsed$showUserAvata;const href=this.selectedIframe.getAttribute("href"),parsed=this.parseInput(href);return{url:href,width:(null==parsed?void 0:parsed.width)||560,height:(null==parsed?void 0:parsed.height)||315,showTitle:null===(_parsed$showTitle=null==parsed?void 0:parsed.showTitle)||void 0===_parsed$showTitle||_parsed$showTitle,linkTitle:null===(_parsed$linkTitle=null==parsed?void 0:parsed.linkTitle)||void 0===_parsed$linkTitle||_parsed$linkTitle,showUserAvatar:null===(_parsed$showUserAvata=null==parsed?void 0:parsed.showUserAvatar)||void 0===_parsed$showUserAvata||_parsed$showUserAvata,responsive:!0,textLinkOnly:!0,startAtEnabled:null!==(null==parsed?void 0:parsed.startAt),startAt:(null==parsed?void 0:parsed.startAt)||"0:00"}}const src=this.selectedIframe.getAttribute("src"),parsed=this.parseInput(src),style=this.selectedIframe.getAttribute("style")||"",maxWidthMatch=style.match(/max-width:\s*(\d+(?:\.\d+)?)px/),aspectRatioMatch=style.match(/aspect-ratio:\s*(\d+(?:\.\d+)?)\s*\/\s*(\d+(?:\.\d+)?)/),maxWidth=maxWidthMatch?parseInt(maxWidthMatch[1]):560;let height=315;if(aspectRatioMatch){const rw=parseFloat(aspectRatioMatch[1]),rh=parseFloat(aspectRatioMatch[2]);rw>0&&(height=Math.round(maxWidth*rh/rw))}return{url:src,width:maxWidth,height:height,showTitle:null===(_parsed$showTitle2=null==parsed?void 0:parsed.showTitle)||void 0===_parsed$showTitle2||_parsed$showTitle2,linkTitle:null===(_parsed$linkTitle2=null==parsed?void 0:parsed.linkTitle)||void 0===_parsed$linkTitle2||_parsed$linkTitle2,showUserAvatar:null===(_parsed$showUserAvata2=null==parsed?void 0:parsed.showUserAvatar)||void 0===_parsed$showUserAvata2||_parsed$showUserAvata2,startAtEnabled:!(null==parsed||!parsed.startAt),startAt:(null==parsed?void 0:parsed.startAt)||"0:00"}}getFormValues(root){const form=root.querySelector(_selectors.default.IFRAME.elements.form);return{url:form.querySelector(_selectors.default.IFRAME.elements.url).value.trim(),showTitle:form.querySelector(_selectors.default.IFRAME.elements.showTitle).checked,linkTitle:form.querySelector(_selectors.default.IFRAME.elements.linkTitle).checked,showUserAvatar:form.querySelector(_selectors.default.IFRAME.elements.showUserAvatar).checked,textLinkOnly:form.querySelector(_selectors.default.IFRAME.elements.textLinkOnly).checked,startAtEnabled:form.querySelector(_selectors.default.IFRAME.elements.startAtEnabled).checked,startAt:form.querySelector(_selectors.default.IFRAME.elements.startAt).value.trim(),width:this.parseWidthHeight(form.querySelector(_selectors.default.IFRAME.elements.width).value),height:this.parseWidthHeight(form.querySelector(_selectors.default.IFRAME.elements.height).value)}}async generateIframeHtml(values){const parsed=this.parseInput(values.url);if(!parsed)return"";if(values.textLinkOnly){let viewUrl;viewUrl=parsed.isGeneric||parsed.isLtiLaunch?parsed.rawUrl:"".concat(parsed.baseUrl,"/view?m=").concat(parsed.videoId);const linkText=(str=>{const div=document.createElement("div");return div.textContent=str,div.innerHTML})(viewUrl),hrefUrl=viewUrl.replace(/"/g,""");return'

').concat(linkText,"

")}const context={src:this.buildEmbedUrl(parsed,values),maxWidth:values.width||560,height:values.height||315,aspectRatioCSS:this.computeAspectRatioCSS(values)},{html:html}=await _templates.default.renderForPromise("tiny_mediacms/iframe_embed_output",context);return html}async updatePreview(root){let updateUrlField=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const values=this.getFormValues(root),previewContainer=root.querySelector(_selectors.default.IFRAME.elements.preview),urlWarning=root.querySelector(_selectors.default.IFRAME.elements.urlWarning);if(!values.url)return previewContainer.innerHTML='Enter a video URL to see preview',void urlWarning.classList.add("d-none");const parsed=this.parseInput(values.url);if(!parsed)return previewContainer.innerHTML='Invalid URL format',void urlWarning.classList.remove("d-none");urlWarning.classList.add("d-none");const embedUrl=this.buildEmbedUrl(parsed,values);if(updateUrlField&&!parsed.isGeneric){root.querySelector(_selectors.default.IFRAME.elements.form).querySelector(_selectors.default.IFRAME.elements.url).value=embedUrl}if(values.textLinkOnly){let viewUrl;viewUrl=parsed.isGeneric||parsed.isLtiLaunch?parsed.rawUrl:"".concat(parsed.baseUrl,"/view?m=").concat(parsed.videoId);const linkText=(str=>{const div=document.createElement("div");return div.textContent=str,div.innerHTML})(viewUrl),hrefUrl=viewUrl.replace(/"/g,""");previewContainer.innerHTML='\n
\n Text link preview:
\n ').concat(linkText,"\n
\n ")}else{const previewWidth=Math.min(values.width||560,400),previewHeight=Math.round(previewWidth*(values.height||315)/(values.width||560));previewContainer.innerHTML='\n \n \n ')}}handleInputChange(root){let updateUrlField=arguments.length>1&&void 0!==arguments[1]&&arguments[1];clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout((()=>{this.updatePreview(root,updateUrlField)}),500)}handleWidthChange(root){const form=root.querySelector(_selectors.default.IFRAME.elements.form),widthInput=form.querySelector(_selectors.default.IFRAME.elements.width),heightInput=form.querySelector(_selectors.default.IFRAME.elements.height),newWidth=parseInt(widthInput.value);!isNaN(newWidth)&&newWidth>0&&(heightInput.value=Math.round(9*newWidth/16)),this.handleInputChange(root)}handleHeightChange(root){this.handleInputChange(root)}async handleDialogueSubmission(modal){const root=modal.getRoot()[0],values=this.getFormValues(root);if(!values.url)return;const html=await this.generateIframeHtml(values);if(html)if(this.isUpdating&&this.selectedIframe){const wrapper=this.selectedIframe.closest(".tiny-mediacms-iframe-wrapper")||this.selectedIframe.closest(".tiny-iframe-responsive"),paragraphWrapper=wrapper?wrapper.closest("p"):this.selectedIframe.closest("p");paragraphWrapper?paragraphWrapper.outerHTML=html:wrapper?wrapper.outerHTML=html:this.selectedIframe.outerHTML=html,this.isUpdating=!1,setTimeout((()=>{this.editor.getBody().querySelectorAll("p:empty, p:blank").forEach((p=>{""!==p.innerHTML.trim()&&"
"!==p.innerHTML||p.remove()}))}),10),this.editor.fire("Change")}else{const node=this.editor.selection.getNode();"P"===node.nodeName&&""===node.innerHTML.trim()?node.outerHTML=html:this.editor.insertContent(html),setTimeout((()=>{this.editor.getBody().querySelectorAll("p").forEach((p=>{""!==p.innerHTML.trim()&&"
"!==p.innerHTML||p.remove()}))}),50)}}async handleRemove(modal){const confirmMessage=await(0,_str.getString)("removeiframeconfirm",_common.component);if(window.confirm(confirmMessage)){if(this.selectedIframe){const wrapper=this.selectedIframe.closest(".tiny-mediacms-iframe-wrapper")||this.selectedIframe.closest(".tiny-iframe-responsive");wrapper?wrapper.remove():this.selectedIframe.remove()}this.isUpdating=!1,modal.hide()}}async registerEventListeners(modal){await modal.getBody();const $root=modal.getRoot(),root=$root[0],form=root.querySelector(_selectors.default.IFRAME.elements.form);form.querySelector(_selectors.default.IFRAME.elements.url).addEventListener("input",(()=>this.handleInputChange(root))),[_selectors.default.IFRAME.elements.showTitle,_selectors.default.IFRAME.elements.linkTitle,_selectors.default.IFRAME.elements.showUserAvatar,_selectors.default.IFRAME.elements.startAtEnabled].forEach((selector=>{form.querySelector(selector).addEventListener("change",(()=>this.handleInputChange(root,!0)))})),form.querySelector(_selectors.default.IFRAME.elements.textLinkOnly).addEventListener("change",(()=>this.handleInputChange(root,!1))),form.querySelector(_selectors.default.IFRAME.elements.startAt).addEventListener("input",(()=>this.handleInputChange(root,!0))),form.querySelector(_selectors.default.IFRAME.elements.width).addEventListener("input",(()=>this.handleWidthChange(root))),form.querySelector(_selectors.default.IFRAME.elements.height).addEventListener("input",(()=>this.handleHeightChange(root))),$root.on(ModalEvents.save,(()=>this.handleDialogueSubmission(modal))),$root.on(ModalEvents.hidden,(()=>{this.currentModal.destroy()}));const removeBtn=root.querySelector(_selectors.default.IFRAME.actions.remove);removeBtn&&removeBtn.addEventListener("click",(()=>this.handleRemove(modal)));form.querySelector(_selectors.default.IFRAME.elements.url).value&&this.updatePreview(root);const iframeLibraryTabBtn=form.querySelector(_selectors.default.IFRAME.elements.tabIframeLibraryBtn);if(iframeLibraryTabBtn){iframeLibraryTabBtn.addEventListener("click",(e=>{e.preventDefault(),e.stopPropagation(),this.switchToIframeLibraryTab(root),setTimeout((()=>this.handleIframeLibraryTabClick(root)),100)})),iframeLibraryTabBtn.addEventListener("shown.bs.tab",(()=>this.handleIframeLibraryTabClick(root)));const $iframeLibraryTabBtn=window.jQuery?window.jQuery(iframeLibraryTabBtn):null;$iframeLibraryTabBtn&&$iframeLibraryTabBtn.on("shown.bs.tab",(()=>this.handleIframeLibraryTabClick(root)))}const urlTabBtn=form.querySelector(_selectors.default.IFRAME.elements.tabUrlBtn);urlTabBtn&&urlTabBtn.addEventListener("click",(e=>{e.preventDefault(),e.stopPropagation(),this.switchToUrlTab(root)}));const uploadMediaBtn=form.querySelector(_selectors.default.IFRAME.elements.tabUploadMediaBtn);uploadMediaBtn&&uploadMediaBtn.addEventListener("click",(e=>{e.preventDefault(),e.stopPropagation(),this.switchToIframeLibraryTab(root);let uploadUrl="";const ltiConfig=(0,_options.getLti)(this.editor);if(ltiConfig&<iConfig.contentItemUrl)try{const urlObj=new URL(ltiConfig.contentItemUrl);urlObj.searchParams.set("action","upload"),uploadUrl=urlObj.toString()}catch(err){}if(!uploadUrl){let baseUrl="";try{const editorData=(0,_options.getData)(this.editor);editorData&&editorData.mediacmsBaseUrl&&(baseUrl=editorData.mediacmsBaseUrl)}catch(err){}if(!baseUrl)try{const urlObj=new URL(this.iframeLibraryUrl);baseUrl="".concat(urlObj.protocol,"//").concat(urlObj.host)}catch(err){}baseUrl=baseUrl.replace(/\/$/,""),uploadUrl=baseUrl?"".concat(baseUrl,"/upload"):""}if(uploadUrl){const pane=form.querySelector(_selectors.default.IFRAME.elements.paneIframeLibrary);if(pane){const iframeEl=pane.querySelector(_selectors.default.IFRAME.elements.iframeLibraryFrame),placeholderEl=pane.querySelector(_selectors.default.IFRAME.elements.iframeLibraryPlaceholder),loadingEl=pane.querySelector(_selectors.default.IFRAME.elements.iframeLibraryLoading);if(placeholderEl&&placeholderEl.classList.add("d-none"),loadingEl&&loadingEl.classList.remove("d-none"),iframeEl){iframeEl.classList.add("d-none");const loadHandler=()=>{this.handleIframeLibraryLoad(root),iframeEl.removeEventListener("load",loadHandler)};iframeEl.addEventListener("load",loadHandler),iframeEl.src=uploadUrl}}}})),this.registerIframeLibraryEventListeners(root),this.isUpdating?setTimeout((()=>this.updatePreview(root)),100):setTimeout((()=>this.handleIframeLibraryTabClick(root)),100)}switchToUrlTab(root){const form=root.querySelector(_selectors.default.IFRAME.elements.form),urlTabBtn=form.querySelector(_selectors.default.IFRAME.elements.tabUrlBtn),urlTabItem=form.querySelector(".tiny_iframecms_tab_url_item"),iframeLibraryTabBtn=form.querySelector(_selectors.default.IFRAME.elements.tabIframeLibraryBtn),urlPane=form.querySelector(_selectors.default.IFRAME.elements.paneUrl),iframeLibraryPane=form.querySelector(_selectors.default.IFRAME.elements.paneIframeLibrary);urlTabItem&&(urlTabItem.style.display=""),urlTabBtn&&(urlTabBtn.classList.add("active"),urlTabBtn.setAttribute("aria-selected","true")),iframeLibraryTabBtn&&(iframeLibraryTabBtn.classList.remove("active"),iframeLibraryTabBtn.setAttribute("aria-selected","false")),urlPane&&urlPane.classList.add("show","active"),iframeLibraryPane&&iframeLibraryPane.classList.remove("show","active")}switchToIframeLibraryTab(root){const form=root.querySelector(_selectors.default.IFRAME.elements.form),urlTabBtn=form.querySelector(_selectors.default.IFRAME.elements.tabUrlBtn),urlTabItem=form.querySelector(".tiny_iframecms_tab_url_item"),iframeLibraryTabBtn=form.querySelector(_selectors.default.IFRAME.elements.tabIframeLibraryBtn),urlPane=form.querySelector(_selectors.default.IFRAME.elements.paneUrl),iframeLibraryPane=form.querySelector(_selectors.default.IFRAME.elements.paneIframeLibrary);urlTabItem&&(urlTabItem.style.display="none"),urlTabBtn&&(urlTabBtn.classList.remove("active"),urlTabBtn.setAttribute("aria-selected","false")),iframeLibraryTabBtn&&(iframeLibraryTabBtn.classList.add("active"),iframeLibraryTabBtn.setAttribute("aria-selected","true")),urlPane&&urlPane.classList.remove("show","active"),iframeLibraryPane&&iframeLibraryPane.classList.add("show","active")}registerIframeLibraryEventListeners(root){window.addEventListener("message",(event=>{this.handleIframeLibraryMessage(root,event)}))}handleIframeLibraryTabClick(root){this.loadIframeLibrary(root)}loadIframeLibrary(root){const ltiConfig=(0,_options.getLti)(this.editor);null!=ltiConfig&<iConfig.contentItemUrl?this.loadIframeLibraryViaLti(root):this.loadIframeLibraryStatic(root)}loadIframeLibraryViaLti(root){const pane=root.querySelector(_selectors.default.IFRAME.elements.form).querySelector(_selectors.default.IFRAME.elements.paneIframeLibrary);if(!pane)return;const placeholderEl=pane.querySelector(_selectors.default.IFRAME.elements.iframeLibraryPlaceholder),loadingEl=pane.querySelector(_selectors.default.IFRAME.elements.iframeLibraryLoading),iframeEl=pane.querySelector(_selectors.default.IFRAME.elements.iframeLibraryFrame);if(!iframeEl)return;placeholderEl&&placeholderEl.classList.add("d-none"),loadingEl&&loadingEl.classList.remove("d-none"),iframeEl.classList.add("d-none");iframeEl.addEventListener("load",(()=>{this.handleIframeLibraryLoad(root)}));const ltiConfig=(0,_options.getLti)(this.editor);iframeEl.src=ltiConfig.contentItemUrl}loadIframeLibraryStatic(root){const pane=root.querySelector(_selectors.default.IFRAME.elements.form).querySelector(_selectors.default.IFRAME.elements.paneIframeLibrary);if(!pane)return;const placeholderEl=pane.querySelector(_selectors.default.IFRAME.elements.iframeLibraryPlaceholder),loadingEl=pane.querySelector(_selectors.default.IFRAME.elements.iframeLibraryLoading),iframeEl=pane.querySelector(_selectors.default.IFRAME.elements.iframeLibraryFrame);if(!iframeEl)return;placeholderEl&&placeholderEl.classList.add("d-none"),loadingEl&&loadingEl.classList.remove("d-none"),iframeEl.classList.add("d-none");const loadHandler=()=>{iframeEl.src===this.iframeLibraryUrl&&(this.handleIframeLibraryLoad(root),iframeEl.removeEventListener("load",loadHandler))};iframeEl.addEventListener("load",loadHandler),iframeEl.src=this.iframeLibraryUrl}handleIframeLibraryLoad(root){const pane=root.querySelector(_selectors.default.IFRAME.elements.form).querySelector(_selectors.default.IFRAME.elements.paneIframeLibrary);if(!pane)return;const placeholderEl=pane.querySelector(_selectors.default.IFRAME.elements.iframeLibraryPlaceholder),loadingEl=pane.querySelector(_selectors.default.IFRAME.elements.iframeLibraryLoading),iframeEl=pane.querySelector(_selectors.default.IFRAME.elements.iframeLibraryFrame);placeholderEl&&placeholderEl.classList.add("d-none"),loadingEl&&loadingEl.classList.add("d-none"),iframeEl&&iframeEl.classList.remove("d-none")}handleIframeLibraryMessage(root,event){const data=event.data;if(data)if("videoSelected"===data.type&&data.embedUrl)this.selectIframeLibraryVideo(root,data.embedUrl,data.videoId);else if("ltiDeepLinkingResponse"!==data.type&&"LtiDeepLinkingResponse"!==data.messageType)if("selectMedia"!==data.action&&"mediaSelected"!==data.action);else{const embedUrl=data.embedUrl||data.url||"";embedUrl&&this.selectIframeLibraryVideo(root,embedUrl)}else{const contentItems=data.content_items||data.contentItems||[];if(contentItems.length>0){const item=contentItems[0],embedUrl=item.url||item.embed_url||item.embedUrl||"",videoId=item.id||item.mediaId||"";embedUrl&&this.selectIframeLibraryVideo(root,embedUrl,videoId)}}}selectIframeLibraryVideo(root,embedUrl){root.querySelector(_selectors.default.IFRAME.elements.form).querySelector(_selectors.default.IFRAME.elements.url).value=embedUrl;const configureTabItem=root.querySelector(".tiny_iframecms_tab_url_item");configureTabItem&&(configureTabItem.style.display=""),this.switchToUrlTab(root),this.updatePreview(root)}},_exports.default})); //# sourceMappingURL=iframeembed.min.js.map \ No newline at end of file diff --git a/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/iframeembed.min.js.map b/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/iframeembed.min.js.map index ae309519..0e7d7f39 100755 --- a/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/iframeembed.min.js.map +++ b/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/iframeembed.min.js.map @@ -1 +1 @@ -{"version":3,"file":"iframeembed.min.js","sources":["../src/iframeembed.js"],"sourcesContent":["import Templates from 'core/templates';\nimport { getString } from 'core/str';\nimport * as ModalEvents from 'core/modal_events';\nimport { component } from './common';\nimport IframeModal from './iframemodal';\nimport Selectors from './selectors';\nimport { getLti, getData } from './options';\n\nexport default class IframeEmbed {\n editor = null;\n currentModal = null;\n isUpdating = false;\n selectedIframe = null;\n debounceTimer = null;\n iframeLibraryUrl =\n 'https://temp.web357.com/mediacms/deic-mediacms-embed-videos.html';\n\n constructor(editor) {\n this.editor = editor;\n }\n\n parseInput(input) {\n if (!input || !input.trim()) {\n return null;\n }\n\n input = input.trim();\n\n const iframeMatch = input.match(\n /]*src=[\"']([^\"']+)[\"'][^>]*>/i,\n );\n if (iframeMatch) {\n return this.parseEmbedUrl(iframeMatch[1]);\n }\n\n if (input.startsWith('http://') || input.startsWith('https://')) {\n return this.parseVideoUrl(input);\n }\n\n return null;\n }\n\n parseVideoUrl(url) {\n try {\n const urlObj = new URL(url);\n const baseUrl = `${urlObj.protocol}//${urlObj.host}`;\n\n if (urlObj.pathname === '/view' && urlObj.searchParams.has('m')) {\n return {\n baseUrl: baseUrl,\n videoId: urlObj.searchParams.get('m'),\n isEmbed: false,\n };\n }\n\n if (urlObj.pathname === '/embed' && urlObj.searchParams.has('m')) {\n const tParam = urlObj.searchParams.get('t');\n const widthParam = urlObj.searchParams.get('width');\n const heightParam = urlObj.searchParams.get('height');\n return {\n baseUrl: baseUrl,\n videoId: urlObj.searchParams.get('m'),\n isEmbed: true,\n showTitle: urlObj.searchParams.get('showTitle') === '1',\n linkTitle: urlObj.searchParams.get('linkTitle') === '1',\n showRelated: urlObj.searchParams.get('showRelated') === '1',\n showUserAvatar:\n urlObj.searchParams.get('showUserAvatar') === '1',\n width: widthParam ? parseInt(widthParam) : null,\n height: heightParam ? parseInt(heightParam) : null,\n startAt: tParam\n ? this.secondsToTimeString(parseInt(tParam))\n : null,\n };\n }\n\n if (urlObj.pathname.includes('/filter/mediacms/launch.php') && urlObj.searchParams.has('token')) {\n const tParam = urlObj.searchParams.get('t');\n const widthParam = urlObj.searchParams.get('width');\n const heightParam = urlObj.searchParams.get('height');\n\n return {\n baseUrl: baseUrl,\n videoId: urlObj.searchParams.get('token'),\n rawUrl: url,\n isLtiLaunch: true,\n showTitle: urlObj.searchParams.get('showTitle') === '1',\n linkTitle: urlObj.searchParams.get('linkTitle') === '1',\n showRelated: urlObj.searchParams.get('showRelated') === '1',\n showUserAvatar: urlObj.searchParams.get('showUserAvatar') === '1',\n width: widthParam ? parseInt(widthParam) : null,\n height: heightParam ? parseInt(heightParam) : null,\n startAt: tParam ? this.secondsToTimeString(parseInt(tParam)) : null,\n };\n }\n\n return {\n baseUrl: baseUrl,\n rawUrl: url,\n isGeneric: true,\n };\n } catch (e) {\n return null;\n }\n }\n\n parseEmbedUrl(url) {\n return this.parseVideoUrl(url);\n }\n\n secondsToTimeString(seconds) {\n const mins = Math.floor(seconds / 60);\n const secs = seconds % 60;\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n }\n\n timeStringToSeconds(timeStr) {\n if (!timeStr || !timeStr.trim()) {\n return null;\n }\n timeStr = timeStr.trim();\n\n if (timeStr.includes(':')) {\n const parts = timeStr.split(':');\n const mins = parseInt(parts[0]) || 0;\n const secs = parseInt(parts[1]) || 0;\n return mins * 60 + secs;\n }\n\n const secs = parseInt(timeStr);\n return isNaN(secs) ? null : secs;\n }\n\n parseWidthHeight(value) {\n if (!value) {\n return null;\n }\n const parsed = parseInt(value.trim());\n return isNaN(parsed) ? null : parsed;\n }\n\n computeAspectRatioCSS(values) {\n const w = values.width || 560;\n const h = values.height || 315;\n return `${w} / ${h}`;\n }\n\n buildEmbedUrl(parsed, options) {\n if (parsed.isGeneric) {\n return parsed.rawUrl;\n }\n\n let url;\n if (parsed.isLtiLaunch) {\n url = new URL(parsed.rawUrl);\n const token = url.searchParams.get('token');\n const courseid = url.searchParams.get('courseid');\n url.search = '';\n url.searchParams.set('token', token);\n if (courseid) {\n url.searchParams.set('courseid', courseid);\n }\n } else {\n url = new URL(`${parsed.baseUrl}/embed`);\n url.searchParams.set('m', parsed.videoId);\n }\n\n url.searchParams.set('showTitle', options.showTitle ? '1' : '0');\n url.searchParams.set('showRelated', options.showRelated ? '1' : '0');\n url.searchParams.set(\n 'showUserAvatar',\n options.showUserAvatar ? '1' : '0',\n );\n url.searchParams.set('linkTitle', options.linkTitle ? '1' : '0');\n\n if (options.startAtEnabled && options.startAt) {\n const seconds = this.timeStringToSeconds(options.startAt);\n if (seconds !== null && seconds > 0) {\n url.searchParams.set('t', seconds.toString());\n }\n }\n\n if (options.width) {\n url.searchParams.set('width', options.width);\n }\n if (options.height) {\n url.searchParams.set('height', options.height);\n }\n\n return url.toString();\n }\n\n async getTemplateContext(data = {}) {\n const editorData = getData(this.editor);\n const autoConvertOptions = editorData?.autoConvertOptions || {};\n\n const getDefault = (key, fallback = true) => {\n if (this.isUpdating && data[key] !== undefined) {\n return data[key];\n }\n return autoConvertOptions[key] !== undefined\n ? autoConvertOptions[key]\n : fallback;\n };\n\n const width = (this.isUpdating && data.width) ? data.width : 560;\n const height = (this.isUpdating && data.height) ? data.height : 315;\n\n return {\n elementid: this.editor.getElement().id,\n isupdating: this.isUpdating,\n url: data.url || '',\n showTitle: getDefault('showTitle'),\n linkTitle: getDefault('linkTitle'),\n showRelated: getDefault('showRelated'),\n showUserAvatar: getDefault('showUserAvatar'),\n textLinkOnly: data.textLinkOnly || false,\n startAtEnabled: data.startAtEnabled || false,\n startAt: data.startAt || '0:00',\n width,\n height,\n };\n }\n\n async displayDialogue() {\n this.selectedIframe = this.getSelectedIframe();\n const data = this.getCurrentIframeData();\n this.isUpdating = data !== null;\n\n this.currentModal = await IframeModal.create({\n title: getString('iframemodaltitle', component),\n templateContext: await this.getTemplateContext(data || {}),\n });\n\n await this.registerEventListeners(this.currentModal);\n }\n\n getSelectedIframe() {\n const node = this.editor.selection.getNode();\n\n if (node.nodeName.toLowerCase() === 'a' && node.getAttribute('data-mediacms-textlink') === 'true') {\n return node;\n }\n\n if (node.nodeName.toLowerCase() === 'iframe') {\n return node;\n }\n\n const iframe = node.querySelector('iframe');\n if (iframe) {\n return iframe;\n }\n\n const wrapper =\n node.closest('.tiny-mediacms-iframe-wrapper') ||\n node.closest('.tiny-iframe-responsive');\n if (wrapper) {\n return wrapper.querySelector('iframe');\n }\n\n const textLink = node.closest('a[data-mediacms-textlink=\"true\"]');\n if (textLink) {\n return textLink;\n }\n\n return null;\n }\n\n getCurrentIframeData() {\n if (!this.selectedIframe) {\n return null;\n }\n\n if (this.selectedIframe.nodeName.toLowerCase() === 'a' &&\n this.selectedIframe.getAttribute('data-mediacms-textlink') === 'true') {\n const href = this.selectedIframe.getAttribute('href');\n const parsed = this.parseInput(href);\n\n return {\n url: href,\n width: parsed?.width || 560,\n height: parsed?.height || 315,\n showTitle: parsed?.showTitle ?? true,\n linkTitle: parsed?.linkTitle ?? true,\n showRelated: parsed?.showRelated ?? true,\n showUserAvatar: parsed?.showUserAvatar ?? true,\n responsive: true,\n textLinkOnly: true,\n startAtEnabled: parsed?.startAt !== null,\n startAt: parsed?.startAt || '0:00',\n };\n }\n\n const src = this.selectedIframe.getAttribute('src');\n const parsed = this.parseInput(src);\n\n // Parse responsive dimensions from inline style\n const style = this.selectedIframe.getAttribute('style') || '';\n const maxWidthMatch = style.match(/max-width:\\s*(\\d+(?:\\.\\d+)?)px/);\n const aspectRatioMatch = style.match(/aspect-ratio:\\s*(\\d+(?:\\.\\d+)?)\\s*\\/\\s*(\\d+(?:\\.\\d+)?)/);\n\n const maxWidth = maxWidthMatch ? parseInt(maxWidthMatch[1]) : 560;\n let height = 315;\n\n if (aspectRatioMatch) {\n const rw = parseFloat(aspectRatioMatch[1]);\n const rh = parseFloat(aspectRatioMatch[2]);\n if (rw > 0) {\n height = Math.round(maxWidth * rh / rw);\n }\n }\n\n return {\n url: src,\n width: maxWidth,\n height,\n showTitle: parsed?.showTitle ?? true,\n linkTitle: parsed?.linkTitle ?? true,\n showRelated: parsed?.showRelated ?? true,\n showUserAvatar: parsed?.showUserAvatar ?? true,\n startAtEnabled: !!(parsed?.startAt),\n startAt: parsed?.startAt || '0:00',\n };\n }\n\n getFormValues(root) {\n const form = root.querySelector(Selectors.IFRAME.elements.form);\n\n return {\n url: form.querySelector(Selectors.IFRAME.elements.url).value.trim(),\n showTitle: form.querySelector(Selectors.IFRAME.elements.showTitle)\n .checked,\n linkTitle: form.querySelector(Selectors.IFRAME.elements.linkTitle)\n .checked,\n showRelated: form.querySelector(\n Selectors.IFRAME.elements.showRelated,\n ).checked,\n showUserAvatar: form.querySelector(\n Selectors.IFRAME.elements.showUserAvatar,\n ).checked,\n textLinkOnly: form.querySelector(Selectors.IFRAME.elements.textLinkOnly)\n .checked,\n startAtEnabled: form.querySelector(\n Selectors.IFRAME.elements.startAtEnabled,\n ).checked,\n startAt: form\n .querySelector(Selectors.IFRAME.elements.startAt)\n .value.trim(),\n width: this.parseWidthHeight(\n form.querySelector(Selectors.IFRAME.elements.width).value,\n ),\n height: this.parseWidthHeight(\n form.querySelector(Selectors.IFRAME.elements.height).value,\n ),\n };\n }\n\n async generateIframeHtml(values) {\n const parsed = this.parseInput(values.url);\n if (!parsed) {\n return '';\n }\n\n if (values.textLinkOnly) {\n let viewUrl;\n if (parsed.isGeneric || parsed.isLtiLaunch) {\n viewUrl = parsed.rawUrl;\n } else {\n viewUrl = `${parsed.baseUrl}/view?m=${parsed.videoId}`;\n }\n\n const escapeHtml = (str) => {\n const div = document.createElement('div');\n div.textContent = str;\n return div.innerHTML;\n };\n\n const linkText = escapeHtml(viewUrl);\n const hrefUrl = viewUrl.replace(/\"/g, '"');\n\n return `

${linkText}

`;\n }\n\n const embedUrl = this.buildEmbedUrl(parsed, values);\n\n const context = {\n src: embedUrl,\n maxWidth: values.width || 560,\n height: values.height || 315,\n aspectRatioCSS: this.computeAspectRatioCSS(values),\n };\n\n const { html } = await Templates.renderForPromise(\n 'tiny_mediacms/iframe_embed_output',\n context,\n );\n return html;\n }\n\n async updatePreview(root, updateUrlField = false) {\n const values = this.getFormValues(root);\n const previewContainer = root.querySelector(\n Selectors.IFRAME.elements.preview,\n );\n const urlWarning = root.querySelector(\n Selectors.IFRAME.elements.urlWarning,\n );\n\n if (!values.url) {\n previewContainer.innerHTML =\n 'Enter a video URL to see preview';\n urlWarning.classList.add('d-none');\n return;\n }\n\n const parsed = this.parseInput(values.url);\n if (!parsed) {\n previewContainer.innerHTML =\n 'Invalid URL format';\n urlWarning.classList.remove('d-none');\n return;\n }\n\n urlWarning.classList.add('d-none');\n const embedUrl = this.buildEmbedUrl(parsed, values);\n\n if (updateUrlField && !parsed.isGeneric) {\n const form = root.querySelector(Selectors.IFRAME.elements.form);\n const urlInput = form.querySelector(Selectors.IFRAME.elements.url);\n urlInput.value = embedUrl;\n }\n\n if (values.textLinkOnly) {\n let viewUrl;\n if (parsed.isGeneric || parsed.isLtiLaunch) {\n viewUrl = parsed.rawUrl;\n } else {\n viewUrl = `${parsed.baseUrl}/view?m=${parsed.videoId}`;\n }\n\n const escapeHtml = (str) => {\n const div = document.createElement('div');\n div.textContent = str;\n return div.innerHTML;\n };\n\n const linkText = escapeHtml(viewUrl);\n const hrefUrl = viewUrl.replace(/\"/g, '"');\n\n previewContainer.innerHTML = `\n
\n Text link preview:
\n ${linkText}\n
\n `;\n } else {\n const previewWidth = Math.min(values.width || 560, 400);\n const previewHeight = Math.round(previewWidth * (values.height || 315) / (values.width || 560));\n\n previewContainer.innerHTML = `\n \n \n `;\n }\n }\n\n handleInputChange(root, updateUrlField = false) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = setTimeout(() => {\n this.updatePreview(root, updateUrlField);\n }, 500);\n }\n\n handleWidthChange(root) {\n const form = root.querySelector(Selectors.IFRAME.elements.form);\n const widthInput = form.querySelector(Selectors.IFRAME.elements.width);\n const heightInput = form.querySelector(Selectors.IFRAME.elements.height);\n const newWidth = parseInt(widthInput.value);\n if (!isNaN(newWidth) && newWidth > 0) {\n heightInput.value = Math.round(newWidth * 9 / 16);\n }\n this.handleInputChange(root);\n }\n\n handleHeightChange(root) {\n this.handleInputChange(root);\n }\n\n async handleDialogueSubmission(modal) {\n const root = modal.getRoot()[0];\n const values = this.getFormValues(root);\n\n if (!values.url) {\n return;\n }\n\n const html = await this.generateIframeHtml(values);\n if (html) {\n if (this.isUpdating && this.selectedIframe) {\n const wrapper =\n this.selectedIframe.closest(\n '.tiny-mediacms-iframe-wrapper',\n ) || this.selectedIframe.closest('.tiny-iframe-responsive');\n\n const paragraphWrapper = wrapper ? wrapper.closest('p') : this.selectedIframe.closest('p');\n\n if (paragraphWrapper) {\n paragraphWrapper.outerHTML = html;\n } else if (wrapper) {\n wrapper.outerHTML = html;\n } else {\n this.selectedIframe.outerHTML = html;\n }\n this.isUpdating = false;\n\n setTimeout(() => {\n const body = this.editor.getBody();\n const emptyPs = body.querySelectorAll('p:empty, p:blank');\n emptyPs.forEach(p => {\n if (p.innerHTML.trim() === '' || p.innerHTML === '
') {\n p.remove();\n }\n });\n }, 10);\n\n this.editor.fire('Change');\n } else {\n const node = this.editor.selection.getNode();\n if (node.nodeName === 'P' && node.innerHTML.trim() === '') {\n node.outerHTML = html;\n } else {\n this.editor.insertContent(html);\n }\n setTimeout(() => {\n const body = this.editor.getBody();\n body.querySelectorAll('p').forEach(p => {\n if (p.innerHTML.trim() === '' || p.innerHTML === '
') {\n p.remove();\n }\n });\n }, 50);\n }\n }\n }\n\n async handleRemove(modal) {\n const confirmMessage = await getString(\n 'removeiframeconfirm',\n component,\n );\n\n // eslint-disable-next-line no-alert\n if (!window.confirm(confirmMessage)) {\n return;\n }\n\n if (this.selectedIframe) {\n const wrapper =\n this.selectedIframe.closest('.tiny-mediacms-iframe-wrapper') ||\n this.selectedIframe.closest('.tiny-iframe-responsive');\n if (wrapper) {\n wrapper.remove();\n } else {\n this.selectedIframe.remove();\n }\n }\n\n this.isUpdating = false;\n modal.hide();\n }\n\n async registerEventListeners(modal) {\n await modal.getBody();\n const $root = modal.getRoot();\n const root = $root[0];\n\n const form = root.querySelector(Selectors.IFRAME.elements.form);\n\n form.querySelector(Selectors.IFRAME.elements.url).addEventListener(\n 'input',\n () => this.handleInputChange(root),\n );\n\n [\n Selectors.IFRAME.elements.showTitle,\n Selectors.IFRAME.elements.linkTitle,\n Selectors.IFRAME.elements.showRelated,\n Selectors.IFRAME.elements.showUserAvatar,\n Selectors.IFRAME.elements.startAtEnabled,\n ].forEach((selector) => {\n form.querySelector(selector).addEventListener('change', () =>\n this.handleInputChange(root, true),\n );\n });\n\n form.querySelector(Selectors.IFRAME.elements.textLinkOnly).addEventListener('change', () =>\n this.handleInputChange(root, false),\n );\n\n form.querySelector(Selectors.IFRAME.elements.startAt).addEventListener(\n 'input',\n () => this.handleInputChange(root, true),\n );\n\n form.querySelector(Selectors.IFRAME.elements.width).addEventListener(\n 'input',\n () => this.handleWidthChange(root),\n );\n form.querySelector(Selectors.IFRAME.elements.height).addEventListener(\n 'input',\n () => this.handleHeightChange(root),\n );\n\n $root.on(ModalEvents.save, () => this.handleDialogueSubmission(modal));\n $root.on(ModalEvents.hidden, () => {\n this.currentModal.destroy();\n });\n\n const removeBtn = root.querySelector(Selectors.IFRAME.actions.remove);\n if (removeBtn) {\n removeBtn.addEventListener('click', () => this.handleRemove(modal));\n }\n\n const urlInput = form.querySelector(Selectors.IFRAME.elements.url);\n if (urlInput.value) {\n this.updatePreview(root);\n }\n\n const iframeLibraryTabBtn = form.querySelector(\n Selectors.IFRAME.elements.tabIframeLibraryBtn,\n );\n if (iframeLibraryTabBtn) {\n iframeLibraryTabBtn.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n this.switchToIframeLibraryTab(root);\n\n setTimeout(() => this.handleIframeLibraryTabClick(root), 100);\n });\n iframeLibraryTabBtn.addEventListener('shown.bs.tab', () =>\n this.handleIframeLibraryTabClick(root),\n );\n const $iframeLibraryTabBtn = window.jQuery\n ? window.jQuery(iframeLibraryTabBtn)\n : null;\n if ($iframeLibraryTabBtn) {\n $iframeLibraryTabBtn.on('shown.bs.tab', () =>\n this.handleIframeLibraryTabClick(root),\n );\n }\n }\n\n const urlTabBtn = form.querySelector(\n Selectors.IFRAME.elements.tabUrlBtn,\n );\n if (urlTabBtn) {\n urlTabBtn.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n this.switchToUrlTab(root);\n });\n }\n\n const uploadMediaBtn = form.querySelector(\n Selectors.IFRAME.elements.tabUploadMediaBtn,\n );\n if (uploadMediaBtn) {\n uploadMediaBtn.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n this.switchToIframeLibraryTab(root);\n\n let uploadUrl = '';\n const ltiConfig = getLti(this.editor);\n\n if (ltiConfig && ltiConfig.contentItemUrl) {\n try {\n const urlObj = new URL(ltiConfig.contentItemUrl);\n urlObj.searchParams.set('action', 'upload');\n uploadUrl = urlObj.toString();\n } catch (err) {\n // eslint-disable-next-line no-unused-vars\n }\n }\n\n if (!uploadUrl) {\n let baseUrl = '';\n try {\n const editorData = getData(this.editor);\n if (editorData && editorData.mediacmsBaseUrl) {\n baseUrl = editorData.mediacmsBaseUrl;\n }\n } catch (err) {\n // eslint-disable-next-line no-unused-vars\n }\n\n if (!baseUrl) {\n try {\n const urlObj = new URL(this.iframeLibraryUrl);\n baseUrl = `${urlObj.protocol}//${urlObj.host}`;\n } catch (err) {\n // eslint-disable-next-line no-unused-vars\n }\n }\n\n baseUrl = baseUrl.replace(/\\/$/, '');\n uploadUrl = baseUrl ? `${baseUrl}/upload` : '';\n }\n\n if (uploadUrl) {\n const pane = form.querySelector(Selectors.IFRAME.elements.paneIframeLibrary);\n if (pane) {\n const iframeEl = pane.querySelector(Selectors.IFRAME.elements.iframeLibraryFrame);\n const placeholderEl = pane.querySelector(Selectors.IFRAME.elements.iframeLibraryPlaceholder);\n const loadingEl = pane.querySelector(Selectors.IFRAME.elements.iframeLibraryLoading);\n\n if (placeholderEl) {\n placeholderEl.classList.add('d-none');\n }\n if (loadingEl) {\n loadingEl.classList.remove('d-none');\n }\n if (iframeEl) {\n iframeEl.classList.add('d-none');\n\n const loadHandler = () => {\n this.handleIframeLibraryLoad(root);\n iframeEl.removeEventListener('load', loadHandler);\n };\n iframeEl.addEventListener('load', loadHandler);\n iframeEl.src = uploadUrl;\n }\n }\n }\n });\n }\n\n this.registerIframeLibraryEventListeners(root);\n\n if (this.isUpdating) {\n setTimeout(() => this.updatePreview(root), 100);\n } else {\n setTimeout(() => this.handleIframeLibraryTabClick(root), 100);\n }\n }\n\n switchToUrlTab(root) {\n const form = root.querySelector(Selectors.IFRAME.elements.form);\n\n const urlTabBtn = form.querySelector(\n Selectors.IFRAME.elements.tabUrlBtn,\n );\n const urlTabItem = form.querySelector('.tiny_iframecms_tab_url_item');\n const iframeLibraryTabBtn = form.querySelector(\n Selectors.IFRAME.elements.tabIframeLibraryBtn,\n );\n\n const urlPane = form.querySelector(Selectors.IFRAME.elements.paneUrl);\n const iframeLibraryPane = form.querySelector(\n Selectors.IFRAME.elements.paneIframeLibrary,\n );\n\n if (urlTabItem) {\n urlTabItem.style.display = '';\n }\n\n if (urlTabBtn) {\n urlTabBtn.classList.add('active');\n urlTabBtn.setAttribute('aria-selected', 'true');\n }\n if (iframeLibraryTabBtn) {\n iframeLibraryTabBtn.classList.remove('active');\n iframeLibraryTabBtn.setAttribute('aria-selected', 'false');\n }\n\n if (urlPane) {\n urlPane.classList.add('show', 'active');\n }\n if (iframeLibraryPane) {\n iframeLibraryPane.classList.remove('show', 'active');\n }\n }\n\n switchToIframeLibraryTab(root) {\n const form = root.querySelector(Selectors.IFRAME.elements.form);\n\n const urlTabBtn = form.querySelector(\n Selectors.IFRAME.elements.tabUrlBtn,\n );\n const urlTabItem = form.querySelector('.tiny_iframecms_tab_url_item');\n const iframeLibraryTabBtn = form.querySelector(\n Selectors.IFRAME.elements.tabIframeLibraryBtn,\n );\n\n const urlPane = form.querySelector(Selectors.IFRAME.elements.paneUrl);\n const iframeLibraryPane = form.querySelector(\n Selectors.IFRAME.elements.paneIframeLibrary,\n );\n\n if (urlTabItem) {\n urlTabItem.style.display = 'none';\n }\n\n if (urlTabBtn) {\n urlTabBtn.classList.remove('active');\n urlTabBtn.setAttribute('aria-selected', 'false');\n }\n if (iframeLibraryTabBtn) {\n iframeLibraryTabBtn.classList.add('active');\n iframeLibraryTabBtn.setAttribute('aria-selected', 'true');\n }\n\n if (urlPane) {\n urlPane.classList.remove('show', 'active');\n }\n if (iframeLibraryPane) {\n iframeLibraryPane.classList.add('show', 'active');\n }\n }\n\n registerIframeLibraryEventListeners(root) {\n window.addEventListener('message', (event) => {\n this.handleIframeLibraryMessage(root, event);\n });\n }\n\n handleIframeLibraryTabClick(root) {\n this.loadIframeLibrary(root);\n }\n\n loadIframeLibrary(root) {\n const ltiConfig = getLti(this.editor);\n if (ltiConfig?.contentItemUrl) {\n this.loadIframeLibraryViaLti(root);\n } else {\n this.loadIframeLibraryStatic(root);\n }\n }\n\n loadIframeLibraryViaLti(root) {\n const form = root.querySelector(Selectors.IFRAME.elements.form);\n const pane = form.querySelector(\n Selectors.IFRAME.elements.paneIframeLibrary,\n );\n\n if (!pane) {\n return;\n }\n\n const placeholderEl = pane.querySelector(\n Selectors.IFRAME.elements.iframeLibraryPlaceholder,\n );\n const loadingEl = pane.querySelector(\n Selectors.IFRAME.elements.iframeLibraryLoading,\n );\n const iframeEl = pane.querySelector(\n Selectors.IFRAME.elements.iframeLibraryFrame,\n );\n\n if (!iframeEl) {\n return;\n }\n\n if (placeholderEl) {\n placeholderEl.classList.add('d-none');\n }\n if (loadingEl) {\n loadingEl.classList.remove('d-none');\n }\n iframeEl.classList.add('d-none');\n\n const loadHandler = () => {\n this.handleIframeLibraryLoad(root);\n };\n iframeEl.addEventListener('load', loadHandler);\n\n const ltiConfig = getLti(this.editor);\n iframeEl.src = ltiConfig.contentItemUrl;\n }\n\n loadIframeLibraryStatic(root) {\n const form = root.querySelector(Selectors.IFRAME.elements.form);\n const pane = form.querySelector(\n Selectors.IFRAME.elements.paneIframeLibrary,\n );\n\n if (!pane) {\n return;\n }\n\n const placeholderEl = pane.querySelector(\n Selectors.IFRAME.elements.iframeLibraryPlaceholder,\n );\n const loadingEl = pane.querySelector(\n Selectors.IFRAME.elements.iframeLibraryLoading,\n );\n const iframeEl = pane.querySelector(\n Selectors.IFRAME.elements.iframeLibraryFrame,\n );\n\n if (!iframeEl) {\n return;\n }\n\n if (placeholderEl) {\n placeholderEl.classList.add('d-none');\n }\n if (loadingEl) {\n loadingEl.classList.remove('d-none');\n }\n iframeEl.classList.add('d-none');\n\n const loadHandler = () => {\n if (iframeEl.src === this.iframeLibraryUrl) {\n this.handleIframeLibraryLoad(root);\n iframeEl.removeEventListener('load', loadHandler);\n }\n };\n iframeEl.addEventListener('load', loadHandler);\n\n iframeEl.src = this.iframeLibraryUrl;\n }\n\n handleIframeLibraryLoad(root) {\n const form = root.querySelector(Selectors.IFRAME.elements.form);\n const pane = form.querySelector(\n Selectors.IFRAME.elements.paneIframeLibrary,\n );\n\n if (!pane) {\n return;\n }\n\n const placeholderEl = pane.querySelector(\n Selectors.IFRAME.elements.iframeLibraryPlaceholder,\n );\n const loadingEl = pane.querySelector(\n Selectors.IFRAME.elements.iframeLibraryLoading,\n );\n const iframeEl = pane.querySelector(\n Selectors.IFRAME.elements.iframeLibraryFrame,\n );\n\n if (placeholderEl) {\n placeholderEl.classList.add('d-none');\n }\n if (loadingEl) {\n loadingEl.classList.add('d-none');\n }\n if (iframeEl) {\n iframeEl.classList.remove('d-none');\n }\n }\n\n handleIframeLibraryMessage(root, event) {\n const data = event.data;\n\n if (!data) {\n return;\n }\n\n if (data.type === 'videoSelected' && data.embedUrl) {\n this.selectIframeLibraryVideo(root, data.embedUrl, data.videoId);\n return;\n }\n\n if (\n data.type === 'ltiDeepLinkingResponse' ||\n data.messageType === 'LtiDeepLinkingResponse'\n ) {\n const contentItems = data.content_items || data.contentItems || [];\n if (contentItems.length > 0) {\n const item = contentItems[0];\n const embedUrl =\n item.url || item.embed_url || item.embedUrl || '';\n const videoId = item.id || item.mediaId || '';\n if (embedUrl) {\n this.selectIframeLibraryVideo(root, embedUrl, videoId);\n }\n }\n return;\n }\n\n if (data.action === 'selectMedia' || data.action === 'mediaSelected') {\n const embedUrl = data.embedUrl || data.url || '';\n if (embedUrl) {\n this.selectIframeLibraryVideo(root, embedUrl);\n }\n return;\n }\n }\n\n selectIframeLibraryVideo(root, embedUrl) {\n const form = root.querySelector(Selectors.IFRAME.elements.form);\n\n const urlInput = form.querySelector(Selectors.IFRAME.elements.url);\n urlInput.value = embedUrl;\n\n const configureTabItem = root.querySelector('.tiny_iframecms_tab_url_item');\n if (configureTabItem) {\n configureTabItem.style.display = '';\n }\n\n this.switchToUrlTab(root);\n this.updatePreview(root);\n }\n}\n"],"names":["constructor","editor","parseInput","input","trim","iframeMatch","match","this","parseEmbedUrl","startsWith","parseVideoUrl","url","urlObj","URL","baseUrl","protocol","host","pathname","searchParams","has","videoId","get","isEmbed","tParam","widthParam","heightParam","showTitle","linkTitle","showRelated","showUserAvatar","width","parseInt","height","startAt","secondsToTimeString","includes","rawUrl","isLtiLaunch","isGeneric","e","seconds","mins","Math","floor","secs","toString","padStart","timeStringToSeconds","timeStr","parts","split","isNaN","parseWidthHeight","value","parsed","computeAspectRatioCSS","values","w","h","buildEmbedUrl","options","token","courseid","search","set","startAtEnabled","data","editorData","autoConvertOptions","getDefault","key","fallback","_this","isUpdating","undefined","elementid","getElement","id","isupdating","textLinkOnly","selectedIframe","getSelectedIframe","getCurrentIframeData","currentModal","IframeModal","create","title","component","templateContext","getTemplateContext","registerEventListeners","node","selection","getNode","nodeName","toLowerCase","getAttribute","iframe","querySelector","wrapper","closest","textLink","href","responsive","src","style","maxWidthMatch","aspectRatioMatch","maxWidth","rw","parseFloat","rh","round","getFormValues","root","form","Selectors","IFRAME","elements","checked","viewUrl","linkText","str","div","document","createElement","textContent","innerHTML","escapeHtml","hrefUrl","replace","context","aspectRatioCSS","html","Templates","renderForPromise","updateUrlField","previewContainer","preview","urlWarning","classList","add","remove","embedUrl","previewWidth","min","previewHeight","handleInputChange","clearTimeout","debounceTimer","setTimeout","updatePreview","handleWidthChange","widthInput","heightInput","newWidth","handleHeightChange","modal","getRoot","generateIframeHtml","paragraphWrapper","outerHTML","getBody","querySelectorAll","forEach","p","fire","insertContent","confirmMessage","window","confirm","hide","$root","addEventListener","selector","on","ModalEvents","save","handleDialogueSubmission","hidden","destroy","removeBtn","actions","handleRemove","iframeLibraryTabBtn","tabIframeLibraryBtn","preventDefault","stopPropagation","switchToIframeLibraryTab","handleIframeLibraryTabClick","$iframeLibraryTabBtn","jQuery","urlTabBtn","tabUrlBtn","switchToUrlTab","uploadMediaBtn","tabUploadMediaBtn","uploadUrl","ltiConfig","contentItemUrl","err","mediacmsBaseUrl","iframeLibraryUrl","pane","paneIframeLibrary","iframeEl","iframeLibraryFrame","placeholderEl","iframeLibraryPlaceholder","loadingEl","iframeLibraryLoading","loadHandler","handleIframeLibraryLoad","removeEventListener","registerIframeLibraryEventListeners","urlTabItem","urlPane","paneUrl","iframeLibraryPane","display","setAttribute","event","handleIframeLibraryMessage","loadIframeLibrary","loadIframeLibraryViaLti","loadIframeLibraryStatic","type","selectIframeLibraryVideo","messageType","action","contentItems","content_items","length","item","embed_url","mediaId","configureTabItem"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"iframeembed.min.js","sources":["../src/iframeembed.js"],"sourcesContent":["import Templates from 'core/templates';\nimport { getString } from 'core/str';\nimport * as ModalEvents from 'core/modal_events';\nimport { component } from './common';\nimport IframeModal from './iframemodal';\nimport Selectors from './selectors';\nimport { getLti, getData } from './options';\n\nexport default class IframeEmbed {\n editor = null;\n currentModal = null;\n isUpdating = false;\n selectedIframe = null;\n debounceTimer = null;\n iframeLibraryUrl =\n 'https://temp.web357.com/mediacms/deic-mediacms-embed-videos.html';\n\n constructor(editor) {\n this.editor = editor;\n }\n\n parseInput(input) {\n if (!input || !input.trim()) {\n return null;\n }\n\n input = input.trim();\n\n const iframeMatch = input.match(\n /]*src=[\"']([^\"']+)[\"'][^>]*>/i,\n );\n if (iframeMatch) {\n return this.parseEmbedUrl(iframeMatch[1]);\n }\n\n if (input.startsWith('http://') || input.startsWith('https://')) {\n return this.parseVideoUrl(input);\n }\n\n return null;\n }\n\n parseVideoUrl(url) {\n try {\n const urlObj = new URL(url);\n const baseUrl = `${urlObj.protocol}//${urlObj.host}`;\n\n if (urlObj.pathname === '/view' && urlObj.searchParams.has('m')) {\n return {\n baseUrl: baseUrl,\n videoId: urlObj.searchParams.get('m'),\n isEmbed: false,\n };\n }\n\n if (urlObj.pathname === '/embed' && urlObj.searchParams.has('m')) {\n const tParam = urlObj.searchParams.get('t');\n const widthParam = urlObj.searchParams.get('width');\n const heightParam = urlObj.searchParams.get('height');\n return {\n baseUrl: baseUrl,\n videoId: urlObj.searchParams.get('m'),\n isEmbed: true,\n showTitle: urlObj.searchParams.get('showTitle') === '1',\n linkTitle: urlObj.searchParams.get('linkTitle') === '1',\n showUserAvatar:\n urlObj.searchParams.get('showUserAvatar') === '1',\n width: widthParam ? parseInt(widthParam) : null,\n height: heightParam ? parseInt(heightParam) : null,\n startAt: tParam\n ? this.secondsToTimeString(parseInt(tParam))\n : null,\n };\n }\n\n if (urlObj.pathname.includes('/filter/mediacms/launch.php') && urlObj.searchParams.has('token')) {\n const tParam = urlObj.searchParams.get('t');\n const widthParam = urlObj.searchParams.get('width');\n const heightParam = urlObj.searchParams.get('height');\n\n return {\n baseUrl: baseUrl,\n videoId: urlObj.searchParams.get('token'),\n rawUrl: url,\n isLtiLaunch: true,\n showTitle: urlObj.searchParams.get('showTitle') === '1',\n linkTitle: urlObj.searchParams.get('linkTitle') === '1',\n showUserAvatar: urlObj.searchParams.get('showUserAvatar') === '1',\n width: widthParam ? parseInt(widthParam) : null,\n height: heightParam ? parseInt(heightParam) : null,\n startAt: tParam ? this.secondsToTimeString(parseInt(tParam)) : null,\n };\n }\n\n return {\n baseUrl: baseUrl,\n rawUrl: url,\n isGeneric: true,\n };\n } catch (e) {\n return null;\n }\n }\n\n parseEmbedUrl(url) {\n return this.parseVideoUrl(url);\n }\n\n secondsToTimeString(seconds) {\n const mins = Math.floor(seconds / 60);\n const secs = seconds % 60;\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n }\n\n timeStringToSeconds(timeStr) {\n if (!timeStr || !timeStr.trim()) {\n return null;\n }\n timeStr = timeStr.trim();\n\n if (timeStr.includes(':')) {\n const parts = timeStr.split(':');\n const mins = parseInt(parts[0]) || 0;\n const secs = parseInt(parts[1]) || 0;\n return mins * 60 + secs;\n }\n\n const secs = parseInt(timeStr);\n return isNaN(secs) ? null : secs;\n }\n\n parseWidthHeight(value) {\n if (!value) {\n return null;\n }\n const parsed = parseInt(value.trim());\n return isNaN(parsed) ? null : parsed;\n }\n\n computeAspectRatioCSS(values) {\n const w = values.width || 560;\n const h = values.height || 315;\n return `${w} / ${h}`;\n }\n\n buildEmbedUrl(parsed, options) {\n if (parsed.isGeneric) {\n return parsed.rawUrl;\n }\n\n let url;\n if (parsed.isLtiLaunch) {\n url = new URL(parsed.rawUrl);\n const token = url.searchParams.get('token');\n const courseid = url.searchParams.get('courseid');\n url.search = '';\n url.searchParams.set('token', token);\n if (courseid) {\n url.searchParams.set('courseid', courseid);\n }\n } else {\n url = new URL(`${parsed.baseUrl}/embed`);\n url.searchParams.set('m', parsed.videoId);\n }\n\n url.searchParams.set('showTitle', options.showTitle ? '1' : '0');\n url.searchParams.set(\n 'showUserAvatar',\n options.showUserAvatar ? '1' : '0',\n );\n url.searchParams.set('linkTitle', options.linkTitle ? '1' : '0');\n\n if (options.startAtEnabled && options.startAt) {\n const seconds = this.timeStringToSeconds(options.startAt);\n if (seconds !== null && seconds > 0) {\n url.searchParams.set('t', seconds.toString());\n }\n }\n\n if (options.width) {\n url.searchParams.set('width', options.width);\n }\n if (options.height) {\n url.searchParams.set('height', options.height);\n }\n\n return url.toString();\n }\n\n async getTemplateContext(data = {}) {\n const editorData = getData(this.editor);\n const autoConvertOptions = editorData?.autoConvertOptions || {};\n\n const getDefault = (key, fallback = true) => {\n if (this.isUpdating && data[key] !== undefined) {\n return data[key];\n }\n return autoConvertOptions[key] !== undefined\n ? autoConvertOptions[key]\n : fallback;\n };\n\n const width = (this.isUpdating && data.width) ? data.width : 560;\n const height = (this.isUpdating && data.height) ? data.height : 315;\n\n return {\n elementid: this.editor.getElement().id,\n isupdating: this.isUpdating,\n url: data.url || '',\n showTitle: getDefault('showTitle'),\n linkTitle: getDefault('linkTitle'),\n showUserAvatar: getDefault('showUserAvatar'),\n textLinkOnly: data.textLinkOnly || false,\n startAtEnabled: data.startAtEnabled || false,\n startAt: data.startAt || '0:00',\n width,\n height,\n };\n }\n\n async displayDialogue() {\n this.selectedIframe = this.getSelectedIframe();\n const data = this.getCurrentIframeData();\n this.isUpdating = data !== null;\n\n this.currentModal = await IframeModal.create({\n title: getString('iframemodaltitle', component),\n templateContext: await this.getTemplateContext(data || {}),\n });\n\n await this.registerEventListeners(this.currentModal);\n }\n\n getSelectedIframe() {\n const node = this.editor.selection.getNode();\n\n if (node.nodeName.toLowerCase() === 'a' && node.getAttribute('data-mediacms-textlink') === 'true') {\n return node;\n }\n\n if (node.nodeName.toLowerCase() === 'iframe') {\n return node;\n }\n\n const iframe = node.querySelector('iframe');\n if (iframe) {\n return iframe;\n }\n\n const wrapper =\n node.closest('.tiny-mediacms-iframe-wrapper') ||\n node.closest('.tiny-iframe-responsive');\n if (wrapper) {\n return wrapper.querySelector('iframe');\n }\n\n const textLink = node.closest('a[data-mediacms-textlink=\"true\"]');\n if (textLink) {\n return textLink;\n }\n\n return null;\n }\n\n getCurrentIframeData() {\n if (!this.selectedIframe) {\n return null;\n }\n\n if (this.selectedIframe.nodeName.toLowerCase() === 'a' &&\n this.selectedIframe.getAttribute('data-mediacms-textlink') === 'true') {\n const href = this.selectedIframe.getAttribute('href');\n const parsed = this.parseInput(href);\n\n return {\n url: href,\n width: parsed?.width || 560,\n height: parsed?.height || 315,\n showTitle: parsed?.showTitle ?? true,\n linkTitle: parsed?.linkTitle ?? true,\n showUserAvatar: parsed?.showUserAvatar ?? true,\n responsive: true,\n textLinkOnly: true,\n startAtEnabled: parsed?.startAt !== null,\n startAt: parsed?.startAt || '0:00',\n };\n }\n\n const src = this.selectedIframe.getAttribute('src');\n const parsed = this.parseInput(src);\n\n // Parse responsive dimensions from inline style\n const style = this.selectedIframe.getAttribute('style') || '';\n const maxWidthMatch = style.match(/max-width:\\s*(\\d+(?:\\.\\d+)?)px/);\n const aspectRatioMatch = style.match(/aspect-ratio:\\s*(\\d+(?:\\.\\d+)?)\\s*\\/\\s*(\\d+(?:\\.\\d+)?)/);\n\n const maxWidth = maxWidthMatch ? parseInt(maxWidthMatch[1]) : 560;\n let height = 315;\n\n if (aspectRatioMatch) {\n const rw = parseFloat(aspectRatioMatch[1]);\n const rh = parseFloat(aspectRatioMatch[2]);\n if (rw > 0) {\n height = Math.round(maxWidth * rh / rw);\n }\n }\n\n return {\n url: src,\n width: maxWidth,\n height,\n showTitle: parsed?.showTitle ?? true,\n linkTitle: parsed?.linkTitle ?? true,\n showUserAvatar: parsed?.showUserAvatar ?? true,\n startAtEnabled: !!(parsed?.startAt),\n startAt: parsed?.startAt || '0:00',\n };\n }\n\n getFormValues(root) {\n const form = root.querySelector(Selectors.IFRAME.elements.form);\n\n return {\n url: form.querySelector(Selectors.IFRAME.elements.url).value.trim(),\n showTitle: form.querySelector(Selectors.IFRAME.elements.showTitle)\n .checked,\n linkTitle: form.querySelector(Selectors.IFRAME.elements.linkTitle)\n .checked,\n showUserAvatar: form.querySelector(\n Selectors.IFRAME.elements.showUserAvatar,\n ).checked,\n textLinkOnly: form.querySelector(Selectors.IFRAME.elements.textLinkOnly)\n .checked,\n startAtEnabled: form.querySelector(\n Selectors.IFRAME.elements.startAtEnabled,\n ).checked,\n startAt: form\n .querySelector(Selectors.IFRAME.elements.startAt)\n .value.trim(),\n width: this.parseWidthHeight(\n form.querySelector(Selectors.IFRAME.elements.width).value,\n ),\n height: this.parseWidthHeight(\n form.querySelector(Selectors.IFRAME.elements.height).value,\n ),\n };\n }\n\n async generateIframeHtml(values) {\n const parsed = this.parseInput(values.url);\n if (!parsed) {\n return '';\n }\n\n if (values.textLinkOnly) {\n let viewUrl;\n if (parsed.isGeneric || parsed.isLtiLaunch) {\n viewUrl = parsed.rawUrl;\n } else {\n viewUrl = `${parsed.baseUrl}/view?m=${parsed.videoId}`;\n }\n\n const escapeHtml = (str) => {\n const div = document.createElement('div');\n div.textContent = str;\n return div.innerHTML;\n };\n\n const linkText = escapeHtml(viewUrl);\n const hrefUrl = viewUrl.replace(/\"/g, '"');\n\n return `

${linkText}

`;\n }\n\n const embedUrl = this.buildEmbedUrl(parsed, values);\n\n const context = {\n src: embedUrl,\n maxWidth: values.width || 560,\n height: values.height || 315,\n aspectRatioCSS: this.computeAspectRatioCSS(values),\n };\n\n const { html } = await Templates.renderForPromise(\n 'tiny_mediacms/iframe_embed_output',\n context,\n );\n return html;\n }\n\n async updatePreview(root, updateUrlField = false) {\n const values = this.getFormValues(root);\n const previewContainer = root.querySelector(\n Selectors.IFRAME.elements.preview,\n );\n const urlWarning = root.querySelector(\n Selectors.IFRAME.elements.urlWarning,\n );\n\n if (!values.url) {\n previewContainer.innerHTML =\n 'Enter a video URL to see preview';\n urlWarning.classList.add('d-none');\n return;\n }\n\n const parsed = this.parseInput(values.url);\n if (!parsed) {\n previewContainer.innerHTML =\n 'Invalid URL format';\n urlWarning.classList.remove('d-none');\n return;\n }\n\n urlWarning.classList.add('d-none');\n const embedUrl = this.buildEmbedUrl(parsed, values);\n\n if (updateUrlField && !parsed.isGeneric) {\n const form = root.querySelector(Selectors.IFRAME.elements.form);\n const urlInput = form.querySelector(Selectors.IFRAME.elements.url);\n urlInput.value = embedUrl;\n }\n\n if (values.textLinkOnly) {\n let viewUrl;\n if (parsed.isGeneric || parsed.isLtiLaunch) {\n viewUrl = parsed.rawUrl;\n } else {\n viewUrl = `${parsed.baseUrl}/view?m=${parsed.videoId}`;\n }\n\n const escapeHtml = (str) => {\n const div = document.createElement('div');\n div.textContent = str;\n return div.innerHTML;\n };\n\n const linkText = escapeHtml(viewUrl);\n const hrefUrl = viewUrl.replace(/\"/g, '"');\n\n previewContainer.innerHTML = `\n
\n Text link preview:
\n ${linkText}\n
\n `;\n } else {\n const previewWidth = Math.min(values.width || 560, 400);\n const previewHeight = Math.round(previewWidth * (values.height || 315) / (values.width || 560));\n\n previewContainer.innerHTML = `\n \n \n `;\n }\n }\n\n handleInputChange(root, updateUrlField = false) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = setTimeout(() => {\n this.updatePreview(root, updateUrlField);\n }, 500);\n }\n\n handleWidthChange(root) {\n const form = root.querySelector(Selectors.IFRAME.elements.form);\n const widthInput = form.querySelector(Selectors.IFRAME.elements.width);\n const heightInput = form.querySelector(Selectors.IFRAME.elements.height);\n const newWidth = parseInt(widthInput.value);\n if (!isNaN(newWidth) && newWidth > 0) {\n heightInput.value = Math.round(newWidth * 9 / 16);\n }\n this.handleInputChange(root);\n }\n\n handleHeightChange(root) {\n this.handleInputChange(root);\n }\n\n async handleDialogueSubmission(modal) {\n const root = modal.getRoot()[0];\n const values = this.getFormValues(root);\n\n if (!values.url) {\n return;\n }\n\n const html = await this.generateIframeHtml(values);\n if (html) {\n if (this.isUpdating && this.selectedIframe) {\n const wrapper =\n this.selectedIframe.closest(\n '.tiny-mediacms-iframe-wrapper',\n ) || this.selectedIframe.closest('.tiny-iframe-responsive');\n\n const paragraphWrapper = wrapper ? wrapper.closest('p') : this.selectedIframe.closest('p');\n\n if (paragraphWrapper) {\n paragraphWrapper.outerHTML = html;\n } else if (wrapper) {\n wrapper.outerHTML = html;\n } else {\n this.selectedIframe.outerHTML = html;\n }\n this.isUpdating = false;\n\n setTimeout(() => {\n const body = this.editor.getBody();\n const emptyPs = body.querySelectorAll('p:empty, p:blank');\n emptyPs.forEach(p => {\n if (p.innerHTML.trim() === '' || p.innerHTML === '
') {\n p.remove();\n }\n });\n }, 10);\n\n this.editor.fire('Change');\n } else {\n const node = this.editor.selection.getNode();\n if (node.nodeName === 'P' && node.innerHTML.trim() === '') {\n node.outerHTML = html;\n } else {\n this.editor.insertContent(html);\n }\n setTimeout(() => {\n const body = this.editor.getBody();\n body.querySelectorAll('p').forEach(p => {\n if (p.innerHTML.trim() === '' || p.innerHTML === '
') {\n p.remove();\n }\n });\n }, 50);\n }\n }\n }\n\n async handleRemove(modal) {\n const confirmMessage = await getString(\n 'removeiframeconfirm',\n component,\n );\n\n // eslint-disable-next-line no-alert\n if (!window.confirm(confirmMessage)) {\n return;\n }\n\n if (this.selectedIframe) {\n const wrapper =\n this.selectedIframe.closest('.tiny-mediacms-iframe-wrapper') ||\n this.selectedIframe.closest('.tiny-iframe-responsive');\n if (wrapper) {\n wrapper.remove();\n } else {\n this.selectedIframe.remove();\n }\n }\n\n this.isUpdating = false;\n modal.hide();\n }\n\n async registerEventListeners(modal) {\n await modal.getBody();\n const $root = modal.getRoot();\n const root = $root[0];\n\n const form = root.querySelector(Selectors.IFRAME.elements.form);\n\n form.querySelector(Selectors.IFRAME.elements.url).addEventListener(\n 'input',\n () => this.handleInputChange(root),\n );\n\n [\n Selectors.IFRAME.elements.showTitle,\n Selectors.IFRAME.elements.linkTitle,\n Selectors.IFRAME.elements.showUserAvatar,\n Selectors.IFRAME.elements.startAtEnabled,\n ].forEach((selector) => {\n form.querySelector(selector).addEventListener('change', () =>\n this.handleInputChange(root, true),\n );\n });\n\n form.querySelector(Selectors.IFRAME.elements.textLinkOnly).addEventListener('change', () =>\n this.handleInputChange(root, false),\n );\n\n form.querySelector(Selectors.IFRAME.elements.startAt).addEventListener(\n 'input',\n () => this.handleInputChange(root, true),\n );\n\n form.querySelector(Selectors.IFRAME.elements.width).addEventListener(\n 'input',\n () => this.handleWidthChange(root),\n );\n form.querySelector(Selectors.IFRAME.elements.height).addEventListener(\n 'input',\n () => this.handleHeightChange(root),\n );\n\n $root.on(ModalEvents.save, () => this.handleDialogueSubmission(modal));\n $root.on(ModalEvents.hidden, () => {\n this.currentModal.destroy();\n });\n\n const removeBtn = root.querySelector(Selectors.IFRAME.actions.remove);\n if (removeBtn) {\n removeBtn.addEventListener('click', () => this.handleRemove(modal));\n }\n\n const urlInput = form.querySelector(Selectors.IFRAME.elements.url);\n if (urlInput.value) {\n this.updatePreview(root);\n }\n\n const iframeLibraryTabBtn = form.querySelector(\n Selectors.IFRAME.elements.tabIframeLibraryBtn,\n );\n if (iframeLibraryTabBtn) {\n iframeLibraryTabBtn.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n this.switchToIframeLibraryTab(root);\n\n setTimeout(() => this.handleIframeLibraryTabClick(root), 100);\n });\n iframeLibraryTabBtn.addEventListener('shown.bs.tab', () =>\n this.handleIframeLibraryTabClick(root),\n );\n const $iframeLibraryTabBtn = window.jQuery\n ? window.jQuery(iframeLibraryTabBtn)\n : null;\n if ($iframeLibraryTabBtn) {\n $iframeLibraryTabBtn.on('shown.bs.tab', () =>\n this.handleIframeLibraryTabClick(root),\n );\n }\n }\n\n const urlTabBtn = form.querySelector(\n Selectors.IFRAME.elements.tabUrlBtn,\n );\n if (urlTabBtn) {\n urlTabBtn.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n this.switchToUrlTab(root);\n });\n }\n\n const uploadMediaBtn = form.querySelector(\n Selectors.IFRAME.elements.tabUploadMediaBtn,\n );\n if (uploadMediaBtn) {\n uploadMediaBtn.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n this.switchToIframeLibraryTab(root);\n\n let uploadUrl = '';\n const ltiConfig = getLti(this.editor);\n\n if (ltiConfig && ltiConfig.contentItemUrl) {\n try {\n const urlObj = new URL(ltiConfig.contentItemUrl);\n urlObj.searchParams.set('action', 'upload');\n uploadUrl = urlObj.toString();\n } catch (err) {\n // eslint-disable-next-line no-unused-vars\n }\n }\n\n if (!uploadUrl) {\n let baseUrl = '';\n try {\n const editorData = getData(this.editor);\n if (editorData && editorData.mediacmsBaseUrl) {\n baseUrl = editorData.mediacmsBaseUrl;\n }\n } catch (err) {\n // eslint-disable-next-line no-unused-vars\n }\n\n if (!baseUrl) {\n try {\n const urlObj = new URL(this.iframeLibraryUrl);\n baseUrl = `${urlObj.protocol}//${urlObj.host}`;\n } catch (err) {\n // eslint-disable-next-line no-unused-vars\n }\n }\n\n baseUrl = baseUrl.replace(/\\/$/, '');\n uploadUrl = baseUrl ? `${baseUrl}/upload` : '';\n }\n\n if (uploadUrl) {\n const pane = form.querySelector(Selectors.IFRAME.elements.paneIframeLibrary);\n if (pane) {\n const iframeEl = pane.querySelector(Selectors.IFRAME.elements.iframeLibraryFrame);\n const placeholderEl = pane.querySelector(Selectors.IFRAME.elements.iframeLibraryPlaceholder);\n const loadingEl = pane.querySelector(Selectors.IFRAME.elements.iframeLibraryLoading);\n\n if (placeholderEl) {\n placeholderEl.classList.add('d-none');\n }\n if (loadingEl) {\n loadingEl.classList.remove('d-none');\n }\n if (iframeEl) {\n iframeEl.classList.add('d-none');\n\n const loadHandler = () => {\n this.handleIframeLibraryLoad(root);\n iframeEl.removeEventListener('load', loadHandler);\n };\n iframeEl.addEventListener('load', loadHandler);\n iframeEl.src = uploadUrl;\n }\n }\n }\n });\n }\n\n this.registerIframeLibraryEventListeners(root);\n\n if (this.isUpdating) {\n setTimeout(() => this.updatePreview(root), 100);\n } else {\n setTimeout(() => this.handleIframeLibraryTabClick(root), 100);\n }\n }\n\n switchToUrlTab(root) {\n const form = root.querySelector(Selectors.IFRAME.elements.form);\n\n const urlTabBtn = form.querySelector(\n Selectors.IFRAME.elements.tabUrlBtn,\n );\n const urlTabItem = form.querySelector('.tiny_iframecms_tab_url_item');\n const iframeLibraryTabBtn = form.querySelector(\n Selectors.IFRAME.elements.tabIframeLibraryBtn,\n );\n\n const urlPane = form.querySelector(Selectors.IFRAME.elements.paneUrl);\n const iframeLibraryPane = form.querySelector(\n Selectors.IFRAME.elements.paneIframeLibrary,\n );\n\n if (urlTabItem) {\n urlTabItem.style.display = '';\n }\n\n if (urlTabBtn) {\n urlTabBtn.classList.add('active');\n urlTabBtn.setAttribute('aria-selected', 'true');\n }\n if (iframeLibraryTabBtn) {\n iframeLibraryTabBtn.classList.remove('active');\n iframeLibraryTabBtn.setAttribute('aria-selected', 'false');\n }\n\n if (urlPane) {\n urlPane.classList.add('show', 'active');\n }\n if (iframeLibraryPane) {\n iframeLibraryPane.classList.remove('show', 'active');\n }\n }\n\n switchToIframeLibraryTab(root) {\n const form = root.querySelector(Selectors.IFRAME.elements.form);\n\n const urlTabBtn = form.querySelector(\n Selectors.IFRAME.elements.tabUrlBtn,\n );\n const urlTabItem = form.querySelector('.tiny_iframecms_tab_url_item');\n const iframeLibraryTabBtn = form.querySelector(\n Selectors.IFRAME.elements.tabIframeLibraryBtn,\n );\n\n const urlPane = form.querySelector(Selectors.IFRAME.elements.paneUrl);\n const iframeLibraryPane = form.querySelector(\n Selectors.IFRAME.elements.paneIframeLibrary,\n );\n\n if (urlTabItem) {\n urlTabItem.style.display = 'none';\n }\n\n if (urlTabBtn) {\n urlTabBtn.classList.remove('active');\n urlTabBtn.setAttribute('aria-selected', 'false');\n }\n if (iframeLibraryTabBtn) {\n iframeLibraryTabBtn.classList.add('active');\n iframeLibraryTabBtn.setAttribute('aria-selected', 'true');\n }\n\n if (urlPane) {\n urlPane.classList.remove('show', 'active');\n }\n if (iframeLibraryPane) {\n iframeLibraryPane.classList.add('show', 'active');\n }\n }\n\n registerIframeLibraryEventListeners(root) {\n window.addEventListener('message', (event) => {\n this.handleIframeLibraryMessage(root, event);\n });\n }\n\n handleIframeLibraryTabClick(root) {\n this.loadIframeLibrary(root);\n }\n\n loadIframeLibrary(root) {\n const ltiConfig = getLti(this.editor);\n if (ltiConfig?.contentItemUrl) {\n this.loadIframeLibraryViaLti(root);\n } else {\n this.loadIframeLibraryStatic(root);\n }\n }\n\n loadIframeLibraryViaLti(root) {\n const form = root.querySelector(Selectors.IFRAME.elements.form);\n const pane = form.querySelector(\n Selectors.IFRAME.elements.paneIframeLibrary,\n );\n\n if (!pane) {\n return;\n }\n\n const placeholderEl = pane.querySelector(\n Selectors.IFRAME.elements.iframeLibraryPlaceholder,\n );\n const loadingEl = pane.querySelector(\n Selectors.IFRAME.elements.iframeLibraryLoading,\n );\n const iframeEl = pane.querySelector(\n Selectors.IFRAME.elements.iframeLibraryFrame,\n );\n\n if (!iframeEl) {\n return;\n }\n\n if (placeholderEl) {\n placeholderEl.classList.add('d-none');\n }\n if (loadingEl) {\n loadingEl.classList.remove('d-none');\n }\n iframeEl.classList.add('d-none');\n\n const loadHandler = () => {\n this.handleIframeLibraryLoad(root);\n };\n iframeEl.addEventListener('load', loadHandler);\n\n const ltiConfig = getLti(this.editor);\n iframeEl.src = ltiConfig.contentItemUrl;\n }\n\n loadIframeLibraryStatic(root) {\n const form = root.querySelector(Selectors.IFRAME.elements.form);\n const pane = form.querySelector(\n Selectors.IFRAME.elements.paneIframeLibrary,\n );\n\n if (!pane) {\n return;\n }\n\n const placeholderEl = pane.querySelector(\n Selectors.IFRAME.elements.iframeLibraryPlaceholder,\n );\n const loadingEl = pane.querySelector(\n Selectors.IFRAME.elements.iframeLibraryLoading,\n );\n const iframeEl = pane.querySelector(\n Selectors.IFRAME.elements.iframeLibraryFrame,\n );\n\n if (!iframeEl) {\n return;\n }\n\n if (placeholderEl) {\n placeholderEl.classList.add('d-none');\n }\n if (loadingEl) {\n loadingEl.classList.remove('d-none');\n }\n iframeEl.classList.add('d-none');\n\n const loadHandler = () => {\n if (iframeEl.src === this.iframeLibraryUrl) {\n this.handleIframeLibraryLoad(root);\n iframeEl.removeEventListener('load', loadHandler);\n }\n };\n iframeEl.addEventListener('load', loadHandler);\n\n iframeEl.src = this.iframeLibraryUrl;\n }\n\n handleIframeLibraryLoad(root) {\n const form = root.querySelector(Selectors.IFRAME.elements.form);\n const pane = form.querySelector(\n Selectors.IFRAME.elements.paneIframeLibrary,\n );\n\n if (!pane) {\n return;\n }\n\n const placeholderEl = pane.querySelector(\n Selectors.IFRAME.elements.iframeLibraryPlaceholder,\n );\n const loadingEl = pane.querySelector(\n Selectors.IFRAME.elements.iframeLibraryLoading,\n );\n const iframeEl = pane.querySelector(\n Selectors.IFRAME.elements.iframeLibraryFrame,\n );\n\n if (placeholderEl) {\n placeholderEl.classList.add('d-none');\n }\n if (loadingEl) {\n loadingEl.classList.add('d-none');\n }\n if (iframeEl) {\n iframeEl.classList.remove('d-none');\n }\n }\n\n handleIframeLibraryMessage(root, event) {\n const data = event.data;\n\n if (!data) {\n return;\n }\n\n if (data.type === 'videoSelected' && data.embedUrl) {\n this.selectIframeLibraryVideo(root, data.embedUrl, data.videoId);\n return;\n }\n\n if (\n data.type === 'ltiDeepLinkingResponse' ||\n data.messageType === 'LtiDeepLinkingResponse'\n ) {\n const contentItems = data.content_items || data.contentItems || [];\n if (contentItems.length > 0) {\n const item = contentItems[0];\n const embedUrl =\n item.url || item.embed_url || item.embedUrl || '';\n const videoId = item.id || item.mediaId || '';\n if (embedUrl) {\n this.selectIframeLibraryVideo(root, embedUrl, videoId);\n }\n }\n return;\n }\n\n if (data.action === 'selectMedia' || data.action === 'mediaSelected') {\n const embedUrl = data.embedUrl || data.url || '';\n if (embedUrl) {\n this.selectIframeLibraryVideo(root, embedUrl);\n }\n return;\n }\n }\n\n selectIframeLibraryVideo(root, embedUrl) {\n const form = root.querySelector(Selectors.IFRAME.elements.form);\n\n const urlInput = form.querySelector(Selectors.IFRAME.elements.url);\n urlInput.value = embedUrl;\n\n const configureTabItem = root.querySelector('.tiny_iframecms_tab_url_item');\n if (configureTabItem) {\n configureTabItem.style.display = '';\n }\n\n this.switchToUrlTab(root);\n this.updatePreview(root);\n }\n}\n"],"names":["constructor","editor","parseInput","input","trim","iframeMatch","match","this","parseEmbedUrl","startsWith","parseVideoUrl","url","urlObj","URL","baseUrl","protocol","host","pathname","searchParams","has","videoId","get","isEmbed","tParam","widthParam","heightParam","showTitle","linkTitle","showUserAvatar","width","parseInt","height","startAt","secondsToTimeString","includes","rawUrl","isLtiLaunch","isGeneric","e","seconds","mins","Math","floor","secs","toString","padStart","timeStringToSeconds","timeStr","parts","split","isNaN","parseWidthHeight","value","parsed","computeAspectRatioCSS","values","w","h","buildEmbedUrl","options","token","courseid","search","set","startAtEnabled","data","editorData","autoConvertOptions","getDefault","key","fallback","_this","isUpdating","undefined","elementid","getElement","id","isupdating","textLinkOnly","selectedIframe","getSelectedIframe","getCurrentIframeData","currentModal","IframeModal","create","title","component","templateContext","getTemplateContext","registerEventListeners","node","selection","getNode","nodeName","toLowerCase","getAttribute","iframe","querySelector","wrapper","closest","textLink","href","responsive","src","style","maxWidthMatch","aspectRatioMatch","maxWidth","rw","parseFloat","rh","round","getFormValues","root","form","Selectors","IFRAME","elements","checked","viewUrl","linkText","str","div","document","createElement","textContent","innerHTML","escapeHtml","hrefUrl","replace","context","aspectRatioCSS","html","Templates","renderForPromise","updateUrlField","previewContainer","preview","urlWarning","classList","add","remove","embedUrl","previewWidth","min","previewHeight","handleInputChange","clearTimeout","debounceTimer","setTimeout","updatePreview","handleWidthChange","widthInput","heightInput","newWidth","handleHeightChange","modal","getRoot","generateIframeHtml","paragraphWrapper","outerHTML","getBody","querySelectorAll","forEach","p","fire","insertContent","confirmMessage","window","confirm","hide","$root","addEventListener","selector","on","ModalEvents","save","handleDialogueSubmission","hidden","destroy","removeBtn","actions","handleRemove","iframeLibraryTabBtn","tabIframeLibraryBtn","preventDefault","stopPropagation","switchToIframeLibraryTab","handleIframeLibraryTabClick","$iframeLibraryTabBtn","jQuery","urlTabBtn","tabUrlBtn","switchToUrlTab","uploadMediaBtn","tabUploadMediaBtn","uploadUrl","ltiConfig","contentItemUrl","err","mediacmsBaseUrl","iframeLibraryUrl","pane","paneIframeLibrary","iframeEl","iframeLibraryFrame","placeholderEl","iframeLibraryPlaceholder","loadingEl","iframeLibraryLoading","loadHandler","handleIframeLibraryLoad","removeEventListener","registerIframeLibraryEventListeners","urlTabItem","urlPane","paneUrl","iframeLibraryPane","display","setAttribute","event","handleIframeLibraryMessage","loadIframeLibrary","loadIframeLibraryViaLti","loadIframeLibraryStatic","type","selectIframeLibraryVideo","messageType","action","contentItems","content_items","length","item","embed_url","mediaId","configureTabItem"],"mappings":"wpDAiBIA,YAAYC,sCARH,0CACM,yCACF,yCACI,2CACD,8CAEZ,yEAGKA,OAASA,OAGlBC,WAAWC,WACFA,QAAUA,MAAMC,cACV,WAKLC,aAFNF,MAAQA,MAAMC,QAEYE,MACtB,kDAEAD,YACOE,KAAKC,cAAcH,YAAY,IAGtCF,MAAMM,WAAW,YAAcN,MAAMM,WAAW,YACzCF,KAAKG,cAAcP,OAGvB,KAGXO,cAAcC,eAEAC,OAAS,IAAIC,IAAIF,KACjBG,kBAAaF,OAAOG,sBAAaH,OAAOI,SAEtB,UAApBJ,OAAOK,UAAwBL,OAAOM,aAAaC,IAAI,WAChD,CACHL,QAASA,QACTM,QAASR,OAAOM,aAAaG,IAAI,KACjCC,SAAS,MAIO,WAApBV,OAAOK,UAAyBL,OAAOM,aAAaC,IAAI,KAAM,OACxDI,OAASX,OAAOM,aAAaG,IAAI,KACjCG,WAAaZ,OAAOM,aAAaG,IAAI,SACrCI,YAAcb,OAAOM,aAAaG,IAAI,gBACrC,CACHP,QAASA,QACTM,QAASR,OAAOM,aAAaG,IAAI,KACjCC,SAAS,EACTI,UAAoD,MAAzCd,OAAOM,aAAaG,IAAI,aACnCM,UAAoD,MAAzCf,OAAOM,aAAaG,IAAI,aACnCO,eACkD,MAA9ChB,OAAOM,aAAaG,IAAI,kBAC5BQ,MAAOL,WAAaM,SAASN,YAAc,KAC3CO,OAAQN,YAAcK,SAASL,aAAe,KAC9CO,QAAST,OACHhB,KAAK0B,oBAAoBH,SAASP,SAClC,SAIVX,OAAOK,SAASiB,SAAS,gCAAkCtB,OAAOM,aAAaC,IAAI,SAAU,OACvFI,OAASX,OAAOM,aAAaG,IAAI,KACjCG,WAAaZ,OAAOM,aAAaG,IAAI,SACrCI,YAAcb,OAAOM,aAAaG,IAAI,gBAErC,CACHP,QAASA,QACTM,QAASR,OAAOM,aAAaG,IAAI,SACjCc,OAAQxB,IACRyB,aAAa,EACbV,UAAoD,MAAzCd,OAAOM,aAAaG,IAAI,aACnCM,UAAoD,MAAzCf,OAAOM,aAAaG,IAAI,aACnCO,eAA8D,MAA9ChB,OAAOM,aAAaG,IAAI,kBACxCQ,MAAOL,WAAaM,SAASN,YAAc,KAC3CO,OAAQN,YAAcK,SAASL,aAAe,KAC9CO,QAAST,OAAShB,KAAK0B,oBAAoBH,SAASP,SAAW,YAIhE,CACHT,QAASA,QACTqB,OAAQxB,IACR0B,WAAW,GAEjB,MAAOC,UACE,MAIf9B,cAAcG,YACHJ,KAAKG,cAAcC,KAG9BsB,oBAAoBM,eACVC,KAAOC,KAAKC,MAAMH,QAAU,IAC5BI,KAAOJ,QAAU,mBACbC,iBAAQG,KAAKC,WAAWC,SAAS,EAAG,MAGlDC,oBAAoBC,aACXA,UAAYA,QAAQ3C,cACd,SAEX2C,QAAUA,QAAQ3C,QAEN8B,SAAS,KAAM,OACjBc,MAAQD,QAAQE,MAAM,YAGd,IAFDnB,SAASkB,MAAM,KAAO,IACtBlB,SAASkB,MAAM,KAAO,SAIjCL,KAAOb,SAASiB,gBACfG,MAAMP,MAAQ,KAAOA,KAGhCQ,iBAAiBC,WACRA,aACM,WAELC,OAASvB,SAASsB,MAAMhD,eACvB8C,MAAMG,QAAU,KAAOA,OAGlCC,sBAAsBC,cACZC,EAAID,OAAO1B,OAAS,IACpB4B,EAAIF,OAAOxB,QAAU,oBACjByB,gBAAOC,GAGrBC,cAAcL,OAAQM,YACdN,OAAOhB,iBACAgB,OAAOlB,WAGdxB,OACA0C,OAAOjB,YAAa,CACpBzB,IAAM,IAAIE,IAAIwC,OAAOlB,cACfyB,MAAQjD,IAAIO,aAAaG,IAAI,SAC7BwC,SAAWlD,IAAIO,aAAaG,IAAI,YACtCV,IAAImD,OAAS,GACbnD,IAAIO,aAAa6C,IAAI,QAASH,OAC1BC,UACAlD,IAAIO,aAAa6C,IAAI,WAAYF,eAGrClD,IAAM,IAAIE,cAAOwC,OAAOvC,mBACxBH,IAAIO,aAAa6C,IAAI,IAAKV,OAAOjC,YAGrCT,IAAIO,aAAa6C,IAAI,YAAaJ,QAAQjC,UAAY,IAAM,KAC5Df,IAAIO,aAAa6C,IACb,iBACAJ,QAAQ/B,eAAiB,IAAM,KAEnCjB,IAAIO,aAAa6C,IAAI,YAAaJ,QAAQhC,UAAY,IAAM,KAExDgC,QAAQK,gBAAkBL,QAAQ3B,QAAS,OACrCO,QAAUhC,KAAKuC,oBAAoBa,QAAQ3B,SACjC,OAAZO,SAAoBA,QAAU,GAC9B5B,IAAIO,aAAa6C,IAAI,IAAKxB,QAAQK,mBAItCe,QAAQ9B,OACRlB,IAAIO,aAAa6C,IAAI,QAASJ,QAAQ9B,OAEtC8B,QAAQ5B,QACRpB,IAAIO,aAAa6C,IAAI,SAAUJ,QAAQ5B,QAGpCpB,IAAIiC,yDAGUqB,4DAAO,SACtBC,YAAa,oBAAQ3D,KAAKN,QAC1BkE,oBAAqBD,MAAAA,kBAAAA,WAAYC,qBAAsB,GAEvDC,WAAa,SAACC,SAAKC,2EACjBC,MAAKC,iBAA4BC,IAAdR,KAAKI,KACjBJ,KAAKI,UAEmBI,IAA5BN,mBAAmBE,KACpBF,mBAAmBE,KACnBC,UAGJzC,MAAStB,KAAKiE,YAAcP,KAAKpC,MAASoC,KAAKpC,MAAQ,IACvDE,OAAUxB,KAAKiE,YAAcP,KAAKlC,OAAUkC,KAAKlC,OAAS,UAEzD,CACH2C,UAAWnE,KAAKN,OAAO0E,aAAaC,GACpCC,WAAYtE,KAAKiE,WACjB7D,IAAKsD,KAAKtD,KAAO,GACjBe,UAAW0C,WAAW,aACtBzC,UAAWyC,WAAW,aACtBxC,eAAgBwC,WAAW,kBAC3BU,aAAcb,KAAKa,eAAgB,EACnCd,eAAgBC,KAAKD,iBAAkB,EACvChC,QAASiC,KAAKjC,SAAW,OACzBH,MAAAA,MACAE,OAAAA,qCAKCgD,eAAiBxE,KAAKyE,0BACrBf,KAAO1D,KAAK0E,4BACbT,WAAsB,OAATP,UAEbiB,mBAAqBC,qBAAYC,OAAO,CACzCC,OAAO,kBAAU,mBAAoBC,mBACrCC,sBAAuBhF,KAAKiF,mBAAmBvB,MAAQ,YAGrD1D,KAAKkF,uBAAuBlF,KAAK2E,cAG3CF,0BACUU,KAAOnF,KAAKN,OAAO0F,UAAUC,aAEC,MAAhCF,KAAKG,SAASC,eAAyE,SAAhDJ,KAAKK,aAAa,iCAClDL,QAGyB,WAAhCA,KAAKG,SAASC,qBACPJ,WAGLM,OAASN,KAAKO,cAAc,aAC9BD,cACOA,aAGLE,QACFR,KAAKS,QAAQ,kCACbT,KAAKS,QAAQ,8BACbD,eACOA,QAAQD,cAAc,gBAG3BG,SAAWV,KAAKS,QAAQ,2CAC1BC,UAIG,KAGXnB,4FACS1E,KAAKwE,sBACC,QAGwC,MAA/CxE,KAAKwE,eAAec,SAASC,eACkC,SAA/DvF,KAAKwE,eAAegB,aAAa,0BAAsC,qEACjEM,KAAO9F,KAAKwE,eAAegB,aAAa,QACxC1C,OAAS9C,KAAKL,WAAWmG,YAExB,CACH1F,IAAK0F,KACLxE,OAAOwB,MAAAA,cAAAA,OAAQxB,QAAS,IACxBE,QAAQsB,MAAAA,cAAAA,OAAQtB,SAAU,IAC1BL,oCAAW2B,MAAAA,cAAAA,OAAQ3B,0DACnBC,oCAAW0B,MAAAA,cAAAA,OAAQ1B,0DACnBC,6CAAgByB,MAAAA,cAAAA,OAAQzB,uEACxB0E,YAAY,EACZxB,cAAc,EACdd,eAAoC,QAApBX,MAAAA,cAAAA,OAAQrB,SACxBA,SAASqB,MAAAA,cAAAA,OAAQrB,UAAW,cAI9BuE,IAAMhG,KAAKwE,eAAegB,aAAa,OACvC1C,OAAS9C,KAAKL,WAAWqG,KAGzBC,MAAQjG,KAAKwE,eAAegB,aAAa,UAAY,GACrDU,cAAgBD,MAAMlG,MAAM,kCAC5BoG,iBAAmBF,MAAMlG,MAAM,0DAE/BqG,SAAWF,cAAgB3E,SAAS2E,cAAc,IAAM,QAC1D1E,OAAS,OAET2E,iBAAkB,OACZE,GAAKC,WAAWH,iBAAiB,IACjCI,GAAKD,WAAWH,iBAAiB,IACnCE,GAAK,IACL7E,OAASU,KAAKsE,MAAMJ,SAAWG,GAAKF,WAIrC,CACHjG,IAAK4F,IACL1E,MAAO8E,SACP5E,OAAAA,OACAL,qCAAW2B,MAAAA,cAAAA,OAAQ3B,4DACnBC,qCAAW0B,MAAAA,cAAAA,OAAQ1B,4DACnBC,8CAAgByB,MAAAA,cAAAA,OAAQzB,yEACxBoC,iBAAmBX,MAAAA,SAAAA,OAAQrB,SAC3BA,SAASqB,MAAAA,cAAAA,OAAQrB,UAAW,QAIpCgF,cAAcC,YACJC,KAAOD,KAAKhB,cAAckB,mBAAUC,OAAOC,SAASH,YAEnD,CACHvG,IAAKuG,KAAKjB,cAAckB,mBAAUC,OAAOC,SAAS1G,KAAKyC,MAAMhD,OAC7DsB,UAAWwF,KAAKjB,cAAckB,mBAAUC,OAAOC,SAAS3F,WACnD4F,QACL3F,UAAWuF,KAAKjB,cAAckB,mBAAUC,OAAOC,SAAS1F,WACnD2F,QACL1F,eAAgBsF,KAAKjB,cACjBkB,mBAAUC,OAAOC,SAASzF,gBAC5B0F,QACFxC,aAAcoC,KAAKjB,cAAckB,mBAAUC,OAAOC,SAASvC,cACtDwC,QACLtD,eAAgBkD,KAAKjB,cACjBkB,mBAAUC,OAAOC,SAASrD,gBAC5BsD,QACFtF,QAASkF,KACJjB,cAAckB,mBAAUC,OAAOC,SAASrF,SACxCoB,MAAMhD,OACXyB,MAAOtB,KAAK4C,iBACR+D,KAAKjB,cAAckB,mBAAUC,OAAOC,SAASxF,OAAOuB,OAExDrB,OAAQxB,KAAK4C,iBACT+D,KAAKjB,cAAckB,mBAAUC,OAAOC,SAAStF,QAAQqB,iCAKxCG,cACfF,OAAS9C,KAAKL,WAAWqD,OAAO5C,SACjC0C,aACM,MAGPE,OAAOuB,aAAc,KACjByC,QAEAA,QADAlE,OAAOhB,WAAagB,OAAOjB,YACjBiB,OAAOlB,iBAEJkB,OAAOvC,2BAAkBuC,OAAOjC,eAS3CoG,SANcC,CAAAA,YACVC,IAAMC,SAASC,cAAc,cACnCF,IAAIG,YAAcJ,IACXC,IAAII,WAGEC,CAAWR,SACtBS,QAAUT,QAAQU,QAAQ,KAAM,sCAEhBD,mEAA0DR,2BAK9EU,QAAU,CACZ3B,IAHahG,KAAKmD,cAAcL,OAAQE,QAIxCoD,SAAUpD,OAAO1B,OAAS,IAC1BE,OAAQwB,OAAOxB,QAAU,IACzBoG,eAAgB5H,KAAK+C,sBAAsBC,UAGzC6E,KAAEA,YAAeC,mBAAUC,iBAC7B,oCACAJ,gBAEGE,yBAGSnB,UAAMsB,6EAChBhF,OAAShD,KAAKyG,cAAcC,MAC5BuB,iBAAmBvB,KAAKhB,cAC1BkB,mBAAUC,OAAOC,SAASoB,SAExBC,WAAazB,KAAKhB,cACpBkB,mBAAUC,OAAOC,SAASqB,gBAGzBnF,OAAO5C,WACR6H,iBAAiBV,UACb,wEACJY,WAAWC,UAAUC,IAAI,gBAIvBvF,OAAS9C,KAAKL,WAAWqD,OAAO5C,SACjC0C,cACDmF,iBAAiBV,UACb,2DACJY,WAAWC,UAAUE,OAAO,UAIhCH,WAAWC,UAAUC,IAAI,gBACnBE,SAAWvI,KAAKmD,cAAcL,OAAQE,WAExCgF,iBAAmBlF,OAAOhB,UAAW,CACxB4E,KAAKhB,cAAckB,mBAAUC,OAAOC,SAASH,MACpCjB,cAAckB,mBAAUC,OAAOC,SAAS1G,KACrDyC,MAAQ0F,YAGjBvF,OAAOuB,aAAc,KACjByC,QAEAA,QADAlE,OAAOhB,WAAagB,OAAOjB,YACjBiB,OAAOlB,iBAEJkB,OAAOvC,2BAAkBuC,OAAOjC,eAS3CoG,SANcC,CAAAA,YACVC,IAAMC,SAASC,cAAc,cACnCF,IAAIG,YAAcJ,IACXC,IAAII,WAGEC,CAAWR,SACtBS,QAAUT,QAAQU,QAAQ,KAAM,UAEtCO,iBAAiBV,gKAGEE,mEAA0DR,2DAG1E,OACGuB,aAAetG,KAAKuG,IAAIzF,OAAO1B,OAAS,IAAK,KAC7CoH,cAAgBxG,KAAKsE,MAAMgC,cAAgBxF,OAAOxB,QAAU,MAAQwB,OAAO1B,OAAS,MAE1F2G,iBAAiBV,wEAEFgB,kDACEC,uDACCE,6LAS1BC,kBAAkBjC,UAAMsB,uEACpBY,aAAa5I,KAAK6I,oBACbA,cAAgBC,YAAW,UACvBC,cAAcrC,KAAMsB,kBAC1B,KAGPgB,kBAAkBtC,YACRC,KAAOD,KAAKhB,cAAckB,mBAAUC,OAAOC,SAASH,MACpDsC,WAAatC,KAAKjB,cAAckB,mBAAUC,OAAOC,SAASxF,OAC1D4H,YAAcvC,KAAKjB,cAAckB,mBAAUC,OAAOC,SAAStF,QAC3D2H,SAAW5H,SAAS0H,WAAWpG,QAChCF,MAAMwG,WAAaA,SAAW,IAC/BD,YAAYrG,MAAQX,KAAKsE,MAAiB,EAAX2C,SAAe,UAE7CR,kBAAkBjC,MAG3B0C,mBAAmB1C,WACViC,kBAAkBjC,qCAGI2C,aACrB3C,KAAO2C,MAAMC,UAAU,GACvBtG,OAAShD,KAAKyG,cAAcC,UAE7B1D,OAAO5C,iBAINyH,WAAa7H,KAAKuJ,mBAAmBvG,WACvC6E,QACI7H,KAAKiE,YAAcjE,KAAKwE,eAAgB,OAClCmB,QACF3F,KAAKwE,eAAeoB,QAChB,kCACC5F,KAAKwE,eAAeoB,QAAQ,2BAE/B4D,iBAAmB7D,QAAUA,QAAQC,QAAQ,KAAO5F,KAAKwE,eAAeoB,QAAQ,KAElF4D,iBACAA,iBAAiBC,UAAY5B,KACtBlC,QACPA,QAAQ8D,UAAY5B,UAEfrD,eAAeiF,UAAY5B,UAE/B5D,YAAa,EAElB6E,YAAW,KACM9I,KAAKN,OAAOgK,UACJC,iBAAiB,oBAC9BC,SAAQC,IACe,KAAvBA,EAAEtC,UAAU1H,QAAiC,SAAhBgK,EAAEtC,WAC/BsC,EAAEvB,cAGX,SAEE5I,OAAOoK,KAAK,cACd,OACG3E,KAAOnF,KAAKN,OAAO0F,UAAUC,UACb,MAAlBF,KAAKG,UAA8C,KAA1BH,KAAKoC,UAAU1H,OACxCsF,KAAKsE,UAAY5B,UAEZnI,OAAOqK,cAAclC,MAE9BiB,YAAW,KACM9I,KAAKN,OAAOgK,UACpBC,iBAAiB,KAAKC,SAAQC,IACJ,KAAvBA,EAAEtC,UAAU1H,QAAiC,SAAhBgK,EAAEtC,WAC/BsC,EAAEvB,cAGX,wBAKIe,aACTW,qBAAuB,kBACzB,sBACAjF,sBAICkF,OAAOC,QAAQF,oBAIhBhK,KAAKwE,eAAgB,OACfmB,QACF3F,KAAKwE,eAAeoB,QAAQ,kCAC5B5F,KAAKwE,eAAeoB,QAAQ,2BAC5BD,QACAA,QAAQ2C,cAEH9D,eAAe8D,cAIvBrE,YAAa,EAClBoF,MAAMc,qCAGmBd,aACnBA,MAAMK,gBACNU,MAAQf,MAAMC,UACd5C,KAAO0D,MAAM,GAEbzD,KAAOD,KAAKhB,cAAckB,mBAAUC,OAAOC,SAASH,MAE1DA,KAAKjB,cAAckB,mBAAUC,OAAOC,SAAS1G,KAAKiK,iBAC9C,SACA,IAAMrK,KAAK2I,kBAAkBjC,SAI7BE,mBAAUC,OAAOC,SAAS3F,UAC1ByF,mBAAUC,OAAOC,SAAS1F,UAC1BwF,mBAAUC,OAAOC,SAASzF,eAC1BuF,mBAAUC,OAAOC,SAASrD,gBAC5BmG,SAASU,WACP3D,KAAKjB,cAAc4E,UAAUD,iBAAiB,UAAU,IACpDrK,KAAK2I,kBAAkBjC,MAAM,QAIrCC,KAAKjB,cAAckB,mBAAUC,OAAOC,SAASvC,cAAc8F,iBAAiB,UAAU,IAClFrK,KAAK2I,kBAAkBjC,MAAM,KAGjCC,KAAKjB,cAAckB,mBAAUC,OAAOC,SAASrF,SAAS4I,iBAClD,SACA,IAAMrK,KAAK2I,kBAAkBjC,MAAM,KAGvCC,KAAKjB,cAAckB,mBAAUC,OAAOC,SAASxF,OAAO+I,iBAChD,SACA,IAAMrK,KAAKgJ,kBAAkBtC,QAEjCC,KAAKjB,cAAckB,mBAAUC,OAAOC,SAAStF,QAAQ6I,iBACjD,SACA,IAAMrK,KAAKoJ,mBAAmB1C,QAGlC0D,MAAMG,GAAGC,YAAYC,MAAM,IAAMzK,KAAK0K,yBAAyBrB,SAC/De,MAAMG,GAAGC,YAAYG,QAAQ,UACpBhG,aAAaiG,mBAGhBC,UAAYnE,KAAKhB,cAAckB,mBAAUC,OAAOiE,QAAQxC,QAC1DuC,WACAA,UAAUR,iBAAiB,SAAS,IAAMrK,KAAK+K,aAAa1B,SAG/C1C,KAAKjB,cAAckB,mBAAUC,OAAOC,SAAS1G,KACjDyC,YACJkG,cAAcrC,YAGjBsE,oBAAsBrE,KAAKjB,cAC7BkB,mBAAUC,OAAOC,SAASmE,wBAE1BD,oBAAqB,CACrBA,oBAAoBX,iBAAiB,SAAUtI,IAC3CA,EAAEmJ,iBACFnJ,EAAEoJ,uBAEGC,yBAAyB1E,MAE9BoC,YAAW,IAAM9I,KAAKqL,4BAA4B3E,OAAO,QAE7DsE,oBAAoBX,iBAAiB,gBAAgB,IACjDrK,KAAKqL,4BAA4B3E,cAE/B4E,qBAAuBrB,OAAOsB,OAC9BtB,OAAOsB,OAAOP,qBACd,KACFM,sBACAA,qBAAqBf,GAAG,gBAAgB,IACpCvK,KAAKqL,4BAA4B3E,cAKvC8E,UAAY7E,KAAKjB,cACnBkB,mBAAUC,OAAOC,SAAS2E,WAE1BD,WACAA,UAAUnB,iBAAiB,SAAUtI,IACjCA,EAAEmJ,iBACFnJ,EAAEoJ,uBAEGO,eAAehF,eAItBiF,eAAiBhF,KAAKjB,cACxBkB,mBAAUC,OAAOC,SAAS8E,mBAE1BD,gBACAA,eAAetB,iBAAiB,SAAUtI,IACtCA,EAAEmJ,iBACFnJ,EAAEoJ,uBAEGC,yBAAyB1E,UAE1BmF,UAAY,SACVC,WAAY,mBAAO9L,KAAKN,WAE1BoM,WAAaA,UAAUC,yBAEb1L,OAAS,IAAIC,IAAIwL,UAAUC,gBACjC1L,OAAOM,aAAa6C,IAAI,SAAU,UAClCqI,UAAYxL,OAAOgC,WACrB,MAAO2J,UAKRH,UAAW,KACRtL,QAAU,aAEJoD,YAAa,oBAAQ3D,KAAKN,QAC5BiE,YAAcA,WAAWsI,kBACzB1L,QAAUoD,WAAWsI,iBAE3B,MAAOD,UAIJzL,kBAESF,OAAS,IAAIC,IAAIN,KAAKkM,kBAC5B3L,kBAAaF,OAAOG,sBAAaH,OAAOI,MAC1C,MAAOuL,MAKbzL,QAAUA,QAAQmH,QAAQ,MAAO,IACjCmE,UAAYtL,kBAAaA,mBAAmB,MAG5CsL,UAAW,OACLM,KAAOxF,KAAKjB,cAAckB,mBAAUC,OAAOC,SAASsF,sBACtDD,KAAM,OACAE,SAAWF,KAAKzG,cAAckB,mBAAUC,OAAOC,SAASwF,oBACxDC,cAAgBJ,KAAKzG,cAAckB,mBAAUC,OAAOC,SAAS0F,0BAC7DC,UAAYN,KAAKzG,cAAckB,mBAAUC,OAAOC,SAAS4F,yBAE3DH,eACAA,cAAcnE,UAAUC,IAAI,UAE5BoE,WACAA,UAAUrE,UAAUE,OAAO,UAE3B+D,SAAU,CACVA,SAASjE,UAAUC,IAAI,gBAEjBsE,YAAc,UACXC,wBAAwBlG,MAC7B2F,SAASQ,oBAAoB,OAAQF,cAEzCN,SAAShC,iBAAiB,OAAQsC,aAClCN,SAASrG,IAAM6F,qBAO9BiB,oCAAoCpG,MAErC1G,KAAKiE,WACL6E,YAAW,IAAM9I,KAAK+I,cAAcrC,OAAO,KAE3CoC,YAAW,IAAM9I,KAAKqL,4BAA4B3E,OAAO,KAIjEgF,eAAehF,YACLC,KAAOD,KAAKhB,cAAckB,mBAAUC,OAAOC,SAASH,MAEpD6E,UAAY7E,KAAKjB,cACnBkB,mBAAUC,OAAOC,SAAS2E,WAExBsB,WAAapG,KAAKjB,cAAc,gCAChCsF,oBAAsBrE,KAAKjB,cAC7BkB,mBAAUC,OAAOC,SAASmE,qBAGxB+B,QAAUrG,KAAKjB,cAAckB,mBAAUC,OAAOC,SAASmG,SACvDC,kBAAoBvG,KAAKjB,cAC3BkB,mBAAUC,OAAOC,SAASsF,mBAG1BW,aACAA,WAAW9G,MAAMkH,QAAU,IAG3B3B,YACAA,UAAUpD,UAAUC,IAAI,UACxBmD,UAAU4B,aAAa,gBAAiB,SAExCpC,sBACAA,oBAAoB5C,UAAUE,OAAO,UACrC0C,oBAAoBoC,aAAa,gBAAiB,UAGlDJ,SACAA,QAAQ5E,UAAUC,IAAI,OAAQ,UAE9B6E,mBACAA,kBAAkB9E,UAAUE,OAAO,OAAQ,UAInD8C,yBAAyB1E,YACfC,KAAOD,KAAKhB,cAAckB,mBAAUC,OAAOC,SAASH,MAEpD6E,UAAY7E,KAAKjB,cACnBkB,mBAAUC,OAAOC,SAAS2E,WAExBsB,WAAapG,KAAKjB,cAAc,gCAChCsF,oBAAsBrE,KAAKjB,cAC7BkB,mBAAUC,OAAOC,SAASmE,qBAGxB+B,QAAUrG,KAAKjB,cAAckB,mBAAUC,OAAOC,SAASmG,SACvDC,kBAAoBvG,KAAKjB,cAC3BkB,mBAAUC,OAAOC,SAASsF,mBAG1BW,aACAA,WAAW9G,MAAMkH,QAAU,QAG3B3B,YACAA,UAAUpD,UAAUE,OAAO,UAC3BkD,UAAU4B,aAAa,gBAAiB,UAExCpC,sBACAA,oBAAoB5C,UAAUC,IAAI,UAClC2C,oBAAoBoC,aAAa,gBAAiB,SAGlDJ,SACAA,QAAQ5E,UAAUE,OAAO,OAAQ,UAEjC4E,mBACAA,kBAAkB9E,UAAUC,IAAI,OAAQ,UAIhDyE,oCAAoCpG,MAChCuD,OAAOI,iBAAiB,WAAYgD,aAC3BC,2BAA2B5G,KAAM2G,UAI9ChC,4BAA4B3E,WACnB6G,kBAAkB7G,MAG3B6G,kBAAkB7G,YACRoF,WAAY,mBAAO9L,KAAKN,QAC1BoM,MAAAA,WAAAA,UAAWC,oBACNyB,wBAAwB9G,WAExB+G,wBAAwB/G,MAIrC8G,wBAAwB9G,YAEdyF,KADOzF,KAAKhB,cAAckB,mBAAUC,OAAOC,SAASH,MACxCjB,cACdkB,mBAAUC,OAAOC,SAASsF,uBAGzBD,kBAICI,cAAgBJ,KAAKzG,cACvBkB,mBAAUC,OAAOC,SAAS0F,0BAExBC,UAAYN,KAAKzG,cACnBkB,mBAAUC,OAAOC,SAAS4F,sBAExBL,SAAWF,KAAKzG,cAClBkB,mBAAUC,OAAOC,SAASwF,wBAGzBD,gBAIDE,eACAA,cAAcnE,UAAUC,IAAI,UAE5BoE,WACAA,UAAUrE,UAAUE,OAAO,UAE/B+D,SAASjE,UAAUC,IAAI,UAKvBgE,SAAShC,iBAAiB,QAHN,UACXuC,wBAAwBlG,eAI3BoF,WAAY,mBAAO9L,KAAKN,QAC9B2M,SAASrG,IAAM8F,UAAUC,eAG7B0B,wBAAwB/G,YAEdyF,KADOzF,KAAKhB,cAAckB,mBAAUC,OAAOC,SAASH,MACxCjB,cACdkB,mBAAUC,OAAOC,SAASsF,uBAGzBD,kBAICI,cAAgBJ,KAAKzG,cACvBkB,mBAAUC,OAAOC,SAAS0F,0BAExBC,UAAYN,KAAKzG,cACnBkB,mBAAUC,OAAOC,SAAS4F,sBAExBL,SAAWF,KAAKzG,cAClBkB,mBAAUC,OAAOC,SAASwF,wBAGzBD,gBAIDE,eACAA,cAAcnE,UAAUC,IAAI,UAE5BoE,WACAA,UAAUrE,UAAUE,OAAO,UAE/B+D,SAASjE,UAAUC,IAAI,gBAEjBsE,YAAc,KACZN,SAASrG,MAAQhG,KAAKkM,wBACjBU,wBAAwBlG,MAC7B2F,SAASQ,oBAAoB,OAAQF,eAG7CN,SAAShC,iBAAiB,OAAQsC,aAElCN,SAASrG,IAAMhG,KAAKkM,iBAGxBU,wBAAwBlG,YAEdyF,KADOzF,KAAKhB,cAAckB,mBAAUC,OAAOC,SAASH,MACxCjB,cACdkB,mBAAUC,OAAOC,SAASsF,uBAGzBD,kBAICI,cAAgBJ,KAAKzG,cACvBkB,mBAAUC,OAAOC,SAAS0F,0BAExBC,UAAYN,KAAKzG,cACnBkB,mBAAUC,OAAOC,SAAS4F,sBAExBL,SAAWF,KAAKzG,cAClBkB,mBAAUC,OAAOC,SAASwF,oBAG1BC,eACAA,cAAcnE,UAAUC,IAAI,UAE5BoE,WACAA,UAAUrE,UAAUC,IAAI,UAExBgE,UACAA,SAASjE,UAAUE,OAAO,UAIlCgF,2BAA2B5G,KAAM2G,aACvB3J,KAAO2J,MAAM3J,QAEdA,QAIa,kBAAdA,KAAKgK,MAA4BhK,KAAK6E,cACjCoF,yBAAyBjH,KAAMhD,KAAK6E,SAAU7E,KAAK7C,iBAK1C,2BAAd6C,KAAKgK,MACgB,2BAArBhK,KAAKkK,eAeW,gBAAhBlK,KAAKmK,QAA4C,kBAAhBnK,KAAKmK,mBAChCtF,SAAW7E,KAAK6E,UAAY7E,KAAKtD,KAAO,GAC1CmI,eACKoF,yBAAyBjH,KAAM6B,qBAhBlCuF,aAAepK,KAAKqK,eAAiBrK,KAAKoK,cAAgB,MAC5DA,aAAaE,OAAS,EAAG,OACnBC,KAAOH,aAAa,GACpBvF,SACF0F,KAAK7N,KAAO6N,KAAKC,WAAaD,KAAK1F,UAAY,GAC7C1H,QAAUoN,KAAK5J,IAAM4J,KAAKE,SAAW,GACvC5F,eACKoF,yBAAyBjH,KAAM6B,SAAU1H,WAe9D8M,yBAAyBjH,KAAM6B,UACd7B,KAAKhB,cAAckB,mBAAUC,OAAOC,SAASH,MAEpCjB,cAAckB,mBAAUC,OAAOC,SAAS1G,KACrDyC,MAAQ0F,eAEX6F,iBAAmB1H,KAAKhB,cAAc,gCACxC0I,mBACAA,iBAAiBnI,MAAMkH,QAAU,SAGhCzB,eAAehF,WACfqC,cAAcrC"} \ No newline at end of file diff --git a/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/options.min.js b/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/options.min.js index ed1f7e68..c21104af 100755 --- a/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/options.min.js +++ b/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/options.min.js @@ -6,6 +6,6 @@ define("tiny_mediacms/options",["exports","editor_tiny/options","./common"],(fun * @copyright 2022 Huong Nguyen * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -const dataName=(0,_options.getPluginOptionName)(_common.pluginName,"data"),permissionsName=(0,_options.getPluginOptionName)(_common.pluginName,"permissions"),ltiName=(0,_options.getPluginOptionName)(_common.pluginName,"lti");_exports.register=editor=>{const registerOption=editor.options.register;registerOption(permissionsName,{processor:"object",default:{image:{filepicker:!1}}}),registerOption(dataName,{processor:"object",default:{mediacmsApiUrl:"",mediacmsBaseUrl:"",mediacmsPageSize:12,autoConvertEnabled:!0,autoConvertBaseUrl:"",autoConvertOptions:{showTitle:!0,linkTitle:!0,showRelated:!0,showUserAvatar:!0}}}),registerOption(ltiName,{processor:"object",default:{toolId:0,courseId:0,contentItemUrl:""}})};const getPermissions=editor=>editor.options.get(permissionsName);_exports.getPermissions=getPermissions;_exports.getImagePermissions=editor=>getPermissions(editor).image;_exports.getEmbedPermissions=editor=>getPermissions(editor).embed;_exports.getData=editor=>editor.options.get(dataName);_exports.getLti=editor=>editor.options.get(ltiName)})); +const dataName=(0,_options.getPluginOptionName)(_common.pluginName,"data"),permissionsName=(0,_options.getPluginOptionName)(_common.pluginName,"permissions"),ltiName=(0,_options.getPluginOptionName)(_common.pluginName,"lti");_exports.register=editor=>{const registerOption=editor.options.register;registerOption(permissionsName,{processor:"object",default:{image:{filepicker:!1}}}),registerOption(dataName,{processor:"object",default:{mediacmsApiUrl:"",mediacmsBaseUrl:"",mediacmsPageSize:12,autoConvertEnabled:!0,autoConvertBaseUrl:"",autoConvertOptions:{showTitle:!0,linkTitle:!0,showUserAvatar:!0}}}),registerOption(ltiName,{processor:"object",default:{toolId:0,courseId:0,contentItemUrl:""}})};const getPermissions=editor=>editor.options.get(permissionsName);_exports.getPermissions=getPermissions;_exports.getImagePermissions=editor=>getPermissions(editor).image;_exports.getEmbedPermissions=editor=>getPermissions(editor).embed;_exports.getData=editor=>editor.options.get(dataName);_exports.getLti=editor=>editor.options.get(ltiName)})); //# sourceMappingURL=options.min.js.map \ No newline at end of file diff --git a/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/options.min.js.map b/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/options.min.js.map index 545b140d..d647b311 100755 --- a/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/options.min.js.map +++ b/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/options.min.js.map @@ -1 +1 @@ -{"version":3,"file":"options.min.js","sources":["../src/options.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 .\n\n/**\n * Options helper for Tiny Media plugin.\n *\n * @module tiny_mediacms/options\n * @copyright 2022 Huong Nguyen \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport {getPluginOptionName} from 'editor_tiny/options';\nimport {pluginName} from './common';\n\nconst dataName = getPluginOptionName(pluginName, 'data');\nconst permissionsName = getPluginOptionName(pluginName, 'permissions');\nconst ltiName = getPluginOptionName(pluginName, 'lti');\n\n/**\n * Register the options for the Tiny Media plugin.\n *\n * @param {TinyMCE} editor\n */\nexport const register = (editor) => {\n const registerOption = editor.options.register;\n\n registerOption(permissionsName, {\n processor: 'object',\n \"default\": {\n image: {\n filepicker: false,\n }\n },\n });\n\n registerOption(dataName, {\n processor: 'object',\n \"default\": {\n // MediaCMS video library configuration\n mediacmsApiUrl: '', // e.g., 'https://deic.mediacms.io/api/v1/media'\n mediacmsBaseUrl: '', // e.g., 'https://deic.mediacms.io'\n mediacmsPageSize: 12,\n // Auto-conversion settings\n autoConvertEnabled: true, // Enable/disable auto-conversion of pasted MediaCMS URLs\n autoConvertBaseUrl: '', // Base URL to restrict auto-conversion (empty = allow all MediaCMS domains)\n autoConvertOptions: {\n // Default embed options for auto-converted videos\n showTitle: true,\n linkTitle: true,\n showRelated: true,\n showUserAvatar: true,\n },\n },\n });\n\n registerOption(ltiName, {\n processor: 'object',\n \"default\": {\n // LTI configuration for MediaCMS iframe library\n toolId: 0, // LTI external tool ID\n courseId: 0, // Current course ID\n contentItemUrl: '', // URL to /mod/lti/contentitem.php for Deep Linking\n },\n });\n};\n\n/**\n * Get the permissions configuration for the Tiny Media plugin.\n *\n * @param {TinyMCE} editor\n * @returns {object}\n */\nexport const getPermissions = (editor) => editor.options.get(permissionsName);\n\n/**\n * Get the permissions configuration for the Tiny Media plugin.\n *\n * @param {TinyMCE} editor\n * @returns {object}\n */\nexport const getImagePermissions = (editor) => getPermissions(editor).image;\n\n/**\n * Get the permissions configuration for the Tiny Media plugin.\n *\n * @param {TinyMCE} editor\n * @returns {object}\n */\nexport const getEmbedPermissions = (editor) => getPermissions(editor).embed;\n\n/**\n * Get the data configuration for the Media Manager.\n *\n * @param {TinyMCE} editor\n * @returns {object}\n */\nexport const getData = (editor) => editor.options.get(dataName);\n\n/**\n * Get the LTI configuration for the MediaCMS iframe library.\n *\n * @param {TinyMCE} editor\n * @returns {object}\n */\nexport const getLti = (editor) => editor.options.get(ltiName);\n"],"names":["dataName","pluginName","permissionsName","ltiName","editor","registerOption","options","register","processor","image","filepicker","mediacmsApiUrl","mediacmsBaseUrl","mediacmsPageSize","autoConvertEnabled","autoConvertBaseUrl","autoConvertOptions","showTitle","linkTitle","showRelated","showUserAvatar","toolId","courseId","contentItemUrl","getPermissions","get","embed"],"mappings":";;;;;;;;MA0BMA,UAAW,gCAAoBC,mBAAY,QAC3CC,iBAAkB,gCAAoBD,mBAAY,eAClDE,SAAU,gCAAoBF,mBAAY,yBAOvBG,eACfC,eAAiBD,OAAOE,QAAQC,SAEtCF,eAAeH,gBAAiB,CAC5BM,UAAW,iBACA,CACPC,MAAO,CACHC,YAAY,MAKxBL,eAAeL,SAAU,CACrBQ,UAAW,iBACA,CAEPG,eAAgB,GAChBC,gBAAiB,GACjBC,iBAAkB,GAElBC,oBAAoB,EACpBC,mBAAoB,GACpBC,mBAAoB,CAEhBC,WAAW,EACXC,WAAW,EACXC,aAAa,EACbC,gBAAgB,MAK5Bf,eAAeF,QAAS,CACpBK,UAAW,iBACA,CAEPa,OAAQ,EACRC,SAAU,EACVC,eAAgB,aAWfC,eAAkBpB,QAAWA,OAAOE,QAAQmB,IAAIvB,qFAQzBE,QAAWoB,eAAepB,QAAQK,mCAQlCL,QAAWoB,eAAepB,QAAQsB,uBAQ9CtB,QAAWA,OAAOE,QAAQmB,IAAIzB,0BAQ/BI,QAAWA,OAAOE,QAAQmB,IAAItB"} \ No newline at end of file +{"version":3,"file":"options.min.js","sources":["../src/options.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 .\n\n/**\n * Options helper for Tiny Media plugin.\n *\n * @module tiny_mediacms/options\n * @copyright 2022 Huong Nguyen \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport {getPluginOptionName} from 'editor_tiny/options';\nimport {pluginName} from './common';\n\nconst dataName = getPluginOptionName(pluginName, 'data');\nconst permissionsName = getPluginOptionName(pluginName, 'permissions');\nconst ltiName = getPluginOptionName(pluginName, 'lti');\n\n/**\n * Register the options for the Tiny Media plugin.\n *\n * @param {TinyMCE} editor\n */\nexport const register = (editor) => {\n const registerOption = editor.options.register;\n\n registerOption(permissionsName, {\n processor: 'object',\n \"default\": {\n image: {\n filepicker: false,\n }\n },\n });\n\n registerOption(dataName, {\n processor: 'object',\n \"default\": {\n // MediaCMS video library configuration\n mediacmsApiUrl: '', // e.g., 'https://deic.mediacms.io/api/v1/media'\n mediacmsBaseUrl: '', // e.g., 'https://deic.mediacms.io'\n mediacmsPageSize: 12,\n // Auto-conversion settings\n autoConvertEnabled: true, // Enable/disable auto-conversion of pasted MediaCMS URLs\n autoConvertBaseUrl: '', // Base URL to restrict auto-conversion (empty = allow all MediaCMS domains)\n autoConvertOptions: {\n // Default embed options for auto-converted videos\n showTitle: true,\n linkTitle: true,\n showUserAvatar: true,\n },\n },\n });\n\n registerOption(ltiName, {\n processor: 'object',\n \"default\": {\n // LTI configuration for MediaCMS iframe library\n toolId: 0, // LTI external tool ID\n courseId: 0, // Current course ID\n contentItemUrl: '', // URL to /mod/lti/contentitem.php for Deep Linking\n },\n });\n};\n\n/**\n * Get the permissions configuration for the Tiny Media plugin.\n *\n * @param {TinyMCE} editor\n * @returns {object}\n */\nexport const getPermissions = (editor) => editor.options.get(permissionsName);\n\n/**\n * Get the permissions configuration for the Tiny Media plugin.\n *\n * @param {TinyMCE} editor\n * @returns {object}\n */\nexport const getImagePermissions = (editor) => getPermissions(editor).image;\n\n/**\n * Get the permissions configuration for the Tiny Media plugin.\n *\n * @param {TinyMCE} editor\n * @returns {object}\n */\nexport const getEmbedPermissions = (editor) => getPermissions(editor).embed;\n\n/**\n * Get the data configuration for the Media Manager.\n *\n * @param {TinyMCE} editor\n * @returns {object}\n */\nexport const getData = (editor) => editor.options.get(dataName);\n\n/**\n * Get the LTI configuration for the MediaCMS iframe library.\n *\n * @param {TinyMCE} editor\n * @returns {object}\n */\nexport const getLti = (editor) => editor.options.get(ltiName);\n"],"names":["dataName","pluginName","permissionsName","ltiName","editor","registerOption","options","register","processor","image","filepicker","mediacmsApiUrl","mediacmsBaseUrl","mediacmsPageSize","autoConvertEnabled","autoConvertBaseUrl","autoConvertOptions","showTitle","linkTitle","showUserAvatar","toolId","courseId","contentItemUrl","getPermissions","get","embed"],"mappings":";;;;;;;;MA0BMA,UAAW,gCAAoBC,mBAAY,QAC3CC,iBAAkB,gCAAoBD,mBAAY,eAClDE,SAAU,gCAAoBF,mBAAY,yBAOvBG,eACfC,eAAiBD,OAAOE,QAAQC,SAEtCF,eAAeH,gBAAiB,CAC5BM,UAAW,iBACA,CACPC,MAAO,CACHC,YAAY,MAKxBL,eAAeL,SAAU,CACrBQ,UAAW,iBACA,CAEPG,eAAgB,GAChBC,gBAAiB,GACjBC,iBAAkB,GAElBC,oBAAoB,EACpBC,mBAAoB,GACpBC,mBAAoB,CAEhBC,WAAW,EACXC,WAAW,EACXC,gBAAgB,MAK5Bd,eAAeF,QAAS,CACpBK,UAAW,iBACA,CAEPY,OAAQ,EACRC,SAAU,EACVC,eAAgB,aAWfC,eAAkBnB,QAAWA,OAAOE,QAAQkB,IAAItB,qFAQzBE,QAAWmB,eAAenB,QAAQK,mCAQlCL,QAAWmB,eAAenB,QAAQqB,uBAQ9CrB,QAAWA,OAAOE,QAAQkB,IAAIxB,0BAQ/BI,QAAWA,OAAOE,QAAQkB,IAAIrB"} \ No newline at end of file diff --git a/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/selectors.min.js b/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/selectors.min.js index 6e9a8adc..c384ebf2 100755 --- a/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/selectors.min.js +++ b/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/selectors.min.js @@ -1,3 +1,3 @@ -define("tiny_mediacms/selectors",["exports"],(function(_exports){Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0;return _exports.default={IMAGE:{actions:{submit:".tiny_imagecms_urlentrysubmit",imageBrowser:".openimagecmsbrowser",addUrl:".tiny_imagecms_addurl",deleteImage:".tiny_imagecms_deleteicon"},elements:{form:"form.tiny_imagecms_form",alignSettings:".tiny_imagecms_button",alt:".tiny_imagecms_altentry",altWarning:".tiny_imagecms_altwarning",height:".tiny_imagecms_heightentry",width:".tiny_imagecms_widthentry",url:".tiny_imagecms_urlentry",urlWarning:".tiny_imagecms_urlwarning",size:".tiny_imagecms_size",presentation:".tiny_imagecms_presentation",constrain:".tiny_imagecms_constrain",customStyle:".tiny_imagecms_customstyle",preview:".tiny_imagecms_preview",previewBox:".tiny_imagecms_preview_box",loaderIcon:".tiny_imagecms_loader",loaderIconContainer:".tiny_imagecms_loader_container",insertImage:".tiny_imagecms_insert_image",modalFooter:".modal-footer",dropzoneContainer:".tiny_imagecms_dropzone_container",fileInput:"#tiny_imagecms_fileinput",fileNameLabel:".tiny_imagecms_filename",sizeOriginal:".tiny_imagecms_sizeoriginal",sizeCustom:".tiny_imagecms_sizecustom",properties:".tiny_imagecms_properties"},styles:{responsive:"img-fluid"}},EMBED:{actions:{submit:".tiny_mediacms_submit",mediaBrowser:".openmediacmsbrowser"},elements:{form:"form.tiny_mediacms_form",source:".tiny_mediacms_source",track:".tiny_mediacms_track",mediaSource:".tiny_mediacms_media_source",linkSource:".tiny_mediacms_link_source",linkSize:".tiny_mediacms_link_size",posterSource:".tiny_mediacms_poster_source",posterSize:".tiny_mediacms_poster_size",displayOptions:".tiny_mediacms_display_options",name:".tiny_mediacms_name_entry",title:".tiny_mediacms_title_entry",url:".tiny_mediacms_url_entry",width:".tiny_mediacms_width_entry",height:".tiny_mediacms_height_entry",trackSource:".tiny_mediacms_track_source",trackKind:".tiny_mediacms_track_kind_entry",trackLabel:".tiny_mediacms_track_label_entry",trackLang:".tiny_mediacms_track_lang_entry",trackDefault:".tiny_mediacms_track_default",mediaControl:".tiny_mediacms_controls",mediaAutoplay:".tiny_mediacms_autoplay",mediaMute:".tiny_mediacms_mute",mediaLoop:".tiny_mediacms_loop",advancedSettings:".tiny_mediacms_advancedsettings",linkTab:'li[data-medium-type="link"]',videoTab:'li[data-medium-type="video"]',audioTab:'li[data-medium-type="audio"]',linkPane:'.tab-pane[data-medium-type="link"]',videoPane:'.tab-pane[data-medium-type="video"]',audioPane:'.tab-pane[data-medium-type="audio"]',trackSubtitlesTab:'li[data-track-kind="subtitles"]',trackCaptionsTab:'li[data-track-kind="captions"]',trackDescriptionsTab:'li[data-track-kind="descriptions"]',trackChaptersTab:'li[data-track-kind="chapters"]',trackMetadataTab:'li[data-track-kind="metadata"]',trackSubtitlesPane:'.tab-pane[data-track-kind="subtitles"]',trackCaptionsPane:'.tab-pane[data-track-kind="captions"]',trackDescriptionsPane:'.tab-pane[data-track-kind="descriptions"]',trackChaptersPane:'.tab-pane[data-track-kind="chapters"]',trackMetadataPane:'.tab-pane[data-track-kind="metadata"]'},mediaTypes:{link:"LINK",video:"VIDEO",audio:"AUDIO"},trackKinds:{subtitles:"SUBTITLES",captions:"CAPTIONS",descriptions:"DESCRIPTIONS",chapters:"CHAPTERS",metadata:"METADATA"}},IFRAME:{actions:{remove:'[data-action="remove"]'},elements:{form:"form.tiny_iframecms_form",url:".tiny_iframecms_url",urlWarning:".tiny_iframecms_url_warning",showTitle:".tiny_iframecms_showtitle",linkTitle:".tiny_iframecms_linktitle",showRelated:".tiny_iframecms_showrelated",showUserAvatar:".tiny_iframecms_showuseravatar",textLinkOnly:".tiny_iframecms_textlinkonly",startAt:".tiny_iframecms_startat",startAtEnabled:".tiny_iframecms_startat_enabled",width:".tiny_iframecms_width",height:".tiny_iframecms_height",preview:".tiny_iframecms_preview",previewContainer:".tiny_iframecms_preview_container",tabs:".tiny_iframecms_tabs",tabUrlBtn:".tiny_iframecms_tab_url_btn",tabIframeLibraryBtn:".tiny_iframecms_tab_iframe_library_btn",tabUploadMediaBtn:".tiny_iframecms_upload_media_btn",paneUrl:".tiny_iframecms_pane_url",paneIframeLibrary:".tiny_iframecms_pane_iframe_library",iframeLibraryContainer:".tiny_iframecms_iframe_library_container",iframeLibraryPlaceholder:".tiny_iframecms_iframe_library_placeholder",iframeLibraryLoading:".tiny_iframecms_iframe_library_loading",iframeLibraryFrame:".tiny_iframecms_iframe_library_frame"}}},_exports.default})); +define("tiny_mediacms/selectors",["exports"],(function(_exports){Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0;return _exports.default={IMAGE:{actions:{submit:".tiny_imagecms_urlentrysubmit",imageBrowser:".openimagecmsbrowser",addUrl:".tiny_imagecms_addurl",deleteImage:".tiny_imagecms_deleteicon"},elements:{form:"form.tiny_imagecms_form",alignSettings:".tiny_imagecms_button",alt:".tiny_imagecms_altentry",altWarning:".tiny_imagecms_altwarning",height:".tiny_imagecms_heightentry",width:".tiny_imagecms_widthentry",url:".tiny_imagecms_urlentry",urlWarning:".tiny_imagecms_urlwarning",size:".tiny_imagecms_size",presentation:".tiny_imagecms_presentation",constrain:".tiny_imagecms_constrain",customStyle:".tiny_imagecms_customstyle",preview:".tiny_imagecms_preview",previewBox:".tiny_imagecms_preview_box",loaderIcon:".tiny_imagecms_loader",loaderIconContainer:".tiny_imagecms_loader_container",insertImage:".tiny_imagecms_insert_image",modalFooter:".modal-footer",dropzoneContainer:".tiny_imagecms_dropzone_container",fileInput:"#tiny_imagecms_fileinput",fileNameLabel:".tiny_imagecms_filename",sizeOriginal:".tiny_imagecms_sizeoriginal",sizeCustom:".tiny_imagecms_sizecustom",properties:".tiny_imagecms_properties"},styles:{responsive:"img-fluid"}},EMBED:{actions:{submit:".tiny_mediacms_submit",mediaBrowser:".openmediacmsbrowser"},elements:{form:"form.tiny_mediacms_form",source:".tiny_mediacms_source",track:".tiny_mediacms_track",mediaSource:".tiny_mediacms_media_source",linkSource:".tiny_mediacms_link_source",linkSize:".tiny_mediacms_link_size",posterSource:".tiny_mediacms_poster_source",posterSize:".tiny_mediacms_poster_size",displayOptions:".tiny_mediacms_display_options",name:".tiny_mediacms_name_entry",title:".tiny_mediacms_title_entry",url:".tiny_mediacms_url_entry",width:".tiny_mediacms_width_entry",height:".tiny_mediacms_height_entry",trackSource:".tiny_mediacms_track_source",trackKind:".tiny_mediacms_track_kind_entry",trackLabel:".tiny_mediacms_track_label_entry",trackLang:".tiny_mediacms_track_lang_entry",trackDefault:".tiny_mediacms_track_default",mediaControl:".tiny_mediacms_controls",mediaAutoplay:".tiny_mediacms_autoplay",mediaMute:".tiny_mediacms_mute",mediaLoop:".tiny_mediacms_loop",advancedSettings:".tiny_mediacms_advancedsettings",linkTab:'li[data-medium-type="link"]',videoTab:'li[data-medium-type="video"]',audioTab:'li[data-medium-type="audio"]',linkPane:'.tab-pane[data-medium-type="link"]',videoPane:'.tab-pane[data-medium-type="video"]',audioPane:'.tab-pane[data-medium-type="audio"]',trackSubtitlesTab:'li[data-track-kind="subtitles"]',trackCaptionsTab:'li[data-track-kind="captions"]',trackDescriptionsTab:'li[data-track-kind="descriptions"]',trackChaptersTab:'li[data-track-kind="chapters"]',trackMetadataTab:'li[data-track-kind="metadata"]',trackSubtitlesPane:'.tab-pane[data-track-kind="subtitles"]',trackCaptionsPane:'.tab-pane[data-track-kind="captions"]',trackDescriptionsPane:'.tab-pane[data-track-kind="descriptions"]',trackChaptersPane:'.tab-pane[data-track-kind="chapters"]',trackMetadataPane:'.tab-pane[data-track-kind="metadata"]'},mediaTypes:{link:"LINK",video:"VIDEO",audio:"AUDIO"},trackKinds:{subtitles:"SUBTITLES",captions:"CAPTIONS",descriptions:"DESCRIPTIONS",chapters:"CHAPTERS",metadata:"METADATA"}},IFRAME:{actions:{remove:'[data-action="remove"]'},elements:{form:"form.tiny_iframecms_form",url:".tiny_iframecms_url",urlWarning:".tiny_iframecms_url_warning",showTitle:".tiny_iframecms_showtitle",linkTitle:".tiny_iframecms_linktitle",showUserAvatar:".tiny_iframecms_showuseravatar",textLinkOnly:".tiny_iframecms_textlinkonly",startAt:".tiny_iframecms_startat",startAtEnabled:".tiny_iframecms_startat_enabled",width:".tiny_iframecms_width",height:".tiny_iframecms_height",preview:".tiny_iframecms_preview",previewContainer:".tiny_iframecms_preview_container",tabs:".tiny_iframecms_tabs",tabUrlBtn:".tiny_iframecms_tab_url_btn",tabIframeLibraryBtn:".tiny_iframecms_tab_iframe_library_btn",tabUploadMediaBtn:".tiny_iframecms_upload_media_btn",paneUrl:".tiny_iframecms_pane_url",paneIframeLibrary:".tiny_iframecms_pane_iframe_library",iframeLibraryContainer:".tiny_iframecms_iframe_library_container",iframeLibraryPlaceholder:".tiny_iframecms_iframe_library_placeholder",iframeLibraryLoading:".tiny_iframecms_iframe_library_loading",iframeLibraryFrame:".tiny_iframecms_iframe_library_frame"}}},_exports.default})); //# sourceMappingURL=selectors.min.js.map \ No newline at end of file diff --git a/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/selectors.min.js.map b/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/selectors.min.js.map index eeba6cfe..f9c4f376 100755 --- a/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/selectors.min.js.map +++ b/lms-plugins/mediacms-moodle/tiny/mediacms/amd/build/selectors.min.js.map @@ -1 +1 @@ -{"version":3,"file":"selectors.min.js","sources":["../src/selectors.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 .\n\n/**\n * Tiny Media plugin helper function to build queryable data selectors.\n *\n * @module tiny_mediacms/selectors\n * @copyright 2022 Huong Nguyen \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nexport default {\n IMAGE: {\n actions: {\n submit: '.tiny_imagecms_urlentrysubmit',\n imageBrowser: '.openimagecmsbrowser',\n addUrl: '.tiny_imagecms_addurl',\n deleteImage: '.tiny_imagecms_deleteicon',\n },\n elements: {\n form: 'form.tiny_imagecms_form',\n alignSettings: '.tiny_imagecms_button',\n alt: '.tiny_imagecms_altentry',\n altWarning: '.tiny_imagecms_altwarning',\n height: '.tiny_imagecms_heightentry',\n width: '.tiny_imagecms_widthentry',\n url: '.tiny_imagecms_urlentry',\n urlWarning: '.tiny_imagecms_urlwarning',\n size: '.tiny_imagecms_size',\n presentation: '.tiny_imagecms_presentation',\n constrain: '.tiny_imagecms_constrain',\n customStyle: '.tiny_imagecms_customstyle',\n preview: '.tiny_imagecms_preview',\n previewBox: '.tiny_imagecms_preview_box',\n loaderIcon: '.tiny_imagecms_loader',\n loaderIconContainer: '.tiny_imagecms_loader_container',\n insertImage: '.tiny_imagecms_insert_image',\n modalFooter: '.modal-footer',\n dropzoneContainer: '.tiny_imagecms_dropzone_container',\n fileInput: '#tiny_imagecms_fileinput',\n fileNameLabel: '.tiny_imagecms_filename',\n sizeOriginal: '.tiny_imagecms_sizeoriginal',\n sizeCustom: '.tiny_imagecms_sizecustom',\n properties: '.tiny_imagecms_properties',\n },\n styles: {\n responsive: 'img-fluid',\n },\n },\n EMBED: {\n actions: {\n submit: '.tiny_mediacms_submit',\n mediaBrowser: '.openmediacmsbrowser',\n },\n elements: {\n form: 'form.tiny_mediacms_form',\n source: '.tiny_mediacms_source',\n track: '.tiny_mediacms_track',\n mediaSource: '.tiny_mediacms_media_source',\n linkSource: '.tiny_mediacms_link_source',\n linkSize: '.tiny_mediacms_link_size',\n posterSource: '.tiny_mediacms_poster_source',\n posterSize: '.tiny_mediacms_poster_size',\n displayOptions: '.tiny_mediacms_display_options',\n name: '.tiny_mediacms_name_entry',\n title: '.tiny_mediacms_title_entry',\n url: '.tiny_mediacms_url_entry',\n width: '.tiny_mediacms_width_entry',\n height: '.tiny_mediacms_height_entry',\n trackSource: '.tiny_mediacms_track_source',\n trackKind: '.tiny_mediacms_track_kind_entry',\n trackLabel: '.tiny_mediacms_track_label_entry',\n trackLang: '.tiny_mediacms_track_lang_entry',\n trackDefault: '.tiny_mediacms_track_default',\n mediaControl: '.tiny_mediacms_controls',\n mediaAutoplay: '.tiny_mediacms_autoplay',\n mediaMute: '.tiny_mediacms_mute',\n mediaLoop: '.tiny_mediacms_loop',\n advancedSettings: '.tiny_mediacms_advancedsettings',\n linkTab: 'li[data-medium-type=\"link\"]',\n videoTab: 'li[data-medium-type=\"video\"]',\n audioTab: 'li[data-medium-type=\"audio\"]',\n linkPane: '.tab-pane[data-medium-type=\"link\"]',\n videoPane: '.tab-pane[data-medium-type=\"video\"]',\n audioPane: '.tab-pane[data-medium-type=\"audio\"]',\n trackSubtitlesTab: 'li[data-track-kind=\"subtitles\"]',\n trackCaptionsTab: 'li[data-track-kind=\"captions\"]',\n trackDescriptionsTab: 'li[data-track-kind=\"descriptions\"]',\n trackChaptersTab: 'li[data-track-kind=\"chapters\"]',\n trackMetadataTab: 'li[data-track-kind=\"metadata\"]',\n trackSubtitlesPane: '.tab-pane[data-track-kind=\"subtitles\"]',\n trackCaptionsPane: '.tab-pane[data-track-kind=\"captions\"]',\n trackDescriptionsPane: '.tab-pane[data-track-kind=\"descriptions\"]',\n trackChaptersPane: '.tab-pane[data-track-kind=\"chapters\"]',\n trackMetadataPane: '.tab-pane[data-track-kind=\"metadata\"]',\n },\n mediaTypes: {\n link: 'LINK',\n video: 'VIDEO',\n audio: 'AUDIO',\n },\n trackKinds: {\n subtitles: 'SUBTITLES',\n captions: 'CAPTIONS',\n descriptions: 'DESCRIPTIONS',\n chapters: 'CHAPTERS',\n metadata: 'METADATA',\n },\n },\n IFRAME: {\n actions: {\n remove: '[data-action=\"remove\"]',\n },\n elements: {\n form: 'form.tiny_iframecms_form',\n url: '.tiny_iframecms_url',\n urlWarning: '.tiny_iframecms_url_warning',\n showTitle: '.tiny_iframecms_showtitle',\n linkTitle: '.tiny_iframecms_linktitle',\n showRelated: '.tiny_iframecms_showrelated',\n showUserAvatar: '.tiny_iframecms_showuseravatar',\n textLinkOnly: '.tiny_iframecms_textlinkonly',\n startAt: '.tiny_iframecms_startat',\n startAtEnabled: '.tiny_iframecms_startat_enabled',\n width: '.tiny_iframecms_width',\n height: '.tiny_iframecms_height',\n preview: '.tiny_iframecms_preview',\n previewContainer: '.tiny_iframecms_preview_container',\n // Tab elements\n tabs: '.tiny_iframecms_tabs',\n tabUrlBtn: '.tiny_iframecms_tab_url_btn',\n tabIframeLibraryBtn: '.tiny_iframecms_tab_iframe_library_btn',\n tabUploadMediaBtn: '.tiny_iframecms_upload_media_btn',\n paneUrl: '.tiny_iframecms_pane_url',\n paneIframeLibrary: '.tiny_iframecms_pane_iframe_library',\n // Iframe library elements\n iframeLibraryContainer: '.tiny_iframecms_iframe_library_container',\n iframeLibraryPlaceholder:\n '.tiny_iframecms_iframe_library_placeholder',\n iframeLibraryLoading: '.tiny_iframecms_iframe_library_loading',\n iframeLibraryFrame: '.tiny_iframecms_iframe_library_frame',\n },\n },\n};\n"],"names":["IMAGE","actions","submit","imageBrowser","addUrl","deleteImage","elements","form","alignSettings","alt","altWarning","height","width","url","urlWarning","size","presentation","constrain","customStyle","preview","previewBox","loaderIcon","loaderIconContainer","insertImage","modalFooter","dropzoneContainer","fileInput","fileNameLabel","sizeOriginal","sizeCustom","properties","styles","responsive","EMBED","mediaBrowser","source","track","mediaSource","linkSource","linkSize","posterSource","posterSize","displayOptions","name","title","trackSource","trackKind","trackLabel","trackLang","trackDefault","mediaControl","mediaAutoplay","mediaMute","mediaLoop","advancedSettings","linkTab","videoTab","audioTab","linkPane","videoPane","audioPane","trackSubtitlesTab","trackCaptionsTab","trackDescriptionsTab","trackChaptersTab","trackMetadataTab","trackSubtitlesPane","trackCaptionsPane","trackDescriptionsPane","trackChaptersPane","trackMetadataPane","mediaTypes","link","video","audio","trackKinds","subtitles","captions","descriptions","chapters","metadata","IFRAME","remove","showTitle","linkTitle","showRelated","showUserAvatar","textLinkOnly","startAt","startAtEnabled","previewContainer","tabs","tabUrlBtn","tabIframeLibraryBtn","tabUploadMediaBtn","paneUrl","paneIframeLibrary","iframeLibraryContainer","iframeLibraryPlaceholder","iframeLibraryLoading","iframeLibraryFrame"],"mappings":"yKAuBe,CACXA,MAAO,CACHC,QAAS,CACLC,OAAQ,gCACRC,aAAc,uBACdC,OAAQ,wBACRC,YAAa,6BAEjBC,SAAU,CACNC,KAAM,0BACNC,cAAe,wBACfC,IAAK,0BACLC,WAAY,4BACZC,OAAQ,6BACRC,MAAO,4BACPC,IAAK,0BACLC,WAAY,4BACZC,KAAM,sBACNC,aAAc,8BACdC,UAAW,2BACXC,YAAa,6BACbC,QAAS,yBACTC,WAAY,6BACZC,WAAY,wBACZC,oBAAqB,kCACrBC,YAAa,8BACbC,YAAa,gBACbC,kBAAmB,oCACnBC,UAAW,2BACXC,cAAe,0BACfC,aAAc,8BACdC,WAAY,4BACZC,WAAY,6BAEhBC,OAAQ,CACJC,WAAY,cAGpBC,MAAO,CACHhC,QAAS,CACLC,OAAQ,wBACRgC,aAAc,wBAElB5B,SAAU,CACNC,KAAM,0BACN4B,OAAQ,wBACRC,MAAO,uBACPC,YAAa,8BACbC,WAAY,6BACZC,SAAU,2BACVC,aAAc,+BACdC,WAAY,6BACZC,eAAgB,iCAChBC,KAAM,4BACNC,MAAO,6BACP/B,IAAK,2BACLD,MAAO,6BACPD,OAAQ,8BACRkC,YAAa,8BACbC,UAAW,kCACXC,WAAY,mCACZC,UAAW,kCACXC,aAAc,+BACdC,aAAc,0BACdC,cAAe,0BACfC,UAAW,sBACXC,UAAW,sBACXC,iBAAkB,kCAClBC,QAAS,8BACTC,SAAU,+BACVC,SAAU,+BACVC,SAAU,qCACVC,UAAW,sCACXC,UAAW,sCACXC,kBAAmB,kCACnBC,iBAAkB,iCAClBC,qBAAsB,qCACtBC,iBAAkB,iCAClBC,iBAAkB,iCAClBC,mBAAoB,yCACpBC,kBAAmB,wCACnBC,sBAAuB,4CACvBC,kBAAmB,wCACnBC,kBAAmB,yCAEvBC,WAAY,CACRC,KAAM,OACNC,MAAO,QACPC,MAAO,SAEXC,WAAY,CACRC,UAAW,YACXC,SAAU,WACVC,aAAc,eACdC,SAAU,WACVC,SAAU,aAGlBC,OAAQ,CACJhF,QAAS,CACLiF,OAAQ,0BAEZ5E,SAAU,CACNC,KAAM,2BACNM,IAAK,sBACLC,WAAY,8BACZqE,UAAW,4BACXC,UAAW,4BACXC,YAAa,8BACbC,eAAgB,iCAChBC,aAAc,+BACdC,QAAS,0BACTC,eAAgB,kCAChB7E,MAAO,wBACPD,OAAQ,yBACRQ,QAAS,0BACTuE,iBAAkB,oCAElBC,KAAM,uBACNC,UAAW,8BACXC,oBAAqB,yCACrBC,kBAAmB,mCACnBC,QAAS,2BACTC,kBAAmB,sCAEnBC,uBAAwB,2CACxBC,yBACI,6CACJC,qBAAsB,yCACtBC,mBAAoB"} \ No newline at end of file +{"version":3,"file":"selectors.min.js","sources":["../src/selectors.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 .\n\n/**\n * Tiny Media plugin helper function to build queryable data selectors.\n *\n * @module tiny_mediacms/selectors\n * @copyright 2022 Huong Nguyen \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nexport default {\n IMAGE: {\n actions: {\n submit: '.tiny_imagecms_urlentrysubmit',\n imageBrowser: '.openimagecmsbrowser',\n addUrl: '.tiny_imagecms_addurl',\n deleteImage: '.tiny_imagecms_deleteicon',\n },\n elements: {\n form: 'form.tiny_imagecms_form',\n alignSettings: '.tiny_imagecms_button',\n alt: '.tiny_imagecms_altentry',\n altWarning: '.tiny_imagecms_altwarning',\n height: '.tiny_imagecms_heightentry',\n width: '.tiny_imagecms_widthentry',\n url: '.tiny_imagecms_urlentry',\n urlWarning: '.tiny_imagecms_urlwarning',\n size: '.tiny_imagecms_size',\n presentation: '.tiny_imagecms_presentation',\n constrain: '.tiny_imagecms_constrain',\n customStyle: '.tiny_imagecms_customstyle',\n preview: '.tiny_imagecms_preview',\n previewBox: '.tiny_imagecms_preview_box',\n loaderIcon: '.tiny_imagecms_loader',\n loaderIconContainer: '.tiny_imagecms_loader_container',\n insertImage: '.tiny_imagecms_insert_image',\n modalFooter: '.modal-footer',\n dropzoneContainer: '.tiny_imagecms_dropzone_container',\n fileInput: '#tiny_imagecms_fileinput',\n fileNameLabel: '.tiny_imagecms_filename',\n sizeOriginal: '.tiny_imagecms_sizeoriginal',\n sizeCustom: '.tiny_imagecms_sizecustom',\n properties: '.tiny_imagecms_properties',\n },\n styles: {\n responsive: 'img-fluid',\n },\n },\n EMBED: {\n actions: {\n submit: '.tiny_mediacms_submit',\n mediaBrowser: '.openmediacmsbrowser',\n },\n elements: {\n form: 'form.tiny_mediacms_form',\n source: '.tiny_mediacms_source',\n track: '.tiny_mediacms_track',\n mediaSource: '.tiny_mediacms_media_source',\n linkSource: '.tiny_mediacms_link_source',\n linkSize: '.tiny_mediacms_link_size',\n posterSource: '.tiny_mediacms_poster_source',\n posterSize: '.tiny_mediacms_poster_size',\n displayOptions: '.tiny_mediacms_display_options',\n name: '.tiny_mediacms_name_entry',\n title: '.tiny_mediacms_title_entry',\n url: '.tiny_mediacms_url_entry',\n width: '.tiny_mediacms_width_entry',\n height: '.tiny_mediacms_height_entry',\n trackSource: '.tiny_mediacms_track_source',\n trackKind: '.tiny_mediacms_track_kind_entry',\n trackLabel: '.tiny_mediacms_track_label_entry',\n trackLang: '.tiny_mediacms_track_lang_entry',\n trackDefault: '.tiny_mediacms_track_default',\n mediaControl: '.tiny_mediacms_controls',\n mediaAutoplay: '.tiny_mediacms_autoplay',\n mediaMute: '.tiny_mediacms_mute',\n mediaLoop: '.tiny_mediacms_loop',\n advancedSettings: '.tiny_mediacms_advancedsettings',\n linkTab: 'li[data-medium-type=\"link\"]',\n videoTab: 'li[data-medium-type=\"video\"]',\n audioTab: 'li[data-medium-type=\"audio\"]',\n linkPane: '.tab-pane[data-medium-type=\"link\"]',\n videoPane: '.tab-pane[data-medium-type=\"video\"]',\n audioPane: '.tab-pane[data-medium-type=\"audio\"]',\n trackSubtitlesTab: 'li[data-track-kind=\"subtitles\"]',\n trackCaptionsTab: 'li[data-track-kind=\"captions\"]',\n trackDescriptionsTab: 'li[data-track-kind=\"descriptions\"]',\n trackChaptersTab: 'li[data-track-kind=\"chapters\"]',\n trackMetadataTab: 'li[data-track-kind=\"metadata\"]',\n trackSubtitlesPane: '.tab-pane[data-track-kind=\"subtitles\"]',\n trackCaptionsPane: '.tab-pane[data-track-kind=\"captions\"]',\n trackDescriptionsPane: '.tab-pane[data-track-kind=\"descriptions\"]',\n trackChaptersPane: '.tab-pane[data-track-kind=\"chapters\"]',\n trackMetadataPane: '.tab-pane[data-track-kind=\"metadata\"]',\n },\n mediaTypes: {\n link: 'LINK',\n video: 'VIDEO',\n audio: 'AUDIO',\n },\n trackKinds: {\n subtitles: 'SUBTITLES',\n captions: 'CAPTIONS',\n descriptions: 'DESCRIPTIONS',\n chapters: 'CHAPTERS',\n metadata: 'METADATA',\n },\n },\n IFRAME: {\n actions: {\n remove: '[data-action=\"remove\"]',\n },\n elements: {\n form: 'form.tiny_iframecms_form',\n url: '.tiny_iframecms_url',\n urlWarning: '.tiny_iframecms_url_warning',\n showTitle: '.tiny_iframecms_showtitle',\n linkTitle: '.tiny_iframecms_linktitle',\n showUserAvatar: '.tiny_iframecms_showuseravatar',\n textLinkOnly: '.tiny_iframecms_textlinkonly',\n startAt: '.tiny_iframecms_startat',\n startAtEnabled: '.tiny_iframecms_startat_enabled',\n width: '.tiny_iframecms_width',\n height: '.tiny_iframecms_height',\n preview: '.tiny_iframecms_preview',\n previewContainer: '.tiny_iframecms_preview_container',\n // Tab elements\n tabs: '.tiny_iframecms_tabs',\n tabUrlBtn: '.tiny_iframecms_tab_url_btn',\n tabIframeLibraryBtn: '.tiny_iframecms_tab_iframe_library_btn',\n tabUploadMediaBtn: '.tiny_iframecms_upload_media_btn',\n paneUrl: '.tiny_iframecms_pane_url',\n paneIframeLibrary: '.tiny_iframecms_pane_iframe_library',\n // Iframe library elements\n iframeLibraryContainer: '.tiny_iframecms_iframe_library_container',\n iframeLibraryPlaceholder:\n '.tiny_iframecms_iframe_library_placeholder',\n iframeLibraryLoading: '.tiny_iframecms_iframe_library_loading',\n iframeLibraryFrame: '.tiny_iframecms_iframe_library_frame',\n },\n },\n};\n"],"names":["IMAGE","actions","submit","imageBrowser","addUrl","deleteImage","elements","form","alignSettings","alt","altWarning","height","width","url","urlWarning","size","presentation","constrain","customStyle","preview","previewBox","loaderIcon","loaderIconContainer","insertImage","modalFooter","dropzoneContainer","fileInput","fileNameLabel","sizeOriginal","sizeCustom","properties","styles","responsive","EMBED","mediaBrowser","source","track","mediaSource","linkSource","linkSize","posterSource","posterSize","displayOptions","name","title","trackSource","trackKind","trackLabel","trackLang","trackDefault","mediaControl","mediaAutoplay","mediaMute","mediaLoop","advancedSettings","linkTab","videoTab","audioTab","linkPane","videoPane","audioPane","trackSubtitlesTab","trackCaptionsTab","trackDescriptionsTab","trackChaptersTab","trackMetadataTab","trackSubtitlesPane","trackCaptionsPane","trackDescriptionsPane","trackChaptersPane","trackMetadataPane","mediaTypes","link","video","audio","trackKinds","subtitles","captions","descriptions","chapters","metadata","IFRAME","remove","showTitle","linkTitle","showUserAvatar","textLinkOnly","startAt","startAtEnabled","previewContainer","tabs","tabUrlBtn","tabIframeLibraryBtn","tabUploadMediaBtn","paneUrl","paneIframeLibrary","iframeLibraryContainer","iframeLibraryPlaceholder","iframeLibraryLoading","iframeLibraryFrame"],"mappings":"yKAuBe,CACXA,MAAO,CACHC,QAAS,CACLC,OAAQ,gCACRC,aAAc,uBACdC,OAAQ,wBACRC,YAAa,6BAEjBC,SAAU,CACNC,KAAM,0BACNC,cAAe,wBACfC,IAAK,0BACLC,WAAY,4BACZC,OAAQ,6BACRC,MAAO,4BACPC,IAAK,0BACLC,WAAY,4BACZC,KAAM,sBACNC,aAAc,8BACdC,UAAW,2BACXC,YAAa,6BACbC,QAAS,yBACTC,WAAY,6BACZC,WAAY,wBACZC,oBAAqB,kCACrBC,YAAa,8BACbC,YAAa,gBACbC,kBAAmB,oCACnBC,UAAW,2BACXC,cAAe,0BACfC,aAAc,8BACdC,WAAY,4BACZC,WAAY,6BAEhBC,OAAQ,CACJC,WAAY,cAGpBC,MAAO,CACHhC,QAAS,CACLC,OAAQ,wBACRgC,aAAc,wBAElB5B,SAAU,CACNC,KAAM,0BACN4B,OAAQ,wBACRC,MAAO,uBACPC,YAAa,8BACbC,WAAY,6BACZC,SAAU,2BACVC,aAAc,+BACdC,WAAY,6BACZC,eAAgB,iCAChBC,KAAM,4BACNC,MAAO,6BACP/B,IAAK,2BACLD,MAAO,6BACPD,OAAQ,8BACRkC,YAAa,8BACbC,UAAW,kCACXC,WAAY,mCACZC,UAAW,kCACXC,aAAc,+BACdC,aAAc,0BACdC,cAAe,0BACfC,UAAW,sBACXC,UAAW,sBACXC,iBAAkB,kCAClBC,QAAS,8BACTC,SAAU,+BACVC,SAAU,+BACVC,SAAU,qCACVC,UAAW,sCACXC,UAAW,sCACXC,kBAAmB,kCACnBC,iBAAkB,iCAClBC,qBAAsB,qCACtBC,iBAAkB,iCAClBC,iBAAkB,iCAClBC,mBAAoB,yCACpBC,kBAAmB,wCACnBC,sBAAuB,4CACvBC,kBAAmB,wCACnBC,kBAAmB,yCAEvBC,WAAY,CACRC,KAAM,OACNC,MAAO,QACPC,MAAO,SAEXC,WAAY,CACRC,UAAW,YACXC,SAAU,WACVC,aAAc,eACdC,SAAU,WACVC,SAAU,aAGlBC,OAAQ,CACJhF,QAAS,CACLiF,OAAQ,0BAEZ5E,SAAU,CACNC,KAAM,2BACNM,IAAK,sBACLC,WAAY,8BACZqE,UAAW,4BACXC,UAAW,4BACXC,eAAgB,iCAChBC,aAAc,+BACdC,QAAS,0BACTC,eAAgB,kCAChB5E,MAAO,wBACPD,OAAQ,yBACRQ,QAAS,0BACTsE,iBAAkB,oCAElBC,KAAM,uBACNC,UAAW,8BACXC,oBAAqB,yCACrBC,kBAAmB,mCACnBC,QAAS,2BACTC,kBAAmB,sCAEnBC,uBAAwB,2CACxBC,yBACI,6CACJC,qBAAsB,yCACtBC,mBAAoB"} \ No newline at end of file diff --git a/lms-plugins/mediacms-moodle/tiny/mediacms/amd/src/autoconvert.js b/lms-plugins/mediacms-moodle/tiny/mediacms/amd/src/autoconvert.js index 7a53da4a..dc84fa27 100755 --- a/lms-plugins/mediacms-moodle/tiny/mediacms/amd/src/autoconvert.js +++ b/lms-plugins/mediacms-moodle/tiny/mediacms/amd/src/autoconvert.js @@ -101,7 +101,6 @@ const generateEmbedHtml = (parsed, options = {}) => { // Apply default options (all enabled by default for best user experience) embedUrl.searchParams.set('showTitle', options.showTitle !== false ? '1' : '0'); - embedUrl.searchParams.set('showRelated', options.showRelated !== false ? '1' : '0'); embedUrl.searchParams.set('showUserAvatar', options.showUserAvatar !== false ? '1' : '0'); embedUrl.searchParams.set('linkTitle', options.linkTitle !== false ? '1' : '0'); diff --git a/lms-plugins/mediacms-moodle/tiny/mediacms/amd/src/iframeembed.js b/lms-plugins/mediacms-moodle/tiny/mediacms/amd/src/iframeembed.js index d33e307e..6af8ff04 100755 --- a/lms-plugins/mediacms-moodle/tiny/mediacms/amd/src/iframeembed.js +++ b/lms-plugins/mediacms-moodle/tiny/mediacms/amd/src/iframeembed.js @@ -63,7 +63,6 @@ export default class IframeEmbed { isEmbed: true, showTitle: urlObj.searchParams.get('showTitle') === '1', linkTitle: urlObj.searchParams.get('linkTitle') === '1', - showRelated: urlObj.searchParams.get('showRelated') === '1', showUserAvatar: urlObj.searchParams.get('showUserAvatar') === '1', width: widthParam ? parseInt(widthParam) : null, @@ -86,7 +85,6 @@ export default class IframeEmbed { isLtiLaunch: true, showTitle: urlObj.searchParams.get('showTitle') === '1', linkTitle: urlObj.searchParams.get('linkTitle') === '1', - showRelated: urlObj.searchParams.get('showRelated') === '1', showUserAvatar: urlObj.searchParams.get('showUserAvatar') === '1', width: widthParam ? parseInt(widthParam) : null, height: heightParam ? parseInt(heightParam) : null, @@ -166,7 +164,6 @@ export default class IframeEmbed { } url.searchParams.set('showTitle', options.showTitle ? '1' : '0'); - url.searchParams.set('showRelated', options.showRelated ? '1' : '0'); url.searchParams.set( 'showUserAvatar', options.showUserAvatar ? '1' : '0', @@ -212,7 +209,6 @@ export default class IframeEmbed { url: data.url || '', showTitle: getDefault('showTitle'), linkTitle: getDefault('linkTitle'), - showRelated: getDefault('showRelated'), showUserAvatar: getDefault('showUserAvatar'), textLinkOnly: data.textLinkOnly || false, startAtEnabled: data.startAtEnabled || false, @@ -282,7 +278,6 @@ export default class IframeEmbed { height: parsed?.height || 315, showTitle: parsed?.showTitle ?? true, linkTitle: parsed?.linkTitle ?? true, - showRelated: parsed?.showRelated ?? true, showUserAvatar: parsed?.showUserAvatar ?? true, responsive: true, textLinkOnly: true, @@ -316,7 +311,6 @@ export default class IframeEmbed { height, showTitle: parsed?.showTitle ?? true, linkTitle: parsed?.linkTitle ?? true, - showRelated: parsed?.showRelated ?? true, showUserAvatar: parsed?.showUserAvatar ?? true, startAtEnabled: !!(parsed?.startAt), startAt: parsed?.startAt || '0:00', @@ -332,9 +326,6 @@ export default class IframeEmbed { .checked, linkTitle: form.querySelector(Selectors.IFRAME.elements.linkTitle) .checked, - showRelated: form.querySelector( - Selectors.IFRAME.elements.showRelated, - ).checked, showUserAvatar: form.querySelector( Selectors.IFRAME.elements.showUserAvatar, ).checked, @@ -590,7 +581,6 @@ export default class IframeEmbed { [ Selectors.IFRAME.elements.showTitle, Selectors.IFRAME.elements.linkTitle, - Selectors.IFRAME.elements.showRelated, Selectors.IFRAME.elements.showUserAvatar, Selectors.IFRAME.elements.startAtEnabled, ].forEach((selector) => { diff --git a/lms-plugins/mediacms-moodle/tiny/mediacms/amd/src/options.js b/lms-plugins/mediacms-moodle/tiny/mediacms/amd/src/options.js index 7c5446f7..6309864f 100755 --- a/lms-plugins/mediacms-moodle/tiny/mediacms/amd/src/options.js +++ b/lms-plugins/mediacms-moodle/tiny/mediacms/amd/src/options.js @@ -59,7 +59,6 @@ export const register = (editor) => { // Default embed options for auto-converted videos showTitle: true, linkTitle: true, - showRelated: true, showUserAvatar: true, }, }, diff --git a/lms-plugins/mediacms-moodle/tiny/mediacms/amd/src/selectors.js b/lms-plugins/mediacms-moodle/tiny/mediacms/amd/src/selectors.js index 5959c367..042b054d 100755 --- a/lms-plugins/mediacms-moodle/tiny/mediacms/amd/src/selectors.js +++ b/lms-plugins/mediacms-moodle/tiny/mediacms/amd/src/selectors.js @@ -129,7 +129,6 @@ export default { urlWarning: '.tiny_iframecms_url_warning', showTitle: '.tiny_iframecms_showtitle', linkTitle: '.tiny_iframecms_linktitle', - showRelated: '.tiny_iframecms_showrelated', showUserAvatar: '.tiny_iframecms_showuseravatar', textLinkOnly: '.tiny_iframecms_textlinkonly', startAt: '.tiny_iframecms_startat', diff --git a/lms-plugins/mediacms-moodle/tiny/mediacms/classes/plugininfo.php b/lms-plugins/mediacms-moodle/tiny/mediacms/classes/plugininfo.php index 91cba2d5..c1717433 100755 --- a/lms-plugins/mediacms-moodle/tiny/mediacms/classes/plugininfo.php +++ b/lms-plugins/mediacms-moodle/tiny/mediacms/classes/plugininfo.php @@ -127,7 +127,6 @@ class plugininfo extends plugin implements plugin_with_buttons, plugin_with_menu 'autoConvertOptions' => [ 'showTitle' => $getboolconfig('autoconvert_showtitle'), 'linkTitle' => $getboolconfig('autoconvert_linktitle'), - 'showRelated' => $getboolconfig('autoconvert_showrelated'), 'showUserAvatar' => $getboolconfig('autoconvert_showuseravatar'), ], ], diff --git a/lms-plugins/mediacms-moodle/tiny/mediacms/lang/en/tiny_mediacms.php b/lms-plugins/mediacms-moodle/tiny/mediacms/lang/en/tiny_mediacms.php index dd7c1890..9bec72fe 100755 --- a/lms-plugins/mediacms-moodle/tiny/mediacms/lang/en/tiny_mediacms.php +++ b/lms-plugins/mediacms-moodle/tiny/mediacms/lang/en/tiny_mediacms.php @@ -121,7 +121,6 @@ $string['iframeurlinvalid'] = 'Please enter a valid MediaCMS Video URL or embed $string['embedoptions'] = 'Embed Options'; $string['showtitle'] = 'Show title'; $string['linktitle'] = 'Link title'; -$string['showrelated'] = 'Show related'; $string['showuseravatar'] = 'Show user avatar'; $string['responsive'] = 'Responsive'; $string['textlinkonly'] = 'Insert text link only'; @@ -175,8 +174,6 @@ $string['autoconvert_showtitle'] = 'Show video title'; $string['autoconvert_showtitle_desc'] = 'Display the video title in the embedded player.'; $string['autoconvert_linktitle'] = 'Link video title'; $string['autoconvert_linktitle_desc'] = 'Make the video title clickable, linking to the original video page.'; -$string['autoconvert_showrelated'] = 'Show related videos'; -$string['autoconvert_showrelated_desc'] = 'Display related videos after the current video ends.'; $string['autoconvert_showuseravatar'] = 'Show user avatar'; $string['autoconvert_showuseravatar_desc'] = 'Display the uploader\'s avatar in the embedded player.'; diff --git a/lms-plugins/mediacms-moodle/tiny/mediacms/settings.php b/lms-plugins/mediacms-moodle/tiny/mediacms/settings.php index d746eb2a..c65903d1 100755 --- a/lms-plugins/mediacms-moodle/tiny/mediacms/settings.php +++ b/lms-plugins/mediacms-moodle/tiny/mediacms/settings.php @@ -52,14 +52,6 @@ if ($ADMIN->fulltree) { ); $settings->add($setting); - $setting = new admin_setting_configcheckbox( - 'tiny_mediacms/autoconvert_showrelated', - new lang_string('autoconvert_showrelated', 'tiny_mediacms'), - new lang_string('autoconvert_showrelated_desc', 'tiny_mediacms'), - 1 - ); - $settings->add($setting); - $setting = new admin_setting_configcheckbox( 'tiny_mediacms/autoconvert_showuseravatar', new lang_string('autoconvert_showuseravatar', 'tiny_mediacms'), diff --git a/lms-plugins/mediacms-moodle/tiny/mediacms/templates/iframe_embed_options.mustache b/lms-plugins/mediacms-moodle/tiny/mediacms/templates/iframe_embed_options.mustache index 7a70e3a5..0c2509fa 100755 --- a/lms-plugins/mediacms-moodle/tiny/mediacms/templates/iframe_embed_options.mustache +++ b/lms-plugins/mediacms-moodle/tiny/mediacms/templates/iframe_embed_options.mustache @@ -24,8 +24,7 @@ "elementid": "editor1", "showTitle": true, "linkTitle": true, - "showRelated": true, - "showUserAvatar": true, + "showUserAvatar": true, "responsive": true, "startAtEnabled": false, "startAt": "0:00" @@ -52,13 +51,6 @@ {{#str}} linktitle, tiny_mediacms {{/str}} -
- - -