define(['Magento_Ui/js/lib/view/utils/async','uiCollection','uiRegistry','underscore','./modal'],function($,Collection,registry,_){'use strict';return Collection.extend({defaults:{template:'ui/modal/modal-component',title:'',subTitle:'',options:{modalClass:'',title:'',subTitle:'',buttons:[],keyEventHandlers:{}},valid:true,links:{title:'options.title',subTitle:'options.subTitle'},listens:{state:'onState',title:'setTitle','options.subTitle':'setSubTitle'},modalClass:'modal-component',onCancel:'closeModal'},initialize:function(){this._super();_.bindAll(this,'initModal','openModal','closeModal','toggleModal','setPrevValues','validate');this.initializeContent();return this;},initConfig:function(){return this._super().initSelector().initModalEvents();},initSelector:function(){var modalClass=this.name.replace(/\./g,'_');this.contentSelector='.'+this.modalClass;this.options.modalClass=this.options.modalClass+' '+modalClass;this.rootSelector='.'+modalClass;return this;},initModalEvents:function(){this.options.keyEventHandlers.escapeKey=this.options.outerClickHandler=this[this.onCancel].bind(this);return this;},initializeContent:function(){$.async({component:this.name},this.initModal);},initToolbarSection:function(){this.set('toolbarSection',this.modal.data('mage-modal').modal.find('header').get(0));},initObservable:function(){this._super();this.observe(['state','focused']);return this;},initModal:function(element){if(!this.modal){this.overrideModalButtonCallback();this.options.modalCloseBtnHandler=this[this.onCancel].bind(this);this.modal=$(element).modal(this.options);this.initToolbarSection();if(this.waitCbk){this.waitCbk();this.waitCbk=null;}} return this;},openModal:function(){if(this.modal){this.state(true);}else{this.waitCbk=this.openModal;}},closeModal:function(){if(this.modal){this.state(false);}else{this.waitCbk=this.closeModal;}},toggleModal:function(){if(this.modal){this.state(!this.state());}else{this.waitCbk=this.toggleModal;}},setTitle:function(title){if(this.title!==title){this.title=title;} if(this.modal){this.modal.modal('setTitle',title);}},setSubTitle:function(subTitle){if(this.subTitle!==subTitle){this.subTitle=subTitle;} if(this.modal){this.modal.modal('setSubTitle',subTitle);}},onState:function(state){if(state){this.modal.modal('openModal');this.applyData();}else{this.modal.modal('closeModal');}},validate:function(elem){if(typeof elem==='undefined'){return;} if(typeof elem.validate==='function'){this.valid&=elem.validate().valid;}else if(elem.elems){elem.elems().forEach(this.validate,this);}},resetData:function(){this.elems().forEach(this.resetValue,this);},applyData:function(){var applied={};this.elems().forEach(this.gatherValues.bind(this,applied),this);this.applied=applied;},gatherValues:function(applied,elem){if(typeof elem.value==='function'){applied[elem.name]=elem.value();}else if(elem.elems){elem.elems().forEach(this.gatherValues.bind(this,applied),this);}},setPrevValues:function(elem){if(typeof elem.value==='function'){this.modal.focus();elem.value(this.applied[elem.name]);}else if(elem.elems){elem.elems().forEach(this.setPrevValues,this);}},triggerAction:function(action){var targetName=action.targetName,params=action.params||[],actionName=action.actionName,target;target=registry.async(targetName);if(target&&typeof target==='function'&&actionName){params.unshift(actionName);target.apply(target,params);}},overrideModalButtonCallback:function(){var buttons=this.options.buttons;if(buttons&&buttons.length){buttons.forEach(function(button){button.click=this.getButtonClickHandler(button.actions);},this);}},getButtonClickHandler:function(actionsConfig){var actions=actionsConfig.map(function(actionConfig){if(_.isObject(actionConfig)){return this.triggerAction.bind(this,actionConfig);} return this[actionConfig]?this[actionConfig].bind(this):function(){};},this);return function(){actions.forEach(function(action){action();});};},actionCancel:function(){this.elems().forEach(this.setPrevValues,this);this.closeModal();},actionDone:function(){this.valid=true;this.elems().forEach(this.validate,this);if(this.valid){this.closeModal();}}});});