// Copyright (c) 2000-2019 Ericsson Telecom AB Telecom AB // | |
// All rights reserved. This program and the accompanying materials are made available under the // | |
// terms of the Eclipse Public License v2.0 which accompanies this distribution, and is available at // | |
// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html // | |
/////////////////////////////////////////////////////////////////////////////////////////////////////// | |
/** Common functionality for applications, such as | |
- mainLoop, | |
- request issuing | |
- response comparison | |
- binding between view and viewModel */ | |
var WebApplications = WebApplications || []; | |
WebApplications.push({'application': new CustomizableApp()}); | |
function CustomizableApp() { | |
"use strict"; | |
var m_appBase = new WebAppBase(); | |
var m_DataSourceUtils = new DataSourceUtils(); | |
var m_webAppModel; | |
var m_viewModel; | |
var m_view; | |
var m_Binder; | |
var m_model; | |
var m_frameWork; | |
var cssfiles = []; | |
this.info = function() { | |
return { | |
defaultIcon: "WebApplications/CustomizableApp/Res/main_icon.png", | |
defaultName: "CustomizableApp" | |
}; | |
}; | |
this.load = function(webAppModel, params, framework) { | |
m_frameWork = framework; | |
var jsfiles = [ | |
"WebApplications/CustomizableApp/ViewModel.js", | |
"WebApplications/CustomizableApp/View.js", | |
"WebApplications/CustomizableApp/Model.js" | |
]; | |
var alwaysLoadableJsFiles = []; | |
function setupLoaded(ok, setup, setupName) { | |
if (ok) { | |
// load js and css files of main files, views and viewmodels, start the application | |
new MultipleDirectoryListTask( | |
[ | |
"WebApplications/CustomizableApp/Views", | |
"WebApplications/CustomizableApp/ViewModels", | |
params.customization + "/ViewModels", | |
params.customization + "/Views" | |
], | |
m_webAppModel.getFileHandler() | |
).taskOperation(function(ok, resources) { | |
jsfiles = jsfiles.concat(resources.jsfiles); | |
cssfiles = resources.cssfiles; | |
//htmlfiles = resources.htmlfiles; | |
m_appBase.load(jsfiles, alwaysLoadableJsFiles, start, m_webAppModel.getFileHandler()); | |
}); | |
} else { | |
alert("Failed to load setup " + setupName); | |
} | |
} | |
function appConfigLoaded(config) { | |
if (config.filesToInclude != undefined) { | |
alwaysLoadableJsFiles = config.filesToInclude; | |
} | |
if (params.setup != undefined) { | |
m_webAppModel.getSetupModel().loadSetup(params.setup, setupLoaded, false, params.setupParams); | |
} else if (config.setup != undefined) { | |
m_webAppModel.getSetupModel().loadSetup(config.setup, setupLoaded, false, config.setupParams); | |
} else { | |
alert('No setup was specified in config.'); | |
} | |
} | |
m_webAppModel = webAppModel; | |
// set setup directory | |
if (params.customization != undefined) { | |
m_webAppModel.getSetupModel().setSetupDirectory(params.customization + '/Setups'); | |
} else { | |
alert('Customizable app customization directory not set in params.'); | |
return; | |
} | |
// load app config | |
m_webAppModel.loadAppConfig(params.customization + '/AppConfig.json', appConfigLoaded); | |
}; | |
this.unload = function(webappUnloaded) { | |
m_appBase.unload(destroy); | |
webappUnloaded(true); | |
}; | |
/** private functions */ | |
function start(p_callback) { | |
m_model = new CCustomizableApp_Model(m_webAppModel, m_frameWork); | |
m_viewModel = new CViewModel(m_model, m_DataSourceUtils); | |
m_view = new CView(m_viewModel, "customAppMainview", "TSGuiFrameworkMain"); | |
function callback(ok, msg) { | |
if (ok) { | |
m_webAppModel.getFileHandler().loadCssFiles(cssfiles, "customAppMainview"); | |
m_viewModel.applicationCreated(); | |
m_viewModel.initRequestSelectionsAndFiltersAtStart(); | |
m_view.applicationCreated(); | |
m_Binder = new CBinder(m_viewModel, m_view, m_DataSourceUtils); | |
m_Binder.start(); | |
} else { | |
alert(msg); | |
} | |
if (typeof p_callback === "function") { | |
p_callback(); | |
} | |
} | |
var taskList = new SyncTaskList([new GenericTask(m_viewModel.init), new GenericTask(m_view.init)], callback); | |
taskList.taskOperation(); | |
} | |
function destroy() { | |
m_view.destroy(); | |
m_Binder.stop(); | |
m_Binder = undefined; | |
m_view = undefined; | |
m_viewModel = undefined; | |
} | |
} | |
function CBinder(aViewModel, aView, aDataSourceUtils) | |
{ | |
"use strict"; | |
/** constructor and private members */ | |
var mOutstandingRequests = 0; | |
var mLastResponse; | |
var mViewModel = aViewModel; | |
var mView = aView; | |
var ERunningState = {EStopped:0, ERunning:1, EStopping:2}; | |
var mRunning = ERunningState.EStopped; | |
var mThis = this; | |
var mRefreshInterval = 3000; | |
if (mViewModel.getUIConfig().refreshInterval != undefined) { | |
//mRefreshInterval = mViewModel.getUIConfig().refreshInterval; | |
} | |
var mDataSourceUtils = aDataSourceUtils; | |
aViewModel.setBinder(this); | |
var mInterval; | |
/** public functions */ | |
this.start = function() | |
{ | |
if (mRunning !== ERunningState.ERunning) | |
{ | |
mRunning = ERunningState.ERunning; | |
mThis.mainLoop(); | |
if (mRefreshInterval != -1) { | |
mInterval = setInterval(mThis.mainLoop, mRefreshInterval); | |
} | |
} | |
}; | |
this.stop = function() | |
{ | |
mRunning = ERunningState.EStopping; | |
if (mInterval != undefined) | |
clearInterval(mInterval); | |
mInterval = undefined; | |
}; | |
function searchObjecForValue(obj, query) | |
{ | |
for (var key in obj) | |
{ | |
var value = obj[key]; | |
if (typeof value === 'object') | |
return searchObjecForValue(value, query); | |
if (typeof value == "string" && value.startsWith(query)) | |
return value; | |
} | |
return false; | |
} | |
this.notifyChange = function(aDisableViews, aFiredFromLoop, aResponseInCaseOfSetData) | |
{ | |
if (aResponseInCaseOfSetData) | |
{ | |
var val = searchObjecForValue(aResponseInCaseOfSetData, "GoodbyeMessage:"); | |
if (val) | |
{ | |
mView.destroy(); | |
mView.displayGoodbyeMessage(val.substring(val.indexOf(':') + 1)); | |
mThis.stop(); | |
} | |
} | |
function dataArrived(aData) { | |
if (aDisableViews && mViewModel.getUIConfig().overlayEnabledOnSelect) { | |
mView.enableViews(); | |
} | |
responseArrived(aData) | |
} | |
if (mOutstandingRequests == 0 || !aFiredFromLoop) | |
{ | |
if (aDisableViews && mViewModel.getUIConfig().overlayEnabledOnSelect) { | |
mView.disableViews(); | |
} | |
mViewModel.getChangedData(dataArrived); | |
mOutstandingRequests++; | |
} | |
}; | |
this.mainLoop = function() | |
{ | |
if (mRunning === ERunningState.ERunning) | |
{ | |
mThis.notifyChange(false, true); | |
} | |
}; | |
this.reloadSetup = function() | |
{ | |
mViewModel.getChangedData(function(aResponse) { | |
mView.destroySetupOnly(); | |
mView.reInitSetup(); | |
mViewModel.applicationCreated(); | |
mView.applicationCreated(); | |
mView.refreshView(true); | |
mLastResponse = null; | |
mThis.enableViews(); | |
mThis.start(); | |
}); | |
} | |
this.enableViews = function() { | |
mView.enableViews(); | |
}; | |
this.disableViews = function(aDoNotShowSpinningCircle) { | |
if (mRunning == ERunningState.ERunning) | |
mView.disableViews(aDoNotShowSpinningCircle); | |
}; | |
this.isRunning = function() { | |
return mRunning === ERunningState.ERunning; | |
} | |
/** private functions */ | |
function responseArrived(aData) | |
{ | |
mOutstandingRequests--; | |
if (aData) | |
{ | |
if (mRunning === ERunningState.ERunning) | |
{ | |
if (!mDataSourceUtils.dataSkeletonEquals(mLastResponse, aData)) | |
{ | |
if (mDataSourceUtils.isResponseToRequest(aData, mViewModel.getRequest())) | |
{ | |
mLastResponse = aData; | |
mViewModel.initRequestSelectionsAndFilters(); | |
mView.refreshView(true); | |
} | |
} | |
else | |
{ | |
mView.refreshView(false); | |
} | |
} | |
else if (mRunning === ERunningState.EStopping) | |
{ | |
mRunning = ERunningState.EStopped; | |
} | |
} | |
} | |
} | |
//# sourceURL=CustomizableApp\Main.js |