diff --git a/Build/Sources/TypeScript/backend/Resources/Public/TypeScript/ContextHelp.ts b/Build/Sources/TypeScript/backend/Resources/Public/TypeScript/ContextHelp.ts index d8860aea99f8ad434e2dfe90172a6bfb16f771c8..3328d6668885b397334c6f5f4d32803028466ab7 100644 --- a/Build/Sources/TypeScript/backend/Resources/Public/TypeScript/ContextHelp.ts +++ b/Build/Sources/TypeScript/backend/Resources/Public/TypeScript/ContextHelp.ts @@ -13,6 +13,8 @@ import 'bootstrap'; import * as $ from 'jquery'; +import {AjaxResponse} from 'TYPO3/CMS/Core/Ajax/AjaxResponse'; +import AjaxRequest = require('TYPO3/CMS/Core/Ajax/AjaxRequest'); import Popover = require('./Popover'); interface HelpData { @@ -148,13 +150,14 @@ class ContextHelp { // If a table is defined, use ajax call to get the tooltip's content if (table) { // Load content - $.getJSON(this.ajaxUrl, { + new AjaxRequest(this.ajaxUrl).withQueryArguments({ params: { action: 'getContextHelp', table: table, field: field, - }, - }).done((data: HelpData): void => { + } + }).get().then(async (response: AjaxResponse): Promise<any> => { + const data: HelpData = await response.resolve(); const title = data.title || ''; const content = data.content || '<p></p>'; Popover.setOptions($trigger, { diff --git a/Build/Sources/TypeScript/backend/Resources/Public/TypeScript/ImageManipulation.ts b/Build/Sources/TypeScript/backend/Resources/Public/TypeScript/ImageManipulation.ts index 0693ccbda3ebe0e3e7df339930c3814a123255a2..6a920512257c657dc2eb1467bbaf0fef14644d41 100644 --- a/Build/Sources/TypeScript/backend/Resources/Public/TypeScript/ImageManipulation.ts +++ b/Build/Sources/TypeScript/backend/Resources/Public/TypeScript/ImageManipulation.ts @@ -14,10 +14,12 @@ import * as $ from 'jquery'; import 'jquery-ui/draggable'; import 'jquery-ui/resizable'; +import {AjaxResponse} from 'TYPO3/CMS/Core/Ajax/AjaxResponse'; import FormEngineValidation = require('TYPO3/CMS/Backend/FormEngineValidation'); +import AjaxRequest = require('TYPO3/CMS/Core/Ajax/AjaxRequest'); +import ImagesLoaded = require('TYPO3/CMS/Core/Contrib/imagesloaded.pkgd.min'); import Icons = require('./Icons'); import Modal = require('./Modal'); -import ImagesLoaded = require('TYPO3/CMS/Core/Contrib/imagesloaded.pkgd.min'); interface Area { x: number; @@ -262,12 +264,9 @@ class ImageManipulation { }, ], callback: (currentModal: JQuery): void => { - $.post({ - url: imageUri, - data: payload, - }).done((response: string): void => { + new AjaxRequest(imageUri).post(payload).then(async (response: AjaxResponse): Promise<void> => { initCropperModal(); - currentModal.find('.t3js-modal-body').append(response).addClass('cropper'); + currentModal.find('.t3js-modal-body').append(await response.resolve()).addClass('cropper'); }); }, content: $('<div class="modal-loading">').append(icon), diff --git a/Build/Sources/TypeScript/backend/Resources/Public/TypeScript/LoginRefresh.ts b/Build/Sources/TypeScript/backend/Resources/Public/TypeScript/LoginRefresh.ts index a056533034b55f111ca12853ee24dfb316865f44..f01015bd58d378a10cda8ae242bfd8e8f2b4839c 100644 --- a/Build/Sources/TypeScript/backend/Resources/Public/TypeScript/LoginRefresh.ts +++ b/Build/Sources/TypeScript/backend/Resources/Public/TypeScript/LoginRefresh.ts @@ -13,11 +13,11 @@ import * as $ from 'jquery'; import {AjaxResponse} from 'TYPO3/CMS/Core/Ajax/AjaxResponse'; -import Typo3Notification = require('TYPO3/CMS/Backend/Notification'); import Modal = require('TYPO3/CMS/Backend/Modal'); +import Typo3Notification = require('TYPO3/CMS/Backend/Notification'); import Severity = require('TYPO3/CMS/Backend/Severity'); -import AjaxRequest = require('TYPO3/CMS/Core/Ajax/AjaxRequest'); import Client = require('TYPO3/CMS/Backend/Storage/Client'); +import AjaxRequest = require('TYPO3/CMS/Core/Ajax/AjaxRequest'); enum MarkupIdentifiers { loginrefresh = 't3js-modal-loginrefresh', @@ -458,8 +458,9 @@ class LoginRefresh { * and opens a dialog. */ protected checkActiveSession = (): void => { - $.getJSON(TYPO3.settings.ajaxUrls.login_timedout, [], (response: { [key: string ]: any }) => { - if (response.login.locked) { + new AjaxRequest(TYPO3.settings.ajaxUrls.login_timedout).get().then(async (response: AjaxResponse): Promise<void> => { + const data = await response.resolve(); + if (data.login.locked) { if (!this.backendIsLocked) { this.backendIsLocked = true; this.showBackendLockedModal(); @@ -472,8 +473,8 @@ class LoginRefresh { } if (!this.backendIsLocked) { - if (response.login.timed_out || response.login.will_time_out) { - response.login.timed_out + if (data.login.timed_out || data.login.will_time_out) { + data.login.timed_out ? this.showLoginForm() : this.showTimeoutModal(); } diff --git a/Build/Sources/TypeScript/backend/Resources/Public/TypeScript/Modal.ts b/Build/Sources/TypeScript/backend/Resources/Public/TypeScript/Modal.ts index 92c7de0d91ba2ea9a2de769b67ece64aa37016dc..e706f36ae226d8f09d906c66c77769703159156d 100644 --- a/Build/Sources/TypeScript/backend/Resources/Public/TypeScript/Modal.ts +++ b/Build/Sources/TypeScript/backend/Resources/Public/TypeScript/Modal.ts @@ -11,13 +11,15 @@ * The TYPO3 project - inspiring people to share! */ -import {AbstractAction} from './ActionButton/AbstractAction'; -import {SeverityEnum} from './Enum/Severity'; import 'bootstrap'; import * as $ from 'jquery'; +import {AjaxResponse} from 'TYPO3/CMS/Core/Ajax/AjaxResponse'; +import {AbstractAction} from './ActionButton/AbstractAction'; +import {SeverityEnum} from './Enum/Severity'; +import AjaxRequest = require('TYPO3/CMS/Core/Ajax/AjaxRequest'); +import SecurityUtility = require('TYPO3/CMS/Core/SecurityUtility'); import Icons = require('./Icons'); import Severity = require('./Severity'); -import SecurityUtility = require('TYPO3/CMS/Core/SecurityUtility'); enum Identifiers { modal = '.t3js-modal', @@ -415,19 +417,15 @@ class Modal { const $loaderTarget = currentModal.find(contentTarget); Icons.getIcon('spinner-circle', Icons.sizes.default, null, null, Icons.markupIdentifiers.inline).then((icon: string): void => { $loaderTarget.html('<div class="modal-loading">' + icon + '</div>'); - $.get( - <string>configuration.content, - (response: string): void => { - this.currentModal.find(contentTarget) - .empty() - .append(response); - if (configuration.ajaxCallback) { - configuration.ajaxCallback(); - } - this.currentModal.trigger('modal-loaded'); - }, - 'html', - ); + new AjaxRequest(configuration.content as string).get().then(async (response: AjaxResponse): Promise<void> => { + this.currentModal.find(contentTarget) + .empty() + .append(await response.raw().text()); + if (configuration.ajaxCallback) { + configuration.ajaxCallback(); + } + this.currentModal.trigger('modal-loaded'); + }); }); } else if (configuration.type === 'iframe') { currentModal.find(Identifiers.body).append( diff --git a/Build/Sources/TypeScript/backend/Resources/Public/TypeScript/OnlineMedia.ts b/Build/Sources/TypeScript/backend/Resources/Public/TypeScript/OnlineMedia.ts index 7d8fa8a55d3847be1551b08f096a7516e56355c8..1451f0b055f9adc513c00dca215820fb483b5371 100644 --- a/Build/Sources/TypeScript/backend/Resources/Public/TypeScript/OnlineMedia.ts +++ b/Build/Sources/TypeScript/backend/Resources/Public/TypeScript/OnlineMedia.ts @@ -11,13 +11,15 @@ * The TYPO3 project - inspiring people to share! */ -import {KeyTypesEnum} from './Enum/KeyTypes'; import * as $ from 'jquery'; +import {MessageUtility} from 'TYPO3/CMS/Backend/Utility/MessageUtility'; +import {AjaxResponse} from 'TYPO3/CMS/Core/Ajax/AjaxResponse'; +import {KeyTypesEnum} from './Enum/KeyTypes'; import NProgress = require('nprogress'); +import AjaxRequest = require('TYPO3/CMS/Core/Ajax/AjaxRequest'); +import SecurityUtility = require('TYPO3/CMS/Core/SecurityUtility'); import Modal = require('./Modal'); import Severity = require('./Severity'); -import SecurityUtility = require('TYPO3/CMS/Core/SecurityUtility'); -import {MessageUtility} from 'TYPO3/CMS/Backend/Utility/MessageUtility'; interface Response { file?: number; @@ -54,40 +56,37 @@ class OnlineMedia { const irreObjectUid = $trigger.data('file-irre-object'); NProgress.start(); - $.post( - TYPO3.settings.ajaxUrls.online_media_create, - { - url: url, - targetFolder: target, - allowed: allowed, - }, - (data: Response): void => { - if (data.file) { - const message = { - actionName: 'typo3:foreignRelation:insert', - objectGroup: irreObjectUid, - table: 'sys_file', - uid: data.file, - }; - MessageUtility.send(message); - } else { - const $confirm = Modal.confirm( - 'ERROR', - data.error, - Severity.error, - [{ - text: TYPO3.lang['button.ok'] || 'OK', - btnClass: 'btn-' + Severity.getCssClass(Severity.error), - name: 'ok', - active: true, - }], - ).on('confirm.button.ok', (): void => { - $confirm.modal('hide'); - }); - } - NProgress.done(); - }, - ); + new AjaxRequest(TYPO3.settings.ajaxUrls.online_media_create).post({ + url: url, + targetFolder: target, + allowed: allowed, + }).then(async (response: AjaxResponse): Promise<void> => { + const data: Response = await response.resolve(); + if (data.file) { + const message = { + actionName: 'typo3:foreignRelation:insert', + objectGroup: irreObjectUid, + table: 'sys_file', + uid: data.file, + }; + MessageUtility.send(message); + } else { + const $confirm = Modal.confirm( + 'ERROR', + data.error, + Severity.error, + [{ + text: TYPO3.lang['button.ok'] || 'OK', + btnClass: 'btn-' + Severity.getCssClass(Severity.error), + name: 'ok', + active: true, + }], + ).on('confirm.button.ok', (): void => { + $confirm.modal('hide'); + }); + } + NProgress.done(); + }); } /** diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/ContextHelp.js b/typo3/sysext/backend/Resources/Public/JavaScript/ContextHelp.js index c41d9047fdfceb17be3c38c4aa0a423ebc24549f..ec457db4be45c70df97a42a524722951a73a2c6f 100644 --- a/typo3/sysext/backend/Resources/Public/JavaScript/ContextHelp.js +++ b/typo3/sysext/backend/Resources/Public/JavaScript/ContextHelp.js @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -define(["require","exports","jquery","./Popover","bootstrap"],(function(t,e,o,a){"use strict";class s{constructor(){this.ajaxUrl=TYPO3.settings.ajaxUrls.context_help,this.trigger="click",this.placement="auto",this.selector=".help-link",this.initialize()}static resolveBackend(){return void 0!==window.opener&&null!==window.opener?window.opener.top:top}initialize(){const t=s.resolveBackend();void 0!==t.TYPO3.settings.ContextHelp&&(this.helpModuleUrl=t.TYPO3.settings.ContextHelp.moduleUrl),void 0===TYPO3.ShortcutMenu&&void 0===t.TYPO3.ShortcutMenu&&o(".icon-actions-system-shortcut-new").closest(".btn").hide();let e=" ";void 0!==t.TYPO3.lang&&(e=t.TYPO3.lang.csh_tooltip_loading);const i=o(this.selector);i.attr("data-loaded","false").attr("data-html","true").attr("data-original-title",e).attr("data-placement",this.placement).attr("data-trigger",this.trigger),a.popover(i),o(document).on("show.bs.popover",this.selector,t=>{const e=o(t.currentTarget),s=e.data("description");void 0!==s&&""!==s?a.setOptions(e,{title:e.data("title"),content:s}):"false"===e.attr("data-loaded")&&e.data("table")&&this.loadHelp(e),e.closest(".t3js-module-docheader").length&&a.setOption(e,"placement","bottom")}).on("shown.bs.popover",this.selector,t=>{const e=o(t.target).data("bs.popover").$tip;e.find(".popover-title").is(":visible")||e.addClass("no-title")}).on("click",".help-has-link",t=>{o(".popover").each((e,a)=>{const s=o(a);s.has(t.target).length&&this.showHelpPopup(s.data("bs.popover").$element)})}).on("click","body",t=>{o(this.selector).each((e,s)=>{const i=o(s);i.is(t.target)||0!==i.has(t.target).length||0!==o(".popover").has(t.target).length||a.hide(i)})})}showHelpPopup(t){try{const e=window.open(this.helpModuleUrl+"&table="+t.data("table")+"&field="+t.data("field"),"ContextHelpWindow","height=400,width=600,status=0,menubar=0,scrollbars=1");return e.focus(),a.hide(t),e}catch(t){}}loadHelp(t){const e=t.data("table"),s=t.data("field");e&&o.getJSON(this.ajaxUrl,{params:{action:"getContextHelp",table:e,field:s}}).done(e=>{const o=e.title||"",s=e.content||"<p></p>";a.setOptions(t,{title:o,content:s}),t.attr("data-loaded","true").one("hidden.bs.popover",()=>{a.show(t)}),a.hide(t)})}}return new s})); \ No newline at end of file +define(["require","exports","jquery","TYPO3/CMS/Core/Ajax/AjaxRequest","./Popover","bootstrap"],(function(t,e,o,a,s){"use strict";class i{constructor(){this.ajaxUrl=TYPO3.settings.ajaxUrls.context_help,this.trigger="click",this.placement="auto",this.selector=".help-link",this.initialize()}static resolveBackend(){return void 0!==window.opener&&null!==window.opener?window.opener.top:top}initialize(){const t=i.resolveBackend();void 0!==t.TYPO3.settings.ContextHelp&&(this.helpModuleUrl=t.TYPO3.settings.ContextHelp.moduleUrl),void 0===TYPO3.ShortcutMenu&&void 0===t.TYPO3.ShortcutMenu&&o(".icon-actions-system-shortcut-new").closest(".btn").hide();let e=" ";void 0!==t.TYPO3.lang&&(e=t.TYPO3.lang.csh_tooltip_loading);const a=o(this.selector);a.attr("data-loaded","false").attr("data-html","true").attr("data-original-title",e).attr("data-placement",this.placement).attr("data-trigger",this.trigger),s.popover(a),o(document).on("show.bs.popover",this.selector,t=>{const e=o(t.currentTarget),a=e.data("description");void 0!==a&&""!==a?s.setOptions(e,{title:e.data("title"),content:a}):"false"===e.attr("data-loaded")&&e.data("table")&&this.loadHelp(e),e.closest(".t3js-module-docheader").length&&s.setOption(e,"placement","bottom")}).on("shown.bs.popover",this.selector,t=>{const e=o(t.target).data("bs.popover").$tip;e.find(".popover-title").is(":visible")||e.addClass("no-title")}).on("click",".help-has-link",t=>{o(".popover").each((e,a)=>{const s=o(a);s.has(t.target).length&&this.showHelpPopup(s.data("bs.popover").$element)})}).on("click","body",t=>{o(this.selector).each((e,a)=>{const i=o(a);i.is(t.target)||0!==i.has(t.target).length||0!==o(".popover").has(t.target).length||s.hide(i)})})}showHelpPopup(t){try{const e=window.open(this.helpModuleUrl+"&table="+t.data("table")+"&field="+t.data("field"),"ContextHelpWindow","height=400,width=600,status=0,menubar=0,scrollbars=1");return e.focus(),s.hide(t),e}catch(t){}}loadHelp(t){const e=t.data("table"),o=t.data("field");e&&new a(this.ajaxUrl).withQueryArguments({params:{action:"getContextHelp",table:e,field:o}}).get().then(async e=>{const o=await e.resolve(),a=o.title||"",i=o.content||"<p></p>";s.setOptions(t,{title:a,content:i}),t.attr("data-loaded","true").one("hidden.bs.popover",()=>{s.show(t)}),s.hide(t)})}}return new i})); \ No newline at end of file diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/ImageManipulation.js b/typo3/sysext/backend/Resources/Public/JavaScript/ImageManipulation.js index dfb26af35546bdbe4a67e2ff2454a5a676bfbc8b..8b0a32a570958916ca42f51cd20318f903472cd1 100644 --- a/typo3/sysext/backend/Resources/Public/JavaScript/ImageManipulation.js +++ b/typo3/sysext/backend/Resources/Public/JavaScript/ImageManipulation.js @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -define(["require","exports","jquery","TYPO3/CMS/Backend/FormEngineValidation","./Icons","./Modal","TYPO3/CMS/Core/Contrib/imagesloaded.pkgd.min","jquery-ui/draggable","jquery-ui/resizable"],(function(t,r,e,i,a,s,o){"use strict";class n{constructor(){this.cropImageContainerSelector="#t3js-crop-image-container",this.cropImageSelector="#t3js-crop-image",this.coverAreaSelector=".t3js-cropper-cover-area",this.cropInfoSelector=".t3js-cropper-info-crop",this.focusAreaSelector="#t3js-cropper-focus-area",this.defaultFocusArea={height:1/3,width:1/3,x:0,y:0},this.defaultOpts={autoCrop:!0,autoCropArea:"0.7",dragMode:"crop",guides:!0,responsive:!0,viewMode:1,zoomable:!1},this.resizeTimeout=450,this.cropBuiltHandler=()=>{const t=this.cropper.cropper("getImageData"),r=this.currentModal.find(this.cropImageSelector);this.imageOriginalSizeFactor=r.data("originalWidth")/t.naturalWidth,this.cropVariantTriggers.each((r,i)=>{const a=e(i).attr("data-crop-variant-id"),s=this.convertRelativeToAbsoluteCropArea(this.data[a].cropArea,t),o=e.extend(!0,{},this.data[a],{cropArea:s});this.updatePreviewThumbnail(o,e(i))}),this.currentCropVariant.cropArea=this.convertRelativeToAbsoluteCropArea(this.currentCropVariant.cropArea,t),this.cropBox=this.currentModal.find(".cropper-crop-box"),this.setCropArea(this.currentCropVariant.cropArea),this.currentCropVariant.coverAreas&&this.initCoverAreas(this.cropBox,this.currentCropVariant.coverAreas),this.currentCropVariant.focusArea&&(n.isEmptyArea(this.currentCropVariant.focusArea)&&(this.currentCropVariant.focusArea=e.extend(!0,{},this.defaultFocusArea)),this.initFocusArea(this.cropBox),this.scaleAndMoveFocusArea(this.currentCropVariant.focusArea)),this.currentCropVariant.selectedRatio&&(this.setAspectRatio(this.currentCropVariant.allowedAspectRatios[this.currentCropVariant.selectedRatio]),this.setCropArea(this.currentCropVariant.cropArea),this.currentModal.find(`[data-option='${this.currentCropVariant.selectedRatio}']`).addClass("active")),this.cropperCanvas.addClass("is-visible")},this.cropMoveHandler=t=>{this.currentCropVariant.cropArea=e.extend(!0,this.currentCropVariant.cropArea,{height:Math.floor(t.height),width:Math.floor(t.width),x:Math.floor(t.x),y:Math.floor(t.y)}),this.updatePreviewThumbnail(this.currentCropVariant,this.activeCropVariantTrigger),this.updateCropVariantData(this.currentCropVariant);const r=Math.round(this.currentCropVariant.cropArea.width*this.imageOriginalSizeFactor),i=Math.round(this.currentCropVariant.cropArea.height*this.imageOriginalSizeFactor);this.cropInfo.text(`${r}×${i} px`)},this.cropStartHandler=()=>{this.currentCropVariant.focusArea&&(this.focusArea.draggable("option","disabled",!0),this.focusArea.resizable("option","disabled",!0))},this.cropEndHandler=()=>{this.currentCropVariant.focusArea&&(this.focusArea.draggable("option","disabled",!1),this.focusArea.resizable("option","disabled",!1))},e(window).resize(()=>{this.cropper&&this.cropper.cropper("destroy")}),this.resizeEnd(()=>{this.cropper&&this.init()})}static isEmptyArea(t){return e.isEmptyObject(t)}static wait(t,r){window.setTimeout(t,r)}static toCssPercent(t){return`${100*t}%`}static serializeCropVariants(t){return JSON.stringify(t,(t,r)=>"id"===t||"title"===t||"allowedAspectRatios"===t||"coverAreas"===t?void 0:r)}initializeTrigger(){e(".t3js-image-manipulation-trigger").off("click").click(t=>{t.preventDefault(),this.trigger=e(t.currentTarget),this.show()})}initializeCropperModal(){const t=this.currentModal.find(this.cropImageSelector);o(t,()=>{setTimeout(()=>{this.init()},100)})}show(){const t=this.trigger.data("modalTitle"),r=this.trigger.data("buttonPreviewText"),i=this.trigger.data("buttonDismissText"),o=this.trigger.data("buttonSaveText"),n=this.trigger.data("url"),c=this.trigger.data("payload"),h=this.initializeCropperModal.bind(this);a.getIcon("spinner-circle",a.sizes.default,null,null,a.markupIdentifiers.inline).then(a=>{this.currentModal=s.advanced({additionalCssClasses:["modal-image-manipulation"],buttons:[{btnClass:"btn-default pull-left",dataAttributes:{method:"preview"},icon:"actions-view",text:r},{btnClass:"btn-default",dataAttributes:{method:"dismiss"},icon:"actions-close",text:i},{btnClass:"btn-primary",dataAttributes:{method:"save"},icon:"actions-document-save",text:o}],callback:t=>{e.post({url:n,data:c}).done(r=>{h(),t.find(".t3js-modal-body").append(r).addClass("cropper")})},content:e('<div class="modal-loading">').append(a),size:s.sizes.full,style:s.styles.dark,title:t}),this.currentModal.on("hide.bs.modal",()=>{this.destroy()}),this.currentModal.data("bs.modal").options.backdrop="static"})}init(){const t=this.currentModal.find(this.cropImageSelector),r=e(t).height(),i=e(t).width(),a=this.trigger.attr("data-crop-variants");if(!a)throw new TypeError("ImageManipulation: No cropVariants data found for image");this.data=e.isEmptyObject(this.data)?JSON.parse(a):this.data,this.currentModal.find(this.cropImageContainerSelector).css({height:r,width:i}),this.cropVariantTriggers=this.currentModal.find(".t3js-crop-variant-trigger"),this.activeCropVariantTrigger=this.currentModal.find(".t3js-crop-variant-trigger.is-active"),this.cropInfo=this.currentModal.find(this.cropInfoSelector),this.saveButton=this.currentModal.find("[data-method=save]"),this.previewButton=this.currentModal.find("[data-method=preview]"),this.dismissButton=this.currentModal.find("[data-method=dismiss]"),this.resetButton=this.currentModal.find("[data-method=reset]"),this.cropperCanvas=this.currentModal.find("#js-crop-canvas"),this.aspectRatioTrigger=this.currentModal.find("[data-method=setAspectRatio]"),this.currentCropVariant=this.data[this.activeCropVariantTrigger.attr("data-crop-variant-id")],this.cropVariantTriggers.off("click").on("click",t=>{if(e(t.currentTarget).hasClass("is-active"))return t.stopPropagation(),void t.preventDefault();this.activeCropVariantTrigger.removeClass("is-active"),e(t.currentTarget).addClass("is-active"),this.activeCropVariantTrigger=e(t.currentTarget);const r=this.data[this.activeCropVariantTrigger.attr("data-crop-variant-id")],i=this.cropper.cropper("getImageData");r.cropArea=this.convertRelativeToAbsoluteCropArea(r.cropArea,i),this.currentCropVariant=e.extend(!0,{},r),this.update(r)}),this.aspectRatioTrigger.off("click").on("click",t=>{const r=e(t.currentTarget).attr("data-option"),i=e.extend(!0,{},this.currentCropVariant),a=i.allowedAspectRatios[r];this.setAspectRatio(a),this.setCropArea(i.cropArea),this.currentCropVariant=e.extend(!0,{},i,{selectedRatio:r}),this.update(this.currentCropVariant)}),this.saveButton.off("click").on("click",()=>{this.save(this.data)}),this.trigger.attr("data-preview-url")?this.previewButton.off("click").on("click",()=>{this.openPreview(this.data)}):this.previewButton.hide(),this.dismissButton.off("click").on("click",()=>{this.currentModal.modal("hide")}),this.resetButton.off("click").on("click",t=>{const r=this.cropper.cropper("getImageData"),i=e(t.currentTarget).attr("data-crop-variant");if(t.preventDefault(),t.stopPropagation(),!i)throw new TypeError("TYPO3 Cropper: No cropVariant data attribute found on reset element.");const a=JSON.parse(i),s=this.convertRelativeToAbsoluteCropArea(a.cropArea,r);this.currentCropVariant=e.extend(!0,{},a,{cropArea:s}),this.update(this.currentCropVariant)}),n.isEmptyArea(this.currentCropVariant.cropArea)&&(this.defaultOpts=e.extend({autoCropArea:1},this.defaultOpts)),this.cropper=top.$(t).cropper(e.extend(this.defaultOpts,{built:this.cropBuiltHandler,crop:this.cropMoveHandler,cropend:this.cropEndHandler,cropstart:this.cropStartHandler,data:this.currentCropVariant.cropArea}))}update(t){const r=e.extend(!0,{},t),i=t.allowedAspectRatios[t.selectedRatio];this.currentModal.find("[data-option]").removeClass("active"),this.currentModal.find(`[data-option="${t.selectedRatio}"]`).addClass("active"),this.setAspectRatio(i),this.setCropArea(r.cropArea),this.currentCropVariant=e.extend(!0,{},r,t),this.cropBox.find(this.coverAreaSelector).remove(),this.cropBox.has(this.focusAreaSelector).length&&(this.focusArea.resizable("destroy").draggable("destroy"),this.focusArea.remove()),t.focusArea&&(n.isEmptyArea(t.focusArea)&&(this.currentCropVariant.focusArea=e.extend(!0,{},this.defaultFocusArea)),this.initFocusArea(this.cropBox),this.scaleAndMoveFocusArea(this.currentCropVariant.focusArea)),t.coverAreas&&this.initCoverAreas(this.cropBox,this.currentCropVariant.coverAreas),this.updatePreviewThumbnail(this.currentCropVariant,this.activeCropVariantTrigger)}initFocusArea(t){this.focusArea=e('<div id="t3js-cropper-focus-area" class="cropper-focus-area"></div>'),t.append(this.focusArea),this.focusArea.draggable({containment:t,create:()=>{this.scaleAndMoveFocusArea(this.currentCropVariant.focusArea)},drag:()=>{const{left:r,top:e}=t.offset(),{left:i,top:a}=this.focusArea.offset(),{focusArea:s,coverAreas:o}=this.currentCropVariant;s.x=(i-r)/t.width(),s.y=(a-e)/t.height(),this.updatePreviewThumbnail(this.currentCropVariant,this.activeCropVariantTrigger),this.checkFocusAndCoverAreasCollision(s,o)?this.focusArea.addClass("has-nodrop"):this.focusArea.removeClass("has-nodrop")},revert:()=>{const{left:r,top:e}=t.offset(),{left:i,top:a}=this.focusArea.offset(),{focusArea:s,coverAreas:o}=this.currentCropVariant;return!!this.checkFocusAndCoverAreasCollision(s,o)&&(this.focusArea.removeClass("has-nodrop"),n.wait(()=>{s.x=(i-r)/t.width(),s.y=(a-e)/t.height(),this.updateCropVariantData(this.currentCropVariant)},250),!0)},revertDuration:200,stop:()=>{const{left:r,top:e}=t.offset(),{left:i,top:a}=this.focusArea.offset(),{focusArea:s}=this.currentCropVariant;s.x=(i-r)/t.width(),s.y=(a-e)/t.height(),this.scaleAndMoveFocusArea(s)}}).resizable({containment:t,handles:"all",resize:()=>{const{left:r,top:e}=t.offset(),{left:i,top:a}=this.focusArea.offset(),{focusArea:s,coverAreas:o}=this.currentCropVariant;s.height=this.focusArea.height()/t.height(),s.width=this.focusArea.width()/t.width(),s.x=(i-r)/t.width(),s.y=(a-e)/t.height(),this.updatePreviewThumbnail(this.currentCropVariant,this.activeCropVariantTrigger),this.checkFocusAndCoverAreasCollision(s,o)?this.focusArea.addClass("has-nodrop"):this.focusArea.removeClass("has-nodrop")},stop:(r,i)=>{const{left:a,top:s}=t.offset(),{left:o,top:n}=this.focusArea.offset(),{focusArea:c,coverAreas:h}=this.currentCropVariant;this.checkFocusAndCoverAreasCollision(c,h)?i.element.animate(e.extend(i.originalPosition,i.originalSize),250,()=>{c.height=this.focusArea.height()/t.height(),c.height=this.focusArea.height()/t.height(),c.width=this.focusArea.width()/t.width(),c.x=(o-a)/t.width(),c.y=(n-s)/t.height(),this.scaleAndMoveFocusArea(c),this.focusArea.removeClass("has-nodrop")}):this.scaleAndMoveFocusArea(c)}})}initCoverAreas(t,r){r.forEach(r=>{const i=e('<div class="cropper-cover-area t3js-cropper-cover-area"></div>');t.append(i),i.css({height:n.toCssPercent(r.height),left:n.toCssPercent(r.x),top:n.toCssPercent(r.y),width:n.toCssPercent(r.width)})})}updatePreviewThumbnail(t,r){let e;const i=r.find(".t3js-cropper-preview-thumbnail-crop-area"),a=r.find(".t3js-cropper-preview-thumbnail-crop-image"),s=r.find(".t3js-cropper-preview-thumbnail-focus-area"),o=this.cropper.cropper("getImageData");i.css({height:n.toCssPercent(t.cropArea.height/o.naturalHeight),left:n.toCssPercent(t.cropArea.x/o.naturalWidth),top:n.toCssPercent(t.cropArea.y/o.naturalHeight),width:n.toCssPercent(t.cropArea.width/o.naturalWidth)}),t.focusArea&&s.css({height:n.toCssPercent(t.focusArea.height),left:n.toCssPercent(t.focusArea.x),top:n.toCssPercent(t.focusArea.y),width:n.toCssPercent(t.focusArea.width)}),e=i.css(["width","height","left","top"]),a.css({height:`${parseFloat(e.height)*(1/(t.cropArea.height/o.naturalHeight))}px`,margin:`${-1*parseFloat(e.left)}px`,marginTop:`${-1*parseFloat(e.top)}px`,width:`${parseFloat(e.width)*(1/(t.cropArea.width/o.naturalWidth))}px`})}scaleAndMoveFocusArea(t){this.focusArea.css({height:n.toCssPercent(t.height),left:n.toCssPercent(t.x),top:n.toCssPercent(t.y),width:n.toCssPercent(t.width)}),this.currentCropVariant.focusArea=t,this.updatePreviewThumbnail(this.currentCropVariant,this.activeCropVariantTrigger),this.updateCropVariantData(this.currentCropVariant)}updateCropVariantData(t){const r=this.cropper.cropper("getImageData"),i=this.convertAbsoluteToRelativeCropArea(t.cropArea,r);this.data[t.id]=e.extend(!0,{},t,{cropArea:i})}setAspectRatio(t){this.cropper.cropper("setAspectRatio",t.value)}setCropArea(t){0===this.currentCropVariant.allowedAspectRatios[this.currentCropVariant.selectedRatio].value?this.cropper.cropper("setData",{height:t.height,width:t.width,x:t.x,y:t.y}):this.cropper.cropper("setData",{height:t.height,x:t.x,y:t.y})}checkFocusAndCoverAreasCollision(t,r){return!!r&&r.some(r=>t.x<r.x+r.width&&t.x+t.width>r.x&&t.y<r.y+r.height&&t.height+t.y>r.y)}convertAbsoluteToRelativeCropArea(t,r){const{height:e,width:i,x:a,y:s}=t;return{height:e/r.naturalHeight,width:i/r.naturalWidth,x:a/r.naturalWidth,y:s/r.naturalHeight}}convertRelativeToAbsoluteCropArea(t,r){const{height:e,width:i,x:a,y:s}=t;return{height:e*r.naturalHeight,width:i*r.naturalWidth,x:a*r.naturalWidth,y:s*r.naturalHeight}}setPreviewImages(t){const r=this.cropper,i=r.cropper("getImageData");Object.keys(t).forEach(a=>{const s=t[a],o=this.convertRelativeToAbsoluteCropArea(s.cropArea,i),n=this.trigger.closest(".form-group").find(`.t3js-image-manipulation-preview[data-crop-variant-id="${a}"]`),c=this.trigger.closest(".form-group").find(`.t3js-image-manipulation-selected-ratio[data-crop-variant-id="${a}"]`);if(0===n.length)return;let h=n.width(),p=n.data("preview-height");const d=o.width/o.height,l=h/d;l>p?h=p*d:p=l,h>o.width&&(h=o.width,p=o.height);const u=h/o.width,g=e("<div />").html('<img src="'+r.attr("src")+'">'),f=this.currentModal.find(`.t3-js-ratio-title[data-ratio-id="${s.id}${s.selectedRatio}"]`);c.text(f.text()),g.addClass("cropper-preview-container"),n.empty().append(g),g.wrap('<span class="thumbnail thumbnail-status"></span>'),g.width(h).height(p).find("img").css({height:i.naturalHeight*u,left:-o.x*u,top:-o.y*u,width:i.naturalWidth*u})})}openPreview(t){const r=n.serializeCropVariants(t);let e=this.trigger.attr("data-preview-url");e=e+"&cropVariants="+encodeURIComponent(r),window.open(e,"TYPO3ImageManipulationPreview")}save(t){const r=n.serializeCropVariants(t),a=e(`#${this.trigger.attr("data-field")}`);this.trigger.attr("data-crop-variants",JSON.stringify(t)),this.setPreviewImages(t),a.val(r),i.markFieldAsChanged(a),this.currentModal.modal("hide")}destroy(){this.currentModal&&(void 0!==this.cropper&&null!==this.cropper&&this.cropper.cropper("destroy"),this.cropper=null,this.currentModal=null,this.data=null)}resizeEnd(t){let r;e(window).on("resize",()=>{clearTimeout(r),r=setTimeout(()=>{t()},this.resizeTimeout)})}}return new n})); \ No newline at end of file +define(["require","exports","jquery","TYPO3/CMS/Backend/FormEngineValidation","TYPO3/CMS/Core/Ajax/AjaxRequest","TYPO3/CMS/Core/Contrib/imagesloaded.pkgd.min","./Icons","./Modal","jquery-ui/draggable","jquery-ui/resizable"],(function(t,e,r,i,a,s,o,n){"use strict";class c{constructor(){this.cropImageContainerSelector="#t3js-crop-image-container",this.cropImageSelector="#t3js-crop-image",this.coverAreaSelector=".t3js-cropper-cover-area",this.cropInfoSelector=".t3js-cropper-info-crop",this.focusAreaSelector="#t3js-cropper-focus-area",this.defaultFocusArea={height:1/3,width:1/3,x:0,y:0},this.defaultOpts={autoCrop:!0,autoCropArea:"0.7",dragMode:"crop",guides:!0,responsive:!0,viewMode:1,zoomable:!1},this.resizeTimeout=450,this.cropBuiltHandler=()=>{const t=this.cropper.cropper("getImageData"),e=this.currentModal.find(this.cropImageSelector);this.imageOriginalSizeFactor=e.data("originalWidth")/t.naturalWidth,this.cropVariantTriggers.each((e,i)=>{const a=r(i).attr("data-crop-variant-id"),s=this.convertRelativeToAbsoluteCropArea(this.data[a].cropArea,t),o=r.extend(!0,{},this.data[a],{cropArea:s});this.updatePreviewThumbnail(o,r(i))}),this.currentCropVariant.cropArea=this.convertRelativeToAbsoluteCropArea(this.currentCropVariant.cropArea,t),this.cropBox=this.currentModal.find(".cropper-crop-box"),this.setCropArea(this.currentCropVariant.cropArea),this.currentCropVariant.coverAreas&&this.initCoverAreas(this.cropBox,this.currentCropVariant.coverAreas),this.currentCropVariant.focusArea&&(c.isEmptyArea(this.currentCropVariant.focusArea)&&(this.currentCropVariant.focusArea=r.extend(!0,{},this.defaultFocusArea)),this.initFocusArea(this.cropBox),this.scaleAndMoveFocusArea(this.currentCropVariant.focusArea)),this.currentCropVariant.selectedRatio&&(this.setAspectRatio(this.currentCropVariant.allowedAspectRatios[this.currentCropVariant.selectedRatio]),this.setCropArea(this.currentCropVariant.cropArea),this.currentModal.find(`[data-option='${this.currentCropVariant.selectedRatio}']`).addClass("active")),this.cropperCanvas.addClass("is-visible")},this.cropMoveHandler=t=>{this.currentCropVariant.cropArea=r.extend(!0,this.currentCropVariant.cropArea,{height:Math.floor(t.height),width:Math.floor(t.width),x:Math.floor(t.x),y:Math.floor(t.y)}),this.updatePreviewThumbnail(this.currentCropVariant,this.activeCropVariantTrigger),this.updateCropVariantData(this.currentCropVariant);const e=Math.round(this.currentCropVariant.cropArea.width*this.imageOriginalSizeFactor),i=Math.round(this.currentCropVariant.cropArea.height*this.imageOriginalSizeFactor);this.cropInfo.text(`${e}×${i} px`)},this.cropStartHandler=()=>{this.currentCropVariant.focusArea&&(this.focusArea.draggable("option","disabled",!0),this.focusArea.resizable("option","disabled",!0))},this.cropEndHandler=()=>{this.currentCropVariant.focusArea&&(this.focusArea.draggable("option","disabled",!1),this.focusArea.resizable("option","disabled",!1))},r(window).resize(()=>{this.cropper&&this.cropper.cropper("destroy")}),this.resizeEnd(()=>{this.cropper&&this.init()})}static isEmptyArea(t){return r.isEmptyObject(t)}static wait(t,e){window.setTimeout(t,e)}static toCssPercent(t){return`${100*t}%`}static serializeCropVariants(t){return JSON.stringify(t,(t,e)=>"id"===t||"title"===t||"allowedAspectRatios"===t||"coverAreas"===t?void 0:e)}initializeTrigger(){r(".t3js-image-manipulation-trigger").off("click").click(t=>{t.preventDefault(),this.trigger=r(t.currentTarget),this.show()})}initializeCropperModal(){const t=this.currentModal.find(this.cropImageSelector);s(t,()=>{setTimeout(()=>{this.init()},100)})}show(){const t=this.trigger.data("modalTitle"),e=this.trigger.data("buttonPreviewText"),i=this.trigger.data("buttonDismissText"),s=this.trigger.data("buttonSaveText"),c=this.trigger.data("url"),h=this.trigger.data("payload"),p=this.initializeCropperModal.bind(this);o.getIcon("spinner-circle",o.sizes.default,null,null,o.markupIdentifiers.inline).then(o=>{this.currentModal=n.advanced({additionalCssClasses:["modal-image-manipulation"],buttons:[{btnClass:"btn-default pull-left",dataAttributes:{method:"preview"},icon:"actions-view",text:e},{btnClass:"btn-default",dataAttributes:{method:"dismiss"},icon:"actions-close",text:i},{btnClass:"btn-primary",dataAttributes:{method:"save"},icon:"actions-document-save",text:s}],callback:t=>{new a(c).post(h).then(async e=>{p(),t.find(".t3js-modal-body").append(await e.resolve()).addClass("cropper")})},content:r('<div class="modal-loading">').append(o),size:n.sizes.full,style:n.styles.dark,title:t}),this.currentModal.on("hide.bs.modal",()=>{this.destroy()}),this.currentModal.data("bs.modal").options.backdrop="static"})}init(){const t=this.currentModal.find(this.cropImageSelector),e=r(t).height(),i=r(t).width(),a=this.trigger.attr("data-crop-variants");if(!a)throw new TypeError("ImageManipulation: No cropVariants data found for image");this.data=r.isEmptyObject(this.data)?JSON.parse(a):this.data,this.currentModal.find(this.cropImageContainerSelector).css({height:e,width:i}),this.cropVariantTriggers=this.currentModal.find(".t3js-crop-variant-trigger"),this.activeCropVariantTrigger=this.currentModal.find(".t3js-crop-variant-trigger.is-active"),this.cropInfo=this.currentModal.find(this.cropInfoSelector),this.saveButton=this.currentModal.find("[data-method=save]"),this.previewButton=this.currentModal.find("[data-method=preview]"),this.dismissButton=this.currentModal.find("[data-method=dismiss]"),this.resetButton=this.currentModal.find("[data-method=reset]"),this.cropperCanvas=this.currentModal.find("#js-crop-canvas"),this.aspectRatioTrigger=this.currentModal.find("[data-method=setAspectRatio]"),this.currentCropVariant=this.data[this.activeCropVariantTrigger.attr("data-crop-variant-id")],this.cropVariantTriggers.off("click").on("click",t=>{if(r(t.currentTarget).hasClass("is-active"))return t.stopPropagation(),void t.preventDefault();this.activeCropVariantTrigger.removeClass("is-active"),r(t.currentTarget).addClass("is-active"),this.activeCropVariantTrigger=r(t.currentTarget);const e=this.data[this.activeCropVariantTrigger.attr("data-crop-variant-id")],i=this.cropper.cropper("getImageData");e.cropArea=this.convertRelativeToAbsoluteCropArea(e.cropArea,i),this.currentCropVariant=r.extend(!0,{},e),this.update(e)}),this.aspectRatioTrigger.off("click").on("click",t=>{const e=r(t.currentTarget).attr("data-option"),i=r.extend(!0,{},this.currentCropVariant),a=i.allowedAspectRatios[e];this.setAspectRatio(a),this.setCropArea(i.cropArea),this.currentCropVariant=r.extend(!0,{},i,{selectedRatio:e}),this.update(this.currentCropVariant)}),this.saveButton.off("click").on("click",()=>{this.save(this.data)}),this.trigger.attr("data-preview-url")?this.previewButton.off("click").on("click",()=>{this.openPreview(this.data)}):this.previewButton.hide(),this.dismissButton.off("click").on("click",()=>{this.currentModal.modal("hide")}),this.resetButton.off("click").on("click",t=>{const e=this.cropper.cropper("getImageData"),i=r(t.currentTarget).attr("data-crop-variant");if(t.preventDefault(),t.stopPropagation(),!i)throw new TypeError("TYPO3 Cropper: No cropVariant data attribute found on reset element.");const a=JSON.parse(i),s=this.convertRelativeToAbsoluteCropArea(a.cropArea,e);this.currentCropVariant=r.extend(!0,{},a,{cropArea:s}),this.update(this.currentCropVariant)}),c.isEmptyArea(this.currentCropVariant.cropArea)&&(this.defaultOpts=r.extend({autoCropArea:1},this.defaultOpts)),this.cropper=top.$(t).cropper(r.extend(this.defaultOpts,{built:this.cropBuiltHandler,crop:this.cropMoveHandler,cropend:this.cropEndHandler,cropstart:this.cropStartHandler,data:this.currentCropVariant.cropArea}))}update(t){const e=r.extend(!0,{},t),i=t.allowedAspectRatios[t.selectedRatio];this.currentModal.find("[data-option]").removeClass("active"),this.currentModal.find(`[data-option="${t.selectedRatio}"]`).addClass("active"),this.setAspectRatio(i),this.setCropArea(e.cropArea),this.currentCropVariant=r.extend(!0,{},e,t),this.cropBox.find(this.coverAreaSelector).remove(),this.cropBox.has(this.focusAreaSelector).length&&(this.focusArea.resizable("destroy").draggable("destroy"),this.focusArea.remove()),t.focusArea&&(c.isEmptyArea(t.focusArea)&&(this.currentCropVariant.focusArea=r.extend(!0,{},this.defaultFocusArea)),this.initFocusArea(this.cropBox),this.scaleAndMoveFocusArea(this.currentCropVariant.focusArea)),t.coverAreas&&this.initCoverAreas(this.cropBox,this.currentCropVariant.coverAreas),this.updatePreviewThumbnail(this.currentCropVariant,this.activeCropVariantTrigger)}initFocusArea(t){this.focusArea=r('<div id="t3js-cropper-focus-area" class="cropper-focus-area"></div>'),t.append(this.focusArea),this.focusArea.draggable({containment:t,create:()=>{this.scaleAndMoveFocusArea(this.currentCropVariant.focusArea)},drag:()=>{const{left:e,top:r}=t.offset(),{left:i,top:a}=this.focusArea.offset(),{focusArea:s,coverAreas:o}=this.currentCropVariant;s.x=(i-e)/t.width(),s.y=(a-r)/t.height(),this.updatePreviewThumbnail(this.currentCropVariant,this.activeCropVariantTrigger),this.checkFocusAndCoverAreasCollision(s,o)?this.focusArea.addClass("has-nodrop"):this.focusArea.removeClass("has-nodrop")},revert:()=>{const{left:e,top:r}=t.offset(),{left:i,top:a}=this.focusArea.offset(),{focusArea:s,coverAreas:o}=this.currentCropVariant;return!!this.checkFocusAndCoverAreasCollision(s,o)&&(this.focusArea.removeClass("has-nodrop"),c.wait(()=>{s.x=(i-e)/t.width(),s.y=(a-r)/t.height(),this.updateCropVariantData(this.currentCropVariant)},250),!0)},revertDuration:200,stop:()=>{const{left:e,top:r}=t.offset(),{left:i,top:a}=this.focusArea.offset(),{focusArea:s}=this.currentCropVariant;s.x=(i-e)/t.width(),s.y=(a-r)/t.height(),this.scaleAndMoveFocusArea(s)}}).resizable({containment:t,handles:"all",resize:()=>{const{left:e,top:r}=t.offset(),{left:i,top:a}=this.focusArea.offset(),{focusArea:s,coverAreas:o}=this.currentCropVariant;s.height=this.focusArea.height()/t.height(),s.width=this.focusArea.width()/t.width(),s.x=(i-e)/t.width(),s.y=(a-r)/t.height(),this.updatePreviewThumbnail(this.currentCropVariant,this.activeCropVariantTrigger),this.checkFocusAndCoverAreasCollision(s,o)?this.focusArea.addClass("has-nodrop"):this.focusArea.removeClass("has-nodrop")},stop:(e,i)=>{const{left:a,top:s}=t.offset(),{left:o,top:n}=this.focusArea.offset(),{focusArea:c,coverAreas:h}=this.currentCropVariant;this.checkFocusAndCoverAreasCollision(c,h)?i.element.animate(r.extend(i.originalPosition,i.originalSize),250,()=>{c.height=this.focusArea.height()/t.height(),c.height=this.focusArea.height()/t.height(),c.width=this.focusArea.width()/t.width(),c.x=(o-a)/t.width(),c.y=(n-s)/t.height(),this.scaleAndMoveFocusArea(c),this.focusArea.removeClass("has-nodrop")}):this.scaleAndMoveFocusArea(c)}})}initCoverAreas(t,e){e.forEach(e=>{const i=r('<div class="cropper-cover-area t3js-cropper-cover-area"></div>');t.append(i),i.css({height:c.toCssPercent(e.height),left:c.toCssPercent(e.x),top:c.toCssPercent(e.y),width:c.toCssPercent(e.width)})})}updatePreviewThumbnail(t,e){let r;const i=e.find(".t3js-cropper-preview-thumbnail-crop-area"),a=e.find(".t3js-cropper-preview-thumbnail-crop-image"),s=e.find(".t3js-cropper-preview-thumbnail-focus-area"),o=this.cropper.cropper("getImageData");i.css({height:c.toCssPercent(t.cropArea.height/o.naturalHeight),left:c.toCssPercent(t.cropArea.x/o.naturalWidth),top:c.toCssPercent(t.cropArea.y/o.naturalHeight),width:c.toCssPercent(t.cropArea.width/o.naturalWidth)}),t.focusArea&&s.css({height:c.toCssPercent(t.focusArea.height),left:c.toCssPercent(t.focusArea.x),top:c.toCssPercent(t.focusArea.y),width:c.toCssPercent(t.focusArea.width)}),r=i.css(["width","height","left","top"]),a.css({height:`${parseFloat(r.height)*(1/(t.cropArea.height/o.naturalHeight))}px`,margin:`${-1*parseFloat(r.left)}px`,marginTop:`${-1*parseFloat(r.top)}px`,width:`${parseFloat(r.width)*(1/(t.cropArea.width/o.naturalWidth))}px`})}scaleAndMoveFocusArea(t){this.focusArea.css({height:c.toCssPercent(t.height),left:c.toCssPercent(t.x),top:c.toCssPercent(t.y),width:c.toCssPercent(t.width)}),this.currentCropVariant.focusArea=t,this.updatePreviewThumbnail(this.currentCropVariant,this.activeCropVariantTrigger),this.updateCropVariantData(this.currentCropVariant)}updateCropVariantData(t){const e=this.cropper.cropper("getImageData"),i=this.convertAbsoluteToRelativeCropArea(t.cropArea,e);this.data[t.id]=r.extend(!0,{},t,{cropArea:i})}setAspectRatio(t){this.cropper.cropper("setAspectRatio",t.value)}setCropArea(t){0===this.currentCropVariant.allowedAspectRatios[this.currentCropVariant.selectedRatio].value?this.cropper.cropper("setData",{height:t.height,width:t.width,x:t.x,y:t.y}):this.cropper.cropper("setData",{height:t.height,x:t.x,y:t.y})}checkFocusAndCoverAreasCollision(t,e){return!!e&&e.some(e=>t.x<e.x+e.width&&t.x+t.width>e.x&&t.y<e.y+e.height&&t.height+t.y>e.y)}convertAbsoluteToRelativeCropArea(t,e){const{height:r,width:i,x:a,y:s}=t;return{height:r/e.naturalHeight,width:i/e.naturalWidth,x:a/e.naturalWidth,y:s/e.naturalHeight}}convertRelativeToAbsoluteCropArea(t,e){const{height:r,width:i,x:a,y:s}=t;return{height:r*e.naturalHeight,width:i*e.naturalWidth,x:a*e.naturalWidth,y:s*e.naturalHeight}}setPreviewImages(t){const e=this.cropper,i=e.cropper("getImageData");Object.keys(t).forEach(a=>{const s=t[a],o=this.convertRelativeToAbsoluteCropArea(s.cropArea,i),n=this.trigger.closest(".form-group").find(`.t3js-image-manipulation-preview[data-crop-variant-id="${a}"]`),c=this.trigger.closest(".form-group").find(`.t3js-image-manipulation-selected-ratio[data-crop-variant-id="${a}"]`);if(0===n.length)return;let h=n.width(),p=n.data("preview-height");const d=o.width/o.height,l=h/d;l>p?h=p*d:p=l,h>o.width&&(h=o.width,p=o.height);const u=h/o.width,g=r("<div />").html('<img src="'+e.attr("src")+'">'),f=this.currentModal.find(`.t3-js-ratio-title[data-ratio-id="${s.id}${s.selectedRatio}"]`);c.text(f.text()),g.addClass("cropper-preview-container"),n.empty().append(g),g.wrap('<span class="thumbnail thumbnail-status"></span>'),g.width(h).height(p).find("img").css({height:i.naturalHeight*u,left:-o.x*u,top:-o.y*u,width:i.naturalWidth*u})})}openPreview(t){const e=c.serializeCropVariants(t);let r=this.trigger.attr("data-preview-url");r=r+"&cropVariants="+encodeURIComponent(e),window.open(r,"TYPO3ImageManipulationPreview")}save(t){const e=c.serializeCropVariants(t),a=r(`#${this.trigger.attr("data-field")}`);this.trigger.attr("data-crop-variants",JSON.stringify(t)),this.setPreviewImages(t),a.val(e),i.markFieldAsChanged(a),this.currentModal.modal("hide")}destroy(){this.currentModal&&(void 0!==this.cropper&&null!==this.cropper&&this.cropper.cropper("destroy"),this.cropper=null,this.currentModal=null,this.data=null)}resizeEnd(t){let e;r(window).on("resize",()=>{clearTimeout(e),e=setTimeout(()=>{t()},this.resizeTimeout)})}}return new c})); \ No newline at end of file diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/LoginRefresh.js b/typo3/sysext/backend/Resources/Public/JavaScript/LoginRefresh.js index bb7b46a4337075a97ebfc4e471b63151b50f4513..20e66bab37879c457dc94516bd1b89ccf5d67a03 100644 --- a/typo3/sysext/backend/Resources/Public/JavaScript/LoginRefresh.js +++ b/typo3/sysext/backend/Resources/Public/JavaScript/LoginRefresh.js @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -define(["require","exports","jquery","TYPO3/CMS/Backend/Notification","TYPO3/CMS/Backend/Modal","TYPO3/CMS/Backend/Severity","TYPO3/CMS/Core/Ajax/AjaxRequest","TYPO3/CMS/Backend/Storage/Client"],(function(e,o,t,i,s,n,a,l){"use strict";var d;!function(e){e.loginrefresh="t3js-modal-loginrefresh",e.lockedModal="t3js-modal-backendlocked",e.loginFormModal="t3js-modal-backendloginform"}(d||(d={}));class r{constructor(){this.options={modalConfig:{backdrop:"static"}},this.webNotification=null,this.intervalTime=60,this.intervalId=null,this.backendIsLocked=!1,this.isTimingOut=!1,this.$timeoutModal=null,this.$backendLockedModal=null,this.$loginForm=null,this.loginFramesetUrl="",this.logoutUrl="",this.submitForm=e=>{e.preventDefault();const o=this.$loginForm.find("form"),s=o.find("input[name=p_field]"),n=o.find("input[name=userident]"),l=s.val();if(""===l&&""===n.val())return i.error(TYPO3.lang["mess.refresh_login_failed"],TYPO3.lang["mess.refresh_login_emptyPassword"]),void s.focus();l&&(n.val(l),s.val(""));const d={login_status:"login"};t.each(o.serializeArray(),(function(e,o){d[o.name]=o.value})),new a(o.attr("action")).post(d).then(async e=>{(await e.resolve()).login.success?this.hideLoginForm():(i.error(TYPO3.lang["mess.refresh_login_failed"],TYPO3.lang["mess.refresh_login_failed_message"]),s.focus())})},this.checkActiveSession=()=>{t.getJSON(TYPO3.settings.ajaxUrls.login_timedout,[],e=>{e.login.locked?this.backendIsLocked||(this.backendIsLocked=!0,this.showBackendLockedModal()):this.backendIsLocked&&(this.backendIsLocked=!1,this.hideBackendLockedModal()),this.backendIsLocked||(e.login.timed_out||e.login.will_time_out)&&(e.login.timed_out?this.showLoginForm():this.showTimeoutModal())})}}initialize(){this.initializeTimeoutModal(),this.initializeBackendLockedModal(),this.initializeLoginForm(),this.startTask();const e=!(l.isset("notifications.asked")&&"yes"===l.get("notifications.asked")),o="undefined"!=typeof Notification&&"default"===Notification.permission;e&&"https:"===document.location.protocol&&o&&s.confirm(TYPO3.lang["notification.request.title"],TYPO3.lang["notification.request.description"],n.info,[{text:TYPO3.lang["button.yes"]||"Yes",btnClass:"btn-"+n.getCssClass(n.info),name:"ok",active:!0},{text:TYPO3.lang["button.no"]||"No",btnClass:"btn-"+n.getCssClass(n.notice),name:"cancel"}]).on("confirm.button.ok",()=>{Notification.requestPermission(),s.dismiss()}).on("confirm.button.cancel",()=>{s.dismiss()}).on("hide.bs.modal",()=>{l.set("notifications.asked","yes")})}startTask(){if(null!==this.intervalId)return;let e=1e3*this.intervalTime;this.intervalId=setInterval(this.checkActiveSession,e)}stopTask(){clearInterval(this.intervalId),this.intervalId=null}setIntervalTime(e){this.intervalTime=Math.min(e,86400)}setLogoutUrl(e){this.logoutUrl=e}setLoginFramesetUrl(e){this.loginFramesetUrl=e}showTimeoutModal(){this.isTimingOut=!0,this.$timeoutModal.modal(this.options.modalConfig),this.fillProgressbar(this.$timeoutModal),"https:"===document.location.protocol&&"undefined"!=typeof Notification&&"granted"===Notification.permission&&document.hidden&&(this.webNotification=new Notification(TYPO3.lang["mess.login_about_to_expire_title"],{body:TYPO3.lang["mess.login_about_to_expire"],icon:"/typo3/sysext/backend/Resources/Public/Images/Logo.png"}),this.webNotification.onclick=()=>{window.focus()})}hideTimeoutModal(){this.isTimingOut=!1,this.$timeoutModal.modal("hide"),"undefined"!=typeof Notification&&null!==this.webNotification&&this.webNotification.close()}showBackendLockedModal(){this.$backendLockedModal.modal(this.options.modalConfig)}hideBackendLockedModal(){this.$backendLockedModal.modal("hide")}showLoginForm(){new a(TYPO3.settings.ajaxUrls.logout).get().then(()=>{TYPO3.configuration.showRefreshLoginPopup?this.showLoginPopup():this.$loginForm.modal(this.options.modalConfig)})}showLoginPopup(){const e=window.open(this.loginFramesetUrl,"relogin_"+Math.random().toString(16).slice(2),"height=450,width=700,status=0,menubar=0,location=1");e&&e.focus()}hideLoginForm(){this.$loginForm.modal("hide")}initializeBackendLockedModal(){this.$backendLockedModal=this.generateModal(d.lockedModal),this.$backendLockedModal.find(".modal-header h4").text(TYPO3.lang["mess.please_wait"]),this.$backendLockedModal.find(".modal-body").append(t("<p />").text(TYPO3.lang["mess.be_locked"])),this.$backendLockedModal.find(".modal-footer").remove(),t("body").append(this.$backendLockedModal)}initializeTimeoutModal(){this.$timeoutModal=this.generateModal(d.loginrefresh),this.$timeoutModal.addClass("modal-severity-notice"),this.$timeoutModal.find(".modal-header h4").text(TYPO3.lang["mess.login_about_to_expire_title"]),this.$timeoutModal.find(".modal-body").append(t("<p />").text(TYPO3.lang["mess.login_about_to_expire"]),t("<div />",{class:"progress"}).append(t("<div />",{class:"progress-bar progress-bar-warning progress-bar-striped active",role:"progressbar","aria-valuemin":"0","aria-valuemax":"100"}).append(t("<span />",{class:"sr-only"})))),this.$timeoutModal.find(".modal-footer").append(t("<button />",{class:"btn btn-default","data-action":"logout"}).text(TYPO3.lang["mess.refresh_login_logout_button"]).on("click",()=>{top.location.href=this.logoutUrl}),t("<button />",{class:"btn btn-primary t3js-active","data-action":"refreshSession"}).text(TYPO3.lang["mess.refresh_login_refresh_button"]).on("click",()=>{new a(TYPO3.settings.ajaxUrls.login_timedout).get().then(()=>{this.hideTimeoutModal()})})),this.registerDefaultModalEvents(this.$timeoutModal),t("body").append(this.$timeoutModal)}initializeLoginForm(){if(TYPO3.configuration.showRefreshLoginPopup)return;this.$loginForm=this.generateModal(d.loginFormModal),this.$loginForm.addClass("modal-notice");let o=String(TYPO3.lang["mess.refresh_login_title"]).replace("%s",TYPO3.configuration.username);this.$loginForm.find(".modal-header h4").text(o),this.$loginForm.find(".modal-body").append(t("<p />").text(TYPO3.lang["mess.login_expired"]),t("<form />",{id:"beLoginRefresh",method:"POST",action:TYPO3.settings.ajaxUrls.login}).append(t("<div />",{class:"form-group"}).append(t("<input />",{type:"password",name:"p_field",autofocus:"autofocus",class:"form-control",placeholder:TYPO3.lang["mess.refresh_login_password"],"data-rsa-encryption":"t3-loginrefres-userident"})),t("<input />",{type:"hidden",name:"username",value:TYPO3.configuration.username}),t("<input />",{type:"hidden",name:"userident",id:"t3-loginrefres-userident"}))),this.$loginForm.find(".modal-footer").append(t("<a />",{href:this.logoutUrl,class:"btn btn-default"}).text(TYPO3.lang["mess.refresh_exit_button"]),t("<button />",{type:"button",class:"btn btn-primary","data-action":"refreshSession"}).text(TYPO3.lang["mess.refresh_login_button"]).on("click",()=>{this.$loginForm.find("form").submit()})),this.registerDefaultModalEvents(this.$loginForm).on("submit",this.submitForm),t("body").append(this.$loginForm),e.specified("TYPO3/CMS/Rsaauth/RsaEncryptionModule")&&e(["TYPO3/CMS/Rsaauth/RsaEncryptionModule"],(function(e){e.registerForm(t("#beLoginRefresh").get(0))}))}generateModal(e){return t("<div />",{id:e,class:"t3js-modal "+e+" modal modal-type-default modal-severity-notice modal-style-light modal-size-small fade"}).append(t("<div />",{class:"modal-dialog"}).append(t("<div />",{class:"modal-content"}).append(t("<div />",{class:"modal-header"}).append(t("<h4 />",{class:"modal-title"})),t("<div />",{class:"modal-body"}),t("<div />",{class:"modal-footer"}))))}fillProgressbar(e){if(!this.isTimingOut)return;let o=0;const t=e.find(".progress-bar"),i=t.children(".sr-only"),s=setInterval(()=>{const e=o>=100;!this.isTimingOut||e?(clearInterval(s),e&&(this.hideTimeoutModal(),this.showLoginForm()),o=0):o+=1;const n=o+"%";t.css("width",n),i.text(n)},300)}registerDefaultModalEvents(e){return e.on("hidden.bs.modal",()=>{this.startTask()}).on("shown.bs.modal",()=>{this.stopTask(),this.$timeoutModal.find(".modal-footer .t3js-active").first().focus()}),e}}let c;try{window.opener&&window.opener.TYPO3&&window.opener.TYPO3.LoginRefresh&&(c=window.opener.TYPO3.LoginRefresh),parent&&parent.window.TYPO3&&parent.window.TYPO3.LoginRefresh&&(c=parent.window.TYPO3.LoginRefresh),top&&top.TYPO3&&top.TYPO3.LoginRefresh&&(c=top.TYPO3.LoginRefresh)}catch(e){}return c||(c=new r,"undefined"!=typeof TYPO3&&(TYPO3.LoginRefresh=c)),c})); \ No newline at end of file +define(["require","exports","jquery","TYPO3/CMS/Backend/Modal","TYPO3/CMS/Backend/Notification","TYPO3/CMS/Backend/Severity","TYPO3/CMS/Backend/Storage/Client","TYPO3/CMS/Core/Ajax/AjaxRequest"],(function(e,o,t,i,s,n,a,l){"use strict";var d;!function(e){e.loginrefresh="t3js-modal-loginrefresh",e.lockedModal="t3js-modal-backendlocked",e.loginFormModal="t3js-modal-backendloginform"}(d||(d={}));class r{constructor(){this.options={modalConfig:{backdrop:"static"}},this.webNotification=null,this.intervalTime=60,this.intervalId=null,this.backendIsLocked=!1,this.isTimingOut=!1,this.$timeoutModal=null,this.$backendLockedModal=null,this.$loginForm=null,this.loginFramesetUrl="",this.logoutUrl="",this.submitForm=e=>{e.preventDefault();const o=this.$loginForm.find("form"),i=o.find("input[name=p_field]"),n=o.find("input[name=userident]"),a=i.val();if(""===a&&""===n.val())return s.error(TYPO3.lang["mess.refresh_login_failed"],TYPO3.lang["mess.refresh_login_emptyPassword"]),void i.focus();a&&(n.val(a),i.val(""));const d={login_status:"login"};t.each(o.serializeArray(),(function(e,o){d[o.name]=o.value})),new l(o.attr("action")).post(d).then(async e=>{(await e.resolve()).login.success?this.hideLoginForm():(s.error(TYPO3.lang["mess.refresh_login_failed"],TYPO3.lang["mess.refresh_login_failed_message"]),i.focus())})},this.checkActiveSession=()=>{new l(TYPO3.settings.ajaxUrls.login_timedout).get().then(async e=>{const o=await e.resolve();o.login.locked?this.backendIsLocked||(this.backendIsLocked=!0,this.showBackendLockedModal()):this.backendIsLocked&&(this.backendIsLocked=!1,this.hideBackendLockedModal()),this.backendIsLocked||(o.login.timed_out||o.login.will_time_out)&&(o.login.timed_out?this.showLoginForm():this.showTimeoutModal())})}}initialize(){this.initializeTimeoutModal(),this.initializeBackendLockedModal(),this.initializeLoginForm(),this.startTask();const e=!(a.isset("notifications.asked")&&"yes"===a.get("notifications.asked")),o="undefined"!=typeof Notification&&"default"===Notification.permission;e&&"https:"===document.location.protocol&&o&&i.confirm(TYPO3.lang["notification.request.title"],TYPO3.lang["notification.request.description"],n.info,[{text:TYPO3.lang["button.yes"]||"Yes",btnClass:"btn-"+n.getCssClass(n.info),name:"ok",active:!0},{text:TYPO3.lang["button.no"]||"No",btnClass:"btn-"+n.getCssClass(n.notice),name:"cancel"}]).on("confirm.button.ok",()=>{Notification.requestPermission(),i.dismiss()}).on("confirm.button.cancel",()=>{i.dismiss()}).on("hide.bs.modal",()=>{a.set("notifications.asked","yes")})}startTask(){if(null!==this.intervalId)return;let e=1e3*this.intervalTime;this.intervalId=setInterval(this.checkActiveSession,e)}stopTask(){clearInterval(this.intervalId),this.intervalId=null}setIntervalTime(e){this.intervalTime=Math.min(e,86400)}setLogoutUrl(e){this.logoutUrl=e}setLoginFramesetUrl(e){this.loginFramesetUrl=e}showTimeoutModal(){this.isTimingOut=!0,this.$timeoutModal.modal(this.options.modalConfig),this.fillProgressbar(this.$timeoutModal),"https:"===document.location.protocol&&"undefined"!=typeof Notification&&"granted"===Notification.permission&&document.hidden&&(this.webNotification=new Notification(TYPO3.lang["mess.login_about_to_expire_title"],{body:TYPO3.lang["mess.login_about_to_expire"],icon:"/typo3/sysext/backend/Resources/Public/Images/Logo.png"}),this.webNotification.onclick=()=>{window.focus()})}hideTimeoutModal(){this.isTimingOut=!1,this.$timeoutModal.modal("hide"),"undefined"!=typeof Notification&&null!==this.webNotification&&this.webNotification.close()}showBackendLockedModal(){this.$backendLockedModal.modal(this.options.modalConfig)}hideBackendLockedModal(){this.$backendLockedModal.modal("hide")}showLoginForm(){new l(TYPO3.settings.ajaxUrls.logout).get().then(()=>{TYPO3.configuration.showRefreshLoginPopup?this.showLoginPopup():this.$loginForm.modal(this.options.modalConfig)})}showLoginPopup(){const e=window.open(this.loginFramesetUrl,"relogin_"+Math.random().toString(16).slice(2),"height=450,width=700,status=0,menubar=0,location=1");e&&e.focus()}hideLoginForm(){this.$loginForm.modal("hide")}initializeBackendLockedModal(){this.$backendLockedModal=this.generateModal(d.lockedModal),this.$backendLockedModal.find(".modal-header h4").text(TYPO3.lang["mess.please_wait"]),this.$backendLockedModal.find(".modal-body").append(t("<p />").text(TYPO3.lang["mess.be_locked"])),this.$backendLockedModal.find(".modal-footer").remove(),t("body").append(this.$backendLockedModal)}initializeTimeoutModal(){this.$timeoutModal=this.generateModal(d.loginrefresh),this.$timeoutModal.addClass("modal-severity-notice"),this.$timeoutModal.find(".modal-header h4").text(TYPO3.lang["mess.login_about_to_expire_title"]),this.$timeoutModal.find(".modal-body").append(t("<p />").text(TYPO3.lang["mess.login_about_to_expire"]),t("<div />",{class:"progress"}).append(t("<div />",{class:"progress-bar progress-bar-warning progress-bar-striped active",role:"progressbar","aria-valuemin":"0","aria-valuemax":"100"}).append(t("<span />",{class:"sr-only"})))),this.$timeoutModal.find(".modal-footer").append(t("<button />",{class:"btn btn-default","data-action":"logout"}).text(TYPO3.lang["mess.refresh_login_logout_button"]).on("click",()=>{top.location.href=this.logoutUrl}),t("<button />",{class:"btn btn-primary t3js-active","data-action":"refreshSession"}).text(TYPO3.lang["mess.refresh_login_refresh_button"]).on("click",()=>{new l(TYPO3.settings.ajaxUrls.login_timedout).get().then(()=>{this.hideTimeoutModal()})})),this.registerDefaultModalEvents(this.$timeoutModal),t("body").append(this.$timeoutModal)}initializeLoginForm(){if(TYPO3.configuration.showRefreshLoginPopup)return;this.$loginForm=this.generateModal(d.loginFormModal),this.$loginForm.addClass("modal-notice");let o=String(TYPO3.lang["mess.refresh_login_title"]).replace("%s",TYPO3.configuration.username);this.$loginForm.find(".modal-header h4").text(o),this.$loginForm.find(".modal-body").append(t("<p />").text(TYPO3.lang["mess.login_expired"]),t("<form />",{id:"beLoginRefresh",method:"POST",action:TYPO3.settings.ajaxUrls.login}).append(t("<div />",{class:"form-group"}).append(t("<input />",{type:"password",name:"p_field",autofocus:"autofocus",class:"form-control",placeholder:TYPO3.lang["mess.refresh_login_password"],"data-rsa-encryption":"t3-loginrefres-userident"})),t("<input />",{type:"hidden",name:"username",value:TYPO3.configuration.username}),t("<input />",{type:"hidden",name:"userident",id:"t3-loginrefres-userident"}))),this.$loginForm.find(".modal-footer").append(t("<a />",{href:this.logoutUrl,class:"btn btn-default"}).text(TYPO3.lang["mess.refresh_exit_button"]),t("<button />",{type:"button",class:"btn btn-primary","data-action":"refreshSession"}).text(TYPO3.lang["mess.refresh_login_button"]).on("click",()=>{this.$loginForm.find("form").submit()})),this.registerDefaultModalEvents(this.$loginForm).on("submit",this.submitForm),t("body").append(this.$loginForm),e.specified("TYPO3/CMS/Rsaauth/RsaEncryptionModule")&&e(["TYPO3/CMS/Rsaauth/RsaEncryptionModule"],(function(e){e.registerForm(t("#beLoginRefresh").get(0))}))}generateModal(e){return t("<div />",{id:e,class:"t3js-modal "+e+" modal modal-type-default modal-severity-notice modal-style-light modal-size-small fade"}).append(t("<div />",{class:"modal-dialog"}).append(t("<div />",{class:"modal-content"}).append(t("<div />",{class:"modal-header"}).append(t("<h4 />",{class:"modal-title"})),t("<div />",{class:"modal-body"}),t("<div />",{class:"modal-footer"}))))}fillProgressbar(e){if(!this.isTimingOut)return;let o=0;const t=e.find(".progress-bar"),i=t.children(".sr-only"),s=setInterval(()=>{const e=o>=100;!this.isTimingOut||e?(clearInterval(s),e&&(this.hideTimeoutModal(),this.showLoginForm()),o=0):o+=1;const n=o+"%";t.css("width",n),i.text(n)},300)}registerDefaultModalEvents(e){return e.on("hidden.bs.modal",()=>{this.startTask()}).on("shown.bs.modal",()=>{this.stopTask(),this.$timeoutModal.find(".modal-footer .t3js-active").first().focus()}),e}}let c;try{window.opener&&window.opener.TYPO3&&window.opener.TYPO3.LoginRefresh&&(c=window.opener.TYPO3.LoginRefresh),parent&&parent.window.TYPO3&&parent.window.TYPO3.LoginRefresh&&(c=parent.window.TYPO3.LoginRefresh),top&&top.TYPO3&&top.TYPO3.LoginRefresh&&(c=top.TYPO3.LoginRefresh)}catch(e){}return c||(c=new r,"undefined"!=typeof TYPO3&&(TYPO3.LoginRefresh=c)),c})); \ No newline at end of file diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/Modal.js b/typo3/sysext/backend/Resources/Public/JavaScript/Modal.js index 7eab9a5b8d5d59999340ff23cd664fbf220f958e..9b50004fc5c7e96a7bcb6e423d173598c585dbc3 100644 --- a/typo3/sysext/backend/Resources/Public/JavaScript/Modal.js +++ b/typo3/sysext/backend/Resources/Public/JavaScript/Modal.js @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -define(["require","exports","./Enum/Severity","jquery","./Icons","./Severity","TYPO3/CMS/Core/SecurityUtility","bootstrap"],(function(t,e,a,n,i,s,l){"use strict";var o,d,r,c;!function(t){t.modal=".t3js-modal",t.content=".t3js-modal-content",t.title=".t3js-modal-title",t.close=".t3js-modal-close",t.body=".t3js-modal-body",t.footer=".t3js-modal-footer",t.iframe=".t3js-modal-iframe",t.iconPlaceholder=".t3js-modal-icon-placeholder"}(o||(o={})),function(t){t.small="small",t.default="default",t.medium="medium",t.large="large",t.full="full"}(d||(d={})),function(t){t.default="default",t.light="light",t.dark="dark"}(r||(r={})),function(t){t.default="default",t.ajax="ajax",t.iframe="iframe"}(c||(c={}));class u{constructor(t){this.sizes=d,this.styles=r,this.types=c,this.currentModal=null,this.instances=[],this.$template=n('<div class="t3js-modal modal fade"><div class="modal-dialog"><div class="t3js-modal-content modal-content"><div class="modal-header"><button class="t3js-modal-close close"><span aria-hidden="true"><span class="t3js-modal-icon-placeholder" data-icon="actions-close"></span></span><span class="sr-only"></span></button><h4 class="t3js-modal-title modal-title"></h4></div><div class="t3js-modal-body modal-body"></div><div class="t3js-modal-footer modal-footer"></div></div></div></div>'),this.defaultConfiguration={type:c.default,title:"Information",content:"No content provided, please check your <code>Modal</code> configuration.",severity:a.SeverityEnum.notice,buttons:[],style:r.default,size:d.default,additionalCssClasses:[],callback:n.noop(),ajaxCallback:n.noop(),ajaxTarget:null},this.securityUtility=t,n(document).on("modal-dismiss",this.dismiss),this.initializeMarkupTrigger(document)}dismiss(){this.currentModal&&this.currentModal.modal("hide")}confirm(t,e,i=a.SeverityEnum.warning,l=[],o){return 0===l.length&&l.push({text:n(this).data("button-close-text")||TYPO3.lang["button.cancel"]||"Cancel",active:!0,btnClass:"btn-default",name:"cancel"},{text:n(this).data("button-ok-text")||TYPO3.lang["button.ok"]||"OK",btnClass:"btn-"+s.getCssClass(i),name:"ok"}),this.advanced({title:t,content:e,severity:i,buttons:l,additionalCssClasses:o,callback:t=>{t.on("button.clicked",t=>{"cancel"===t.target.getAttribute("name")?n(t.currentTarget).trigger("confirm.button.cancel"):"ok"===t.target.getAttribute("name")&&n(t.currentTarget).trigger("confirm.button.ok")})}})}loadUrl(t,e=a.SeverityEnum.info,n,i,s,l){return this.advanced({type:c.ajax,title:t,severity:e,buttons:n,ajaxCallback:s,ajaxTarget:l,content:i})}show(t,e,n=a.SeverityEnum.info,i,s){return this.advanced({type:c.default,title:t,content:e,severity:n,buttons:i,additionalCssClasses:s})}advanced(t){return t.type="string"==typeof t.type&&t.type in c?t.type:this.defaultConfiguration.type,t.title="string"==typeof t.title?t.title:this.defaultConfiguration.title,t.content="string"==typeof t.content||"object"==typeof t.content?t.content:this.defaultConfiguration.content,t.severity=void 0!==t.severity?t.severity:this.defaultConfiguration.severity,t.buttons=t.buttons||this.defaultConfiguration.buttons,t.size="string"==typeof t.size&&t.size in d?t.size:this.defaultConfiguration.size,t.style="string"==typeof t.style&&t.style in r?t.style:this.defaultConfiguration.style,t.additionalCssClasses=t.additionalCssClasses||this.defaultConfiguration.additionalCssClasses,t.callback="function"==typeof t.callback?t.callback:this.defaultConfiguration.callback,t.ajaxCallback="function"==typeof t.ajaxCallback?t.ajaxCallback:this.defaultConfiguration.ajaxCallback,t.ajaxTarget="string"==typeof t.ajaxTarget?t.ajaxTarget:this.defaultConfiguration.ajaxTarget,this.generate(t)}setButtons(t){const e=this.currentModal.find(o.footer);if(t.length>0){e.empty();for(let a=0;a<t.length;a++){const i=t[a],s=n("<button />",{class:"btn"});s.html("<span>"+this.securityUtility.encodeHtml(i.text,!1)+"</span>"),i.active&&s.addClass("t3js-active"),""!==i.btnClass&&s.addClass(i.btnClass),""!==i.name&&s.attr("name",i.name),i.action?s.on("click",()=>{e.find("button").not(s).addClass("disabled"),i.action.execute(s.get(0)).then(()=>{this.currentModal.modal("hide")})}):i.trigger&&s.on("click",i.trigger),i.dataAttributes&&Object.keys(i.dataAttributes).length>0&&Object.keys(i.dataAttributes).map(t=>{s.attr("data-"+t,i.dataAttributes[t])}),i.icon&&s.prepend('<span class="t3js-modal-icon-placeholder" data-icon="'+i.icon+'"></span>'),e.append(s)}e.show(),e.find("button").on("click",t=>{n(t.currentTarget).trigger("button.clicked")})}else e.hide();return this.currentModal}initializeMarkupTrigger(t){n(t).on("click",".t3js-modal-trigger",t=>{t.preventDefault();const e=n(t.currentTarget),i=e.data("content")||"Are you sure?",l=void 0!==a.SeverityEnum[e.data("severity")]?a.SeverityEnum[e.data("severity")]:a.SeverityEnum.info;let o=e.data("url")||null;if(null!==o){const t=o.includes("?")?"&":"?";o=o+t+n.param({data:e.data()})}this.advanced({type:null!==o?c.ajax:c.default,title:e.data("title")||"Alert",content:null!==o?o:i,severity:l,buttons:[{text:e.data("button-close-text")||TYPO3.lang["button.close"]||"Close",active:!0,btnClass:"btn-default",trigger:()=>{this.currentModal.trigger("modal-dismiss")}},{text:e.data("button-ok-text")||TYPO3.lang["button.ok"]||"OK",btnClass:"btn-"+s.getCssClass(l),trigger:()=>{this.currentModal.trigger("modal-dismiss"),t.target.ownerDocument.location.href=e.data("href")||e.attr("href")}}]})})}generate(t){const e=this.$template.clone();if(t.additionalCssClasses.length>0)for(let a of t.additionalCssClasses)e.addClass(a);if(e.addClass("modal-type-"+t.type),e.addClass("modal-severity-"+s.getCssClass(t.severity)),e.addClass("modal-style-"+t.style),e.addClass("modal-size-"+t.size),e.attr("tabindex","-1"),e.find(o.title).text(t.title),e.find(o.close).on("click",()=>{e.modal("hide")}),"ajax"===t.type){const a=t.ajaxTarget?t.ajaxTarget:o.body,s=e.find(a);i.getIcon("spinner-circle",i.sizes.default,null,null,i.markupIdentifiers.inline).then(e=>{s.html('<div class="modal-loading">'+e+"</div>"),n.get(t.content,e=>{this.currentModal.find(a).empty().append(e),t.ajaxCallback&&t.ajaxCallback(),this.currentModal.trigger("modal-loaded")},"html")})}else"iframe"===t.type?(e.find(o.body).append(n("<iframe />",{src:t.content,name:"modal_frame",class:"modal-iframe t3js-modal-iframe"})),e.find(o.iframe).on("load",()=>{e.find(o.title).text(e.find(o.iframe).get(0).contentDocument.title)})):("string"==typeof t.content&&(t.content=n("<p />").html(this.securityUtility.encodeHtml(t.content))),e.find(o.body).append(t.content));return e.on("shown.bs.modal",t=>{const e=n(t.currentTarget);e.find(o.footer).find(".t3js-active").first().focus(),e.find(o.iconPlaceholder).each((t,e)=>{i.getIcon(n(e).data("icon"),i.sizes.small,null,null,i.markupIdentifiers.inline).then(t=>{this.currentModal.find(o.iconPlaceholder+"[data-icon="+n(t).data("identifier")+"]").replaceWith(t)})})}),e.on("hidden.bs.modal",t=>{if(this.instances.length>0){const t=this.instances.length-1;this.instances.splice(t,1),this.currentModal=this.instances[t-1]}e.trigger("modal-destroyed"),n(t.currentTarget).remove(),this.instances.length>0&&n("body").addClass("modal-open")}),e.on("show.bs.modal",e=>{this.currentModal=n(e.currentTarget),this.setButtons(t.buttons),this.instances.push(this.currentModal)}),e.on("modal-dismiss",t=>{n(t.currentTarget).modal("hide")}),t.callback&&t.callback(e),e.modal()}}let f=null;try{parent&&parent.window.TYPO3&&parent.window.TYPO3.Modal?(parent.window.TYPO3.Modal.initializeMarkupTrigger(document),f=parent.window.TYPO3.Modal):top&&top.TYPO3.Modal&&(top.TYPO3.Modal.initializeMarkupTrigger(document),f=top.TYPO3.Modal)}catch(t){}return f||(f=new u(new l),TYPO3.Modal=f),f})); \ No newline at end of file +define(["require","exports","jquery","./Enum/Severity","TYPO3/CMS/Core/Ajax/AjaxRequest","TYPO3/CMS/Core/SecurityUtility","./Icons","./Severity","bootstrap"],(function(t,e,a,n,i,s,l,o){"use strict";var d,r,c,u;!function(t){t.modal=".t3js-modal",t.content=".t3js-modal-content",t.title=".t3js-modal-title",t.close=".t3js-modal-close",t.body=".t3js-modal-body",t.footer=".t3js-modal-footer",t.iframe=".t3js-modal-iframe",t.iconPlaceholder=".t3js-modal-icon-placeholder"}(d||(d={})),function(t){t.small="small",t.default="default",t.medium="medium",t.large="large",t.full="full"}(r||(r={})),function(t){t.default="default",t.light="light",t.dark="dark"}(c||(c={})),function(t){t.default="default",t.ajax="ajax",t.iframe="iframe"}(u||(u={}));class f{constructor(t){this.sizes=r,this.styles=c,this.types=u,this.currentModal=null,this.instances=[],this.$template=a('<div class="t3js-modal modal fade"><div class="modal-dialog"><div class="t3js-modal-content modal-content"><div class="modal-header"><button class="t3js-modal-close close"><span aria-hidden="true"><span class="t3js-modal-icon-placeholder" data-icon="actions-close"></span></span><span class="sr-only"></span></button><h4 class="t3js-modal-title modal-title"></h4></div><div class="t3js-modal-body modal-body"></div><div class="t3js-modal-footer modal-footer"></div></div></div></div>'),this.defaultConfiguration={type:u.default,title:"Information",content:"No content provided, please check your <code>Modal</code> configuration.",severity:n.SeverityEnum.notice,buttons:[],style:c.default,size:r.default,additionalCssClasses:[],callback:a.noop(),ajaxCallback:a.noop(),ajaxTarget:null},this.securityUtility=t,a(document).on("modal-dismiss",this.dismiss),this.initializeMarkupTrigger(document)}dismiss(){this.currentModal&&this.currentModal.modal("hide")}confirm(t,e,i=n.SeverityEnum.warning,s=[],l){return 0===s.length&&s.push({text:a(this).data("button-close-text")||TYPO3.lang["button.cancel"]||"Cancel",active:!0,btnClass:"btn-default",name:"cancel"},{text:a(this).data("button-ok-text")||TYPO3.lang["button.ok"]||"OK",btnClass:"btn-"+o.getCssClass(i),name:"ok"}),this.advanced({title:t,content:e,severity:i,buttons:s,additionalCssClasses:l,callback:t=>{t.on("button.clicked",t=>{"cancel"===t.target.getAttribute("name")?a(t.currentTarget).trigger("confirm.button.cancel"):"ok"===t.target.getAttribute("name")&&a(t.currentTarget).trigger("confirm.button.ok")})}})}loadUrl(t,e=n.SeverityEnum.info,a,i,s,l){return this.advanced({type:u.ajax,title:t,severity:e,buttons:a,ajaxCallback:s,ajaxTarget:l,content:i})}show(t,e,a=n.SeverityEnum.info,i,s){return this.advanced({type:u.default,title:t,content:e,severity:a,buttons:i,additionalCssClasses:s})}advanced(t){return t.type="string"==typeof t.type&&t.type in u?t.type:this.defaultConfiguration.type,t.title="string"==typeof t.title?t.title:this.defaultConfiguration.title,t.content="string"==typeof t.content||"object"==typeof t.content?t.content:this.defaultConfiguration.content,t.severity=void 0!==t.severity?t.severity:this.defaultConfiguration.severity,t.buttons=t.buttons||this.defaultConfiguration.buttons,t.size="string"==typeof t.size&&t.size in r?t.size:this.defaultConfiguration.size,t.style="string"==typeof t.style&&t.style in c?t.style:this.defaultConfiguration.style,t.additionalCssClasses=t.additionalCssClasses||this.defaultConfiguration.additionalCssClasses,t.callback="function"==typeof t.callback?t.callback:this.defaultConfiguration.callback,t.ajaxCallback="function"==typeof t.ajaxCallback?t.ajaxCallback:this.defaultConfiguration.ajaxCallback,t.ajaxTarget="string"==typeof t.ajaxTarget?t.ajaxTarget:this.defaultConfiguration.ajaxTarget,this.generate(t)}setButtons(t){const e=this.currentModal.find(d.footer);if(t.length>0){e.empty();for(let n=0;n<t.length;n++){const i=t[n],s=a("<button />",{class:"btn"});s.html("<span>"+this.securityUtility.encodeHtml(i.text,!1)+"</span>"),i.active&&s.addClass("t3js-active"),""!==i.btnClass&&s.addClass(i.btnClass),""!==i.name&&s.attr("name",i.name),i.action?s.on("click",()=>{e.find("button").not(s).addClass("disabled"),i.action.execute(s.get(0)).then(()=>{this.currentModal.modal("hide")})}):i.trigger&&s.on("click",i.trigger),i.dataAttributes&&Object.keys(i.dataAttributes).length>0&&Object.keys(i.dataAttributes).map(t=>{s.attr("data-"+t,i.dataAttributes[t])}),i.icon&&s.prepend('<span class="t3js-modal-icon-placeholder" data-icon="'+i.icon+'"></span>'),e.append(s)}e.show(),e.find("button").on("click",t=>{a(t.currentTarget).trigger("button.clicked")})}else e.hide();return this.currentModal}initializeMarkupTrigger(t){a(t).on("click",".t3js-modal-trigger",t=>{t.preventDefault();const e=a(t.currentTarget),i=e.data("content")||"Are you sure?",s=void 0!==n.SeverityEnum[e.data("severity")]?n.SeverityEnum[e.data("severity")]:n.SeverityEnum.info;let l=e.data("url")||null;if(null!==l){const t=l.includes("?")?"&":"?";l=l+t+a.param({data:e.data()})}this.advanced({type:null!==l?u.ajax:u.default,title:e.data("title")||"Alert",content:null!==l?l:i,severity:s,buttons:[{text:e.data("button-close-text")||TYPO3.lang["button.close"]||"Close",active:!0,btnClass:"btn-default",trigger:()=>{this.currentModal.trigger("modal-dismiss")}},{text:e.data("button-ok-text")||TYPO3.lang["button.ok"]||"OK",btnClass:"btn-"+o.getCssClass(s),trigger:()=>{this.currentModal.trigger("modal-dismiss"),t.target.ownerDocument.location.href=e.data("href")||e.attr("href")}}]})})}generate(t){const e=this.$template.clone();if(t.additionalCssClasses.length>0)for(let a of t.additionalCssClasses)e.addClass(a);if(e.addClass("modal-type-"+t.type),e.addClass("modal-severity-"+o.getCssClass(t.severity)),e.addClass("modal-style-"+t.style),e.addClass("modal-size-"+t.size),e.attr("tabindex","-1"),e.find(d.title).text(t.title),e.find(d.close).on("click",()=>{e.modal("hide")}),"ajax"===t.type){const a=t.ajaxTarget?t.ajaxTarget:d.body,n=e.find(a);l.getIcon("spinner-circle",l.sizes.default,null,null,l.markupIdentifiers.inline).then(e=>{n.html('<div class="modal-loading">'+e+"</div>"),new i(t.content).get().then(async e=>{this.currentModal.find(a).empty().append(await e.raw().text()),t.ajaxCallback&&t.ajaxCallback(),this.currentModal.trigger("modal-loaded")})})}else"iframe"===t.type?(e.find(d.body).append(a("<iframe />",{src:t.content,name:"modal_frame",class:"modal-iframe t3js-modal-iframe"})),e.find(d.iframe).on("load",()=>{e.find(d.title).text(e.find(d.iframe).get(0).contentDocument.title)})):("string"==typeof t.content&&(t.content=a("<p />").html(this.securityUtility.encodeHtml(t.content))),e.find(d.body).append(t.content));return e.on("shown.bs.modal",t=>{const e=a(t.currentTarget);e.find(d.footer).find(".t3js-active").first().focus(),e.find(d.iconPlaceholder).each((t,e)=>{l.getIcon(a(e).data("icon"),l.sizes.small,null,null,l.markupIdentifiers.inline).then(t=>{this.currentModal.find(d.iconPlaceholder+"[data-icon="+a(t).data("identifier")+"]").replaceWith(t)})})}),e.on("hidden.bs.modal",t=>{if(this.instances.length>0){const t=this.instances.length-1;this.instances.splice(t,1),this.currentModal=this.instances[t-1]}e.trigger("modal-destroyed"),a(t.currentTarget).remove(),this.instances.length>0&&a("body").addClass("modal-open")}),e.on("show.bs.modal",e=>{this.currentModal=a(e.currentTarget),this.setButtons(t.buttons),this.instances.push(this.currentModal)}),e.on("modal-dismiss",t=>{a(t.currentTarget).modal("hide")}),t.callback&&t.callback(e),e.modal()}}let m=null;try{parent&&parent.window.TYPO3&&parent.window.TYPO3.Modal?(parent.window.TYPO3.Modal.initializeMarkupTrigger(document),m=parent.window.TYPO3.Modal):top&&top.TYPO3.Modal&&(top.TYPO3.Modal.initializeMarkupTrigger(document),m=top.TYPO3.Modal)}catch(t){}return m||(m=new f(new s),TYPO3.Modal=m),m})); \ No newline at end of file diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/OnlineMedia.js b/typo3/sysext/backend/Resources/Public/JavaScript/OnlineMedia.js index fec50dc00bd833d68dd73a9eecace967b658cfde..cd500ea755d91216ff71f9a72b858d304c5d8713 100644 --- a/typo3/sysext/backend/Resources/Public/JavaScript/OnlineMedia.js +++ b/typo3/sysext/backend/Resources/Public/JavaScript/OnlineMedia.js @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -define(["require","exports","./Enum/KeyTypes","jquery","nprogress","./Modal","./Severity","TYPO3/CMS/Core/SecurityUtility","TYPO3/CMS/Backend/Utility/MessageUtility"],(function(e,t,i,n,a,r,o,l,s){"use strict";return new class{constructor(){this.securityUtility=new l,n(()=>{this.registerEvents()})}registerEvents(){const e=this;n(document).on("click",".t3js-online-media-add-btn",t=>{e.triggerModal(n(t.currentTarget))})}addOnlineMedia(e,t){const i=e.data("target-folder"),l=e.data("online-media-allowed"),d=e.data("file-irre-object");a.start(),n.post(TYPO3.settings.ajaxUrls.online_media_create,{url:t,targetFolder:i,allowed:l},e=>{if(e.file){const t={actionName:"typo3:foreignRelation:insert",objectGroup:d,table:"sys_file",uid:e.file};s.MessageUtility.send(t)}else{const t=r.confirm("ERROR",e.error,o.error,[{text:TYPO3.lang["button.ok"]||"OK",btnClass:"btn-"+o.getCssClass(o.error),name:"ok",active:!0}]).on("confirm.button.ok",()=>{t.modal("hide")})}a.done()})}triggerModal(e){const t=e.data("btn-submit")||"Add",a=e.data("placeholder")||"Paste media url here...",l=n.map(e.data("online-media-allowed").split(","),e=>'<span class="label label-success">'+this.securityUtility.encodeHtml(e.toUpperCase(),!1)+"</span>"),s=e.data("online-media-allowed-help-text")||"Allow to embed from sources:",d=n("<div>").attr("class","form-control-wrap").append([n("<input>").attr("type","text").attr("class","form-control online-media-url").attr("placeholder",a),n("<div>").attr("class","help-block").html(this.securityUtility.encodeHtml(s,!1)+"<br>"+l.join(" "))]),c=r.show(e.attr("title"),d,o.notice,[{text:t,btnClass:"btn btn-primary",name:"ok",trigger:()=>{const t=c.find("input.online-media-url").val();t&&(c.modal("hide"),this.addOnlineMedia(e,t))}}]);c.on("shown.bs.modal",e=>{n(e.currentTarget).find("input.online-media-url").first().focus().on("keydown",e=>{e.keyCode===i.KeyTypesEnum.ENTER&&c.find('button[name="ok"]').trigger("click")})})}}})); \ No newline at end of file +define(["require","exports","jquery","TYPO3/CMS/Backend/Utility/MessageUtility","./Enum/KeyTypes","nprogress","TYPO3/CMS/Core/Ajax/AjaxRequest","TYPO3/CMS/Core/SecurityUtility","./Modal","./Severity"],(function(e,t,i,a,n,r,o,s,l,d){"use strict";return new class{constructor(){this.securityUtility=new s,i(()=>{this.registerEvents()})}registerEvents(){const e=this;i(document).on("click",".t3js-online-media-add-btn",t=>{e.triggerModal(i(t.currentTarget))})}addOnlineMedia(e,t){const i=e.data("target-folder"),n=e.data("online-media-allowed"),s=e.data("file-irre-object");r.start(),new o(TYPO3.settings.ajaxUrls.online_media_create).post({url:t,targetFolder:i,allowed:n}).then(async e=>{const t=await e.resolve();if(t.file){const e={actionName:"typo3:foreignRelation:insert",objectGroup:s,table:"sys_file",uid:t.file};a.MessageUtility.send(e)}else{const e=l.confirm("ERROR",t.error,d.error,[{text:TYPO3.lang["button.ok"]||"OK",btnClass:"btn-"+d.getCssClass(d.error),name:"ok",active:!0}]).on("confirm.button.ok",()=>{e.modal("hide")})}r.done()})}triggerModal(e){const t=e.data("btn-submit")||"Add",a=e.data("placeholder")||"Paste media url here...",r=i.map(e.data("online-media-allowed").split(","),e=>'<span class="label label-success">'+this.securityUtility.encodeHtml(e.toUpperCase(),!1)+"</span>"),o=e.data("online-media-allowed-help-text")||"Allow to embed from sources:",s=i("<div>").attr("class","form-control-wrap").append([i("<input>").attr("type","text").attr("class","form-control online-media-url").attr("placeholder",a),i("<div>").attr("class","help-block").html(this.securityUtility.encodeHtml(o,!1)+"<br>"+r.join(" "))]),c=l.show(e.attr("title"),s,d.notice,[{text:t,btnClass:"btn btn-primary",name:"ok",trigger:()=>{const t=c.find("input.online-media-url").val();t&&(c.modal("hide"),this.addOnlineMedia(e,t))}}]);c.on("shown.bs.modal",e=>{i(e.currentTarget).find("input.online-media-url").first().focus().on("keydown",e=>{e.keyCode===n.KeyTypesEnum.ENTER&&c.find('button[name="ok"]').trigger("click")})})}}})); \ No newline at end of file