/**
* Panel is the basic element for navigation. Which defines Six basic
* functions: show, hide, beforeShow, beforeHide, init, and uninit for
* navigation. These functions are called by `SettingsService` during the
* navigation.
* Internal functions onShow, onHide, onBeforeShow, onBeforeHide, onInit,
* and onUninit are called respectively in the basic functions.
*
* @module Panel
*/
define(function() {
'use strict';
var _emptyFunc = function panel_emptyFunc() {};
/**
* @alias module:Panel
* @param {Object} options
* Options are used to override the internal functions.
* @returns {Panel}
*/
var Panel = function ctor_panel(options) {
var _initialized = false;
options = options || {};
options.onInit = options.onInit || _emptyFunc;
options.onUninit = options.onUninit || _emptyFunc;
options.onShow = options.onShow || _emptyFunc;
options.onHide = options.onHide || _emptyFunc;
options.onBeforeShow = options.onBeforeShow || _emptyFunc;
options.onBeforeHide = options.onBeforeHide || _emptyFunc;
return {
/**
* Get a value that indicates whether the panel has been initialized.
*
* @alias module:Panel#initialized
* @return {Boolean}
*/
get initialized() {
return _initialized;
},
/**
* Called at the first time when the beforeShow function is called.
*
* @alias module:Panel#init
* @param {HTMLElement} panel
* @param {Object} initOptions
*/
init: function(panel, initOptions) {
if (_initialized) {
return;
}
_initialized = true;
return options.onInit(panel, initOptions);
},
/**
* Called when cleanup.
*
* @alias module:Panel#uninit
*/
uninit: function() {
if (!_initialized) {
return;
}
_initialized = false;
options.onUninit();
},
/**
* Called when the panel is navigated into the viewport.
*
* @alias module:Panel#show
* @param {HTMLElement} panel
* @param {Object} showOptions
*/
show: function(panel, showOptions) {
// Initialize at the first call to show if necessary.
return Promise.resolve(this.init(panel, showOptions)).then(function() {
return options.onShow(panel, showOptions);
});
},
/**
* Called when the panel is navigated out of the viewport.
*
* @alias module:Panel#hide
*/
hide: function() {
return options.onHide();
},
/**
* Called when the panel is about to be navigated to into the viewport.
*
* @alias module:Panel#beforeShow
* @param {HTMLElement} panel
* @param {Object} beforeShowOptions
*/
beforeShow: function(panel, beforeShowOptions) {
// Initialize at the first call to beforeShow.
return Promise.resolve(this.init(panel, beforeShowOptions)).then(
function() {
return options.onBeforeShow(panel, beforeShowOptions);
});
},
/**
* Called when the panel is about to be navigated out of the viewport.
*
* @alias module:Panel#beforeHide
* @param {HTMLElement} panel
* @param {Object} beforeShowOptions
*/
beforeHide: function() {
return options.onBeforeHide();
}
};
};
return Panel;
});