| // 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_View(p_viewModel, p_parentId, p_viewId) {
|
| "use strict";
|
|
|
| var HTML = "WebApplications/GuiEditor/Views/View.html";
|
|
|
| var parentDiv = document.getElementById(p_parentId);
|
| var v_parentId = p_parentId;
|
| var v_viewId = p_viewId;
|
| var v_viewmodel = p_viewModel;
|
| var v_this = this;
|
|
|
| var v_requestEditorView = new GuiEditor_RequestEditor_View(v_viewmodel, v_this);
|
| var v_viewContentEditorView = new GuiEditor_ViewContentEditor_View(v_viewmodel, "GuiEditor_ViewContentEditor");
|
| var v_viewmodelContentEditorView = new GuiEditor_ViewModelContentEditor_View(v_viewmodel, "GuiEditor_ViewmodelContentEditor");
|
| var v_uiConfigEditorView = new GuiEditor_JSONConfigEditor_View(v_viewmodel.getUIConfigEditorViewmodel(), "GuiEditor_UIConfigEditor");
|
|
|
| var v_focused_obj;
|
|
|
| ///////////////////// GETTER FOR SUBVIEWS //////////////////////////////
|
|
|
| this.getRequestEditorView = function() {
|
| return v_requestEditorView;
|
| };
|
|
|
| ///////////////////// GENERAL VIEW FUNCTIONS //////////////////////////////
|
|
|
| this.init = function(p_callback) {
|
| var mainDiv = document.createElement("div");
|
| mainDiv.setAttribute("id", v_viewId);
|
| parentDiv.appendChild(mainDiv);
|
|
|
| function htmlLoaded(ok, data) {
|
| if (ok) {
|
| $("#" + v_viewId).append(data);
|
| $('#GuiEditor_Tabs').tabs({
|
| activate: function(ev, ui) {
|
| var oldId = ui.oldPanel.attr("id");
|
| tabClosed(oldId);
|
| var newId = ui.newPanel.attr("id");
|
| tabOpened(newId);
|
| }
|
| });
|
|
|
| $("#GuiEditor_WebAppStyle").load("WebApplications/GuiEditor/Views/View.css", function() {
|
| v_this.toggleButtons(false);
|
| p_callback(true);
|
| });
|
| } else {
|
| p_callback(false, "Error loading " + HTML);
|
| }
|
| }
|
|
|
| v_viewmodel.loadFile(HTML, htmlLoaded);
|
| };
|
|
|
| function onWindowResize(event) {
|
| if (event.target == window) {
|
| $("#GuiEditor_MainView").height(ViewUtils.getSuggestedHeight("GuiEditor_MainView"));
|
| }
|
| }
|
|
|
| this.applicationCreated = function() {
|
| v_requestEditorView.applicationCreated();
|
| v_viewContentEditorView.applicationCreated();
|
| v_viewmodelContentEditorView.applicationCreated();
|
| v_uiConfigEditorView.applicationCreated();
|
| $("#GuiEditor_Button_New").on("click", newSetup);
|
| $("#GuiEditor_Button_Load").on("click", switchSetup);
|
| $("#GuiEditor_Button_Save").on("click", saveSetup);
|
| $("#GuiEditor_Button_SaveAs").on("click", saveSetupAs);
|
| $("#GuiEditor_Button_Show").on("click", showData);
|
| $("#GuiEditor_Button_ExportChartData").on("click", exportChartRequest);
|
| $("#GuiEditor_Button_History").on("click", showHistory);
|
| $("#GuiEditor_Button_SetApplication").on("click", changeApplication);
|
| $(document).on("keydown", keyPressed);
|
|
|
| $(window).on("resize", onWindowResize);
|
| $("#GuiEditor_MainView").height(ViewUtils.getSuggestedHeight("GuiEditor_MainView"));
|
|
|
| /* TODO: this works if we add .sortable class to the ul elemens, but do we need it? It would not be here, however.
|
| $(".sortable").sortable();
|
| $(".sortable").disableSelection();
|
| */
|
| };
|
|
|
| this.destroy = function() {
|
| v_requestEditorView.destroy();
|
| $("#" + v_viewId).remove();
|
| $(document).off("keydown", keyPressed);
|
| $(window).off("resize", onWindowResize);
|
| };
|
|
|
| this.unload = function(p_callback) {
|
| if (v_viewmodel.isSetupChanged() == true && v_viewmodel.getAppConfig().confirmExit == true) {
|
| var exitDialog = new ExitDialog(v_viewId, "GuiEditor_Dialog_Exit", {
|
| "header": "Exit GuiEditor",
|
| "text": "Do you wish to save changes before leaving?",
|
| "callback": function(exit, save) {
|
| if (save) {
|
| saveSetup(function(ok) {
|
| p_callback(exit);
|
| });
|
| } else {
|
| p_callback(exit);
|
| }
|
| }
|
| });
|
| exitDialog.open();
|
| } else {
|
| p_callback(true);
|
| }
|
| };
|
|
|
| ///////////////////// EVENT HANDLING FUNCTIONS //////////////////////////////
|
|
|
| function keyPressed(event) {
|
| if(event.keyCode === 46 && v_focused_obj != undefined && v_focused_obj.deletePressed != undefined) {
|
| v_focused_obj.deletePressed();
|
| }
|
|
|
| if(event.keyCode === 83 && event.ctrlKey == true && $("#GuiEditor_Button_Save").attr("disabled") != true) {
|
| saveSetup();
|
| event.preventDefault();
|
| event.stopPropagation();
|
| }
|
| }
|
|
|
| function tabClosed(id) {
|
| if (id == "GuiEditor_RequestEditorView") {
|
| $(document).off("keydown", keyPressed);
|
| } else if (id == "GuiEditor_UIConfigEditor") {
|
| v_uiConfigEditorView.close();
|
| }
|
| }
|
|
|
| function tabOpened(id) {
|
| if (id == "GuiEditor_InfoAreaView") {
|
| showData();
|
| } else if (id == "GuiEditor_ViewContentEditor") {
|
| v_viewContentEditorView.applicationFocused();
|
| } else if (id == "GuiEditor_ViewmodelContentEditor") {
|
| v_viewmodelContentEditorView.applicationFocused();
|
| } else if (id == "GuiEditor_RequestEditorView") {
|
| $("#" + v_viewId).on("keydown", keyPressed);
|
| $("#" + id).trigger("resize");
|
| v_requestEditorView.getEditorContainerView().refreshConnections();
|
| v_requestEditorView.getEditorContainerView().validateEditors();
|
| } else if (id == "GuiEditor_UIConfigEditor") {
|
| v_uiConfigEditorView.refresh();
|
| }
|
| }
|
|
|
| function newSetup() {
|
| v_this.toggleButtons(false);
|
| v_viewmodel.newSetup();
|
| v_this.updateSetupName();
|
| v_focused_obj = undefined;
|
| }
|
|
|
| function deleteSetup(value) {
|
| var text = "Are you sure your want to delete setup " + value + "?";
|
| if (v_viewmodel.isCurrentlyEdited(value)) {
|
| text += "<br><b>Warning! This is the currently edited setup<b>";
|
| }
|
|
|
| function setupDeleted(ok) {
|
| if (!ok) {
|
| alert("Failed to delete setup " + value);
|
| }
|
| v_this.updateSetupName();
|
| switchSetup();
|
| }
|
|
|
| var dialog = new ConfirmationDialog(v_viewId, "GuiEditor_Dialog_DeleteSetup", {
|
| "header": "Delete setup",
|
| "text": text,
|
| "callback": function() {
|
| v_viewmodel.deleteSetup(value, setupDeleted);
|
| }
|
| });
|
| dialog.open();
|
| }
|
|
|
| function switchSetup() {
|
| function gotSetupName(p_setup) {
|
| v_this.toggleButtons(false);
|
| v_viewmodel.switchSetup(p_setup,
|
| function callback(ok) {
|
| if (!ok) {
|
| alert("Loading setup failed");
|
| }
|
| v_this.updateSetupName();
|
| v_focused_obj = undefined;
|
| v_viewContentEditorView.applicationFocused();
|
| }
|
| );
|
| }
|
|
|
| function optionsArrived(options) {
|
| var dialog = new ChoiceDialogWithButton(v_viewId, "GuiEditor_Dialog_LoadSetup", {
|
| "header": "Select setup",
|
| "text": "Please select a setup from the table below.",
|
| "choices": options,
|
| "callback": gotSetupName,
|
| "buttonHandler": deleteSetup,
|
| "buttonText": "X",
|
| "buttonStyle": "color: red;",
|
| "closeOnButtonPress": true,
|
| "searchFunction": v_viewmodel.globalSetupSearch
|
| });
|
| dialog.open();
|
| }
|
|
|
| v_viewmodel.listSetups(optionsArrived);
|
| }
|
|
|
| function saveSetup(p_callback) {
|
| function setupSaved(ok) {
|
| if (!ok) {
|
| alert("Failed to save setup " + v_viewmodel.getSetupName());
|
| }
|
| if (p_callback != undefined && typeof p_callback == "function") {
|
| p_callback(ok);
|
| }
|
| v_this.toggleButtons(true);
|
| }
|
|
|
| if (v_viewmodel.isSaveable()) {
|
| v_this.toggleButtons(false);
|
| v_viewmodel.saveSetup(setupSaved);
|
| } else {
|
| saveSetupAs(p_callback);
|
| }
|
| }
|
|
|
| function saveSetupAs(p_callback) {
|
| var newSetupName;
|
|
|
| function setupSaved(ok) {
|
| if (!ok) {
|
| alert("Failed to save setup " + newSetupName);
|
| }
|
| v_this.updateSetupName();
|
| if (p_callback != undefined && typeof p_callback == "function") {
|
| p_callback(ok);
|
| }
|
| v_this.toggleButtons(true);
|
| }
|
|
|
| function gotSetupName(value) {
|
| newSetupName = value;
|
| v_viewmodel.setupExists(newSetupName, function(exists) {
|
| if (exists) {
|
| var confirmDialog = new ConfirmationDialog(v_viewId, "GuiEditor_Dialog_OverWrite", {
|
| "header": "Already exists",
|
| "text": "Overwrite directory?",
|
| "callback": function() {
|
| v_this.toggleButtons(false);
|
| v_viewmodel.saveSetupAs(newSetupName, setupSaved);
|
| }
|
| });
|
| confirmDialog.open();
|
| } else {
|
| v_this.toggleButtons(false);
|
| v_viewmodel.saveSetupAs(newSetupName, setupSaved);
|
| }
|
| });
|
| }
|
|
|
| var date = new Date();
|
| var dialog = new InputDialog(v_viewId, "GuiEditor_Dialog_SaveSetupAs", {
|
| "header": "Save Setup As...",
|
| "text": "Please enter the name of the setup.<br/>The name should only con­tain upper and lower case eng­lish let­ters, num­bers, under­scores, dots and dashes. The length is also capped at max 32 char­ac­ters.",
|
| "defaultValue": "Setup_" + date.getFullYear() + "-" + mpad((date.getMonth() + 1), 2) + "-" + mpad(date.getDate(), 2) + "_" + mpad(date.getHours(), 2) + "-" + mpad(date.getMinutes(), 2) + "-" + mpad(date.getSeconds(), 2),
|
| "validator": function(value) {
|
| var error = "";
|
| var pattern = /^([A-Za-z0-9-_.])+$/;
|
| if (!pattern.test(value))
|
| error += "Setup name can only con­tain upper and lower case eng­lish let­ters, num­bers, under­scores, dots and dashes!";
|
| if (error.length > 0)
|
| error += "<br/>";
|
| if (value.length > 132)
|
| error += "Setup name is too long (max. 132 char­ac­ters allo­wed)!";
|
| return error;
|
| },
|
| "callback": gotSetupName
|
| });
|
|
|
| dialog.open();
|
| }
|
|
|
| function showData() {
|
| $("#GuiEditor_InfoArea").val(v_viewmodel.getJsonRepresentation());
|
| }
|
|
|
| function exportChartRequest() {
|
| function chartRequestExported() {
|
| $("#GuiEditor_Button_ExportChartData").prop("disabled", false).css("color", "");
|
| }
|
|
|
| $("#GuiEditor_Button_ExportChartData").prop("disabled", true).css("color", "red");
|
| v_viewmodel.exportChartRequest(chartRequestExported);
|
| }
|
|
|
| function changeApplication() {
|
| function gotApplicationName(p_application) {
|
| v_viewmodel.setEditedApp(p_application, function() {
|
| newSetup();
|
| });
|
| }
|
|
|
| function optionsArrived(options) {
|
| var dialog = new ChoiceDialog(v_viewId, "GuiEditor_Dialog_SetApplication", {
|
| "header": "Select application",
|
| "text": "Please select an application from the table below.",
|
| "choices": options,
|
| "callback": gotApplicationName
|
| });
|
| dialog.open();
|
| }
|
|
|
| v_viewmodel.listEditableApps(optionsArrived);
|
| }
|
|
|
| ///////////////////// USEFUL FUNCTION FOR VIEWS //////////////////////////////
|
|
|
| this.toggleButtons = function(on) {
|
| $(".GuiEditor_Button_Left").prop("disabled", !on);
|
| $(".GuiEditor_Button_Right").prop("disabled", !on);
|
| };
|
|
|
| this.setFocusedObj = function(p_object) {
|
| if (v_focused_obj != undefined) {
|
| v_focused_obj.setDefaultZidx();
|
| }
|
| if (p_object != undefined) {
|
| p_object.setZidx();
|
| }
|
| v_focused_obj = p_object;
|
| };
|
|
|
| this.updateSetupName = function() {
|
| var config = v_viewmodel.getAppConfig();
|
| if (config.lastEditedApp != undefined) {
|
| document.getElementById("GuiEditor_AppNameLabel").innerHTML = config.lastEditedApp;
|
| } else {
|
| document.getElementById("GuiEditor_AppNameLabel").innerHTML = "... undefined application ...";
|
| }
|
| if (config.lastEditedSetup != undefined) {
|
| document.getElementById("GuiEditor_SetupNameLabel").innerHTML = config.lastEditedSetup;
|
| } else {
|
| document.getElementById("GuiEditor_SetupNameLabel").innerHTML = "... unsaved setup ...";
|
| }
|
| };
|
|
|
| ///////////////////// HISTORY //////////////////////////////
|
|
|
| function HistoryElement(index, element) {
|
| var v_index = index;
|
| this.text = element.text;
|
| this.callback = function() {
|
| if (v_index != v_viewmodel.getCurrentPositionInHistory()) {
|
| v_viewmodel.rewind(v_index);
|
| }
|
| };
|
| }
|
|
|
| function HistoryClass(history) {
|
| var v_history = history;
|
| this.getMenuElements = function() {
|
| var contextItems = [];
|
| for (var i = 0; i < v_history.length; ++i) {
|
| contextItems.unshift(new HistoryElement(i, v_history[i]));
|
| }
|
| return contextItems;
|
| };
|
| }
|
|
|
| function showHistory(event) {
|
| v_viewmodel.historyEnabled(false);
|
| var history = v_viewmodel.getHistory();
|
| var contextMenuViewmodel = new HistoryClass(history);
|
| var contextParentId = "GuiEditor_Buttonbar";
|
| var contextId = "GuiEditor_History";
|
| var customDataForContextMenu = {
|
| "offset": $(this).offset()
|
| };
|
| var contextMenu = new CView_ContextMenu([contextMenuViewmodel], contextId, contextParentId, customDataForContextMenu);
|
| contextMenu.applicationCreated();
|
| $("#" + contextId).on("remove", function() {
|
| v_viewmodel.historyEnabled(true);
|
| });
|
| $($("#" + contextId + " li")[history.length - v_viewmodel.getCurrentPositionInHistory() - 1]).css("color", "green");
|
| $("#" + contextId + " li").css("padding-left", "65px");
|
| $("#" + contextId + " li").css("background-color", "rgba(197,197,197,0.9)");
|
| }
|
| }
|
| //# sourceURL=GuiEditor\Views\View.js
|