| // 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 |