blob: 6f57a3aa6fe30e89cd8cc1ac6ce01a198ec9b74f [file] [log] [blame]
// Copyright (c) 2000-2017 Ericsson Telecom AB //
// All rights reserved. This program and the accompanying materials are made available under the //
// terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at //
// http://www.eclipse.org/legal/epl-v10.html //
///////////////////////////////////////////////////////////////////////////////////////////////////////
function GuiEditor_Model(p_webAppModel, p_framework, p_extension) {
"use strict";
var v_baseModel = p_webAppModel;
var v_setupModel = v_baseModel.getSetupModel();
var v_framework = p_framework;
var v_dsRestAPI;
if (v_baseModel.getAppConfig().lastEditedApp != undefined && window["DsRestAPI"] != undefined) {
v_dsRestAPI = new DsRestAPI(p_extension);
} else {
v_dsRestAPI = {"getHelp": function(callback) {callback(true, {"sources" : []});}};
}
///////////////////// SETUP HANDLING /////////////////////
this.newSetup = function() {
v_setupModel.newSetup();
changeLastEdited(undefined);
var setup = v_setupModel.getSetup();
fillDesktopSettings(setup);
return setup;
};
this.deleteSetup = function(name, callback) {
function setupDeleted(ok) {
var config = v_baseModel.getAppConfig();
if (ok && config.lastEditedSetup == name) {
changeLastEdited(undefined);
}
callback(ok)
}
v_setupModel.deleteSetup(name, setupDeleted);
};
this.switchSetup = function(p_setupName, p_setupLoaded) {
function setupLoaded(ok, setup, setupName) {
fillDesktopSettings(setup);
if (ok) {
changeLastEdited(setupName);
}
p_setupLoaded(ok, setup, setupName);
}
v_setupModel.loadSetup(p_setupName, setupLoaded, true);
};
this.saveSetup = v_setupModel.saveSetup;
this.saveSetupAs = function(setupName, callback) {
function setupSaved(ok) {
if (ok) {
changeLastEdited(setupName);
}
callback(ok);
}
v_setupModel.saveSetupAs(setupName, setupSaved);
};
this.listSetups = v_setupModel.listSetups;
this.setupExists = function(setupName, callback) {
v_setupModel.setupExists(setupName, callback);
};
function fillDesktopSettings(setup) {
var desktopData = setup.desktop.getData();
if (desktopData["ViewmodelEditors"] == undefined) {
desktopData["ViewmodelEditors"] = [];
}
if (desktopData["ViewEditors"] == undefined) {
desktopData["ViewEditors"] = [];
}
if (desktopData["Imports"] == undefined) {
desktopData["Imports"] = [];
}
if (desktopData["HtmlEditor"] == undefined) {
desktopData["HtmlEditor"] = {};
}
if (desktopData["RequestEditor"] == undefined) {
desktopData["RequestEditor"] = {};
}
}
function changeLastEdited(lastEdited) {
var config = v_baseModel.getAppConfig();
config.lastEditedSetup = lastEdited;
v_baseModel.saveAppConfig(config);
if (lastEdited != undefined) {
v_framework.setAppParam("DsRestAPI Console", "customization", config.lastEditedApp);
v_framework.setAppParam("DsRestAPI Console", "setup", config.lastEditedSetup);
var mainConfig = v_baseModel.getMainConfig();
for (var i = 0; i < mainConfig.availableApps.length; ++i) {
if (mainConfig.availableApps[i].directory == "WebApplications/CustomizableApp" && mainConfig.availableApps[i].params.customization == config.lastEditedApp) {
v_framework.setAppParam(mainConfig.availableApps[i].name, "setup", config.lastEditedSetup);
}
}
}
}
this.globalSetupSearch = v_setupModel.globalSetupSearch;
this.exportChartRequest = function(callback) {
var exporter = new ChartRequestCreator(v_baseModel.getFileHandler(), callback);
exporter.run();
};
this.getSetup = v_setupModel.getSetup;
///////////////////// EDITOR MODEL HANDLING /////////////////////
this.createViewModelEditor_Model = function(className, modelCreated, customData) {
if (customData == undefined) {
customData = {};
} else {
customData = mcopy(customData);
}
var data = {
"class": className,
"customData": customData,
"dataPathStrList": [],
"dataPathList": [],
"selectionToControlPathStrList": [],
"selectionToControlPathList": []
};
var setup = v_setupModel.getSetup();
setup.viewmodels.getData().push(data);
var dekstopData = {};
setup.desktop.getData()["ViewmodelEditors"].push(dekstopData);
modelCreated(new GuiEditor_ViewModelEditor_Model(data), dekstopData);
};
this.deleteViewModelEditor_Model = function(index) {
var setup = v_setupModel.getSetup();
setup.viewmodels.getData().splice(index, 1);
setup.desktop.getData()["ViewmodelEditors"].splice(index, 1);
};
this.createViewEditor_Model = function(className, modelCreated, customData) {
if (customData == undefined) {
customData = {};
} else {
customData = mcopy(customData);
}
var data = {
"class": className,
"customData": customData,
"viewModelIndexes": []
};
var setup = v_setupModel.getSetup();
setup.views.getData().push(data);
var dekstopData = {};
setup.desktop.getData()["ViewEditors"].push(dekstopData);
modelCreated(new GuiEditor_ViewEditor_Model(data), dekstopData);
};
this.deleteViewEditor_Model = function(index) {
var setup = v_setupModel.getSetup();
v_setupModel.getSetup().views.getData().splice(index, 1);
setup.desktop.getData()["ViewEditors"].splice(index, 1);
};
this.createImport_Model = function(setupName, modelCreated) {
var data = {
"setupName": setupName
};
var setup = v_setupModel.getSetup();
setup.imports.getData().push(data);
var dekstopData = {};
setup.desktop.getData()["Imports"].push(dekstopData);
modelCreated(new GuiEditor_Imports_Model(data), dekstopData);
};
this.deleteImport_Model = function(index) {
var setup = v_setupModel.getSetup();
v_setupModel.getSetup().imports.getData().splice(index, 1);
setup.desktop.getData()["Imports"].splice(index, 1);
};
this.getEditorModels = function(modelsCreated) {
var setup = v_setupModel.getSetup();
var data = {
"viewmodel": {
"models": [],
"desktopData": []
},
"view": {
"models": [],
"desktopData": []
},
"imports": {
"models": [],
"desktopData": []
}
}
var viewmodelInstances = setup.viewmodels.getData();
if (setup.desktop.getData()["ViewmodelEditors"] == undefined) {
setup.desktop.getData()["ViewmodelEditors"] = [];
}
data.viewmodel.desktopData = setup.desktop.getData()["ViewmodelEditors"];
for (var i = 0; i < viewmodelInstances.length; ++i) {
data.viewmodel.models.push(new GuiEditor_ViewModelEditor_Model(viewmodelInstances[i]));
if (data.viewmodel.desktopData[i] == undefined) {
data.viewmodel.desktopData[i] = {};
}
}
var viewInstances = setup.views.getData();
if (setup.desktop.getData()["ViewEditors"] == undefined) {
setup.desktop.getData()["ViewEditors"] = [];
}
data.view.desktopData = setup.desktop.getData()["ViewEditors"];
for (var j = 0; j < viewInstances.length; ++j) {
data.view.models.push(new GuiEditor_ViewEditor_Model(viewInstances[j]));
if (data.view.desktopData[j] == undefined) {
data.view.desktopData[j] = {};
}
}
var imports = setup.imports.getData();
if (setup.desktop.getData()["Imports"] == undefined) {
setup.desktop.getData()["Imports"] = [];
}
data.imports.desktopData = setup.desktop.getData()["Imports"];
for (var j = 0; j < imports.length; ++j) {
data.imports.models.push(new GuiEditor_Imports_Model(imports[j]));
if (data.imports.desktopData[j] == undefined) {
data.imports.desktopData[j] = {};
}
}
modelsCreated(data);
};
///////////////////// RESOURCE HANDLING /////////////////////
this.viewExists = function(viewName, callback) {
function filesArrived(views) {
callback(views.indexOf(viewName) != -1);
}
this.listCustomViews(filesArrived);
};
this.viewmodelExists = function(viewmodelName, callback) {
function filesArrived(viewmodels) {
callback(viewmodels.indexOf(viewmodelName) != -1);
}
this.listCustomViewmodels(filesArrived);
};
function listJavascriptResources(locations, callback) {
new MultipleDirectoryListTask(locations, v_baseModel.getFileHandler()).taskOperation(function(ok, resources) {
callback(resources.jsfiles);
});
}
this.listViews = function(callback) {
listJavascriptResources([
"WebApplicationFramework/Views",
"WebApplications/CustomizableApp/Views",
v_baseModel.getAppConfig().lastEditedApp + "/Views"
], callback
);
};
this.listCustomViews = function(callback) {
function filesArrived(views) {
var result = [];
for (var i = 0; i < views.length; ++i) {
var fileName = views[i].fileName;
if (fileName.endsWith(".js") || fileName.endsWith(".css") || fileName.endsWith(".html")) {
result.push(fileName.substring(fileName.lastIndexOf("/") + 1, fileName.lastIndexOf(".")));
}
}
result = uniq(result);
result.sort();
callback(result);
}
v_baseModel.getFileHandler().getDirectory(v_baseModel.getAppConfig().lastEditedApp + "/Views", filesArrived);
};
this.listViewmodels = function(callback) {
listJavascriptResources([
"WebApplicationFramework/ViewModels",
"WebApplications/CustomizableApp/ViewModels",
v_baseModel.getAppConfig().lastEditedApp + "/ViewModels"
], callback
);
};
this.listCustomViewmodels = function(callback) {
function filesArrived(viewmodels) {
var result = [];
for (var i = 0; i < viewmodels.length; ++i) {
var fileName = viewmodels[i].fileName;
if (fileName.endsWith(".js")) {
result.push(fileName.substring(fileName.lastIndexOf("/") + 1));
}
}
result.sort();
callback(result);
}
v_baseModel.getFileHandler().getDirectory(v_baseModel.getAppConfig().lastEditedApp + "/ViewModels", filesArrived);
};
this.getViewUrl = function(name) {
return v_baseModel.getAppConfig().lastEditedApp + "/Views/" + name;
};
this.getViewmodelUrl = function(name) {
return v_baseModel.getAppConfig().lastEditedApp + "/ViewModels/" + name;
};
this.deleteFile = function(file, callback) {
v_baseModel.getFileHandler().delDirectory(file, callback);
};
///////////////////// CONFIG HANDLING /////////////////////
this.getAppConfig = v_baseModel.getAppConfig;
this.setEditedApp = function(app, callback) {
var config = v_baseModel.getAppConfig();
config.lastEditedApp = app;
v_setupModel.setSetupDirectory(app + "/Setups");
v_baseModel.saveAppConfig();
new JsImportFromConfigTask(app + '/AppConfig.json', v_baseModel.getFileHandler()).taskOperation(function(ok, extension) {
if (window["DsRestAPI"] != undefined) {
v_dsRestAPI = new DsRestAPI(extension);
}
callback(true);
});
};
this.listEditableApps = function(callback) {
var result = [];
var mainConfig = v_baseModel.getMainConfig();
for (var i = 0; i < mainConfig.availableApps.length; ++i) {
if (mainConfig.availableApps[i].directory == "WebApplications/CustomizableApp" && mainConfig.availableApps[i].params.customization != undefined) {
result.push(mainConfig.availableApps[i].params.customization);
}
}
callback(result);
};
this.listEditableConfigs = function(callback) {
var result = [{
"config": "CustomizableContent/MainConfig.json",
"schema": "CustomizableContent/MainConfigSchema.json"
}];
function filesArrived(data) {
for (var i = 0; i < data.length; ++i) {
if (data[i].contentType.endsWith("d")) {
result.push({
"config": data[i].fileName + "/AppConfig.json",
"schema": data[i].fileName + "/AppConfigSchema.json"
});
}
}
callback(result);
}
v_baseModel.getFileHandler().getDirectory("CustomizableContent", filesArrived);
};
///////////////////// USEFUL FUNCTIONS FOR VIEWMODELS /////////////////////
this.getDesktopDataForRequestEditor = function() {
return v_setupModel.getSetup().desktop.getData()["RequestEditor"];
};
function compareOptions(option1, option2) {
if (option1.text < option2.text) {
return -1;
} else if (option1.text > option2.text) {
return 1;
} else {
return 0;
}
}
this.sortOptions = function(options) {
options.sort(compareOptions);
};
this.getDsRestAPI = function() {
return v_dsRestAPI;
};
this.getFileHandler = v_baseModel.getFileHandler;
}
function ChartRequestCreator(p_fileHandler, p_callback) {
var v_fileHandler = p_fileHandler;
var v_callback = p_callback;
// setup name -> setup params or null
var v_setupsToCheckForCharts = {};
var v_setupsImported = {};
var v_showOtherSetups = false;
var v_setupList;
var v_chartRequest = [];
var v_setupLoader = new CSetup_Model(v_fileHandler);
var v_chartSaver = new JsonLoader("CustomizableContent/CustomizableApp/TimelineRequest.json", v_fileHandler, v_chartRequest);
this.run = function() {
function setupsListed(setups) {
v_setupList = setups;
var tasks = [];
for (var i = 0; i < setups.length; ++i) {
tasks.push(new CheckSetupForSetupTabsTask(setups[i]));
}
var taskList = new SyncTaskList(tasks, setupsCollected);
taskList.taskOperation();
}
v_setupLoader.listSetups(setupsListed);
};
function CheckSetupForSetupTabsTask(p_setupName) {
var v_setupName = p_setupName;
this.taskOperation = function(callback) {
function setupLoaded(ok, setup, setupName) {
if (ok) {
checkSetupForSetupTabs(setup.viewmodels.getData(), setup.imports.getData());
callback(true);
} else {
callback(false, "Could not load setup: " + setupName);
}
}
v_setupLoader.loadSetup(v_setupName, setupLoaded, true);
}
}
function checkSetupForSetupTabs(viewmodels, imports) {
for (var i = 0; i < viewmodels.length; ++i) {
if (viewmodels[i].class == "CViewModel_SetupTabs" && viewmodels[i].customData.hierarchy != undefined) {
collectSetups(viewmodels[i].customData.hierarchy.menuElements);
}
if (viewmodels[i].class == "CViewModel_SetupTabs" && viewmodels[i].customData.displayOtherSetups == true) {
v_showOtherSetups = true;
}
}
for (var i = 0; i < imports.length; ++i) {
v_setupsImported[imports[i].setupName] = true;
}
}
function collectSetups(menuElements) {
if (menuElements != undefined) {
for (var i = 0; i < menuElements.length; ++i) {
if (menuElements[i].setupName != undefined) {
if (menuElements[i].setupParams != undefined) {
v_setupsToCheckForCharts[menuElements[i].setupName] = menuElements[i].setupParams;
} else {
v_setupsToCheckForCharts[menuElements[i].setupName] = null;
}
}
collectSetups(menuElements[i].menuElements);
}
}
}
function setupsCollected() {
if (v_showOtherSetups) {
for (var i = 0; i < v_setupList.length; ++i) {
if (!v_setupsImported.hasOwnProperty(v_setupList[i]) && !v_setupsToCheckForCharts.hasOwnProperty(v_setupList[i])) {
v_setupsToCheckForCharts[v_setupList[i]] = null;
}
}
}
var tasks = [];
for (var setup in v_setupsToCheckForCharts) {
tasks.push(new FindChartsTask(setup, v_setupsToCheckForCharts[setup]));
}
var taskList = new SyncTaskList(tasks, chartsFound);
taskList.taskOperation();
}
function FindChartsTask(p_setupName, p_setupParams) {
var v_setupName = p_setupName;
var v_setupParams = p_setupParams;
this.taskOperation = function(callback) {
function setupLoaded(ok, setup, setupName) {
if (ok) {
findCharts(setup.viewmodels.getData(), setup.request.getData(), setup.request.getData(), []);
callback(true);
} else {
callback(false, "Could not load setup: " + setupName);
}
}
v_setupLoader.loadSetup(v_setupName, setupLoaded, false, true);
}
}
function findCharts(viewmodels, request, requests, path) {
if (requests != undefined) {
for (var i = 0; i < requests.length; ++i) {
path.push(i);
cleanRequestUp(requests[i], viewmodels, path);
if (requests[i].getData.timeline != undefined) {
addChartRequest(mcopy(request), path);
}
findCharts(viewmodels, request, requests[i].getData.children, path);
path.pop();
}
}
}
function cleanRequestUp(request, viewmodels, path) {
request.getData.filter = undefined;
request.getData.rangeFilter = undefined;
var selectionIsChanged = false;
for (var i = 0; i < viewmodels.length; ++i) {
for (var j = 0; j < viewmodels[i].selectionToControlPathList.length; ++j) {
if (pathEquals(path, viewmodels[i].selectionToControlPathList[j])) {
selectionIsChanged = true;
}
}
}
if (selectionIsChanged) {
request.getData.selection = undefined;
}
}
function pathEquals(path1, path2) {
if (path1.length == path2.length) {
for (var i = 0; i < path1.length; ++i) {
if (path1[i] != path2[i]) {
return false;
}
}
return true;
} else {
return false;
}
}
function addChartRequest(request, path) {
var requestList = [request.splice(path[0], 1)[0]];
var currentRequest = requestList[0];
for (var i = 1; i < path.length; ++i) {
requestList[i] = currentRequest.getData.children.splice(path[i], 1)[0];
currentRequest = requestList[i];
}
for (var i = 0; i < requestList.length - 1; ++i) {
requestList[i].getData.children = [];
}
v_chartRequest.push(createRequestFromList(requestList));
}
function createRequestFromList(requestList) {
var PATTERN = /%Parent(\d+)%/g;
var used = [];
var toCheck = [requestList.length - 1];
while (toCheck.length > 0) {
var index = toCheck.shift();
used[index] = true;
var pattern = new RegExp(PATTERN);
var str = JSON.stringify(requestList[index]);
var match = pattern.exec(str);
while (match != undefined) {
var parentid = parseInt(match[1], 10);
if (parentid < index) {
toCheck.push(parentid);
}
match = pattern.exec(str);
}
}
var newRequest;
var prev;
var k = 0;
for (var i = 0; i < used.length; ++i) {
if (used[i] != undefined) {
for (var j = i + 1; j < requestList.length; ++j) {
var string = JSON.stringify(requestList[j]);
string = string.replace("%Parent" + i + "::idx%", "%Parent" + k + "::idx%");
string = string.replace("%Parent" + i + "%", "%Parent" + k + "%");
requestList[j] = JSON.parse(string);
}
if (prev == undefined) {
newRequest = requestList[i];
prev = newRequest;
} else {
prev.getData.children = [requestList[i]];
}
prev = requestList[i];
++k;
}
}
return newRequest;
}
function chartsFound() {
v_chartSaver.save();
v_callback();
}
}
//# sourceURL=GuiEditor\Models\Model.js