com.phloxui
Version:
PhloxUI Ng2+ Framework
881 lines (880 loc) • 68.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Component, ViewChild } from '@angular/core';
import { Router } from '@angular/router';
import { PhloxAppInfoService } from '../service/PhloxAppInfoService.service';
import { PhloxAppService } from '../service/PhloxAppService.service';
import { ObservableManager } from '../service/ObservableManager.service';
import { NeedFocusService } from '../service/NeedFocusService.service';
import { DialogService } from '../service/DialogService.service';
import { BackgroundProcessManager } from '../service/BackgroundProcessManager.service';
import { AbstractNavLeftLayout } from './AbstractNavLeftLayout';
import { MaterialBarLoader } from '../theme/material/component/MaterialBarLoader.component';
var /** @type {?} */ TYPE_NAME = "phx-app";
/**
* <p style="text-indent: 2em;">
* A main bootstrap component class for <code>PhloxUI</code> application. This class implements the [[INavigator]] interface having pages ([[AbstractPage]])
* as <code>navigatee</code> items ([[INavigatee]]). An <code>application</code> may consist of various pages, for example, it may have a login page to allow the user to
* login, once the user is logged on, it will navigate the user to the main page, etc.
* </p>
*
* @author shiorin, tee4cute
*/
var PhloxApp = /** @class */ (function () {
function PhloxApp(router, appInfoService, appSvc, observableMgr, needFocusService, dialogService, bgProcessMgr) {
var _this = this;
this.curRouterLoading = {
"path": null,
"resolve": null,
"reject": null
};
this.pages = [];
this.router = router;
this.appInfoService = appInfoService;
this.observableMgr = observableMgr;
this.needFocusService = needFocusService;
this.reloadAppInfo();
this.dialogService = dialogService;
this.bgProcessMgr = bgProcessMgr;
this._showLoader = false;
// Set app instance to PhloxAppService to allow others to access this instance.
appSvc.setInstance(this);
// init dialog service
this.dialogService.init(this);
this.observableMgr.subscribe(BackgroundProcessManager.PROCESS_START_TOPIC_NAME, function (startBGProcess) {
if (startBGProcess.type === 'connection.page') {
_this.runPageLoader();
}
});
this.observableMgr.subscribe(BackgroundProcessManager.PROCESS_END_TOPIC_NAME, function (endBGProcess) {
if (endBGProcess.type === 'connection.page') {
if (_this.bgProcessMgr.getRunningProcessesCount('connection.page', null) <= 0) {
_this.stopPageLoader();
}
}
});
this.observableMgr.subscribe(BackgroundProcessManager.PROCESS_ERROR_TOPIC_NAME, function (errorBGProcess) {
if (errorBGProcess.type === 'connection.page') {
if (_this.bgProcessMgr.getRunningProcessesCount('connection.page', null) <= 0) {
_this.stopPageLoader();
}
}
});
}
/**
* @return {?}
*/
PhloxApp.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this.observableMgr.subscribe(AbstractNavLeftLayout.FIXED_CHANGE_TOPIC_NAME, function (layout) {
console.log('Nav left "' + layout.getSubTopicName() + '" fixed: ' + layout.fixed);
});
this.observableMgr.subscribe(AbstractNavLeftLayout.TOGGLED_CHANGE_TOPIC_NAME, function (layout) {
console.log('Nav left "' + layout.getSubTopicName() + '" toggled: ' + layout.toggled);
});
// fixed=false, toggled=true
setTimeout(function () {
_this.observableMgr.publish(AbstractNavLeftLayout.TOGGLED_CMD_TOPIC_NAME, true);
}, 1500);
// fixed=false, toggled=false
setTimeout(function () {
_this.observableMgr.publish(AbstractNavLeftLayout.TOGGLED_CMD_TOPIC_NAME, false);
}, 3000);
// fixed=true, toggled=false
setTimeout(function () {
_this.observableMgr.publish(AbstractNavLeftLayout.FIXED_CMD_TOPIC_NAME, true);
}, 3500);
// fixed=true, toggled=true
setTimeout(function () {
_this.observableMgr.publish(AbstractNavLeftLayout.TOGGLED_CMD_TOPIC_NAME, true);
}, 4500);
// fixed=true, toggled=false
setTimeout(function () {
_this.observableMgr.publish(AbstractNavLeftLayout.TOGGLED_CMD_TOPIC_NAME, false);
}, 6000);
// fixed=false, toggled=false
setTimeout(function () {
_this.observableMgr.publish(AbstractNavLeftLayout.FIXED_CMD_TOPIC_NAME, false);
}, 6500);
};
/**
* @return {?}
*/
PhloxApp.prototype.isShowLoader = /**
* @return {?}
*/
function () {
return this._showLoader;
};
/**
* <p style="text-indent: 1em;">
* Get app info of currently opened <code>application</code>.
* </p>
* @return {?}
*/
PhloxApp.prototype.getAppInfo = /**
* <p style="text-indent: 1em;">
* Get app info of currently opened <code>application</code>.
* </p>
* @return {?}
*/
function () {
return this.appInfo;
};
/**
* <p style="text-indent: 1em;">
* Reload the app info from <code>PhloxAppInfoService</code>.
* </p>
* @return {?}
*/
PhloxApp.prototype.reloadAppInfo = /**
* <p style="text-indent: 1em;">
* Reload the app info from <code>PhloxAppInfoService</code>.
* </p>
* @return {?}
*/
function () {
var _this = this;
return this.appInfoService.reload().then(function (result) {
_this.appInfo = result;
return Promise.resolve(_this.appInfo);
});
};
/**
* @return {?}
*/
PhloxApp.prototype.getRouter = /**
* @return {?}
*/
function () {
return this.router;
};
/**
* <p style="text-indent: 1em;">
* Get all available <code>pages</code> ([[AbstractPage]]) in this <code>application</code>.
* </p>
*
* @see [[INavigator.getItems]]
* @return {?}
*/
PhloxApp.prototype.getItems = /**
* <p style="text-indent: 1em;">
* Get all available <code>pages</code> ([[AbstractPage]]) in this <code>application</code>.
* </p>
*
* @see [[INavigator.getItems]]
* @return {?}
*/
function () {
return this.pages;
};
/**
* <p style="text-indent: 1em;">
* Get all available <code>page</code> count ([[AbstractPage]]) in this <code>application</code>.
* </p>
*
* @see [[INavigator.getItemCount]]
* @return {?}
*/
PhloxApp.prototype.getItemCount = /**
* <p style="text-indent: 1em;">
* Get all available <code>page</code> count ([[AbstractPage]]) in this <code>application</code>.
* </p>
*
* @see [[INavigator.getItemCount]]
* @return {?}
*/
function () {
return this.pages.length;
};
/**
* <p style="text-indent: 1em;">
* Get current active <code>page</code> ([[AbstractPage]]) index in the array returned from [[getItems]] method.
* </p>
*
* @see [[INavigator.getActiveIndex]]
* @return {?} Returns <code>-1</code> if there is no current active <code>page</code>.
*/
PhloxApp.prototype.getActiveIndex = /**
* <p style="text-indent: 1em;">
* Get current active <code>page</code> ([[AbstractPage]]) index in the array returned from [[getItems]] method.
* </p>
*
* @see [[INavigator.getActiveIndex]]
* @return {?} Returns <code>-1</code> if there is no current active <code>page</code>.
*/
function () {
for (var /** @type {?} */ i = 0; i < this.pages.length; i++) {
if (this.pages[i].isActive()) {
return i;
}
}
return -1;
};
/**
* <p style="text-indent: 1em;">
* Get current active <code>page</code> ([[AbstractPage]]) object instance.
* </p>
*
* @see [[INavigator.getActiveItem]]
* @return {?} Returns <code>null</code> if there is no current active <code>page</code>.
*/
PhloxApp.prototype.getActiveItem = /**
* <p style="text-indent: 1em;">
* Get current active <code>page</code> ([[AbstractPage]]) object instance.
* </p>
*
* @see [[INavigator.getActiveItem]]
* @return {?} Returns <code>null</code> if there is no current active <code>page</code>.
*/
function () {
var /** @type {?} */ idx = this.getActiveIndex();
if (idx < 0) {
return null;
}
return this.pages[idx];
};
/**
* <p style="text-indent: 1em;">
* An implementation of [[INavigator.setItems]] method. Please see the documentation of super class or super interface for more details.
* </p>
*
* @see [[INavigator.setItems]]
* @param {?} items
* @return {?}
*/
PhloxApp.prototype.setItems = /**
* <p style="text-indent: 1em;">
* An implementation of [[INavigator.setItems]] method. Please see the documentation of super class or super interface for more details.
* </p>
*
* @see [[INavigator.setItems]]
* @param {?} items
* @return {?}
*/
function (items) {
this.pages = items;
};
/**
* <p style="text-indent: 1em;">
* Add a new <code>page</code> ([[AbstractPage]]) into this <code>application</code>. If the <code>page</code> (<code><b>item</b></code>) being added is the
* first <code>page</code> of this <code>application</code>, this method will automatically show the given <code>page</code> and set its <code>active</code>
* flag to <code>true</code>.
* </p>
*
* @see [[INavigator.addItem]]
* @param {?} item
* @return {?}
*/
PhloxApp.prototype.addItem = /**
* <p style="text-indent: 1em;">
* Add a new <code>page</code> ([[AbstractPage]]) into this <code>application</code>. If the <code>page</code> (<code><b>item</b></code>) being added is the
* first <code>page</code> of this <code>application</code>, this method will automatically show the given <code>page</code> and set its <code>active</code>
* flag to <code>true</code>.
* </p>
*
* @see [[INavigator.addItem]]
* @param {?} item
* @return {?}
*/
function (item) {
if (this.containsItem(item)) {
return false;
}
this.pages.push(item);
if (this.pages.length === 1) {
// This is the first one. So, it should be active!
item.active = true;
}
return true;
};
/**
* <p style="text-indent: 1em;">
* Remove the given <code>page</code> ([[AbstractPage]]) from this <code>application</code>. If the <code>page</code> (<code><b>item</b></code>) being removed is
* currently active, this method will automatically unset its <code>active</code> flag and show the first <code>page</code> (if available) in the array returned from
* [[getItems]] method instead.
* </p>
*
* @see [[INavigator.removeItem]]
* @param {?} item
* @return {?}
*/
PhloxApp.prototype.removeItem = /**
* <p style="text-indent: 1em;">
* Remove the given <code>page</code> ([[AbstractPage]]) from this <code>application</code>. If the <code>page</code> (<code><b>item</b></code>) being removed is
* currently active, this method will automatically unset its <code>active</code> flag and show the first <code>page</code> (if available) in the array returned from
* [[getItems]] method instead.
* </p>
*
* @see [[INavigator.removeItem]]
* @param {?} item
* @return {?}
*/
function (item) {
var /** @type {?} */ idx = this.pages.indexOf(item);
if (idx < 0) {
return false;
}
this.pages = this.pages.slice(idx, 1);
if (item.active) {
// Set page active to false.
item.active = false;
// If it is currently active page, we've to navigate to another one.
this.navigateToIndex(0);
}
return true;
};
/**
* <p style="text-indent: 1em;">
* An implementation of [[INavigator.containsItem]] method. Please see the documentation of super class or super interface for more details.
* </p>
*
* @see [[INavigator.containsItem]]
* @param {?} item
* @return {?}
*/
PhloxApp.prototype.containsItem = /**
* <p style="text-indent: 1em;">
* An implementation of [[INavigator.containsItem]] method. Please see the documentation of super class or super interface for more details.
* </p>
*
* @see [[INavigator.containsItem]]
* @param {?} item
* @return {?}
*/
function (item) {
return this.pages.indexOf(item) >= 0;
};
/**
* <p style="text-indent: 1em;">
* An implementation of [[INavigator.getItemByIndex]] method. Please see the documentation of super class or super interface for more details.
* </p>
*
* @see [[INavigator.getItemByIndex]]
* @param {?} idx
* @return {?}
*/
PhloxApp.prototype.getItemByIndex = /**
* <p style="text-indent: 1em;">
* An implementation of [[INavigator.getItemByIndex]] method. Please see the documentation of super class or super interface for more details.
* </p>
*
* @see [[INavigator.getItemByIndex]]
* @param {?} idx
* @return {?}
*/
function (idx) {
if (idx < 0 || idx >= this.pages.length) {
return null;
}
return this.pages[idx];
};
/**
* <p style="text-indent: 1em;">
* An implementation of [[INavigator.getItemByName]] method. Please see the documentation of super class or super interface for more details.
* </p>
*
* @see [[INavigator.getItemByName]]
* @param {?} name
* @return {?}
*/
PhloxApp.prototype.getItemByName = /**
* <p style="text-indent: 1em;">
* An implementation of [[INavigator.getItemByName]] method. Please see the documentation of super class or super interface for more details.
* </p>
*
* @see [[INavigator.getItemByName]]
* @param {?} name
* @return {?}
*/
function (name) {
var /** @type {?} */ idx = this.getItemIndexByName(name);
if (idx < 0) {
return null;
}
return this.pages[idx];
};
/**
* <p style="text-indent: 1em;">
* An implementation of [[INavigator.getItemIndex]] method. Please see the documentation of super class or super interface for more details.
* </p>
*
* @see [[INavigator.getItemIndex]]
* @param {?} item
* @return {?}
*/
PhloxApp.prototype.getItemIndex = /**
* <p style="text-indent: 1em;">
* An implementation of [[INavigator.getItemIndex]] method. Please see the documentation of super class or super interface for more details.
* </p>
*
* @see [[INavigator.getItemIndex]]
* @param {?} item
* @return {?}
*/
function (item) {
return this.pages.indexOf(item);
};
/**
* <p style="text-indent: 1em;">
* An implementation of [[INavigator.getItemIndexByName]] method. Please see the documentation of super class or super interface for more details.
* </p>
*
* @see [[INavigator.getItemIndexByName]]
* @param {?} name
* @return {?}
*/
PhloxApp.prototype.getItemIndexByName = /**
* <p style="text-indent: 1em;">
* An implementation of [[INavigator.getItemIndexByName]] method. Please see the documentation of super class or super interface for more details.
* </p>
*
* @see [[INavigator.getItemIndexByName]]
* @param {?} name
* @return {?}
*/
function (name) {
for (var /** @type {?} */ i = 0; i < this.pages.length; i++) {
if (this.pages[i].getName() === name) {
return i;
}
}
return -1;
};
/**
* <p style="text-indent: 1em;">
* An alias method of [[navigateToName]] passing <code>page</code>'s name ([[AbstractPage.getName]]) as a parameter.
* </p>
*
* @see [[INavigator.navigateTo]]
* @see [[navigateToName]]
* @param {?} item
* @param {?=} options
* @return {?}
*/
PhloxApp.prototype.navigateTo = /**
* <p style="text-indent: 1em;">
* An alias method of [[navigateToName]] passing <code>page</code>'s name ([[AbstractPage.getName]]) as a parameter.
* </p>
*
* @see [[INavigator.navigateTo]]
* @see [[navigateToName]]
* @param {?} item
* @param {?=} options
* @return {?}
*/
function (item, options) {
return this.navigateToName(item.getName(), options);
};
/**
* <p style="text-indent: 1em;">
* An alias method of [[navigateTo]] passing <code>page</code> instance at the given index (<code><b>idx</b></code>) as a parameter.
* </p>
*
* @see [[INavigator.navigateToIndex]]
* @see [[navigateTo]]
* @param {?} idx
* @param {?=} options
* @return {?}
*/
PhloxApp.prototype.navigateToIndex = /**
* <p style="text-indent: 1em;">
* An alias method of [[navigateTo]] passing <code>page</code> instance at the given index (<code><b>idx</b></code>) as a parameter.
* </p>
*
* @see [[INavigator.navigateToIndex]]
* @see [[navigateTo]]
* @param {?} idx
* @param {?=} options
* @return {?}
*/
function (idx, options) {
var /** @type {?} */ page = this.getItemByIndex(idx);
if (page === null) {
return Promise.resolve(false);
}
return this.navigateTo(page, options);
};
/**
* <p style="text-indent: 1em;">
* Navigate this <code>application</code> to the given <code>page</code> <code><b>name</b></code>. The <code>page</code> name is also a
* <code>router</code>'s uri path specified in [[PHLOX_ROUTES]].
* </p>
*
* @see [[INavigator.navigateToName]]
* @see [[PHLOX_ROUTES]]
* @param {?} name
* @param {?=} options
* @return {?}
*/
PhloxApp.prototype.navigateToName = /**
* <p style="text-indent: 1em;">
* Navigate this <code>application</code> to the given <code>page</code> <code><b>name</b></code>. The <code>page</code> name is also a
* <code>router</code>'s uri path specified in [[PHLOX_ROUTES]].
* </p>
*
* @see [[INavigator.navigateToName]]
* @see [[PHLOX_ROUTES]]
* @param {?} name
* @param {?=} options
* @return {?}
*/
function (name, options) {
var _this = this;
var /** @type {?} */ link = name;
if (link === null || typeof link !== 'string') {
return Promise.resolve(false);
}
if (link.length <= 0) {
return Promise.resolve(false);
}
if (link.charAt(0) !== '/') {
link = '/' + link;
}
if (this.router.url === link) {
// Currently active
return Promise.resolve(false);
}
var /** @type {?} */ nav = [link];
if (options !== null && options !== undefined) {
nav.push(options);
}
// Navigate to specified link
return this.router.navigate(nav).then(function (success) {
if (success) {
var /** @type {?} */ curActive = _this.getActiveItem();
if (curActive !== null) {
// Set current page active to false
curActive.active = false;
}
var /** @type {?} */ newPage = _this.getItemByName(link.substring(1));
if (newPage !== null) {
newPage.active = true;
}
}
else {
console.warn('Could not navigate to "' + name + '".');
}
return Promise.resolve(success);
});
};
/**
* <p style="text-indent: 1em;">
* Try to navigate this <code>application</code> back to the first <code>page</code>.
* </p>
*
* @see [[INavigator.reset]]
* @return {?}
*/
PhloxApp.prototype.reset = /**
* <p style="text-indent: 1em;">
* Try to navigate this <code>application</code> back to the first <code>page</code>.
* </p>
*
* @see [[INavigator.reset]]
* @return {?}
*/
function () {
this.navigateToIndex(0);
};
/**
* <p style="text-indent: 1em;">
* A delegator method passing method call to <code>[[needFocusService]].setFocusingComponent()</code>.
* </p>
*
* @see [[NeedFocusService.setFocusingComponent]]
* @param {?} component
* @param {?=} event
* @return {?}
*/
PhloxApp.prototype.setFocusingComponent = /**
* <p style="text-indent: 1em;">
* A delegator method passing method call to <code>[[needFocusService]].setFocusingComponent()</code>.
* </p>
*
* @see [[NeedFocusService.setFocusingComponent]]
* @param {?} component
* @param {?=} event
* @return {?}
*/
function (component, event) {
this.needFocusService.setFocusingComponent(component, event);
};
/**
* <p style="text-indent: 1em;">
* A delegator method passing method call to <code>[[needFocusService]].getFocusingComponent()</code>.
* </p>
*
* @see [[NeedFocusService.getFocusingComponent]]
* @return {?}
*/
PhloxApp.prototype.getFocusingComponent = /**
* <p style="text-indent: 1em;">
* A delegator method passing method call to <code>[[needFocusService]].getFocusingComponent()</code>.
* </p>
*
* @see [[NeedFocusService.getFocusingComponent]]
* @return {?}
*/
function () {
return this.needFocusService.getFocusingComponent();
};
/**
* <p style="text-indent: 1em;">
* A delegator method passing method call to <code>[[needFocusService]].resetFocusingComponent()</code>.
* </p>
*
* @see [[NeedFocusService.resetFocusingComponent]]
* @param {?=} event
* @return {?}
*/
PhloxApp.prototype.resetFocusingComponent = /**
* <p style="text-indent: 1em;">
* A delegator method passing method call to <code>[[needFocusService]].resetFocusingComponent()</code>.
* </p>
*
* @see [[NeedFocusService.resetFocusingComponent]]
* @param {?=} event
* @return {?}
*/
function (event) {
this.needFocusService.resetFocusingComponent(event);
};
/**
* <p style="text-indent: 1em;">
* A delegator method passing method call to <code>[[phloxDialog]].hideDialog()</code>.
* </p>
*
* @see [[PhloxDialog.hideDialog]]
* @return {?}
*/
PhloxApp.prototype.hideDialog = /**
* <p style="text-indent: 1em;">
* A delegator method passing method call to <code>[[phloxDialog]].hideDialog()</code>.
* </p>
*
* @see [[PhloxDialog.hideDialog]]
* @return {?}
*/
function () {
if (this.phloxDialog != null) {
return this.phloxDialog.hideDialog();
}
};
/**
* <p style="text-indent: 1em;">
* A delegator method passing method call to <code>[[phloxDialog]].showConfirmDialog()</code>.
* </p>
*
* @see [[PhloxDialog.showConfirmDialog]]
* @param {?} title
* @param {?} message
* @param {?} showCancelBtn
* @param {?=} width
* @param {?=} height
* @return {?}
*/
PhloxApp.prototype.showConfirmDialog = /**
* <p style="text-indent: 1em;">
* A delegator method passing method call to <code>[[phloxDialog]].showConfirmDialog()</code>.
* </p>
*
* @see [[PhloxDialog.showConfirmDialog]]
* @param {?} title
* @param {?} message
* @param {?} showCancelBtn
* @param {?=} width
* @param {?=} height
* @return {?}
*/
function (title, message, showCancelBtn, width, height) {
if (this.phloxDialog != null) {
return this.phloxDialog.showConfirmDialog(title, message, showCancelBtn, width, height);
}
return new Promise(function (resolve, reject) {
reject('Could not find PhloxDialog instance.');
});
};
/**
* <p style="text-indent: 1em;">
* A delegator method passing method call to <code>[[phloxDialog]].showMessageDialog()</code>.
* </p>
*
* @see [[PhloxDialog.showMessageDialog]]
* @param {?} title
* @param {?} message
* @param {?=} width
* @param {?=} height
* @return {?}
*/
PhloxApp.prototype.showMessageDialog = /**
* <p style="text-indent: 1em;">
* A delegator method passing method call to <code>[[phloxDialog]].showMessageDialog()</code>.
* </p>
*
* @see [[PhloxDialog.showMessageDialog]]
* @param {?} title
* @param {?} message
* @param {?=} width
* @param {?=} height
* @return {?}
*/
function (title, message, width, height) {
if (this.phloxDialog != null) {
return this.phloxDialog.showMessageDialog(title, message, width, height);
}
return new Promise(function (resolve, reject) {
reject('Could not find PhloxDialog instance.');
});
};
/**
* <p style="text-indent: 1em;">
* A delegator method passing method call to <code>[[phloxDialog]].showComponentDialog()</code>.
* </p>
*
* @see [[PhloxDialog.showComponentDialog]]
* @param {?} componentDialogModel
* @return {?}
*/
PhloxApp.prototype.showComponentDialog = /**
* <p style="text-indent: 1em;">
* A delegator method passing method call to <code>[[phloxDialog]].showComponentDialog()</code>.
* </p>
*
* @see [[PhloxDialog.showComponentDialog]]
* @param {?} componentDialogModel
* @return {?}
*/
function (componentDialogModel) {
if (this.phloxDialog != null) {
return this.phloxDialog.showComponentDialog(componentDialogModel);
}
return new Promise(function (resolve, reject) {
reject('Could not find PhloxDialog instance.');
});
};
/**
* @return {?}
*/
PhloxApp.prototype.runPageLoader = /**
* @return {?}
*/
function () {
if (this.barloader === null || typeof this.barloader === 'undefined') {
return;
}
this._showLoader = true;
if (!this.barloader.isRunning()) {
this.barloader.start();
}
};
/**
* @return {?}
*/
PhloxApp.prototype.stopPageLoader = /**
* @return {?}
*/
function () {
if (this.barloader === null || typeof this.barloader === 'undefined') {
return;
}
this._showLoader = false;
if (this.barloader.isRunning()) {
this.barloader.stop();
}
};
PhloxApp.TYPE_NAME = TYPE_NAME;
PhloxApp.decorators = [
{ type: Component, args: [{
moduleId: module.id,
selector: 'phx-app',
template: "<div class=\"phlox-app-bar-container\" [class.show]=\"isShowLoader()\">\n <material-bar-loader #barloader></material-bar-loader>\n</div>\n<router-outlet></router-outlet>\n<phx-dialog #dialog></phx-dialog>\n"
},] },
];
/** @nocollapse */
PhloxApp.ctorParameters = function () { return [
{ type: Router, },
{ type: PhloxAppInfoService, },
{ type: PhloxAppService, },
{ type: ObservableManager, },
{ type: NeedFocusService, },
{ type: DialogService, },
{ type: BackgroundProcessManager, },
]; };
PhloxApp.propDecorators = {
"phloxDialog": [{ type: ViewChild, args: ['dialog',] },],
"barloader": [{ type: ViewChild, args: ["barloader",] },],
};
return PhloxApp;
}());
export { PhloxApp };
function PhloxApp_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
PhloxApp.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
PhloxApp.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
PhloxApp.propDecorators;
/** @type {?} */
PhloxApp.TYPE_NAME;
/**
* This field will be automatically injected by <code>ng</code>.
* @type {?}
*/
PhloxApp.prototype.appInfoService;
/**
* This field will be automatically injected by <code>ng</code>.
* @type {?}
*/
PhloxApp.prototype.observableMgr;
/**
* This field will be automatically injected by <code>ng</code>.
* @type {?}
*/
PhloxApp.prototype.needFocusService;
/**
* A field keeping cache for the last successfully loaded [[PhloxAppInfo]] from method [[reloadAppInfo]].
* @type {?}
*/
PhloxApp.prototype.appInfo;
/**
* An array keeping all <code>page</code>s of this <code>application</code>.
* @type {?}
*/
PhloxApp.prototype.pages;
/**
* This field will be automatically injected by <code>ng</code>.
* @type {?}
*/
PhloxApp.prototype.router;
/**
* This field will be automatically injected by <code>ng</code>.
* @type {?}
*/
PhloxApp.prototype.dialogService;
/**
* This field will be automatically injected by <code>ng</code>.
* @type {?}
*/
PhloxApp.prototype.bgProcessMgr;
/**
* A [[PhloxDialog]] child component instance of this component.
* @type {?}
*/
PhloxApp.prototype.phloxDialog;
/** @type {?} */
PhloxApp.prototype.barloader;
/** @type {?} */
PhloxApp.prototype._showLoader;
/** @type {?} */
PhloxApp.prototype.curRouterLoading;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGhsb3hBcHAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50L1BobG94QXBwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXpDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDakUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFJdkYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seURBQXlELENBQUM7QUFFNUYscUJBQU0sU0FBUyxHQUFXLFNBQVMsQ0FBQzs7Ozs7Ozs7Ozs7SUF1RWxDLGtCQUFZLE1BQWMsRUFBRSxjQUFtQyxFQUFFLE1BQXVCLEVBQUUsYUFBZ0MsRUFBRSxnQkFBa0MsRUFDNUosYUFBNEIsRUFBRSxZQUFzQztRQUR0RSxpQkFxQ0M7Z0NBM0MrQjtZQUM5QixNQUFNLEVBQUUsSUFBSTtZQUNaLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLElBQUk7U0FDZjtRQUlDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUks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Q2Isd0JBQXdCOzs7Z0NBbUU5QixTQUFTLFNBQUMsUUFBUTs4QkFFbEIsU0FBUyxTQUFDLFdBQVc7O21CQTdFeEI7O1NBb0NhLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgUGhsb3hBcHBJbmZvLCBDb21wb25lbnREaWFsb2dNb2RlbCB9IGZyb20gJy4vbW9kZWwvbW9kZWxzJztcbmltcG9ydCB7IFBobG94QXBwSW5mb1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL1BobG94QXBwSW5mb1NlcnZpY2Uuc2VydmljZSc7XG5pbXBvcnQgeyBQaGxveEFwcFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL1BobG94QXBwU2VydmljZS5zZXJ2aWNlJztcbmltcG9ydCB7IE9ic2VydmFibGVNYW5hZ2VyIH0gZnJvbSAnLi4vc2VydmljZS9PYnNlcnZhYmxlTWFuYWdlci5zZXJ2aWNlJztcbmltcG9ydCB7IE5lZWRGb2N1c1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL05lZWRGb2N1c1NlcnZpY2Uuc2VydmljZSc7XG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZS9EaWFsb2dTZXJ2aWNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQmFja2dyb3VuZFByb2Nlc3NNYW5hZ2VyIH0gZnJvbSAnLi4vc2VydmljZS9CYWNrZ3JvdW5kUHJvY2Vzc01hbmFnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBJTmF2aWdhdG9yIH0gZnJvbSAnLi9JTmF2aWdhdG9yJztcbmltcG9ydCB7IElOZWVkRm9jdXMgfSBmcm9tICcuL0lOZWVkRm9jdXMnO1xuaW1wb3J0IHsgQWJzdHJhY3RQYWdlIH0gZnJvbSAnLi9BYnN0cmFjdFBhZ2UnO1xuaW1wb3J0IHsgQWJzdHJhY3ROYXZMZWZ0TGF5b3V0IH0gZnJvbSAnLi9BYnN0cmFjdE5hdkxlZnRMYXlvdXQnO1xuaW1wb3J0IHsgTWF0ZXJpYWxCYXJMb2FkZXIgfSBmcm9tICcuLi90aGVtZS9tYXRlcmlhbC9jb21wb25lbnQvTWF0ZXJpYWxCYXJMb2FkZXIuY29tcG9uZW50JztcblxuY29uc3QgVFlQRV9OQU1FOiBzdHJpbmcgPSBcInBoeC1hcHBcIjtcblxuLyoqXG4gKiA8cCBzdHlsZT1cInRleHQtaW5kZW50OiAyZW07XCI+XG4gKiBBIG1haW4gYm9vdHN0cmFwIGNvbXBvbmVudCBjbGFzcyBmb3IgPGNvZGU+UGhsb3hVSTwvY29kZT4gYXBwbGljYXRpb24uIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgW1tJTmF2aWdhdG9yXV0gaW50ZXJmYWNlIGhhdmluZyBwYWdlcyAoW1tBYnN0cmFjdFBhZ2VdXSlcbiAqIGFzIDxjb2RlPm5hdmlnYXRlZTwvY29kZT4gaXRlbXMgKFtbSU5hdmlnYXRlZV1dKS4gQW4gPGNvZGU+YXBwbGljYXRpb248L2NvZGU+IG1heSBjb25zaXN0IG9mIHZhcmlvdXMgcGFnZXMsIGZvciBleGFtcGxlLCBpdCBtYXkgaGF2ZSBhIGxvZ2luIHBhZ2UgdG8gYWxsb3cgdGhlIHVzZXIgdG9cbiAqIGxvZ2luLCBvbmNlIHRoZSB1c2VyIGlzIGxvZ2dlZCBvbiwgaXQgd2lsbCBuYXZpZ2F0ZSB0aGUgdXNlciB0byB0aGUgbWFpbiBwYWdlLCBldGMuXG4gKiA8L3A+XG4gKlxuICogQGF1dGhvciBzaGlvcmluLCB0ZWU0Y3V0ZVxuICovXG5AQ29tcG9uZW50KHtcbiAgbW9kdWxlSWQ6IG1vZHVsZS5pZCxcbiAgc2VsZWN0b3I6ICdwaHgtYXBwJyxcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwicGhsb3gtYXBwLWJhci1jb250YWluZXJcIiBbY2xhc3Muc2hvd109XCJpc1Nob3dMb2FkZXIoKVwiPlxuICA8bWF0ZXJpYWwtYmFyLWxvYWRlciAjYmFybG9hZGVyPjwvbWF0ZXJpYWwtYmFyLWxvYWRlcj5cbjwvZGl2PlxuPHJvdXRlci1vdXRsZXQ+PC9yb3V0ZXItb3V0bGV0PlxuPHBoeC1kaWFsb2cgI2RpYWxvZz48L3BoeC1kaWFsb2c+XG5gXG59KVxuZXhwb3J0IGNsYXNzIFBobG94QXBwIGltcGxlbWVudHMgSU5hdmlnYXRvcjxBYnN0cmFjdFBhZ2U+LCBPbkluaXQge1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVFlQRV9OQU1FOiBzdHJpbmcgPSBUWVBFX05BTUU7XG5cbiAgLyoqXG4gICAqIFRoaXMgZmllbGQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluamVjdGVkIGJ5IDxjb2RlPm5nPC9jb2RlPi5cbiAgICovXG4gIHByaXZhdGUgYXBwSW5mb1NlcnZpY2U6IFBobG94QXBwSW5mb1NlcnZpY2U7XG4gIC8qKlxuICAgKiBUaGlzIGZpZWxkIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbmplY3RlZCBieSA8Y29kZT5uZzwvY29kZT4uXG4gICAqL1xuICBwcml2YXRlIG9ic2VydmFibGVNZ3I6IE9ic2VydmFibGVNYW5hZ2VyO1xuICAvKipcbiAgICogVGhpcyBmaWVsZCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5qZWN0ZWQgYnkgPGNvZGU+bmc8L2NvZGU+LlxuICAgKi9cbiAgcHJpdmF0ZSBuZWVkRm9jdXNTZXJ2aWNlOiBOZWVkRm9jdXNTZXJ2aWNlO1xuICAvKipcbiAgICogQSBmaWVsZCBrZWVwaW5nIGNhY2hlIGZvciB0aGUgbGFzdCBzdWNjZXNzZnVsbHkgbG9hZGVkIFtbUGhsb3hBcHBJbmZvXV0gZnJvbSBtZXRob2QgW1tyZWxvYWRBcHBJbmZvXV0uXG4gICAqL1xuICBwcml2YXRlIGFwcEluZm86IFBobG94QXBwSW5mbztcbiAgLyoqXG4gICAqIEFuIGFycmF5IGtlZXBpbmcgYWxsIDxjb2RlPnBhZ2U8L2NvZGU+cyBvZiB0aGlzIDxjb2RlPmFwcGxpY2F0aW9uPC9jb2RlPi5cbiAgICovXG4gIHByaXZhdGUgcGFnZXM6IEFic3RyYWN0UGFnZVtdO1xuICAvKipcbiAgICogVGhpcyBmaWVsZCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5qZWN0ZWQgYnkgPGNvZGU+bmc8L2NvZGU+LlxuICAgKi9cbiAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcjtcbiAgLyoqXG4gICAqIFRoaXMgZmllbGQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluamVjdGVkIGJ5IDxjb2RlPm5nPC9jb2RlPi5cbiAgICovXG4gIHByaXZhdGUgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZTtcbiAgLyoqXG4gICAqIFRoaXMgZmllbGQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluamVjdGVkIGJ5IDxjb2RlPm5nPC9jb2RlPi5cbiAgICovXG4gIHByaXZhdGUgYmdQcm9jZXNzTWdyOiBCYWNrZ3JvdW5kUHJvY2Vzc01hbmFnZXI7XG4gIC8qKlxuICAgKiBBIFtbUGhsb3hEaWFsb2ddXSBjaGlsZCBjb21wb25lbnQgaW5zdGFuY2Ugb2YgdGhpcyBjb21wb25lbnQuXG4gICAqL1xuICBAVmlld0NoaWxkKCdkaWFsb2cnKVxuICBwcml2YXRlIHBobG94RGlhbG9nOiBhbnk7XG4gIEBWaWV3Q2hpbGQoXCJiYXJsb2FkZXJcIilcbiAgcHJpdmF0ZSBiYXJsb2FkZXI6IE1hdGVyaWFsQmFyTG9hZGVyO1xuICBwcml2YXRlIF9zaG93TG9hZGVyOiBib29sZWFuO1xuICBwcml2YXRlIGN1clJvdXRlckxvYWRpbmc6IGFueSA9IHtcbiAgICBcInBhdGhcIjogbnVsbCxcbiAgICBcInJlc29sdmVcIjogbnVsbCxcbiAgICBcInJlamVjdFwiOiBudWxsXG4gIH07XG5cbiAgY29uc3RydWN0b3Iocm91dGVyOiBSb3V0ZXIsIGFwcEluZm9TZXJ2aWNlOiBQaGxveEFwcEluZm9TZXJ2aWNlLCBhcHBTdmM6IFBobG94QXBwU2VydmljZSwgb2JzZXJ2YWJsZU1ncjogT2JzZXJ2YWJsZU1hbmFnZXIsIG5lZWRGb2N1c1NlcnZpY2U6IE5lZWRGb2N1c1NlcnZpY2UsXG4gICAgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSwgYmdQcm9jZXNzTWdyOiBCYWNrZ3JvdW5kUHJvY2Vzc01hbmFnZXIpIHtcbiAgICB0aGlzLnBhZ2VzID0gW107XG4gICAgdGhpcy5yb3V0ZXIgPSByb3V0ZXI7XG4gICAgdGhpcy5hcHBJbmZvU2VydmljZSA9IGFwcEluZm9TZXJ2aWNlO1xuICAgIHRoaXMub2JzZXJ2YWJsZU1nciA9IG9ic2VydmFibGVNZ3I7XG4gICAgdGhpcy5uZWVkRm9jdXNTZXJ2aWNlID0gbmVlZEZvY3VzU2VydmljZTtcbiAgICB0aGlzLnJlbG9hZEFwcEluZm8oKTtcbiAgICB0aGlzLmRpYWxvZ1NlcnZpY2UgPSBkaWFsb2dTZXJ2aWNlO1xuICAgIHRoaXMuYmdQcm9jZXNzTWdyID0gYmdQcm9jZXNzTWdyO1xuICAgIHRoaXMuX3Nob3dMb2FkZXIgPSBmYWxzZTtcblxuICAgIC8vIFNldCBhcHAgaW5zdGFuY2UgdG8gUGhsb3hBcHBTZXJ2aWNlIHRvIGFsbG93IG90aGVycyB0byBhY2Nlc3MgdGhpcyBpbnN0YW5jZS5cbiAgICBhcHBTdmMuc2V0SW5zdGFuY2UodGhpcyk7XG5cbiAgICAvLyBpbml0IGRpYWxvZyBzZXJ2aWNlXG4gICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmluaXQodGhpcyk7XG5cbiAgICB0aGlzLm9ic2VydmFibGVNZ3Iuc3Vic2NyaWJlKEJhY2tncm91bmRQcm9jZXNzTWFuYWdlci5QUk9DRVNTX1NUQVJUX1RPUElDX05BTUUsIChzdGFydEJHUHJvY2VzczogYW55KSA9PiB7XG4gICAgICBpZiAoc3RhcnRCR1Byb2Nlc3MudHlwZSA9PT0gJ2Nvbm5lY3Rpb24ucGFnZScpIHtcbiAgICAgICAgdGhpcy5ydW5QYWdlTG9hZGVyKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5vYnNlcnZhYmxlTWdyLnN1YnNjcmliZShCYWNrZ3JvdW5kUHJvY2Vzc01hbmFnZXIuUFJPQ0VTU19FTkRfVE9QSUNfTkFNRSwgKGVuZEJHUHJvY2VzczogYW55KSA9PiB7XG4gICAgICBpZiAoZW5kQkdQcm9jZXNzLnR5cGUgPT09ICdjb25uZWN0aW9uLnBhZ2UnKSB7XG4gICAgICAgIGlmICh0aGlzLmJnUHJvY2Vzc01nci5nZXRSdW5uaW5nUHJvY2Vzc2VzQ291bnQoJ2Nvbm5lY3Rpb24ucGFnZScsIG51bGwpIDw9IDApIHtcbiAgICAgICAgICB0aGlzLnN0b3BQYWdlTG9hZGVyKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLm9ic2VydmFibGVNZ3Iuc3Vic2NyaWJlKEJhY2tncm91bmRQcm9jZXNzTWFuYWdlci5QUk9DRVNTX0VSUk9SX1RPUElDX05BTUUsIChlcnJvckJHUHJvY2VzczogYW55KSA9PiB7XG4gICAgICBpZiAoZXJyb3JCR1Byb2Nlc3MudHlwZSA9PT0gJ2Nvbm5lY3Rpb24ucGFnZScpIHtcbiAgICAgICAgaWYgKHRoaXMuYmdQcm9jZXNzTWdyLmdldFJ1bm5pbmdQcm9jZXNzZXNDb3Vud