/**
* Progress module.
*
* @module progress
*/
import events from './event';
/**
* Maintains progress state of user traversing through form, using
* currently focused input or the last changed input as the indicator for the current location.
*/
export default {
/**
* @type {number}
*/
status: 0,
/**
* @type {Element}
*/
lastChanged: null,
/**
* @type {Array<Element>}
*/
all: null,
/**
* Updates total
*/
updateTotal() {
this.all = [ ...this.form.view.html.querySelectorAll( '.question:not(.disabled):not(.or-appearance-comment):not(.or-appearance-dn):not(.readonly)' ) ]
.filter( question => !question.closest( '.disabled' ) );
},
/**
* Updates rounded % value of progress and triggers event if changed.
*
* @param {Element} el - the element that represent the current state of progress
*/
update( el ) {
let status;
if ( !this.all || !el ) {
this.updateTotal();
}
this.lastChanged = el || this.lastChanged;
if ( this.lastChanged ) {
status = Math.round( ( ( this.all.indexOf( this.lastChanged.closest( '.question' ) ) + 1 ) * 100 ) / this.all.length );
}
// if the current el was removed (inside removed repeat), the status will be 0 - leave unchanged
if ( status > 0 && status !== this.status ) {
this.status = status;
this.form.view.html.dispatchEvent( events.ProgressUpdate( status ) );
}
},
/**
* @return {string} status
*/
get() {
return this.status;
}
};