mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-26 19:26:23 +01:00 
			
		
		
		
	We would never update or build fomantic again, we have forked it as a private library long time ago. So just put the JS and CSS files in "fomantic/build" into git. And use "import" to use them. Remove "form.js", rewrite "tab" component. All source code is from official Fomantic UI build. Will apply patches in separate PRs.
		
			
				
	
	
		
			1210 lines
		
	
	
		
			40 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			1210 lines
		
	
	
		
			40 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*!
 | |
|  * # Fomantic-UI - Modal
 | |
|  * http://github.com/fomantic/Fomantic-UI/
 | |
|  *
 | |
|  *
 | |
|  * Released under the MIT license
 | |
|  * http://opensource.org/licenses/MIT
 | |
|  *
 | |
|  */
 | |
| 
 | |
| ;(function ($, window, document, undefined) {
 | |
| 
 | |
| 'use strict';
 | |
| 
 | |
| $.isFunction = $.isFunction || function(obj) {
 | |
|   return typeof obj === "function" && typeof obj.nodeType !== "number";
 | |
| };
 | |
| 
 | |
| window = (typeof window != 'undefined' && window.Math == Math)
 | |
|   ? window
 | |
|   : (typeof self != 'undefined' && self.Math == Math)
 | |
|     ? self
 | |
|     : Function('return this')()
 | |
| ;
 | |
| 
 | |
| $.fn.modal = function(parameters) {
 | |
|   var
 | |
|     $allModules    = $(this),
 | |
|     $window        = $(window),
 | |
|     $document      = $(document),
 | |
|     $body          = $('body'),
 | |
| 
 | |
|     moduleSelector = $allModules.selector || '',
 | |
| 
 | |
|     time           = new Date().getTime(),
 | |
|     performance    = [],
 | |
| 
 | |
|     query          = arguments[0],
 | |
|     methodInvoked  = (typeof query == 'string'),
 | |
|     queryArguments = [].slice.call(arguments, 1),
 | |
| 
 | |
|     requestAnimationFrame = window.requestAnimationFrame
 | |
|       || window.mozRequestAnimationFrame
 | |
|       || window.webkitRequestAnimationFrame
 | |
|       || window.msRequestAnimationFrame
 | |
|       || function(callback) { setTimeout(callback, 0); },
 | |
| 
 | |
|     returnedValue
 | |
|   ;
 | |
| 
 | |
|   $allModules
 | |
|     .each(function() {
 | |
|       var
 | |
|         settings    = ( $.isPlainObject(parameters) )
 | |
|           ? $.extend(true, {}, $.fn.modal.settings, parameters)
 | |
|           : $.extend({}, $.fn.modal.settings),
 | |
| 
 | |
|         selector        = settings.selector,
 | |
|         className       = settings.className,
 | |
|         namespace       = settings.namespace,
 | |
|         error           = settings.error,
 | |
| 
 | |
|         eventNamespace  = '.' + namespace,
 | |
|         moduleNamespace = 'module-' + namespace,
 | |
| 
 | |
|         $module         = $(this),
 | |
|         $context        = $(settings.context),
 | |
|         $close          = $module.find(selector.close),
 | |
| 
 | |
|         $allModals,
 | |
|         $otherModals,
 | |
|         $focusedElement,
 | |
|         $dimmable,
 | |
|         $dimmer,
 | |
| 
 | |
|         element         = this,
 | |
|         instance        = $module.data(moduleNamespace),
 | |
| 
 | |
|         ignoreRepeatedEvents = false,
 | |
| 
 | |
|         initialMouseDownInModal,
 | |
|         initialMouseDownInScrollbar,
 | |
|         initialBodyMargin = '',
 | |
|         tempBodyMargin = '',
 | |
| 
 | |
|         elementEventNamespace,
 | |
|         id,
 | |
|         observer,
 | |
|         module
 | |
|       ;
 | |
|       module  = {
 | |
| 
 | |
|         initialize: function() {
 | |
|           module.cache = {};
 | |
|           module.verbose('Initializing dimmer', $context);
 | |
| 
 | |
|           module.create.id();
 | |
|           module.create.dimmer();
 | |
| 
 | |
|           if ( settings.allowMultiple ) {
 | |
|             module.create.innerDimmer();
 | |
|           }
 | |
|           if (!settings.centered){
 | |
|             $module.addClass('top aligned');
 | |
|           }
 | |
|           module.refreshModals();
 | |
| 
 | |
|           module.bind.events();
 | |
|           if(settings.observeChanges) {
 | |
|             module.observeChanges();
 | |
|           }
 | |
|           module.instantiate();
 | |
|         },
 | |
| 
 | |
|         instantiate: function() {
 | |
|           module.verbose('Storing instance of modal');
 | |
|           instance = module;
 | |
|           $module
 | |
|             .data(moduleNamespace, instance)
 | |
|           ;
 | |
|         },
 | |
| 
 | |
|         create: {
 | |
|           dimmer: function() {
 | |
|             var
 | |
|               defaultSettings = {
 | |
|                 debug      : settings.debug,
 | |
|                 dimmerName : 'modals'
 | |
|               },
 | |
|               dimmerSettings = $.extend(true, defaultSettings, settings.dimmerSettings)
 | |
|             ;
 | |
|             if($.fn.dimmer === undefined) {
 | |
|               module.error(error.dimmer);
 | |
|               return;
 | |
|             }
 | |
|             module.debug('Creating dimmer');
 | |
|             $dimmable = $context.dimmer(dimmerSettings);
 | |
|             if(settings.detachable) {
 | |
|               module.verbose('Modal is detachable, moving content into dimmer');
 | |
|               $dimmable.dimmer('add content', $module);
 | |
|             }
 | |
|             else {
 | |
|               module.set.undetached();
 | |
|             }
 | |
|             $dimmer = $dimmable.dimmer('get dimmer');
 | |
|           },
 | |
|           id: function() {
 | |
|             id = (Math.random().toString(16) + '000000000').substr(2, 8);
 | |
|             elementEventNamespace = '.' + id;
 | |
|             module.verbose('Creating unique id for element', id);
 | |
|           },
 | |
|           innerDimmer: function() {
 | |
|             if ( $module.find(selector.dimmer).length == 0 ) {
 | |
|               $module.prepend('<div class="ui inverted dimmer"></div>');
 | |
|             }
 | |
|           }
 | |
|         },
 | |
| 
 | |
|         destroy: function() {
 | |
|           if (observer) {
 | |
|             observer.disconnect();
 | |
|           }
 | |
|           module.verbose('Destroying previous modal');
 | |
|           $module
 | |
|             .removeData(moduleNamespace)
 | |
|             .off(eventNamespace)
 | |
|           ;
 | |
|           $window.off(elementEventNamespace);
 | |
|           $dimmer.off(elementEventNamespace);
 | |
|           $close.off(eventNamespace);
 | |
|           $context.dimmer('destroy');
 | |
|         },
 | |
| 
 | |
|         observeChanges: function() {
 | |
|           if('MutationObserver' in window) {
 | |
|             observer = new MutationObserver(function(mutations) {
 | |
|               module.debug('DOM tree modified, refreshing');
 | |
|               module.refresh();
 | |
|             });
 | |
|             observer.observe(element, {
 | |
|               childList : true,
 | |
|               subtree   : true
 | |
|             });
 | |
|             module.debug('Setting up mutation observer', observer);
 | |
|           }
 | |
|         },
 | |
| 
 | |
|         refresh: function() {
 | |
|           module.remove.scrolling();
 | |
|           module.cacheSizes();
 | |
|           if(!module.can.useFlex()) {
 | |
|             module.set.modalOffset();
 | |
|           }
 | |
|           module.set.screenHeight();
 | |
|           module.set.type();
 | |
|         },
 | |
| 
 | |
|         refreshModals: function() {
 | |
|           $otherModals = $module.siblings(selector.modal);
 | |
|           $allModals   = $otherModals.add($module);
 | |
|         },
 | |
| 
 | |
|         attachEvents: function(selector, event) {
 | |
|           var
 | |
|             $toggle = $(selector)
 | |
|           ;
 | |
|           event = $.isFunction(module[event])
 | |
|             ? module[event]
 | |
|             : module.toggle
 | |
|           ;
 | |
|           if($toggle.length > 0) {
 | |
|             module.debug('Attaching modal events to element', selector, event);
 | |
|             $toggle
 | |
|               .off(eventNamespace)
 | |
|               .on('click' + eventNamespace, event)
 | |
|             ;
 | |
|           }
 | |
|           else {
 | |
|             module.error(error.notFound, selector);
 | |
|           }
 | |
|         },
 | |
| 
 | |
|         bind: {
 | |
|           events: function() {
 | |
|             module.verbose('Attaching events');
 | |
|             $module
 | |
|               .on('click' + eventNamespace, selector.close, module.event.close)
 | |
|               .on('click' + eventNamespace, selector.approve, module.event.approve)
 | |
|               .on('click' + eventNamespace, selector.deny, module.event.deny)
 | |
|             ;
 | |
|             $window
 | |
|               .on('resize' + elementEventNamespace, module.event.resize)
 | |
|             ;
 | |
|           },
 | |
|           scrollLock: function() {
 | |
|             // touch events default to passive, due to changes in chrome to optimize mobile perf
 | |
|             $dimmable.get(0).addEventListener('touchmove', module.event.preventScroll, { passive: false });
 | |
|           }
 | |
|         },
 | |
| 
 | |
|         unbind: {
 | |
|           scrollLock: function() {
 | |
|             $dimmable.get(0).removeEventListener('touchmove', module.event.preventScroll, { passive: false });
 | |
|           }
 | |
|         },
 | |
| 
 | |
|         get: {
 | |
|           id: function() {
 | |
|             return (Math.random().toString(16) + '000000000').substr(2, 8);
 | |
|           }
 | |
|         },
 | |
| 
 | |
|         event: {
 | |
|           approve: function() {
 | |
|             if(ignoreRepeatedEvents || settings.onApprove.call(element, $(this)) === false) {
 | |
|               module.verbose('Approve callback returned false cancelling hide');
 | |
|               return;
 | |
|             }
 | |
|             ignoreRepeatedEvents = true;
 | |
|             module.hide(function() {
 | |
|               ignoreRepeatedEvents = false;
 | |
|             });
 | |
|           },
 | |
|           preventScroll: function(event) {
 | |
|             if(event.target.className.indexOf('dimmer') !== -1) {
 | |
|               event.preventDefault();
 | |
|             }
 | |
|           },
 | |
|           deny: function() {
 | |
|             if(ignoreRepeatedEvents || settings.onDeny.call(element, $(this)) === false) {
 | |
|               module.verbose('Deny callback returned false cancelling hide');
 | |
|               return;
 | |
|             }
 | |
|             ignoreRepeatedEvents = true;
 | |
|             module.hide(function() {
 | |
|               ignoreRepeatedEvents = false;
 | |
|             });
 | |
|           },
 | |
|           close: function() {
 | |
|             module.hide();
 | |
|           },
 | |
|           mousedown: function(event) {
 | |
|             var
 | |
|               $target   = $(event.target),
 | |
|               isRtl = module.is.rtl();
 | |
|             ;
 | |
|             initialMouseDownInModal = ($target.closest(selector.modal).length > 0);
 | |
|             if(initialMouseDownInModal) {
 | |
|               module.verbose('Mouse down event registered inside the modal');
 | |
|             }
 | |
|             initialMouseDownInScrollbar = module.is.scrolling() && ((!isRtl && $(window).outerWidth() - settings.scrollbarWidth <= event.clientX) || (isRtl && settings.scrollbarWidth >= event.clientX));
 | |
|             if(initialMouseDownInScrollbar) {
 | |
|               module.verbose('Mouse down event registered inside the scrollbar');
 | |
|             }
 | |
|           },
 | |
|           mouseup: function(event) {
 | |
|             if(!settings.closable) {
 | |
|               module.verbose('Dimmer clicked but closable setting is disabled');
 | |
|               return;
 | |
|             }
 | |
|             if(initialMouseDownInModal) {
 | |
|               module.debug('Dimmer clicked but mouse down was initially registered inside the modal');
 | |
|               return;
 | |
|             }
 | |
|             if(initialMouseDownInScrollbar){
 | |
|               module.debug('Dimmer clicked but mouse down was initially registered inside the scrollbar');
 | |
|               return;
 | |
|             }
 | |
|             var
 | |
|               $target   = $(event.target),
 | |
|               isInModal = ($target.closest(selector.modal).length > 0),
 | |
|               isInDOM   = $.contains(document.documentElement, event.target)
 | |
|             ;
 | |
|             if(!isInModal && isInDOM && module.is.active() && $module.hasClass(className.front) ) {
 | |
|               module.debug('Dimmer clicked, hiding all modals');
 | |
|               if(settings.allowMultiple) {
 | |
|                 if(!module.hideAll()) {
 | |
|                   return;
 | |
|                 }
 | |
|               }
 | |
|               else if(!module.hide()){
 | |
|                   return;
 | |
|               }
 | |
|               module.remove.clickaway();
 | |
|             }
 | |
|           },
 | |
|           debounce: function(method, delay) {
 | |
|             clearTimeout(module.timer);
 | |
|             module.timer = setTimeout(method, delay);
 | |
|           },
 | |
|           keyboard: function(event) {
 | |
|             var
 | |
|               keyCode   = event.which,
 | |
|               escapeKey = 27
 | |
|             ;
 | |
|             if(keyCode == escapeKey) {
 | |
|               if(settings.closable) {
 | |
|                 module.debug('Escape key pressed hiding modal');
 | |
|                 if ( $module.hasClass(className.front) ) {
 | |
|                   module.hide();
 | |
|                 }
 | |
|               }
 | |
|               else {
 | |
|                 module.debug('Escape key pressed, but closable is set to false');
 | |
|               }
 | |
|               event.preventDefault();
 | |
|             }
 | |
|           },
 | |
|           resize: function() {
 | |
|             if( $dimmable.dimmer('is active') && ( module.is.animating() || module.is.active() ) ) {
 | |
|               requestAnimationFrame(module.refresh);
 | |
|             }
 | |
|           }
 | |
|         },
 | |
| 
 | |
|         toggle: function() {
 | |
|           if( module.is.active() || module.is.animating() ) {
 | |
|             module.hide();
 | |
|           }
 | |
|           else {
 | |
|             module.show();
 | |
|           }
 | |
|         },
 | |
| 
 | |
|         show: function(callback) {
 | |
|           callback = $.isFunction(callback)
 | |
|             ? callback
 | |
|             : function(){}
 | |
|           ;
 | |
|           module.refreshModals();
 | |
|           module.set.dimmerSettings();
 | |
|           module.set.dimmerStyles();
 | |
| 
 | |
|           module.showModal(callback);
 | |
|         },
 | |
| 
 | |
|         hide: function(callback) {
 | |
|           callback = $.isFunction(callback)
 | |
|             ? callback
 | |
|             : function(){}
 | |
|           ;
 | |
|           module.refreshModals();
 | |
|           return module.hideModal(callback);
 | |
|         },
 | |
| 
 | |
|         showModal: function(callback) {
 | |
|           callback = $.isFunction(callback)
 | |
|             ? callback
 | |
|             : function(){}
 | |
|           ;
 | |
|           if( module.is.animating() || !module.is.active() ) {
 | |
|             module.showDimmer();
 | |
|             module.cacheSizes();
 | |
|             module.set.bodyMargin();
 | |
|             if(module.can.useFlex()) {
 | |
|               module.remove.legacy();
 | |
|             }
 | |
|             else {
 | |
|               module.set.legacy();
 | |
|               module.set.modalOffset();
 | |
|               module.debug('Using non-flex legacy modal positioning.');
 | |
|             }
 | |
|             module.set.screenHeight();
 | |
|             module.set.type();
 | |
|             module.set.clickaway();
 | |
| 
 | |
|             if( !settings.allowMultiple && module.others.active() ) {
 | |
|               module.hideOthers(module.showModal);
 | |
|             }
 | |
|             else {
 | |
|               ignoreRepeatedEvents = false;
 | |
|               if( settings.allowMultiple ) {
 | |
|                 if ( module.others.active() ) {
 | |
|                   $otherModals.filter('.' + className.active).find(selector.dimmer).addClass('active');
 | |
|                 }
 | |
| 
 | |
|                 if ( settings.detachable ) {
 | |
|                   $module.detach().appendTo($dimmer);
 | |
|                 }
 | |
|               }
 | |
|               settings.onShow.call(element);
 | |
|               if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
 | |
|                 module.debug('Showing modal with css animations');
 | |
|                 $module
 | |
|                   .transition({
 | |
|                     debug       : settings.debug,
 | |
|                     animation   : settings.transition + ' in',
 | |
|                     queue       : settings.queue,
 | |
|                     duration    : settings.duration,
 | |
|                     useFailSafe : true,
 | |
|                     onComplete : function() {
 | |
|                       settings.onVisible.apply(element);
 | |
|                       if(settings.keyboardShortcuts) {
 | |
|                         module.add.keyboardShortcuts();
 | |
|                       }
 | |
|                       module.save.focus();
 | |
|                       module.set.active();
 | |
|                       if(settings.autofocus) {
 | |
|                         module.set.autofocus();
 | |
|                       }
 | |
|                       callback();
 | |
|                     }
 | |
|                   })
 | |
|                 ;
 | |
|               }
 | |
|               else {
 | |
|                 module.error(error.noTransition);
 | |
|               }
 | |
|             }
 | |
|           }
 | |
|           else {
 | |
|             module.debug('Modal is already visible');
 | |
|           }
 | |
|         },
 | |
| 
 | |
|         hideModal: function(callback, keepDimmed, hideOthersToo) {
 | |
|           var
 | |
|             $previousModal = $otherModals.filter('.' + className.active).last()
 | |
|           ;
 | |
|           callback = $.isFunction(callback)
 | |
|             ? callback
 | |
|             : function(){}
 | |
|           ;
 | |
|           module.debug('Hiding modal');
 | |
|           if(settings.onHide.call(element, $(this)) === false) {
 | |
|             module.verbose('Hide callback returned false cancelling hide');
 | |
|             ignoreRepeatedEvents = false;
 | |
|             return false;
 | |
|           }
 | |
| 
 | |
|           if( module.is.animating() || module.is.active() ) {
 | |
|             if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
 | |
|               module.remove.active();
 | |
|               $module
 | |
|                 .transition({
 | |
|                   debug       : settings.debug,
 | |
|                   animation   : settings.transition + ' out',
 | |
|                   queue       : settings.queue,
 | |
|                   duration    : settings.duration,
 | |
|                   useFailSafe : true,
 | |
|                   onStart     : function() {
 | |
|                     if(!module.others.active() && !module.others.animating() && !keepDimmed) {
 | |
|                       module.hideDimmer();
 | |
|                     }
 | |
|                     if( settings.keyboardShortcuts && !module.others.active() ) {
 | |
|                       module.remove.keyboardShortcuts();
 | |
|                     }
 | |
|                   },
 | |
|                   onComplete : function() {
 | |
|                     module.unbind.scrollLock();
 | |
|                     if ( settings.allowMultiple ) {
 | |
|                       $previousModal.addClass(className.front);
 | |
|                       $module.removeClass(className.front);
 | |
| 
 | |
|                       if ( hideOthersToo ) {
 | |
|                         $allModals.find(selector.dimmer).removeClass('active');
 | |
|                       }
 | |
|                       else {
 | |
|                         $previousModal.find(selector.dimmer).removeClass('active');
 | |
|                       }
 | |
|                     }
 | |
|                     settings.onHidden.call(element);
 | |
|                     module.remove.dimmerStyles();
 | |
|                     module.restore.focus();
 | |
|                     callback();
 | |
|                   }
 | |
|                 })
 | |
|               ;
 | |
|             }
 | |
|             else {
 | |
|               module.error(error.noTransition);
 | |
|             }
 | |
|           }
 | |
|         },
 | |
| 
 | |
|         showDimmer: function() {
 | |
|           if($dimmable.dimmer('is animating') || !$dimmable.dimmer('is active') ) {
 | |
|             module.save.bodyMargin();
 | |
|             module.debug('Showing dimmer');
 | |
|             $dimmable.dimmer('show');
 | |
|           }
 | |
|           else {
 | |
|             module.debug('Dimmer already visible');
 | |
|           }
 | |
|         },
 | |
| 
 | |
|         hideDimmer: function() {
 | |
|           if( $dimmable.dimmer('is animating') || ($dimmable.dimmer('is active')) ) {
 | |
|             module.unbind.scrollLock();
 | |
|             $dimmable.dimmer('hide', function() {
 | |
|               module.restore.bodyMargin();
 | |
|               module.remove.clickaway();
 | |
|               module.remove.screenHeight();
 | |
|             });
 | |
|           }
 | |
|           else {
 | |
|             module.debug('Dimmer is not visible cannot hide');
 | |
|             return;
 | |
|           }
 | |
|         },
 | |
| 
 | |
|         hideAll: function(callback) {
 | |
|           var
 | |
|             $visibleModals = $allModals.filter('.' + className.active + ', .' + className.animating)
 | |
|           ;
 | |
|           callback = $.isFunction(callback)
 | |
|             ? callback
 | |
|             : function(){}
 | |
|           ;
 | |
|           if( $visibleModals.length > 0 ) {
 | |
|             module.debug('Hiding all visible modals');
 | |
|             var hideOk = true;
 | |
| //check in reverse order trying to hide most top displayed modal first
 | |
|             $($visibleModals.get().reverse()).each(function(index,element){
 | |
|                 if(hideOk){
 | |
|                     hideOk = $(element).modal('hide modal', callback, false, true);
 | |
|                 }
 | |
|             });
 | |
|             if(hideOk) {
 | |
|               module.hideDimmer();
 | |
|             }
 | |
|             return hideOk;
 | |
|           }
 | |
|         },
 | |
| 
 | |
|         hideOthers: function(callback) {
 | |
|           var
 | |
|             $visibleModals = $otherModals.filter('.' + className.active + ', .' + className.animating)
 | |
|           ;
 | |
|           callback = $.isFunction(callback)
 | |
|             ? callback
 | |
|             : function(){}
 | |
|           ;
 | |
|           if( $visibleModals.length > 0 ) {
 | |
|             module.debug('Hiding other modals', $otherModals);
 | |
|             $visibleModals
 | |
|               .modal('hide modal', callback, true)
 | |
|             ;
 | |
|           }
 | |
|         },
 | |
| 
 | |
|         others: {
 | |
|           active: function() {
 | |
|             return ($otherModals.filter('.' + className.active).length > 0);
 | |
|           },
 | |
|           animating: function() {
 | |
|             return ($otherModals.filter('.' + className.animating).length > 0);
 | |
|           }
 | |
|         },
 | |
| 
 | |
| 
 | |
|         add: {
 | |
|           keyboardShortcuts: function() {
 | |
|             module.verbose('Adding keyboard shortcuts');
 | |
|             $document
 | |
|               .on('keyup' + eventNamespace, module.event.keyboard)
 | |
|             ;
 | |
|           }
 | |
|         },
 | |
| 
 | |
|         save: {
 | |
|           focus: function() {
 | |
|             var
 | |
|               $activeElement = $(document.activeElement),
 | |
|               inCurrentModal = $activeElement.closest($module).length > 0
 | |
|             ;
 | |
|             if(!inCurrentModal) {
 | |
|               $focusedElement = $(document.activeElement).blur();
 | |
|             }
 | |
|           },
 | |
|           bodyMargin: function() {
 | |
|             initialBodyMargin = $body.css('margin-'+(module.can.leftBodyScrollbar() ? 'left':'right'));
 | |
|             var bodyMarginRightPixel = parseInt(initialBodyMargin.replace(/[^\d.]/g, '')),
 | |
|                 bodyScrollbarWidth = window.innerWidth - document.documentElement.clientWidth;
 | |
|             tempBodyMargin = bodyMarginRightPixel + bodyScrollbarWidth;
 | |
|           }
 | |
|         },
 | |
| 
 | |
|         restore: {
 | |
|           focus: function() {
 | |
|             if($focusedElement && $focusedElement.length > 0 && settings.restoreFocus) {
 | |
|               $focusedElement.focus();
 | |
|             }
 | |
|           },
 | |
|           bodyMargin: function() {
 | |
|             var position = module.can.leftBodyScrollbar() ? 'left':'right';
 | |
|             $body.css('margin-'+position, initialBodyMargin);
 | |
|             $body.find(selector.bodyFixed.replace('right',position)).css('padding-'+position, initialBodyMargin);
 | |
|           }
 | |
|         },
 | |
| 
 | |
|         remove: {
 | |
|           active: function() {
 | |
|             $module.removeClass(className.active);
 | |
|           },
 | |
|           legacy: function() {
 | |
|             $module.removeClass(className.legacy);
 | |
|           },
 | |
|           clickaway: function() {
 | |
|             if (!settings.detachable) {
 | |
|               $module
 | |
|                   .off('mousedown' + elementEventNamespace)
 | |
|               ;
 | |
|             }           
 | |
|             $dimmer
 | |
|               .off('mousedown' + elementEventNamespace)
 | |
|             ;
 | |
|             $dimmer
 | |
|               .off('mouseup' + elementEventNamespace)
 | |
|             ;
 | |
|           },
 | |
|           dimmerStyles: function() {
 | |
|             $dimmer.removeClass(className.inverted);
 | |
|             $dimmable.removeClass(className.blurring);
 | |
|           },
 | |
|           bodyStyle: function() {
 | |
|             if($body.attr('style') === '') {
 | |
|               module.verbose('Removing style attribute');
 | |
|               $body.removeAttr('style');
 | |
|             }
 | |
|           },
 | |
|           screenHeight: function() {
 | |
|             module.debug('Removing page height');
 | |
|             $body
 | |
|               .css('height', '')
 | |
|             ;
 | |
|           },
 | |
|           keyboardShortcuts: function() {
 | |
|             module.verbose('Removing keyboard shortcuts');
 | |
|             $document
 | |
|               .off('keyup' + eventNamespace)
 | |
|             ;
 | |
|           },
 | |
|           scrolling: function() {
 | |
|             $dimmable.removeClass(className.scrolling);
 | |
|             $module.removeClass(className.scrolling);
 | |
|           }
 | |
|         },
 | |
| 
 | |
|         cacheSizes: function() {
 | |
|           $module.addClass(className.loading);
 | |
|           var
 | |
|             scrollHeight = $module.prop('scrollHeight'),
 | |
|             modalWidth   = $module.outerWidth(),
 | |
|             modalHeight  = $module.outerHeight()
 | |
|           ;
 | |
|           if(module.cache.pageHeight === undefined || modalHeight !== 0) {
 | |
|             $.extend(module.cache, {
 | |
|               pageHeight    : $(document).outerHeight(),
 | |
|               width         : modalWidth,
 | |
|               height        : modalHeight + settings.offset,
 | |
|               scrollHeight  : scrollHeight + settings.offset,
 | |
|               contextHeight : (settings.context == 'body')
 | |
|                 ? $(window).height()
 | |
|                 : $dimmable.height(),
 | |
|             });
 | |
|             module.cache.topOffset = -(module.cache.height / 2);
 | |
|           }
 | |
|           $module.removeClass(className.loading);
 | |
|           module.debug('Caching modal and container sizes', module.cache);
 | |
|         },
 | |
| 
 | |
|         can: {
 | |
|           leftBodyScrollbar: function(){
 | |
|             if(module.cache.leftBodyScrollbar === undefined) {
 | |
|               module.cache.leftBodyScrollbar = module.is.rtl() && ((module.is.iframe && !module.is.firefox()) || module.is.safari() || module.is.edge() || module.is.ie());
 | |
|             }
 | |
|             return module.cache.leftBodyScrollbar;
 | |
|           },
 | |
|           useFlex: function() {
 | |
|             if (settings.useFlex === 'auto') {
 | |
|               return settings.detachable && !module.is.ie();
 | |
|             }
 | |
|             if(settings.useFlex && module.is.ie()) {
 | |
|               module.debug('useFlex true is not supported in IE');
 | |
|             } else if(settings.useFlex && !settings.detachable) {
 | |
|               module.debug('useFlex true in combination with detachable false is not supported');
 | |
|             }
 | |
|             return settings.useFlex;
 | |
|           },
 | |
|           fit: function() {
 | |
|             var
 | |
|               contextHeight  = module.cache.contextHeight,
 | |
|               verticalCenter = module.cache.contextHeight / 2,
 | |
|               topOffset      = module.cache.topOffset,
 | |
|               scrollHeight   = module.cache.scrollHeight,
 | |
|               height         = module.cache.height,
 | |
|               paddingHeight  = settings.padding,
 | |
|               startPosition  = (verticalCenter + topOffset)
 | |
|             ;
 | |
|             return (scrollHeight > height)
 | |
|               ? (startPosition + scrollHeight + paddingHeight < contextHeight)
 | |
|               : (height + (paddingHeight * 2) < contextHeight)
 | |
|             ;
 | |
|           }
 | |
|         },
 | |
| 
 | |
|         is: {
 | |
|           active: function() {
 | |
|             return $module.hasClass(className.active);
 | |
|           },
 | |
|           ie: function() {
 | |
|             if(module.cache.isIE === undefined) {
 | |
|               var
 | |
|                   isIE11 = (!(window.ActiveXObject) && 'ActiveXObject' in window),
 | |
|                   isIE = ('ActiveXObject' in window)
 | |
|               ;
 | |
|               module.cache.isIE = (isIE11 || isIE);
 | |
|             }
 | |
|             return module.cache.isIE;
 | |
|           },
 | |
|           animating: function() {
 | |
|             return $module.transition('is supported')
 | |
|               ? $module.transition('is animating')
 | |
|               : $module.is(':visible')
 | |
|             ;
 | |
|           },
 | |
|           scrolling: function() {
 | |
|             return $dimmable.hasClass(className.scrolling);
 | |
|           },
 | |
|           modernBrowser: function() {
 | |
|             // appName for IE11 reports 'Netscape' can no longer use
 | |
|             return !(window.ActiveXObject || 'ActiveXObject' in window);
 | |
|           },
 | |
|           rtl: function() {
 | |
|             if(module.cache.isRTL === undefined) {
 | |
|               module.cache.isRTL = $body.attr('dir') === 'rtl' || $body.css('direction') === 'rtl';
 | |
|             }
 | |
|             return module.cache.isRTL;
 | |
|           },
 | |
|           safari: function() {
 | |
|             if(module.cache.isSafari === undefined) {
 | |
|               module.cache.isSafari = /constructor/i.test(window.HTMLElement) || !!window.ApplePaySession;
 | |
|             }
 | |
|             return module.cache.isSafari;
 | |
|           },
 | |
|           edge: function(){
 | |
|             if(module.cache.isEdge === undefined) {
 | |
|               module.cache.isEdge = !!window.setImmediate && !module.is.ie();
 | |
|             }
 | |
|             return module.cache.isEdge;
 | |
|           },
 | |
|           firefox: function(){
 | |
|             if(module.cache.isFirefox === undefined) {
 | |
|                 module.cache.isFirefox = !!window.InstallTrigger;
 | |
|             }
 | |
|             return module.cache.isFirefox;
 | |
|           },
 | |
|           iframe: function() {
 | |
|               return !(self === top);
 | |
|           }
 | |
|         },
 | |
| 
 | |
|         set: {
 | |
|           autofocus: function() {
 | |
|             var
 | |
|               $inputs    = $module.find('[tabindex], :input').filter(':visible').filter(function() {
 | |
|                 return $(this).closest('.disabled').length === 0;
 | |
|               }),
 | |
|               $autofocus = $inputs.filter('[autofocus]'),
 | |
|               $input     = ($autofocus.length > 0)
 | |
|                 ? $autofocus.first()
 | |
|                 : $inputs.first()
 | |
|             ;
 | |
|             if($input.length > 0) {
 | |
|               $input.focus();
 | |
|             }
 | |
|           },
 | |
|           bodyMargin: function() {
 | |
|             var position = module.can.leftBodyScrollbar() ? 'left':'right';
 | |
|             if(settings.detachable || module.can.fit()) {
 | |
|               $body.css('margin-'+position, tempBodyMargin + 'px');
 | |
|             }
 | |
|             $body.find(selector.bodyFixed.replace('right',position)).css('padding-'+position, tempBodyMargin + 'px');
 | |
|           },
 | |
|           clickaway: function() {
 | |
|             if (!settings.detachable) {
 | |
|               $module
 | |
|                 .on('mousedown' + elementEventNamespace, module.event.mousedown)
 | |
|               ;
 | |
|             }
 | |
|             $dimmer
 | |
|               .on('mousedown' + elementEventNamespace, module.event.mousedown)
 | |
|             ;
 | |
|             $dimmer
 | |
|               .on('mouseup' + elementEventNamespace, module.event.mouseup)
 | |
|             ;
 | |
|           },
 | |
|           dimmerSettings: function() {
 | |
|             if($.fn.dimmer === undefined) {
 | |
|               module.error(error.dimmer);
 | |
|               return;
 | |
|             }
 | |
|             var
 | |
|               defaultSettings = {
 | |
|                 debug      : settings.debug,
 | |
|                 dimmerName : 'modals',
 | |
|                 closable   : 'auto',
 | |
|                 useFlex    : module.can.useFlex(),
 | |
|                 duration   : {
 | |
|                   show     : settings.duration,
 | |
|                   hide     : settings.duration
 | |
|                 }
 | |
|               },
 | |
|               dimmerSettings = $.extend(true, defaultSettings, settings.dimmerSettings)
 | |
|             ;
 | |
|             if(settings.inverted) {
 | |
|               dimmerSettings.variation = (dimmerSettings.variation !== undefined)
 | |
|                 ? dimmerSettings.variation + ' inverted'
 | |
|                 : 'inverted'
 | |
|               ;
 | |
|             }
 | |
|             $context.dimmer('setting', dimmerSettings);
 | |
|           },
 | |
|           dimmerStyles: function() {
 | |
|             if(settings.inverted) {
 | |
|               $dimmer.addClass(className.inverted);
 | |
|             }
 | |
|             else {
 | |
|               $dimmer.removeClass(className.inverted);
 | |
|             }
 | |
|             if(settings.blurring) {
 | |
|               $dimmable.addClass(className.blurring);
 | |
|             }
 | |
|             else {
 | |
|               $dimmable.removeClass(className.blurring);
 | |
|             }
 | |
|           },
 | |
|           modalOffset: function() {
 | |
|             if (!settings.detachable) {
 | |
|               var canFit = module.can.fit();
 | |
|               $module
 | |
|                 .css({
 | |
|                   top: (!$module.hasClass('aligned') && canFit)
 | |
|                     ? $(document).scrollTop() + (module.cache.contextHeight - module.cache.height) / 2
 | |
|                     : !canFit || $module.hasClass('top')
 | |
|                       ? $(document).scrollTop() + settings.padding
 | |
|                       : $(document).scrollTop() + (module.cache.contextHeight - module.cache.height - settings.padding),
 | |
|                   marginLeft: -(module.cache.width / 2)
 | |
|                 }) 
 | |
|               ;
 | |
|             } else {
 | |
|               $module
 | |
|                 .css({
 | |
|                   marginTop: (!$module.hasClass('aligned') && module.can.fit())
 | |
|                     ? -(module.cache.height / 2)
 | |
|                     : settings.padding / 2,
 | |
|                   marginLeft: -(module.cache.width / 2)
 | |
|                 }) 
 | |
|               ;
 | |
|             }
 | |
|             module.verbose('Setting modal offset for legacy mode');
 | |
|           },
 | |
|           screenHeight: function() {
 | |
|             if( module.can.fit() ) {
 | |
|               $body.css('height', '');
 | |
|             }
 | |
|             else if(!$module.hasClass('bottom')) {
 | |
|               module.debug('Modal is taller than page content, resizing page height');
 | |
|               $body
 | |
|                 .css('height', module.cache.height + (settings.padding * 2) )
 | |
|               ;
 | |
|             }
 | |
|           },
 | |
|           active: function() {
 | |
|             $module.addClass(className.active + ' ' + className.front);
 | |
|             $otherModals.filter('.' + className.active).removeClass(className.front);
 | |
|           },
 | |
|           scrolling: function() {
 | |
|             $dimmable.addClass(className.scrolling);
 | |
|             $module.addClass(className.scrolling);
 | |
|             module.unbind.scrollLock();
 | |
|           },
 | |
|           legacy: function() {
 | |
|             $module.addClass(className.legacy);
 | |
|           },
 | |
|           type: function() {
 | |
|             if(module.can.fit()) {
 | |
|               module.verbose('Modal fits on screen');
 | |
|               if(!module.others.active() && !module.others.animating()) {
 | |
|                 module.remove.scrolling();
 | |
|                 module.bind.scrollLock();
 | |
|               }
 | |
|             }
 | |
|             else if (!$module.hasClass('bottom')){
 | |
|               module.verbose('Modal cannot fit on screen setting to scrolling');
 | |
|               module.set.scrolling();
 | |
|             } else {
 | |
|                 module.verbose('Bottom aligned modal not fitting on screen is unsupported for scrolling');
 | |
|             }
 | |
|           },
 | |
|           undetached: function() {
 | |
|             $dimmable.addClass(className.undetached);
 | |
|           }
 | |
|         },
 | |
| 
 | |
|         setting: function(name, value) {
 | |
|           module.debug('Changing setting', name, value);
 | |
|           if( $.isPlainObject(name) ) {
 | |
|             $.extend(true, settings, name);
 | |
|           }
 | |
|           else if(value !== undefined) {
 | |
|             if($.isPlainObject(settings[name])) {
 | |
|               $.extend(true, settings[name], value);
 | |
|             }
 | |
|             else {
 | |
|               settings[name] = value;
 | |
|             }
 | |
|           }
 | |
|           else {
 | |
|             return settings[name];
 | |
|           }
 | |
|         },
 | |
|         internal: function(name, value) {
 | |
|           if( $.isPlainObject(name) ) {
 | |
|             $.extend(true, module, name);
 | |
|           }
 | |
|           else if(value !== undefined) {
 | |
|             module[name] = value;
 | |
|           }
 | |
|           else {
 | |
|             return module[name];
 | |
|           }
 | |
|         },
 | |
|         debug: function() {
 | |
|           if(!settings.silent && settings.debug) {
 | |
|             if(settings.performance) {
 | |
|               module.performance.log(arguments);
 | |
|             }
 | |
|             else {
 | |
|               module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
 | |
|               module.debug.apply(console, arguments);
 | |
|             }
 | |
|           }
 | |
|         },
 | |
|         verbose: function() {
 | |
|           if(!settings.silent && settings.verbose && settings.debug) {
 | |
|             if(settings.performance) {
 | |
|               module.performance.log(arguments);
 | |
|             }
 | |
|             else {
 | |
|               module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
 | |
|               module.verbose.apply(console, arguments);
 | |
|             }
 | |
|           }
 | |
|         },
 | |
|         error: function() {
 | |
|           if(!settings.silent) {
 | |
|             module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
 | |
|             module.error.apply(console, arguments);
 | |
|           }
 | |
|         },
 | |
|         performance: {
 | |
|           log: function(message) {
 | |
|             var
 | |
|               currentTime,
 | |
|               executionTime,
 | |
|               previousTime
 | |
|             ;
 | |
|             if(settings.performance) {
 | |
|               currentTime   = new Date().getTime();
 | |
|               previousTime  = time || currentTime;
 | |
|               executionTime = currentTime - previousTime;
 | |
|               time          = currentTime;
 | |
|               performance.push({
 | |
|                 'Name'           : message[0],
 | |
|                 'Arguments'      : [].slice.call(message, 1) || '',
 | |
|                 'Element'        : element,
 | |
|                 'Execution Time' : executionTime
 | |
|               });
 | |
|             }
 | |
|             clearTimeout(module.performance.timer);
 | |
|             module.performance.timer = setTimeout(module.performance.display, 500);
 | |
|           },
 | |
|           display: function() {
 | |
|             var
 | |
|               title = settings.name + ':',
 | |
|               totalTime = 0
 | |
|             ;
 | |
|             time = false;
 | |
|             clearTimeout(module.performance.timer);
 | |
|             $.each(performance, function(index, data) {
 | |
|               totalTime += data['Execution Time'];
 | |
|             });
 | |
|             title += ' ' + totalTime + 'ms';
 | |
|             if(moduleSelector) {
 | |
|               title += ' \'' + moduleSelector + '\'';
 | |
|             }
 | |
|             if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
 | |
|               console.groupCollapsed(title);
 | |
|               if(console.table) {
 | |
|                 console.table(performance);
 | |
|               }
 | |
|               else {
 | |
|                 $.each(performance, function(index, data) {
 | |
|                   console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
 | |
|                 });
 | |
|               }
 | |
|               console.groupEnd();
 | |
|             }
 | |
|             performance = [];
 | |
|           }
 | |
|         },
 | |
|         invoke: function(query, passedArguments, context) {
 | |
|           var
 | |
|             object = instance,
 | |
|             maxDepth,
 | |
|             found,
 | |
|             response
 | |
|           ;
 | |
|           passedArguments = passedArguments || queryArguments;
 | |
|           context         = element         || context;
 | |
|           if(typeof query == 'string' && object !== undefined) {
 | |
|             query    = query.split(/[\. ]/);
 | |
|             maxDepth = query.length - 1;
 | |
|             $.each(query, function(depth, value) {
 | |
|               var camelCaseValue = (depth != maxDepth)
 | |
|                 ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
 | |
|                 : query
 | |
|               ;
 | |
|               if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
 | |
|                 object = object[camelCaseValue];
 | |
|               }
 | |
|               else if( object[camelCaseValue] !== undefined ) {
 | |
|                 found = object[camelCaseValue];
 | |
|                 return false;
 | |
|               }
 | |
|               else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
 | |
|                 object = object[value];
 | |
|               }
 | |
|               else if( object[value] !== undefined ) {
 | |
|                 found = object[value];
 | |
|                 return false;
 | |
|               }
 | |
|               else {
 | |
|                 return false;
 | |
|               }
 | |
|             });
 | |
|           }
 | |
|           if ( $.isFunction( found ) ) {
 | |
|             response = found.apply(context, passedArguments);
 | |
|           }
 | |
|           else if(found !== undefined) {
 | |
|             response = found;
 | |
|           }
 | |
|           if(Array.isArray(returnedValue)) {
 | |
|             returnedValue.push(response);
 | |
|           }
 | |
|           else if(returnedValue !== undefined) {
 | |
|             returnedValue = [returnedValue, response];
 | |
|           }
 | |
|           else if(response !== undefined) {
 | |
|             returnedValue = response;
 | |
|           }
 | |
|           return found;
 | |
|         }
 | |
|       };
 | |
| 
 | |
|       if(methodInvoked) {
 | |
|         if(instance === undefined) {
 | |
|           module.initialize();
 | |
|         }
 | |
|         module.invoke(query);
 | |
|       }
 | |
|       else {
 | |
|         if(instance !== undefined) {
 | |
|           instance.invoke('destroy');
 | |
|         }
 | |
|         module.initialize();
 | |
|       }
 | |
|     })
 | |
|   ;
 | |
| 
 | |
|   return (returnedValue !== undefined)
 | |
|     ? returnedValue
 | |
|     : this
 | |
|   ;
 | |
| };
 | |
| 
 | |
| $.fn.modal.settings = {
 | |
| 
 | |
|   name           : 'Modal',
 | |
|   namespace      : 'modal',
 | |
| 
 | |
|   useFlex        : 'auto',
 | |
|   offset         : 0,
 | |
| 
 | |
|   silent         : false,
 | |
|   debug          : false,
 | |
|   verbose        : false,
 | |
|   performance    : true,
 | |
| 
 | |
|   observeChanges : false,
 | |
| 
 | |
|   allowMultiple  : false,
 | |
|   detachable     : true,
 | |
|   closable       : true,
 | |
|   autofocus      : true,
 | |
|   restoreFocus   : true,
 | |
| 
 | |
|   inverted       : false,
 | |
|   blurring       : false,
 | |
| 
 | |
|   centered       : true,
 | |
| 
 | |
|   dimmerSettings : {
 | |
|     closable : false,
 | |
|     useCSS   : true
 | |
|   },
 | |
| 
 | |
|   // whether to use keyboard shortcuts
 | |
|   keyboardShortcuts: true,
 | |
| 
 | |
|   context    : 'body',
 | |
| 
 | |
|   queue      : false,
 | |
|   duration   : 500,
 | |
|   transition : 'scale',
 | |
| 
 | |
|   // padding with edge of page
 | |
|   padding    : 50,
 | |
|   scrollbarWidth: 10,
 | |
| 
 | |
|   // called before show animation
 | |
|   onShow     : function(){},
 | |
| 
 | |
|   // called after show animation
 | |
|   onVisible  : function(){},
 | |
| 
 | |
|   // called before hide animation
 | |
|   onHide     : function(){ return true; },
 | |
| 
 | |
|   // called after hide animation
 | |
|   onHidden   : function(){},
 | |
| 
 | |
|   // called after approve selector match
 | |
|   onApprove  : function(){ return true; },
 | |
| 
 | |
|   // called after deny selector match
 | |
|   onDeny     : function(){ return true; },
 | |
| 
 | |
|   selector    : {
 | |
|     close    : '> .close',
 | |
|     approve  : '.actions .positive, .actions .approve, .actions .ok',
 | |
|     deny     : '.actions .negative, .actions .deny, .actions .cancel',
 | |
|     modal    : '.ui.modal',
 | |
|     dimmer   : '> .ui.dimmer',
 | |
|     bodyFixed: '> .ui.fixed.menu, > .ui.right.toast-container, > .ui.right.sidebar'
 | |
|   },
 | |
|   error : {
 | |
|     dimmer    : 'UI Dimmer, a required component is not included in this page',
 | |
|     method    : 'The method you called is not defined.',
 | |
|     notFound  : 'The element you specified could not be found'
 | |
|   },
 | |
|   className : {
 | |
|     active     : 'active',
 | |
|     animating  : 'animating',
 | |
|     blurring   : 'blurring',
 | |
|     inverted   : 'inverted',
 | |
|     legacy     : 'legacy',
 | |
|     loading    : 'loading',
 | |
|     scrolling  : 'scrolling',
 | |
|     undetached : 'undetached',
 | |
|     front      : 'front'
 | |
|   }
 | |
| };
 | |
| 
 | |
| 
 | |
| })( jQuery, window, document );
 |