| 
									
										
										
										
											2016-11-04 23:00:34 +03:00
										 |  |  | /********************************************************************** | 
					
						
							|  |  |  | *  | 
					
						
							|  |  |  | * | 
					
						
							|  |  |  | * | 
					
						
							|  |  |  | **********************************************************************/ | 
					
						
							|  |  |  | ((typeof define)[0]=='u'?function(f){module.exports=f(require)}:define)( | 
					
						
							|  |  |  | function(require){ var module={} // makes module AMD/node compatible...
 | 
					
						
							|  |  |  | /*********************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var actions = require('lib/actions') | 
					
						
							|  |  |  | var features = require('lib/features') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var core = require('features/core') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*********************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var ProgressActions = actions.Actions({ | 
					
						
							|  |  |  | 	config: { | 
					
						
							| 
									
										
										
										
											2020-12-06 05:34:28 +03:00
										 |  |  | 		'progress-pre-delay': 1000, | 
					
						
							| 
									
										
										
										
											2016-11-04 23:00:34 +03:00
										 |  |  | 		'progress-done-delay': 1000, | 
					
						
							| 
									
										
										
										
											2020-12-06 05:34:28 +03:00
										 |  |  | 		'progress-fade-duration': 200, | 
					
						
							| 
									
										
										
										
											2020-07-09 02:19:43 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		'progress-update-min': 200, | 
					
						
							| 
									
										
										
										
											2020-11-21 01:48:57 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-21 04:15:33 +03:00
										 |  |  | 		// Logger keywords / aliases that trigger progress actions...
 | 
					
						
							|  |  |  | 		//
 | 
					
						
							|  |  |  | 		// The builtin keywords / aliases are:
 | 
					
						
							|  |  |  | 		// 	add / added			- add one or more item to progress bar
 | 
					
						
							|  |  |  | 		// 	done				- move the progress bar by 1
 | 
					
						
							|  |  |  | 		// 	skip / skipped		- move the progress bar by 1
 | 
					
						
							|  |  |  | 		// 	close / closed		- close the progress bar
 | 
					
						
							|  |  |  | 		// 	error				- report error
 | 
					
						
							|  |  |  | 		//
 | 
					
						
							|  |  |  | 		// The progress bar will be created on first 'add' call.
 | 
					
						
							|  |  |  | 		//
 | 
					
						
							|  |  |  | 		// The progress bar will be closed when the number of added items
 | 
					
						
							|  |  |  | 		// is less or equal to the number of done or skipped items.
 | 
					
						
							|  |  |  | 		//
 | 
					
						
							|  |  |  | 		//
 | 
					
						
							|  |  |  | 		// For example:
 | 
					
						
							|  |  |  | 		//		var log = logger.push('Example')	// - define a logger...
 | 
					
						
							|  |  |  | 		// 		log.emit('add', 'some item...')		// - creates a progress bar
 | 
					
						
							|  |  |  | 		// 											//   with one item...
 | 
					
						
							|  |  |  | 		// 		log.emit('add', [ ... ])			// - adds multiple items to
 | 
					
						
							|  |  |  | 		// 											//   progress bar...
 | 
					
						
							|  |  |  | 		// 		...
 | 
					
						
							|  |  |  | 		//		log.emit('done', 'some item...')	// - close the progress bar
 | 
					
						
							|  |  |  | 		//		...
 | 
					
						
							|  |  |  | 		//
 | 
					
						
							|  |  |  | 		//
 | 
					
						
							|  |  |  | 		// Format:
 | 
					
						
							|  |  |  | 		// 	{
 | 
					
						
							|  |  |  | 		// 		<keyword>: [
 | 
					
						
							|  |  |  | 		// 			<alias>,
 | 
					
						
							|  |  |  | 		// 			...
 | 
					
						
							|  |  |  | 		// 		],
 | 
					
						
							|  |  |  | 		// 		...
 | 
					
						
							|  |  |  | 		// 	}
 | 
					
						
							|  |  |  | 		//
 | 
					
						
							|  |  |  | 		//
 | 
					
						
							|  |  |  | 		// NOTE: the builtin aliases will work even if this is empty.
 | 
					
						
							| 
									
										
										
										
											2020-11-21 01:48:57 +03:00
										 |  |  | 		// NOTE: each root key is also is also usable as a keyword.
 | 
					
						
							| 
									
										
										
										
											2020-11-21 04:15:33 +03:00
										 |  |  | 		'progress-logger-keywords': { | 
					
						
							| 
									
										
										
										
											2020-11-21 01:48:57 +03:00
										 |  |  | 			add: [ | 
					
						
							|  |  |  | 				'queued', | 
					
						
							|  |  |  | 				'found', | 
					
						
							|  |  |  | 			], | 
					
						
							|  |  |  | 			done: [ | 
					
						
							|  |  |  | 				'loaded', | 
					
						
							|  |  |  | 				'written', | 
					
						
							|  |  |  | 				'index', | 
					
						
							|  |  |  | 			], | 
					
						
							|  |  |  | 			skip: [ | 
					
						
							|  |  |  | 				'skipping', | 
					
						
							|  |  |  | 				'removed', | 
					
						
							|  |  |  | 			], | 
					
						
							| 
									
										
										
										
											2020-12-04 06:48:59 +03:00
										 |  |  | 			reset: [ | 
					
						
							|  |  |  | 				'clear', | 
					
						
							|  |  |  | 			], | 
					
						
							| 
									
										
										
										
											2020-11-21 01:48:57 +03:00
										 |  |  | 			close: [ | 
					
						
							|  |  |  | 				'end', | 
					
						
							| 
									
										
										
										
											2020-11-23 16:19:12 +03:00
										 |  |  | 				'abort', | 
					
						
							| 
									
										
										
										
											2020-11-21 01:48:57 +03:00
										 |  |  | 			], | 
					
						
							|  |  |  | 			error: [ | 
					
						
							|  |  |  | 			], | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2016-11-04 23:00:34 +03:00
										 |  |  | 	}, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-21 01:48:57 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-07 18:13:52 +03:00
										 |  |  | 	// XXX add message to be shown...
 | 
					
						
							| 
									
										
										
										
											2016-11-04 23:00:34 +03:00
										 |  |  | 	// XXX should we report errors and stoppages??? (error state??)
 | 
					
						
							|  |  |  | 	// XXX multiple containers...
 | 
					
						
							| 
									
										
										
										
											2016-11-06 01:58:32 +03:00
										 |  |  | 	// XXX shorten the nested css class names...
 | 
					
						
							| 
									
										
										
										
											2016-11-04 23:00:34 +03:00
										 |  |  | 	// XXX revise styles...
 | 
					
						
							| 
									
										
										
										
											2020-12-22 18:25:14 +03:00
										 |  |  | 	// XXX make the "X" finger usable...
 | 
					
						
							|  |  |  | 	// XXX add time estimation...
 | 
					
						
							|  |  |  | 	// 		....based on last 10 tasks...
 | 
					
						
							| 
									
										
										
										
											2020-07-09 02:19:43 +03:00
										 |  |  | 	__progress_cache: null, | 
					
						
							| 
									
										
										
										
											2016-11-04 23:00:34 +03:00
										 |  |  | 	showProgress: ['- Interface/Show progress bar...', | 
					
						
							| 
									
										
										
										
											2020-11-05 22:46:27 +03:00
										 |  |  | 		core.doc`Progress bar widget...
 | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 			Create progress bar... | 
					
						
							|  |  |  | 			.showProgress('text') | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 			Update progress bar (value, max, msg)... | 
					
						
							|  |  |  | 			.showProgress('text', 0, 10) | 
					
						
							|  |  |  | 			.showProgress('text', 10, 50, 'message') | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 			Update progress bar value (has no effect if max is not set)... | 
					
						
							|  |  |  | 			.showProgress('text', 10) | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 			Close progress bar... | 
					
						
							|  |  |  | 			.showProgress('text', 'close') | 
					
						
							| 
									
										
										
										
											2020-12-04 06:48:59 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-05 22:46:27 +03:00
										 |  |  | 			Relative progress modification... | 
					
						
							|  |  |  | 			.showProgress('text', '+1') | 
					
						
							|  |  |  | 			.showProgress('text', '+0', '+1') | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 			.showProgress(logger) | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2020-12-06 05:34:28 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		The progress bar is going to be shown to the user if: | 
					
						
							|  |  |  | 			- max is greater than 1, or | 
					
						
							|  |  |  | 			- it did not close before .config['progress-pre-delay'] ms of start | 
					
						
							|  |  |  | 		This is done to avoid spamming the user with single point progress bars. | 
					
						
							| 
									
										
										
										
											2020-12-06 19:09:06 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		NOTE: to force show the progress bar set attrs.forceShow to true. | 
					
						
							| 
									
										
										
										
											2020-11-05 22:46:27 +03:00
										 |  |  | 		`,
 | 
					
						
							|  |  |  | 		function(text, value, max, attrs){ | 
					
						
							| 
									
										
										
										
											2016-11-04 23:00:34 +03:00
										 |  |  | 			var that = this | 
					
						
							| 
									
										
										
										
											2020-07-09 02:19:43 +03:00
										 |  |  | 			var viewer = this.dom | 
					
						
							| 
									
										
										
										
											2016-11-04 23:00:34 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-05 22:46:27 +03:00
										 |  |  | 			// get attrs...
 | 
					
						
							|  |  |  | 			var args = [...arguments] | 
					
						
							| 
									
										
										
										
											2020-12-06 19:09:06 +03:00
										 |  |  | 			attrs = args.last() instanceof Object ? | 
					
						
							| 
									
										
										
										
											2020-11-05 22:46:27 +03:00
										 |  |  | 				args.pop() | 
					
						
							|  |  |  | 				: null | 
					
						
							| 
									
										
										
										
											2020-12-06 19:09:06 +03:00
										 |  |  | 			var forceShow = !!(attrs || {}).forceShow | 
					
						
							| 
									
										
										
										
											2020-11-05 22:46:27 +03:00
										 |  |  | 			;[text, value, max] = args | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-26 19:04:47 +03:00
										 |  |  | 			// XXX revise...
 | 
					
						
							|  |  |  | 			var msg =  | 
					
						
							|  |  |  | 				(text instanceof Array  | 
					
						
							|  |  |  | 						&& text.length > 1) ?  | 
					
						
							|  |  |  | 					text.slice(1).join(': ')  | 
					
						
							|  |  |  | 					: null | 
					
						
							|  |  |  | 			text = text instanceof Array ?  | 
					
						
							|  |  |  | 				text[0]  | 
					
						
							|  |  |  | 				: text | 
					
						
							| 
									
										
										
										
											2016-11-04 23:00:34 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-06 19:09:06 +03:00
										 |  |  | 			// reset -- clear cache and set everything to 0...
 | 
					
						
							|  |  |  | 			// NOTE: we will later draw the progress bar full...
 | 
					
						
							|  |  |  | 			var reset = value == 'reset' | 
					
						
							|  |  |  | 			if(reset){ | 
					
						
							|  |  |  | 				delete (this.__progress_cache || {})[text] | 
					
						
							|  |  |  | 				value = 0 | 
					
						
							|  |  |  | 				max = 0 } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-23 03:08:47 +03:00
										 |  |  | 			// cache -- make sure we do not update too often...
 | 
					
						
							| 
									
										
										
										
											2020-07-09 02:19:43 +03:00
										 |  |  | 			if(value != 'close'){ | 
					
						
							|  |  |  | 				var cache = (this.__progress_cache = this.__progress_cache || {}) | 
					
						
							| 
									
										
										
										
											2020-11-05 22:46:27 +03:00
										 |  |  | 				cache = cache[text] =  | 
					
						
							|  |  |  | 					Object.assign( | 
					
						
							| 
									
										
										
										
											2020-12-26 19:04:47 +03:00
										 |  |  | 						{msg}, | 
					
						
							|  |  |  | 						cache[text] || {msg}, | 
					
						
							| 
									
										
										
										
											2020-11-05 22:46:27 +03:00
										 |  |  | 						attrs || {}) | 
					
						
							| 
									
										
										
										
											2020-12-26 19:04:47 +03:00
										 |  |  | 				// restore cached message if none given...
 | 
					
						
							|  |  |  | 				msg = cache.msg = msg || cache.msg | 
					
						
							| 
									
										
										
										
											2020-07-09 02:19:43 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				var updateValue = function(name, value){ | 
					
						
							|  |  |  | 					var v = cache[name] || 0 | 
					
						
							|  |  |  | 					return (cache[name] =  | 
					
						
							|  |  |  | 						value != null ?  | 
					
						
							| 
									
										
										
										
											2020-11-23 03:08:47 +03:00
										 |  |  | 							((typeof(value) == typeof('str')  | 
					
						
							|  |  |  | 									&& /[+-][0-9]+/.test(value)) ?  | 
					
						
							| 
									
										
										
										
											2020-07-09 02:19:43 +03:00
										 |  |  | 								v + parseInt(value) | 
					
						
							|  |  |  | 								: parseInt(value)) | 
					
						
							|  |  |  | 							: v) } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-22 18:25:14 +03:00
										 |  |  | 				var prev = cache.prev || 0 | 
					
						
							|  |  |  | 				value = cache.prev = updateValue('value', value) | 
					
						
							| 
									
										
										
										
											2020-07-09 02:19:43 +03:00
										 |  |  | 				max = updateValue('max', max) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-22 18:25:14 +03:00
										 |  |  | 				// estimate time to completion...
 | 
					
						
							|  |  |  | 				var t0 = cache.timestamp || Date.now() | 
					
						
							|  |  |  | 				var t = (cache.timestamp = Date.now()) - t0 | 
					
						
							|  |  |  | 				var avg = cache.avg_time =  | 
					
						
							|  |  |  | 					// rolling average -- feels a bit too smooth...
 | 
					
						
							|  |  |  | 					(((cache.avg_time || 0) * prev + t) / value) || 0 | 
					
						
							|  |  |  | 				var remaining = new Date(0) | 
					
						
							|  |  |  | 				avg > 0 | 
					
						
							|  |  |  | 					&& remaining.setMilliseconds( | 
					
						
							|  |  |  | 						avg  | 
					
						
							| 
									
										
										
										
											2020-12-22 18:48:00 +03:00
										 |  |  | 							* (max-value)  | 
					
						
							|  |  |  | 							// make the estimate a bit pessimistic...
 | 
					
						
							|  |  |  | 							* 1.3) | 
					
						
							| 
									
										
										
										
											2020-12-22 18:25:14 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-09 02:19:43 +03:00
										 |  |  | 				// update not due yet...
 | 
					
						
							|  |  |  | 				if('timeout' in cache){ | 
					
						
							|  |  |  | 					cache.update = true | 
					
						
							| 
									
										
										
										
											2020-11-23 03:08:47 +03:00
										 |  |  | 					return } | 
					
						
							| 
									
										
										
										
											2020-07-09 02:19:43 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				// set next update point and continue...
 | 
					
						
							| 
									
										
										
										
											2020-11-23 03:08:47 +03:00
										 |  |  | 				delete cache.update | 
					
						
							|  |  |  | 				cache.timeout = setTimeout( | 
					
						
							|  |  |  | 					function(){ | 
					
						
							|  |  |  | 						var cache = that.__progress_cache[text] || {} | 
					
						
							|  |  |  | 						delete cache.timeout | 
					
						
							|  |  |  | 						cache.update | 
					
						
							|  |  |  | 							&& that.showProgress(text) },  | 
					
						
							|  |  |  | 					this.config['progress-update-min'] || 200) } | 
					
						
							| 
									
										
										
										
											2020-07-09 02:19:43 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-04 23:00:34 +03:00
										 |  |  | 			// container...
 | 
					
						
							|  |  |  | 			var container = viewer.find('.progress-container') | 
					
						
							|  |  |  | 			container = container.length == 0 ? | 
					
						
							|  |  |  | 				$('<div/>') | 
					
						
							|  |  |  | 					.addClass('progress-container') | 
					
						
							|  |  |  | 					.appendTo(viewer) | 
					
						
							|  |  |  | 				: container | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			// widget...
 | 
					
						
							|  |  |  | 			var widget = container.find('.progress-bar[name="'+text+'"]') | 
					
						
							| 
									
										
										
										
											2020-11-21 04:15:33 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-04 23:00:34 +03:00
										 |  |  | 			// close action...
 | 
					
						
							|  |  |  | 			if(value == 'close'){ | 
					
						
							|  |  |  | 				widget.trigger('progressClose') | 
					
						
							| 
									
										
										
										
											2020-07-09 02:19:43 +03:00
										 |  |  | 				return } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-21 04:15:33 +03:00
										 |  |  | 			// create if not done yet...
 | 
					
						
							| 
									
										
										
										
											2016-11-04 23:00:34 +03:00
										 |  |  | 			widget = widget.length == 0 ? | 
					
						
							|  |  |  | 				$('<div/>') | 
					
						
							|  |  |  | 					.addClass('progress-bar') | 
					
						
							| 
									
										
										
										
											2020-12-06 05:34:28 +03:00
										 |  |  | 					.css({ | 
					
						
							|  |  |  | 						display: 'none', | 
					
						
							|  |  |  | 					}) | 
					
						
							| 
									
										
										
										
											2016-11-04 23:00:34 +03:00
										 |  |  | 					.attr('name', text) | 
					
						
							|  |  |  | 					.text(text) | 
					
						
							|  |  |  | 					// close button...
 | 
					
						
							|  |  |  | 					.append($('<span class="close">×</span>') | 
					
						
							| 
									
										
										
										
											2020-11-05 22:46:27 +03:00
										 |  |  | 						.on('click', function(){  | 
					
						
							|  |  |  | 							var cache = (that.__progress_cache || {})[text] | 
					
						
							|  |  |  | 							cache.onclose | 
					
						
							|  |  |  | 								&& cache.onclose()  | 
					
						
							|  |  |  | 							widget.trigger('progressClose') })) | 
					
						
							| 
									
										
										
										
											2016-11-04 23:00:34 +03:00
										 |  |  | 					// state...
 | 
					
						
							|  |  |  | 					.append($('<span/>') | 
					
						
							|  |  |  | 						.addClass('progress-details')) | 
					
						
							|  |  |  | 					// bar...
 | 
					
						
							|  |  |  | 					.append($('<progress/>')) | 
					
						
							|  |  |  | 					// events...
 | 
					
						
							|  |  |  | 					.on('progressClose', function(){  | 
					
						
							| 
									
										
										
										
											2020-12-06 05:34:28 +03:00
										 |  |  | 						var elem = $(this) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						var clear = function(){ | 
					
						
							|  |  |  | 							var cache = (that.__progress_cache || {})[text] | 
					
						
							|  |  |  | 							cache.timeout  | 
					
						
							|  |  |  | 								&& clearTimeout(cache.timeout) | 
					
						
							|  |  |  | 							cache.ondone | 
					
						
							|  |  |  | 								&& cache.ondone() | 
					
						
							|  |  |  | 							// clear cache...
 | 
					
						
							|  |  |  | 							delete (that.__progress_cache || {})[text] | 
					
						
							|  |  |  | 							elem.remove() } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						// widget was not shown...
 | 
					
						
							|  |  |  | 						if(elem.attr('closing') == null | 
					
						
							|  |  |  | 								|| elem.css('display') == 'none'){ | 
					
						
							|  |  |  | 							clear() | 
					
						
							|  |  |  | 						// fade...
 | 
					
						
							|  |  |  | 						} else { | 
					
						
							|  |  |  | 							elem[0].setAttribute('closing', '')  | 
					
						
							|  |  |  | 							elem	 | 
					
						
							|  |  |  | 								.fadeOut( | 
					
						
							|  |  |  | 									that.config['progress-fade-duration'] || 200,  | 
					
						
							|  |  |  | 									clear) } | 
					
						
							| 
									
										
										
										
											2020-11-23 03:08:47 +03:00
										 |  |  | 						widget = null }) | 
					
						
							| 
									
										
										
										
											2016-11-04 23:00:34 +03:00
										 |  |  | 					.appendTo(container) | 
					
						
							|  |  |  | 				: widget | 
					
						
							| 
									
										
										
										
											2020-12-06 05:34:28 +03:00
										 |  |  | 					.removeAttr('closing') | 
					
						
							| 
									
										
										
										
											2016-11-04 23:00:34 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			// reset closing timeout...
 | 
					
						
							|  |  |  | 			var timeout = widget.attr('close-timeout') | 
					
						
							| 
									
										
										
										
											2020-11-23 03:08:47 +03:00
										 |  |  | 			timeout  | 
					
						
							|  |  |  | 				&& clearTimeout(JSON.parse(timeout)) | 
					
						
							| 
									
										
										
										
											2016-11-04 23:00:34 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-22 18:25:14 +03:00
										 |  |  | 			// time remaining...
 | 
					
						
							| 
									
										
										
										
											2020-12-22 18:48:00 +03:00
										 |  |  | 			// NOTE: we show hours only if > 0...
 | 
					
						
							|  |  |  | 			var t = (remaining && remaining.valueOf()) ? | 
					
						
							|  |  |  | 				` / -${  | 
					
						
							| 
									
										
										
										
											2020-12-22 18:25:14 +03:00
										 |  |  | 					remaining.toISOString() | 
					
						
							|  |  |  | 						.substr(11, 8) | 
					
						
							| 
									
										
										
										
											2020-12-23 00:01:09 +03:00
										 |  |  | 						.replace(/^00:(00:)?/, '') }s`
 | 
					
						
							| 
									
										
										
										
											2020-12-22 18:25:14 +03:00
										 |  |  | 				: '' | 
					
						
							| 
									
										
										
										
											2016-11-04 23:00:34 +03:00
										 |  |  | 			// format the message...
 | 
					
						
							| 
									
										
										
										
											2020-12-26 19:04:47 +03:00
										 |  |  | 			msg = msg ?  | 
					
						
							|  |  |  | 				': '+msg  | 
					
						
							|  |  |  | 				: '' | 
					
						
							| 
									
										
										
										
											2016-11-04 23:00:34 +03:00
										 |  |  | 			msg = ' '+ msg  | 
					
						
							| 
									
										
										
										
											2020-12-06 19:09:06 +03:00
										 |  |  | 				+ (value && value >= (max || 0) ?  | 
					
						
							|  |  |  | 						' (done)'  | 
					
						
							|  |  |  | 					: max && value != max ?  | 
					
						
							| 
									
										
										
										
											2020-12-22 18:25:14 +03:00
										 |  |  | 						` (${value || 0} of ${max}${t})` | 
					
						
							| 
									
										
										
										
											2016-11-04 23:00:34 +03:00
										 |  |  | 					: '...') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			// update widget...
 | 
					
						
							| 
									
										
										
										
											2020-12-06 19:09:06 +03:00
										 |  |  | 			reset ? | 
					
						
							|  |  |  | 				// NOTE: on reset we show the progress bar full...
 | 
					
						
							|  |  |  | 				widget.find('progress') | 
					
						
							|  |  |  | 					.attr({ value: 1, max: 1 }) | 
					
						
							|  |  |  | 				: widget.find('progress') | 
					
						
							|  |  |  | 					.attr({ | 
					
						
							|  |  |  | 						value: (value || ''), | 
					
						
							|  |  |  | 						max: (max || ''), | 
					
						
							|  |  |  | 					}) | 
					
						
							| 
									
										
										
										
											2020-11-23 03:08:47 +03:00
										 |  |  | 			widget.find('.progress-details') | 
					
						
							|  |  |  | 				.text(msg) | 
					
						
							| 
									
										
										
										
											2016-11-04 23:00:34 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-06 05:34:28 +03:00
										 |  |  | 			// auto-show...
 | 
					
						
							| 
									
										
										
										
											2020-12-06 19:09:06 +03:00
										 |  |  | 			if(forceShow  | 
					
						
							|  |  |  | 					|| max > 1  | 
					
						
							| 
									
										
										
										
											2020-12-06 05:34:28 +03:00
										 |  |  | 					|| !this.config['progress-pre-delay']){ | 
					
						
							|  |  |  | 				widget.css({display: ''})  | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				setTimeout( | 
					
						
							|  |  |  | 					function(){  | 
					
						
							|  |  |  | 						widget | 
					
						
							|  |  |  | 							&& widget.attr('closing') == undefined | 
					
						
							|  |  |  | 							&& widget.css({display: ''}) },  | 
					
						
							|  |  |  | 					this.config['progress-pre-delay'] || 1000) } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-04 23:00:34 +03:00
										 |  |  | 			// auto-close...
 | 
					
						
							| 
									
										
										
										
											2020-12-04 06:48:59 +03:00
										 |  |  | 			if(value != null && value >= (max || 0)){ | 
					
						
							| 
									
										
										
										
											2016-11-04 23:00:34 +03:00
										 |  |  | 				widget.attr('close-timeout',  | 
					
						
							| 
									
										
										
										
											2020-11-23 03:08:47 +03:00
										 |  |  | 					JSON.stringify(setTimeout( | 
					
						
							|  |  |  | 						function(){  | 
					
						
							| 
									
										
										
										
											2020-12-06 05:34:28 +03:00
										 |  |  | 							if(widget){ | 
					
						
							|  |  |  | 								widget.trigger('progressClose') } },  | 
					
						
							| 
									
										
										
										
											2020-11-23 03:08:47 +03:00
										 |  |  | 						this.config['progress-done-delay'] || 1000))) } }], | 
					
						
							| 
									
										
										
										
											2020-04-10 19:10:21 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// handle logger progress...
 | 
					
						
							|  |  |  | 	handleLogItem: ['- System/', | 
					
						
							| 
									
										
										
										
											2020-11-05 22:46:27 +03:00
										 |  |  | 		function(logger, path, status, ...rest){ | 
					
						
							| 
									
										
										
										
											2020-07-09 02:19:43 +03:00
										 |  |  | 			var msg = path.join(': ') | 
					
						
							|  |  |  | 			var l = (rest.length == 1 && rest[0] instanceof Array) ? | 
					
						
							|  |  |  | 				rest[0].length | 
					
						
							|  |  |  | 				: rest.length | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-23 03:08:47 +03:00
										 |  |  | 			// only pass the relevant stuff...
 | 
					
						
							|  |  |  | 			var attrs = {} | 
					
						
							|  |  |  | 			logger.ondone  | 
					
						
							|  |  |  | 				&& (attrs.ondone = logger.ondone) | 
					
						
							|  |  |  | 			logger.onclose  | 
					
						
							|  |  |  | 				&& (attrs.onclose = logger.onclose) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-21 01:48:57 +03:00
										 |  |  | 			// get keywords...
 | 
					
						
							| 
									
										
										
										
											2020-12-04 06:48:59 +03:00
										 |  |  | 			var {add, done, skip, reset, close, error} =  | 
					
						
							| 
									
										
										
										
											2020-11-21 04:15:33 +03:00
										 |  |  | 				this.config['progress-logger-keywords']  | 
					
						
							| 
									
										
										
										
											2020-11-21 01:48:57 +03:00
										 |  |  | 				|| {} | 
					
						
							| 
									
										
										
										
											2020-11-21 04:15:33 +03:00
										 |  |  | 			// setup default aliases...
 | 
					
						
							| 
									
										
										
										
											2020-11-21 01:48:57 +03:00
										 |  |  | 			add = new Set([...(add || []), 'added']) | 
					
						
							|  |  |  | 			done = new Set([...(done || [])]) | 
					
						
							|  |  |  | 			skip = new Set([...(skip || []), 'skipped']) | 
					
						
							| 
									
										
										
										
											2020-12-04 06:48:59 +03:00
										 |  |  | 			reset = new Set([...(reset || [])]) | 
					
						
							| 
									
										
										
										
											2020-11-21 01:48:57 +03:00
										 |  |  | 			close = new Set([...(close || []), 'closed']) | 
					
						
							|  |  |  | 			error = new Set([...(error || [])]) | 
					
						
							| 
									
										
										
										
											2020-04-10 19:10:21 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-10 04:07:45 +03:00
										 |  |  | 			// close...
 | 
					
						
							| 
									
										
										
										
											2020-11-21 01:48:57 +03:00
										 |  |  | 			if(status == 'close' || close.has(status)){ | 
					
						
							| 
									
										
										
										
											2020-11-23 03:08:47 +03:00
										 |  |  | 				this.showProgress(path, 'close', attrs) | 
					
						
							| 
									
										
										
										
											2020-12-04 06:48:59 +03:00
										 |  |  | 			// reset...
 | 
					
						
							|  |  |  | 			} else if(status == 'reset' || reset.has(status)){ | 
					
						
							| 
									
										
										
										
											2020-12-06 19:09:06 +03:00
										 |  |  | 				this.showProgress(path, 'reset', attrs) | 
					
						
							| 
									
										
										
										
											2020-11-21 01:48:57 +03:00
										 |  |  | 			// added new item -- increase max...
 | 
					
						
							| 
									
										
										
										
											2020-11-23 03:08:47 +03:00
										 |  |  | 			// XXX show msg in the progress bar???
 | 
					
						
							| 
									
										
										
										
											2020-11-21 01:48:57 +03:00
										 |  |  | 			} else if(status == 'add' || add.has(status)){ | 
					
						
							| 
									
										
										
										
											2020-11-23 03:08:47 +03:00
										 |  |  | 				this.showProgress(path, '+0', '+'+l, attrs) | 
					
						
							| 
									
										
										
										
											2020-11-21 01:48:57 +03:00
										 |  |  | 			// resolved item -- increase done... 
 | 
					
						
							|  |  |  | 			} else if(status == 'done' || done.has(status)){ | 
					
						
							| 
									
										
										
										
											2020-11-23 03:08:47 +03:00
										 |  |  | 				this.showProgress(path, '+'+l, attrs) | 
					
						
							| 
									
										
										
										
											2020-11-21 01:48:57 +03:00
										 |  |  | 			// skipped item -- increase done... 
 | 
					
						
							|  |  |  | 			// XXX should we instead decrease max here???
 | 
					
						
							|  |  |  | 			// 		...if not this is the same as done -- merge...
 | 
					
						
							|  |  |  | 			} else if(status == 'skip' || skip.has(status)){ | 
					
						
							| 
									
										
										
										
											2020-11-23 03:08:47 +03:00
										 |  |  | 				this.showProgress(path, '+'+l, attrs) | 
					
						
							| 
									
										
										
										
											2020-11-21 01:48:57 +03:00
										 |  |  | 			// error...
 | 
					
						
							| 
									
										
										
										
											2020-04-10 19:10:21 +03:00
										 |  |  | 			// XXX STUB...
 | 
					
						
							| 
									
										
										
										
											2020-11-21 01:48:57 +03:00
										 |  |  | 			} else if(status == 'error' || error.has(status)){ | 
					
						
							| 
									
										
										
										
											2020-11-23 03:08:47 +03:00
										 |  |  | 				this.showProgress(['Error'].concat(msg), '+0', '+'+l, attrs) } | 
					
						
							| 
									
										
										
										
											2020-04-10 19:10:21 +03:00
										 |  |  | 		}], | 
					
						
							| 
									
										
										
										
											2016-11-04 23:00:34 +03:00
										 |  |  | }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var Progress =  | 
					
						
							|  |  |  | module.Progress = core.ImageGridFeatures.Feature({ | 
					
						
							|  |  |  | 	title: '', | 
					
						
							|  |  |  | 	doc: '', | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	tag: 'ui-progress', | 
					
						
							|  |  |  | 	depends: [ | 
					
						
							|  |  |  | 		'ui', | 
					
						
							|  |  |  | 	], | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	actions: ProgressActions,  | 
					
						
							|  |  |  | }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /********************************************************************** | 
					
						
							|  |  |  | * vim:set ts=4 sw=4 :                               */ return module }) |