This commit is contained in:
Markos Gogoulos
2026-02-12 18:12:34 +02:00
parent b5a76c53e1
commit e044187973
8 changed files with 47 additions and 139 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -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",responsive:".tiny_iframecms_responsive",textLinkOnly:".tiny_iframecms_textlinkonly",startAt:".tiny_iframecms_startat",startAtEnabled:".tiny_iframecms_startat_enabled",aspectRatio:".tiny_iframecms_aspectratio",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",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"},aspectRatios:{"16:9":{width:560,height:315},"4:3":{width:560,height:420},"1:1":{width:400,height:400},custom:null}}},_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",showRelated:".tiny_iframecms_showrelated",showUserAvatar:".tiny_iframecms_showuseravatar",textLinkOnly:".tiny_iframecms_textlinkonly",startAt:".tiny_iframecms_startat",startAtEnabled:".tiny_iframecms_startat_enabled",aspectRatio:".tiny_iframecms_aspectratio",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",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"},aspectRatios:{"16:9":{width:560,height:315},"4:3":{width:560,height:420},"1:1":{width:400,height:400},custom:null}}},_exports.default}));
//# sourceMappingURL=selectors.min.js.map

File diff suppressed because one or more lines are too long

View File

@@ -188,20 +188,16 @@ export default class IframeEmbed {
}
/**
* Parse width/height value - handle both numeric and '100%'.
* Parse width/height value.
*
* @param {string} value - Width or height value
* @returns {number|string|null} Parsed value
* @returns {number|null} Parsed value
*/
parseWidthHeight(value) {
if (!value) {
return null;
}
const trimmed = value.trim();
if (trimmed === '100%') {
return '100%';
}
const parsed = parseInt(trimmed);
const parsed = parseInt(value.trim());
return isNaN(parsed) ? null : parsed;
}
@@ -229,12 +225,11 @@ export default class IframeEmbed {
);
url.searchParams.set('linkTitle', options.linkTitle ? '1' : '0');
// Add width and height ONLY if responsive is disabled and values are not 100%
// When responsive is enabled, dimensions are set to 100% but not included in URL
if (!options.responsive && options.width && options.width !== '100%') {
// Add width and height if provided
if (options.width) {
url.searchParams.set('width', options.width.toString());
}
if (!options.responsive && options.height && options.height !== '100%') {
if (options.height) {
url.searchParams.set('height', options.height.toString());
}
@@ -271,17 +266,19 @@ export default class IframeEmbed {
: fallback;
};
// Determine responsive mode:
// - If editing with 100% dimensions, responsive is ON
// - If editing with numeric dimensions, responsive is OFF
// - Otherwise, default to responsive=ON for new embeds
let isResponsive;
// Determine dimensions:
// - For editing: preserve existing dimensions
// - For new embeds: default to 640x360
let width, height;
if (this.isUpdating && (data.width || data.height)) {
// Check if dimensions are 100% (responsive) or numeric (fixed)
isResponsive = data.width === '100%' || data.height === '100%';
// Editing: preserve existing dimensions
width = data.width || 640;
height = data.height || 360;
} else {
// New embed or no dimensions: responsive defaults to ON
isResponsive = data.responsive !== false;
// New embed: default to 640x360 (16:9 aspect ratio)
width = 640;
height = 360;
}
return {
@@ -292,13 +289,11 @@ export default class IframeEmbed {
linkTitle: getDefault('linkTitle'),
showRelated: getDefault('showRelated'),
showUserAvatar: getDefault('showUserAvatar'),
responsive: isResponsive,
textLinkOnly: data.textLinkOnly || false,
startAtEnabled: data.startAtEnabled || false,
startAt: data.startAt || '0:00',
// No default dimensions - only use provided values
width: data.width || '',
height: data.height || '',
width: width,
height: height,
is16_9: !data.aspectRatio || data.aspectRatio === '16:9',
is4_3: data.aspectRatio === '4:3',
is1_1: data.aspectRatio === '1:1',
@@ -404,21 +399,9 @@ export default class IframeEmbed {
let width = parsed?.width || this.selectedIframe.getAttribute('width') || null;
let height = parsed?.height || this.selectedIframe.getAttribute('height') || null;
// Check if responsive: either by style (aspect-ratio) or by 100% dimensions
const style = this.selectedIframe.getAttribute('style') || '';
const hasAspectRatio = style.includes('aspect-ratio');
const has100Percent = width === '100%' || height === '100%';
const isResponsive = hasAspectRatio || has100Percent;
// If responsive, set both to 100%
if (isResponsive) {
width = '100%';
height = '100%';
} else {
// Parse numeric values
width = width ? parseInt(width) : null;
height = height ? parseInt(height) : null;
}
// Parse numeric values
width = width ? parseInt(width) : null;
height = height ? parseInt(height) : null;
return {
url: src,
@@ -428,7 +411,6 @@ export default class IframeEmbed {
linkTitle: parsed?.linkTitle ?? true,
showRelated: parsed?.showRelated ?? true,
showUserAvatar: parsed?.showUserAvatar ?? true,
responsive: isResponsive,
startAtEnabled: parsed?.startAt !== null,
startAt: parsed?.startAt || '0:00',
};
@@ -455,8 +437,6 @@ export default class IframeEmbed {
showUserAvatar: form.querySelector(
Selectors.IFRAME.elements.showUserAvatar,
).checked,
responsive: form.querySelector(Selectors.IFRAME.elements.responsive)
.checked,
textLinkOnly: form.querySelector(Selectors.IFRAME.elements.textLinkOnly)
.checked,
startAtEnabled: form.querySelector(
@@ -519,21 +499,10 @@ export default class IframeEmbed {
const embedUrl = this.buildEmbedUrl(parsed, values);
// Calculate aspect ratio values for CSS
const aspectRatioCalcs = {
'16:9': '16 / 9',
'4:3': '4 / 3',
'1:1': '1 / 1',
custom: `${values.width} / ${values.height}`,
};
const context = {
src: embedUrl,
width: values.width,
height: values.height,
responsive: values.responsive,
aspectRatioCalc: aspectRatioCalcs[values.aspectRatio] || '16 / 9',
aspectRatioValue: aspectRatioCalcs[values.aspectRatio] || '16 / 9',
};
const { html } = await Templates.renderForPromise(
@@ -610,25 +579,10 @@ export default class IframeEmbed {
</div>
`;
} else {
// Show a scaled preview
let previewWidth, previewHeight;
if (values.responsive || values.width === '100%' || values.height === '100%') {
// For responsive, use default preview dimensions with aspect ratio
const aspectRatioCalcs = {
'16:9': { width: 400, height: 225 },
'4:3': { width: 400, height: 300 },
'1:1': { width: 300, height: 300 },
};
const defaultDims = aspectRatioCalcs[values.aspectRatio] || { width: 400, height: 225 };
previewWidth = defaultDims.width;
previewHeight = defaultDims.height;
} else {
// For fixed dimensions, scale to fit preview
previewWidth = Math.min(values.width, 400);
const scale = previewWidth / values.width;
previewHeight = Math.round(values.height * scale);
}
// Show a scaled preview - scale to fit preview area
const previewWidth = Math.min(values.width, 400);
const scale = previewWidth / values.width;
const previewHeight = Math.round(values.height * scale);
previewContainer.innerHTML = `
<iframe
@@ -684,30 +638,6 @@ export default class IframeEmbed {
*
* @param {HTMLElement} root - Modal root element
*/
toggleDimensionsEditability(root) {
const form = root.querySelector(Selectors.IFRAME.elements.form);
const responsiveCheckbox = form.querySelector(Selectors.IFRAME.elements.responsive);
const widthInput = form.querySelector(Selectors.IFRAME.elements.width);
const heightInput = form.querySelector(Selectors.IFRAME.elements.height);
if (responsiveCheckbox.checked) {
// Responsive mode: disable width/height inputs and set to 100%
widthInput.disabled = true;
heightInput.disabled = true;
widthInput.style.opacity = '0.5';
heightInput.style.opacity = '0.5';
// Set to 100% to indicate responsive mode
widthInput.value = '100%';
heightInput.value = '100%';
} else {
// Fixed mode: enable width/height inputs (no defaults)
widthInput.disabled = false;
heightInput.disabled = false;
widthInput.style.opacity = '1';
heightInput.style.opacity = '1';
// Leave values as-is (empty if no dimensions specified)
}
}
/**
* Handle width change - adjust height to maintain aspect ratio.
@@ -720,12 +650,6 @@ export default class IframeEmbed {
const aspectRatio = form.querySelector(Selectors.IFRAME.elements.aspectRatio).value;
const heightInput = form.querySelector(Selectors.IFRAME.elements.height);
// Skip calculation if value is 100% (responsive mode)
if (newWidth === '100%') {
this.handleInputChange(root);
return;
}
// Only adjust height if aspect ratio is not 'custom'
if (aspectRatio !== 'custom' && newWidth) {
const width = parseInt(newWidth) || 0;
@@ -752,12 +676,6 @@ export default class IframeEmbed {
const aspectRatio = form.querySelector(Selectors.IFRAME.elements.aspectRatio).value;
const widthInput = form.querySelector(Selectors.IFRAME.elements.width);
// Skip calculation if value is 100% (responsive mode)
if (newHeight === '100%') {
this.handleInputChange(root);
return;
}
// Only adjust width if aspect ratio is not 'custom'
if (aspectRatio !== 'custom' && newHeight) {
const height = parseInt(newHeight) || 0;
@@ -796,7 +714,7 @@ export default class IframeEmbed {
'.tiny-mediacms-iframe-wrapper',
) || this.selectedIframe.closest('.tiny-iframe-responsive');
// Also check if iframe is inside a <p> tag and remove it
// Check if iframe is inside a <p> tag
const paragraphWrapper = wrapper ? wrapper.closest('p') : this.selectedIframe.closest('p');
if (paragraphWrapper) {
@@ -808,6 +726,18 @@ export default class IframeEmbed {
this.selectedIframe.outerHTML = html;
}
this.isUpdating = false;
// Clean up any empty paragraph tags left behind
setTimeout(() => {
const body = this.editor.getBody();
const emptyPs = body.querySelectorAll('p:empty, p:blank');
emptyPs.forEach(p => {
if (p.innerHTML.trim() === '' || p.innerHTML === '<br>') {
p.remove();
}
});
}, 10);
// Fire change event to trigger overlay reprocessing
this.editor.fire('Change');
} else {
@@ -891,12 +821,6 @@ export default class IframeEmbed {
);
});
// Responsive checkbox - toggle width/height editability
form.querySelector(Selectors.IFRAME.elements.responsive).addEventListener('change', () => {
this.toggleDimensionsEditability(root);
this.handleInputChange(root, false);
});
// Text link only checkbox - doesn't affect URL, only output format
form.querySelector(Selectors.IFRAME.elements.textLinkOnly).addEventListener('change', () =>
this.handleInputChange(root, false),
@@ -988,9 +912,6 @@ export default class IframeEmbed {
// Iframe library event listeners
this.registerIframeLibraryEventListeners(root);
// Set initial state of width/height inputs based on responsive checkbox
this.toggleDimensionsEditability(root);
// If editing, Configure tab is active - update preview immediately
// If inserting, My Media tab is active - load the library
if (this.isUpdating) {

View File

@@ -131,7 +131,6 @@ export default {
linkTitle: '.tiny_iframecms_linktitle',
showRelated: '.tiny_iframecms_showrelated',
showUserAvatar: '.tiny_iframecms_showuseravatar',
responsive: '.tiny_iframecms_responsive',
textLinkOnly: '.tiny_iframecms_textlinkonly',
startAt: '.tiny_iframecms_startat',
startAtEnabled: '.tiny_iframecms_startat_enabled',

View File

@@ -75,13 +75,6 @@
{{#str}} showuseravatar, tiny_mediacms {{/str}}
</label>
</div>
<div class="form-check mb-2">
<input type="checkbox" class="form-check-input tiny_iframecms_responsive"
id="{{elementid}}_responsive" {{#responsive}}checked{{/responsive}}>
<label class="form-check-label" for="{{elementid}}_responsive">
{{#str}} responsive, tiny_mediacms {{/str}}
</label>
</div>
<div class="form-check mb-2 d-flex align-items-center">
<input type="checkbox" class="form-check-input tiny_iframecms_startat_enabled"
id="{{elementid}}_startat_enabled" {{#startAtEnabled}}checked{{/startAtEnabled}}>
@@ -116,16 +109,16 @@
<div class="row">
<div class="col-6">
<div class="input-group">
<input type="number" class="form-control tiny_iframecms_width"
id="{{elementid}}_width" value="{{width}}" placeholder="560">
<input type="number" class="form-control tiny_iframecms_width"
id="{{elementid}}_width" value="{{width}}" placeholder="640" min="1" step="1">
<span class="input-group-text">px</span>
</div>
<small class="text-muted">{{#str}} width, tiny_mediacms {{/str}}</small>
</div>
<div class="col-6">
<div class="input-group">
<input type="number" class="form-control tiny_iframecms_height"
id="{{elementid}}_height" value="{{height}}" placeholder="315">
<input type="number" class="form-control tiny_iframecms_height"
id="{{elementid}}_height" value="{{height}}" placeholder="360" min="1" step="1">
<span class="input-group-text">px</span>
</div>
<small class="text-muted">{{#str}} height, tiny_mediacms {{/str}}</small>

View File

@@ -28,9 +28,4 @@
"aspectRatioClass": "ratio-16-9"
}
}}
{{#responsive}}
<iframe width="100%" height="100%" src="{{src}}" style="width:100%;aspect-ratio:{{aspectRatioValue}};display:block;border:0;" allowFullScreen></iframe>
{{/responsive}}
{{^responsive}}
<iframe width="{{width}}" height="{{height}}" src="{{src}}" frameBorder="0" allowFullScreen></iframe>
{{/responsive}}