http://git-wip-us.apache.org/repos/asf/stratos/blob/0251ad3a/components/org.apache.stratos.manager.console/console/themes/theme0/js/custom/applications_group_editor.js ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.manager.console/console/themes/theme0/js/custom/applications_group_editor.js b/components/org.apache.stratos.manager.console/console/themes/theme0/js/custom/applications_group_editor.js new file mode 100644 index 0000000..3c81c5f --- /dev/null +++ b/components/org.apache.stratos.manager.console/console/themes/theme0/js/custom/applications_group_editor.js @@ -0,0 +1,479 @@ +// repaint +function Repaint(){ + $("#whiteboard").resize(function(){ + jsPlumb.repaintEverything(); + }); +} +// drag +function DragEl(el){ + jsPlumb.draggable($(el) ,{ + containment:"#whiteboard" + }); +} + + +// JsPlumb Config +var color = "gray", + exampleColor = "#00f", + arrowCommon = { foldback:0.7, fillStyle:color, width:14 }; + +jsPlumb.importDefaults({ + Connector : [ "Bezier", { curviness:63 } ], + /*Overlays: [ + [ "Arrow", { location:0.7 }, arrowCommon ], + ]*/ +}); + + +var nodeDropOptions = { + activeClass:"dragActive" +}; + +var bottomConnectorOptions = { + endpoint:"Rectangle", + paintStyle:{ width:25, height:21, fillStyle:'#666' }, + isSource:true, + connectorStyle : { strokeStyle:"#666" }, + isTarget:false, + maxConnections:20 +}; + +var endpointOptions = { + isTarget:true, + endpoint:"Dot", + paintStyle:{ + fillStyle:"gray" + }, + dropOptions: nodeDropOptions, + maxConnections:1 +}; + +var groupOptions = { + isTarget:true, + endpoint:"Dot", + paintStyle:{ + fillStyle:"gray" + }, + dropOptions: nodeDropOptions, + maxConnections:1 +}; + +var generatedCartridgeEndpointOptions = { + isTarget:false, + endpoint:"Dot", + paintStyle:{ + fillStyle:"gray" + }, + dropOptions: '', + maxConnections:1 +}; + +var generatedGroupOptions = { + isTarget:false, + endpoint:"Dot", + paintStyle:{ + fillStyle:"gray" + }, + dropOptions: nodeDropOptions, + maxConnections:1 +}; + +jsPlumb.ready(function() { + //create application level block + jsPlumb.addEndpoint('group-base', { + anchor:"BottomCenter" + }, bottomConnectorOptions); +}); + +var cartridgeCounter=0; +//add cartridge to editor +function addJsplumbCartridge(idname, cartridgeCounter) { + + var Div = $('<div>').attr({'id':cartridgeCounter+'-'+idname, 'data-type':'cartridge', 'data-ctype':idname } ) + .text(idname) + .appendTo('#whiteboard'); + $(Div).addClass('stepnode'); + jsPlumb.addEndpoint($(Div), { + anchor: "TopCenter" + }, endpointOptions); + DragEl($(Div)); + Repaint(); +} + +//add group to editor +function addJsplumbGroup(cartridgeCounter) { + + var div = $('<div>').attr({'id':cartridgeCounter+'-group','data-type':'group','data-ctype':''}) + .text('Group') + .addClass('input-false') + .addClass('stepnode') + .appendTo('#whiteboard'); + $(div).append('<div class="notification"><i class="fa fa-exclamation-circle fa-2x"></i></div>'); + jsPlumb.addEndpoint($(div), { + anchor:"BottomCenter" + }, bottomConnectorOptions); + + jsPlumb.addEndpoint($(div), { + anchor: "TopCenter" + }, groupOptions); + DragEl($(div)); + Repaint(); +} + +//create cartridge list +var cartridgeListHtml=''; +function generateCartridges(data){ + if(data.length == 0){ + cartridgeListHtml = 'No Cartridges found..'; + }else{ + for(var cartridge in data){ + var cartridgeData = data[cartridge]; + cartridgeListHtml += '<div class="block-cartridge" ' + + 'data-info="'+cartridgeData.description+ '"'+ + 'data-toggle="tooltip" data-placement="bottom" title="Single Click to view details. Double click to add"'+ + 'id="'+cartridgeData.type+'">' + + cartridgeData.displayName+ + '</div>' + } + } + + //append cartridge into html content + $('#cartridge-list').append(cartridgeListHtml); +} + +//node positioning algo with dagre js +function dagrePosition(){ + // construct dagre graph from JsPlumb graph + var g = new dagre.graphlib.Graph(); + g.setGraph({ranksep:'80'}); + g.setDefaultEdgeLabel(function() { return {}; }); + var nodes = $(".stepnode"); + + for (var i = 0; i < nodes.length; i++) { + var n = nodes[i]; + g.setNode(n.id, {width: 52, height: 52}); + } + var edges = jsPlumb.getAllConnections(); + for (var i = 0; i < edges.length; i++) { + var c = edges[i]; + g.setEdge(c.source.id,c.target.id ); + } + // calculate the layout (i.e. node positions) + dagre.layout(g); + + // Applying the calculated layout + g.nodes().forEach(function(v) { + $("#" + v).css("left", g.node(v).x + "px"); + $("#" + v).css("top", g.node(v).y + "px"); + }); + jsPlumb.repaintEverything(); +} + +function genGroupJSON(collector, connections){ + //generate raw data tree from connections + var collector = collector || {}; + + var rawtree = []; + + //get base-node data + var groupBase = $('#group-base').attr('data-generated'); + if(groupBase){ + var groupBaseJSON = JSON.parse(decodeURIComponent(groupBase)); + collector = groupBaseJSON; + } + //create empty nodes for group and cartridges + collector['groups']=[]; + collector['cartridges']=[]; + + $.each(connections, function (idx, connection) { + var dataType = $('#'+connection.targetId).attr('data-type'); + var dataGenerated = $('#'+connection.targetId).attr('data-generated'); + var jsonContent; + if(dataGenerated != undefined){ + var jsonContent = JSON.parse(decodeURIComponent(dataGenerated)); + }else{ + + var jsonContent = {cname: $('#'+connection.targetId).attr('data-ctype')}; + } + rawtree.push({ + parent: connection.sourceId, + content: jsonContent, + dtype: dataType, + id: connection.targetId + }); + + }); + + //generate heirache by adding json and extra info + var nodes = []; + var toplevelNodes = []; + var lookupList = {}; + + for (var i = 0; i < rawtree.length; i++) { + var n = rawtree[i].content; + if(rawtree[i].dtype == 'cartridge'){ + n.id = rawtree[i].id; + n.parent_id = ((rawtree[i].parent == 'group-base') ? 'group-base': rawtree[i].parent); + n.dtype =rawtree[i].dtype; + }else if(rawtree[i].dtype == 'group'){ + n.id = rawtree[i].id; + n.parent_id = ((rawtree[i].parent == 'group-base') ? 'group-base': rawtree[i].parent); + n.dtype =rawtree[i].dtype; + n.groups = []; + n.cartridges =[]; + } + + lookupList[n.id] = n; + nodes.push(n); + + if (n.parent_id == 'group-base' && rawtree[i].dtype == 'cartridge') { + collector['cartridges'].push(n.cname); + }else if(n.parent_id == 'group-base' && rawtree[i].dtype == 'group'){ + collector['groups'].push(n); + } + + } + + //merge any root level stuffs + for (var i = 0; i < nodes.length; i++) { + var n = nodes[i]; + if (!(n.parent_id == 'group-base') && n.dtype == 'cartridge') { + lookupList[n.parent_id]['cartridges'] = lookupList[n.parent_id]['cartridges'].concat([n.cname]); + }else if(!(n.parent_id == 'group-base') && n.dtype == 'group'){ + lookupList[n.parent_id]['groups'] = lookupList[n.parent_id]['groups'].concat([n]); + } + } + + //cleanup JSON, remove extra items added to object level + function traverse(o) { + for (var i in o) { + if(i == 'id' || i == 'parent_id' || i == 'dtype'){ + delete o[i]; + }else if(i == 'groups' && o[i].length == 0){ + delete o[i]; + } + if (o[i] !== null && typeof(o[i])=="object") { + //going on step down in the object tree!! + traverse(o[i]); + } + } + } + + traverse(collector); + + return collector; + +} + + +var groupBlockTemplate = { + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "root", + "title":" ", + "type": "object", + "options": { + "disable_properties": true, + "disable_collapse": true + }, + "properties": { + "name": { + "id": "root/name", + "type": "string", + "title": "Group Name: " + }, + "isGroupScalingEnabled": { + "id": "root/isGroupScalingEnabled", + "type": "boolean", + "title": "Is Group Scaling Enabled: " + }, + "dependencies": { + "id": "root/dependencies", + "type": "object", + "title": "Dependencies: ", + "options": { + "disable_properties": true + }, + "properties": { + "startupOrders": { + "id": "root/dependencies/startupOrders", + "type": "array", + "title": "Startup Orders: ", + "items": { + "id": "root/dependencies/startupOrders/0", + "type": "string" + } + }, + "scalingDependants": { + "id": "root/dependencies/scalingDependants", + "type": "array", + "title": "Scaling Dependants: ", + "items": { + "id": "root/dependencies/scalingDependants/0", + "type": "string" + } + }, + "terminationBehaviour": { + "id": "root/dependencies/terminationBehaviour", + "type": "string", + "title": "Termination Behaviour: ", + "enum": ["terminate-none","terminate-dependents","terminate-all"] + }, + "required": [ + "startupOrders", + "scalingDependants", + "terminationBehaviour" + ] + } + }, + "required": [ + "name", + "isGroupScalingEnabled", + "dependencies" + ] + } +}; + +var groupBlockDefault = { + "name": "", + "isGroupScalingEnabled": "true", + "dependencies": { + "startupOrders": [ + "cartridge.type, group.name" + ], + "scalingDependants": [ + "cartridge.type, group.name" + ], + "terminationBehaviour": "terminate-all" + } +}; + +// Document ready events +$(document).ready(function(){ + + $('#deploy').on('click', function(){ + var payload = genGroupJSON({}, jsPlumb.getConnections()); + var btn = $(this); + var formtype = 'groups'; + btn.html("<i class='fa fa-spinner fa-spin'></i> Adding..."); + $.ajax({ + type: "POST", + url: caramel.context + "/controllers/applications/application_requests.jag", + dataType: 'json', + data: { "formPayload": JSON.stringify(payload), "formtype": formtype }, + success: function (data) { + if (data.status == 'error') { + var n = noty({text: data.message, layout: 'bottomRight', type: 'error'}); + } else if (data.status == 'warning') { + var n = noty({text: data.message, layout: 'bottomRight', type: 'warning'}); + } else { + var n = noty({text: data.message, layout: 'bottomRight', type: 'success'}); + } + } + }) + .always(function () { + btn.html('Add Group Definition'); + }); + + }); + + //*******************Adding JSON editor *************// + JSONEditor.defaults.theme = 'bootstrap3'; + JSONEditor.defaults.iconlib = 'fontawesome4'; + JSONEditor.defaults.show_errors = "always"; + var editor, blockId = 'group-base'; + + // Initialize the editor + editor = new JSONEditor(document.getElementById('general-data'), { + ajax: false, + disable_edit_json: true, + schema: groupBlockTemplate, + format: "grid", + startval: groupBlockDefault + }); + + DragEl(".stepnode"); + Repaint(); + + function tabData(node){ + + blockId = node.attr('id'); + var blockType = node.attr('data-type'); + var startval; + if(blockType == 'group'){ + if(node.attr('data-generated')) { + startval = JSON.parse(decodeURIComponent(node.attr('data-generated'))); + }else{ + startval = groupBlockDefault; + } + + $('#general-data').html(''); + + // Initialize the editor + editor = new JSONEditor(document.getElementById('general-data'), { + ajax: false, + disable_edit_json: true, + schema: groupBlockTemplate, + format: "grid", + startval: startval + }); + } + + } + + $('#whiteboard').on('click', '.stepnode', function(){ + tabData($(this)) + }); + + //get component JSON data + $('#component-info-update').on('click', function(){ + $('#'+blockId).attr('data-generated', encodeURIComponent(JSON.stringify(editor.getValue()))); + $('#'+blockId).removeClass('input-false'); + $('#'+blockId).find('div>i').removeClass('fa-exclamation-circle').addClass('fa-check-circle-o').css('color','#2ecc71'); + if(blockId == 'group-base'){ + $('#deploy').prop("disabled", false); + } + + }); + + //get create cartridge list + generateCartridges(cartridgeList); + + + //handle single click for cartridge + $('#cartridge-list').on('click', ".block-cartridge", function(){ + $('.description-section').html($(this).attr('data-info')); + }); + //handle double click for cartridge + $('#cartridge-list').on('dblclick', ".block-cartridge", function(){ + addJsplumbCartridge($(this).attr('id'),cartridgeCounter); + //reposition after cartridge add + dagrePosition(); + //increase global count for instances + cartridgeCounter++; + }); + + //handle single click for groups + $('#group-list').on('click', ".block-group", function(){ + + }); + //handle double click event for groups + $('#group-list').on('dblclick', ".block-group", function(){ + + addJsplumbGroup(cartridgeCounter); + //reposition after group add + dagrePosition(); + //increase global count for instances + cartridgeCounter++; + }); + + //reposition on click event on editor + $('.reposition').on('click', function(){ + dagrePosition(); + }); + +}); + +//bootstrap tooltip added +$(function () { + $('[data-toggle="tooltip"]').tooltip(); +})
http://git-wip-us.apache.org/repos/asf/stratos/blob/0251ad3a/components/org.apache.stratos.manager.console/console/themes/theme0/js/custom/applications_topology.js ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.manager.console/console/themes/theme0/js/custom/applications_topology.js b/components/org.apache.stratos.manager.console/console/themes/theme0/js/custom/applications_topology.js new file mode 100644 index 0000000..48b8700 --- /dev/null +++ b/components/org.apache.stratos.manager.console/console/themes/theme0/js/custom/applications_topology.js @@ -0,0 +1,284 @@ +//create JSON from topology +function genTree(data){ + var rawout = []; + + var rootnode ={}; + rootnode.name = data.id; + rootnode.parent = null; + //create initial root node + rawout.push(rootnode); + + //application instances + function applicationInstances(items, collector, parent){ + for(var prop in items){ + if (items.hasOwnProperty(prop)) { + var cur_name = items[prop].instanceId, + status = items[prop].status; + rawout.push({"name": cur_name, "parent": parent, "status": status}); + + clusterInstances(items[prop].clusterInstances, collector, cur_name); + groupInstances(items[prop].groupInstances, collector, cur_name) + } + } + } + + function clusterInstances(items, collector, parent){ + for(var prop in items){ + if (items.hasOwnProperty(prop)) { + var cur_name = items[prop].clusterId + items[prop].instanceId, + alias = items[prop].alias, + hostNames = items[prop].hostNames.toString(), + serviceName = items[prop].serviceName, + status = items[prop].status; + var type = 'clusters'; + rawout.push({"name": cur_name, "parent": parent, "type": type, "status": status, + "alias":alias, "hostNames": hostNames, "serviceName": serviceName + }); + clustermembers(items[prop].member, collector, cur_name) + } + } + } + + function groupInstances(items, collector, parent){ + for(var prop in items){ + if (items.hasOwnProperty(prop)) { + var cur_name = items[prop].groupId + items[prop].instanceId, + instanceId = items[prop].instanceId, + groupId = items[prop].groupId, + status = items[prop].status; + var type = 'groups'; + rawout.push({"name": cur_name, "parent": parent, "type": type, "status": status, + "groupId":groupId, "instanceId":instanceId + }); + + clusterInstances(items[prop].clusterInstances, collector, cur_name); + if(items[prop].hasOwnProperty('groupInstances')){ + groupInstances(items[prop].groupInstances, collector, cur_name) + } + + } + } + } + + function clustermembers(items, collector, parent){ + for(var prop in items){ + if (items.hasOwnProperty(prop)) { + var cur_name = items[prop].memberId, + defaultPrivateIP = items[prop].defaultPrivateIP, + defaultPublicIP = items[prop].defaultPublicIP, + networkPartitionId = items[prop].networkPartitionId, + partitionId = items[prop].partitionId, + status = items[prop].status; + var type = 'members'; + rawout.push({"name": cur_name, "parent": parent, "type": type, "status": status, + "defaultPrivateIP":defaultPrivateIP, "defaultPublicIP":defaultPublicIP, + "networkPartitionId":networkPartitionId, "partitionId":partitionId + }); + } + } + } + + //getting execution logic + applicationInstances(data.applicationInstances, rawout, data.id); + + //generate tree from raw data + var data = rawout; + //data mapping with d3js tree + var dataMap = data.reduce(function (map, node) { + map[node.name] = node; + return map; + }, {}); + var treeData = []; + data.forEach(function (node) { + // add to parent + var parent = dataMap[node.parent]; + if (parent) { + // create child array if it doesn't exist + (parent.children || (parent.children = [])) + // add node to child array + .push(node); + } else { + // parent is null or missing + treeData.push(node); + } + }); + + return treeData[0]; +} + +function update(source) { + + // ************** Generate the tree diagram ***************** + var margin = {top: 40, right: 120, bottom: 20, left: 120}, + width = 960 - margin.right - margin.left, + height = 900 - margin.top - margin.bottom; + + var i = 0; + + var tree = d3.layout.tree() + .separation(function(a, b) { return ((a.parent == source) && (b.parent == source)) ? 5 : 4; }) + .size([height+100, width]); + + var diagonal = d3.svg.diagonal() + .projection(function (d) { + return [d.x, d.y]; + }); + function redraw() { + svg.attr("transform", + "translate(" + d3.event.translate + ")" + + " scale(" + d3.event.scale + ")"); + } + + var svg = d3.select(".application-topology").append("svg") + .attr("width", width + margin.right + margin.left) + .attr("height", height + margin.top + margin.bottom) + .call(d3.behavior.zoom().on("zoom", redraw)) + .append("g"); + + var i = 0; + duration = 750; + + // Compute the new tree layout. + var nodes = tree.nodes(source).reverse(), + links = tree.links(nodes); + + // Normalize for fixed-depth. + nodes.forEach(function (d) { + d.y = d.depth * 100; + }); + + // Declare the nodes⦠+ var node = svg.selectAll("g.node") + .data(nodes, function (d) { + return d.id || (d.id = ++i); + }); + + // Enter the nodes. + var nodeEnter = node.enter().append("g") + .attr("class", "node") + .attr("transform", function (d) { + return "translate(" + d.x + "," + d.y + ")"; + }) + // add tool tip for ps -eo pid,ppid,pcpu,size,comm,ruser,s + .on("mouseover", function (d) { + div.transition() + .duration(200) + .style("opacity", .9); + + if (d.type == 'clusters') { + div.html( + "<strong>Cluster Id: </strong>" + d.name + "<br/>" + + "<strong>Cluster Alias: </strong>" + d.alias + "<br/>" + + "<strong>HostNames: </strong>" + d.hostNames + "<br/>" + + "<strong>Service Name: </strong>" + d.serviceName + "<br/>" + + "<strong>Status: </strong>" + d.status + ).style("left", (d3.event.pageX) + "px") + .style("top", (d3.event.pageY - 28) + "px"); + } else if (d.type == 'members') { + div.html( + "<strong>Member Id: </strong>" + d.name + "<br/>" + + "<strong>Default Private IP: </strong>" + d.defaultPrivateIP + "<br/>" + + "<strong>Default Public IP: </strong>" + d.defaultPublicIP + "<br/>" + + "<strong>Network Partition Id: </strong>" + d.networkPartitionId + "<br/>" + + "<strong>Partition Id: </strong>" + d.partitionId + "<br/>" + + "<strong>Status: </strong>" + d.status + ).style("left", (d3.event.pageX) + "px") + .style("top", (d3.event.pageY - 28) + "px"); + } else if (d.type == 'groups') { + div.html( + "<strong>Group Instance Id: </strong>" + d.instanceId + "<br/>" + + "<strong>Status: </strong>" + d.status + ).style("left", (d3.event.pageX) + "px") + .style("top", (d3.event.pageY - 28) + "px"); + } else { + div.html( + "<strong>Alias: </strong>" + d.name + "<br/>" + ).style("left", (d3.event.pageX) + "px") + .style("top", (d3.event.pageY - 28) + "px"); + } + + }) + .on("mouseout", function (d) { + div.transition() + .duration(500) + .style("opacity", 0); + }); + + nodeEnter.append("rect") + .attr("x", -15) + .attr("y", -15) + .attr("width", 30) + .attr("height", 30) + .style("fill", function (d) { + if (d.status == 'Active' || d.status == 'Activated') { + return "#1abc9c"; + } else if (d.status == 'Created') { + return "#e67e22"; + } else if (d.status == 'Inactive') { + return "#7f8c8d"; + } else if (d.status == 'Terminated') { + return "#c0392b"; + } else if (d.status == 'Terminating') { + return "#c0392b"; + }else{ + return "#CCC"; + } + }); + + nodeEnter.append("image") + .attr("xlink:href", + function (d) { + if (d.type == 'clusters') { + return "../../../themes/theme0/images/topology/cluster.png"; + } else if (d.type == 'groups') { + return "../../../themes/theme0/images/topology/group.png"; + } else if (d.type == 'members') { + return "../../../themes/theme0/images/topology/member.png"; + } else { + return "../../../themes/theme0/images/topology/application.png"; + } + }) + .attr("class", "created") + .attr("x", -16) + .attr("y", -16) + .attr("width", 32) + .attr("height", 32); + + + nodeEnter.append("text") + .attr("y", function (d) { + return d.children || d._children ? -20 : 20; + }) + .attr("dy", ".35em") + .attr("text-anchor", "middle") + .text(function (d) { + if(d.type == 'members') { + return ''; + }else if(d.type == 'clusters') { + return d.alias; + }else if(d.type == 'groups'){ + return d.groupId; + }else{ + return d.name; + } + + }) + .style("fill-opacity", 1); + + // add the tool tip + var div = d3.select("body").append("div") + .attr("class", "tooltip") + .style("opacity", 0); + + // Declare the links⦠+ var link = svg.selectAll("path.link") + .data(links, function (d) { + return d.target.id; + }); + + // Enter the links. + link.enter().insert("path", "g") + .attr("class", "link") + .attr("d", diagonal); + +} http://git-wip-us.apache.org/repos/asf/stratos/blob/0251ad3a/components/org.apache.stratos.manager.console/console/themes/theme0/partials/applications_deploy.hbs ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.manager.console/console/themes/theme0/partials/applications_deploy.hbs b/components/org.apache.stratos.manager.console/console/themes/theme0/partials/applications_deploy.hbs index 183a841..c8a7d2e 100644 --- a/components/org.apache.stratos.manager.console/console/themes/theme0/partials/applications_deploy.hbs +++ b/components/org.apache.stratos.manager.console/console/themes/theme0/partials/applications_deploy.hbs @@ -32,7 +32,7 @@ <!-- Nav tabs --> <ul class="nav nav-tabs" role="tablist"> <li role="presentation" class="active"><a href="#general" aria-controls="general" role="tab" - data-toggle="tab">General Details</a></li> + data-toggle="tab">Application Policy</a></li> <li role="presentation"><a href="#components" aria-controls="components" role="tab" data-toggle="tab">Child Policies</a></li> @@ -41,6 +41,7 @@ <!-- Tab panes --> <div class="tab-content app-details-tab-content"> <div role="tabpanel" class="tab-pane active" id="general"> + <div id='deploy-ui'></div> <textarea id="deployjsonedit" class="form-control" autocomplete="off" style="height: 576px;"></textarea> http://git-wip-us.apache.org/repos/asf/stratos/blob/0251ad3a/components/org.apache.stratos.manager.console/console/themes/theme0/partials/applications_form.hbs ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.manager.console/console/themes/theme0/partials/applications_form.hbs b/components/org.apache.stratos.manager.console/console/themes/theme0/partials/applications_form.hbs index b2548e3..bc9008b 100644 --- a/components/org.apache.stratos.manager.console/console/themes/theme0/partials/applications_form.hbs +++ b/components/org.apache.stratos.manager.console/console/themes/theme0/partials/applications_form.hbs @@ -156,12 +156,16 @@ <div class="toggle-menu-description">{{description}} </div> <div class="list-button" style="display: none;"> + <button class="btn btn-danger btn-lg hover-delete-group" type="button" + id="{{name}}"> Delete</button> <button class="btn btn-info btn-lg hover-details" type="button" id="details_list_{{name}}" data-url="{{url ""}}/applications/groups/{{name}}/" > Details </button> </div> <div class="bottom-bar-wrapper"> <div class="bottom-bar"> + <button class="btn btn-danger btn-lg hover-delete-group" type="button" + id="{{name}}"> Delete</button> <button class="btn btn-info btn-lg hover-details" type="button" id="details_{{name}}" data-url="{{url ""}}/applications/groups/{{name}}/" > Details </button> @@ -391,6 +395,49 @@ }); }); + $('.general-table').on('click', '.hover-delete-group', function (event) { + + var payload =$(this).attr("id"); + noty({ + layout: 'bottomRight', + type: 'warning', + text: 'Are you sure you want to delete group: <strong>'+$(this).attr("id") + "</strong> ?", + buttons: [ + {addClass: 'btn btn-primary', text: 'Yes', onClick: function($noty) { + var formtype = 'deletegroups'; + $noty.close(); + + $.ajax({ + type: "POST", + url: caramel.context + "/controllers/applications/application_requests.jag", + dataType: 'json', + data: { "formPayload": payload, "formtype": formtype }, + success: function (data) { + if (data.status == 'error') { + var n = noty({text: data.message, layout: 'bottomRight', type: 'error'}); + } else if (data.status == 'warning') { + var n = noty({text: data.message, layout: 'bottomRight', type: 'warning'}); + } else { + var n = noty({text: data.message, layout: 'bottomRight', type: 'success'}); + } + window.setTimeout(function(){ + location.reload(); + }, 1000); + } + }).always(function () { + + }); + + } + }, + {addClass: 'btn btn-danger', text: 'No', onClick: function($noty) { + $noty.close(); + } + } + ] + }); + }); + $('.general-table').on('click', '.hover-undeploy', function (event) { var payload =$(this).attr("id"); http://git-wip-us.apache.org/repos/asf/stratos/blob/0251ad3a/components/org.apache.stratos.manager.console/console/themes/theme0/partials/applications_group_editor.hbs ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.manager.console/console/themes/theme0/partials/applications_group_editor.hbs b/components/org.apache.stratos.manager.console/console/themes/theme0/partials/applications_group_editor.hbs new file mode 100644 index 0000000..89a14cb --- /dev/null +++ b/components/org.apache.stratos.manager.console/console/themes/theme0/partials/applications_group_editor.hbs @@ -0,0 +1,147 @@ +<div id="centered"> + <div class="row title"> + <div class="title-main text-center"> + <h1>Create New Group</h1> + </div> + </div> + <div class='container' id='content'> + <div class='row'> + <div class='container text-center form-toolbar'> + <div class='col-md-5'> + <div class="editor-button"> + + </div> + + </div> + <div class='col-md-7'> + <button class='btn btn-info btn-lg pull-right' type='button' id='deploy' + disabled="disabled" data-form='{{formContext}}'> Add {{formTitle}}</button> + <button class='btn btn-default btn-lg pull-right button-gap' type='button' + onclick='window.location.replace(document.referrer)'> Cancel</button> + + </div> + </div> + </div> + <div class="left-side"> + <div class="components"> + <div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true"> + <div class="panel panel-default"> + <div class="panel-heading" role="tab" id="headingOne"> + <h4 class="panel-title"> + <a data-toggle="collapse" data-parent="#accordion" href="#collapseOne" + aria-expanded="true" aria-controls="collapseOne"> + Cartridges + </a> + </h4> + </div> + <div id="collapseOne" class="panel-collapse collapse in" role="tabpanel" + aria-labelledby="headingOne"> + <div class="panel-body component-section" id="cartridge-list"> + <!-- Automatic content will be added --> + </div> + </div> + </div> + <div class="panel panel-default "> + <div class="panel-heading" role="tab" id="headingTwo"> + <h4 class="panel-title"> + <a class="collapsed" data-toggle="collapse" data-parent="#accordion" href="#collapseTwo" + aria-expanded="false" aria-controls="collapseTwo"> + Group Template + </a> + </h4> + </div> + <div id="collapseTwo" class="panel-collapse collapse" role="tabpanel" + aria-labelledby="headingTwo"> + <div class="panel-body component-section" id="group-list"> + <div class="block-group">Group</div> + </div> + </div> + </div> + </div> + </div> + <div class="description" > + <div class="panel panel-default"> + <div class="panel-heading"> + <h3 class="panel-title">Information</h3> + </div> + <div class="panel-body description-section"> + + </div> + </div> + </div> + </div> + <div class="right-side"> + <div class="app-creator"> + <div class="reposition" data-toggle="tooltip" data-placement="left" title="Click to reposition nodes"> + <i class="fa fa-refresh fa-2x"></i> + </div> + <div id="whiteboard"> + <div id="group-base" class="stepnode input-false" data-type="group"> + Group + <div class="notification"><i class="fa fa-exclamation-circle fa-2x"></i></div> + </div> + </div> + + </div> + <div class="app-details"> + <div role="tabpanel app-details-tab" > + + <!-- Nav tabs --> + <ul class="nav nav-tabs" role="tablist"> + <li role="presentation" class="active"><a href="#general" aria-controls="general" role="tab" + data-toggle="tab">Group Details</a></li> + + </ul> + + <!-- Tab panes --> + <div class="tab-content app-details-tab-content"> + <div role="tabpanel" class="tab-pane active" id="general"> + <button type="button" class="btn btn-primary" id="component-info-update" >Update</button> + <div id="general-data"></div> +<!-- <div class="form-group"> + <label class="control-label" for="name">Group Name:</label> + <input type="text" class="form-control level-root" placeholder="" id="name"> + </div> + <div class="form-group"> + <label class="control-label" for="isGroupScalingEnabled">Is Group Scaling Enabled:</label> + <select class="form-control level-components" id="isGroupScalingEnabled"> + <option value="true">True</option> + <option value="false">False</option> + </select> + </div> + <div class="panel panel-default"> + <div class="panel-heading">Dependencies</div> + <div class="panel-body"> + <div class="form-group"> + <label class="control-label" for="alias">Startup Orders:</label> + <input type="text" class="form-control level-components" placeholder="" id="startupOrders"> + </div> + <div class="form-group"> + <label class="control-label" for="alias">Scaling Dependents:</label> + <input type="text" class="form-control level-components" placeholder="" id="scalingDependents"> + </div> + <div class="form-group"> + <label class="control-label" for="alias">Termination Behaviour:</label> + <select class="form-control level-components" id="terminationBehaviour"> + <option value="terminate-none">terminate-none</option> + <option value="terminate-dependents">terminate-dependents</option> + <option value="terminate-all">terminate-all</option> + </select> + </div> + </div> + </div>--> + + </div> + </div> + + </div> + </div> + </div> + </div> + +</div> + +<script> + //use for application generation; + var cartridgeList = {{{editorCartridges}}}; +</script> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/stratos/blob/0251ad3a/components/org.apache.stratos.manager.console/console/themes/theme0/partials/applications_topology.hbs ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.manager.console/console/themes/theme0/partials/applications_topology.hbs b/components/org.apache.stratos.manager.console/console/themes/theme0/partials/applications_topology.hbs index cc3bd40..737327b 100644 --- a/components/org.apache.stratos.manager.console/console/themes/theme0/partials/applications_topology.hbs +++ b/components/org.apache.stratos.manager.console/console/themes/theme0/partials/applications_topology.hbs @@ -8,10 +8,10 @@ <div class='container' id='content'> <div class='row'> <div class='container text-center form-toolbar'> - <div class='col-md-2'> + <div class='col-md-1'> <button class='btn btn-default btn-lg' type='button' onclick='window.location.replace(document.referrer)'> Back</button> </div> - <div class='col-md-10'> + <div class='col-md-11'> <button class='btn btn-info btn-lg pull-right' type='button' id='refresh' data-form=''>Refresh </button> </div> </div> @@ -24,289 +24,7 @@ </div> <script type="text/javascript"> $(document).ready(function () { - var topologydata = {{{topology_data}}}; - //create JSON from topology - function genTree(data){ - var rawout = []; - - var rootnode ={}; - rootnode.name = data.id; - rootnode.parent = null; - //create initial root node - rawout.push(rootnode); - - //application instances - function applicationInstances(items, collector, parent){ - for(var prop in items){ - if (items.hasOwnProperty(prop)) { - var cur_name = items[prop].instanceId, - status = items[prop].status; - rawout.push({"name": cur_name, "parent": parent, "status": status}); - - clusterInstances(items[prop].clusterInstances, collector, cur_name); - groupInstances(items[prop].groupInstances, collector, cur_name) - } - } - } - - function clusterInstances(items, collector, parent){ - for(var prop in items){ - if (items.hasOwnProperty(prop)) { - var cur_name = items[prop].clusterId + items[prop].instanceId, - alias = items[prop].alias, - hostNames = items[prop].hostNames.toString(), - serviceName = items[prop].serviceName, - status = items[prop].status; - var type = 'clusters'; - rawout.push({"name": cur_name, "parent": parent, "type": type, "status": status, - "alias":alias, "hostNames": hostNames, "serviceName": serviceName - }); - clustermembers(items[prop].member, collector, cur_name) - } - } - } - - function groupInstances(items, collector, parent){ - for(var prop in items){ - if (items.hasOwnProperty(prop)) { - var cur_name = items[prop].groupId + items[prop].instanceId, - instanceId = items[prop].instanceId, - groupId = items[prop].groupId, - status = items[prop].status; - var type = 'groups'; - rawout.push({"name": cur_name, "parent": parent, "type": type, "status": status, - "groupId":groupId, "instanceId":instanceId - }); - - clusterInstances(items[prop].clusterInstances, collector, cur_name); - if(items[prop].hasOwnProperty('groupInstances')){ - groupInstances(items[prop].groupInstances, collector, cur_name) - } - - } - } - } - - function clustermembers(items, collector, parent){ - for(var prop in items){ - if (items.hasOwnProperty(prop)) { - var cur_name = items[prop].memberId, - defaultPrivateIP = items[prop].defaultPrivateIP, - defaultPublicIP = items[prop].defaultPublicIP, - networkPartitionId = items[prop].networkPartitionId, - partitionId = items[prop].partitionId, - status = items[prop].status; - var type = 'members'; - rawout.push({"name": cur_name, "parent": parent, "type": type, "status": status, - "defaultPrivateIP":defaultPrivateIP, "defaultPublicIP":defaultPublicIP, - "networkPartitionId":networkPartitionId, "partitionId":partitionId - }); - } - } - } - - //getting execution logic - applicationInstances(data.applicationInstances, rawout, data.id); - - //generate tree from raw data - var data = rawout; - //data mapping with d3js tree - var dataMap = data.reduce(function (map, node) { - map[node.name] = node; - return map; - }, {}); - var treeData = []; - data.forEach(function (node) { - // add to parent - var parent = dataMap[node.parent]; - if (parent) { - // create child array if it doesn't exist - (parent.children || (parent.children = [])) - // add node to child array - .push(node); - } else { - // parent is null or missing - treeData.push(node); - } - }); - - return treeData[0]; - } - - function update(source) { - - // ************** Generate the tree diagram ***************** - var margin = {top: 40, right: 120, bottom: 20, left: 120}, - width = 960 - margin.right - margin.left, - height = 900 - margin.top - margin.bottom; - - var i = 0; - - var tree = d3.layout.tree() - .separation(function(a, b) { return ((a.parent == source) && (b.parent == source)) ? 5 : 4; }) - .size([height+100, width]); - - var diagonal = d3.svg.diagonal() - .projection(function (d) { - return [d.x, d.y]; - }); - function redraw() { - svg.attr("transform", - "translate(" + d3.event.translate + ")" - + " scale(" + d3.event.scale + ")"); - } - - var svg = d3.select(".application-topology").append("svg") - .attr("width", width + margin.right + margin.left) - .attr("height", height + margin.top + margin.bottom) - .call(d3.behavior.zoom().on("zoom", redraw)) - .append("g"); - - var i = 0; - duration = 750; - - // Compute the new tree layout. - var nodes = tree.nodes(source).reverse(), - links = tree.links(nodes); - - // Normalize for fixed-depth. - nodes.forEach(function (d) { - d.y = d.depth * 100; - }); - - // Declare the nodes⦠- var node = svg.selectAll("g.node") - .data(nodes, function (d) { - return d.id || (d.id = ++i); - }); - - // Enter the nodes. - var nodeEnter = node.enter().append("g") - .attr("class", "node") - .attr("transform", function (d) { - return "translate(" + d.x + "," + d.y + ")"; - }) - // add tool tip for ps -eo pid,ppid,pcpu,size,comm,ruser,s - .on("mouseover", function (d) { - div.transition() - .duration(200) - .style("opacity", .9); - - if (d.type == 'clusters') { - div.html( - "<strong>Cluster Id: </strong>" + d.name + "<br/>" + - "<strong>Cluster Alias: </strong>" + d.alias + "<br/>" + - "<strong>HostNames: </strong>" + d.hostNames + "<br/>" + - "<strong>Service Name: </strong>" + d.serviceName + "<br/>" + - "<strong>Status: </strong>" + d.status - ).style("left", (d3.event.pageX) + "px") - .style("top", (d3.event.pageY - 28) + "px"); - } else if (d.type == 'members') { - div.html( - "<strong>Member Id: </strong>" + d.name + "<br/>" + - "<strong>Default Private IP: </strong>" + d.defaultPrivateIP + "<br/>" + - "<strong>Default Public IP: </strong>" + d.defaultPublicIP + "<br/>" + - "<strong>Network Partition Id: </strong>" + d.networkPartitionId + "<br/>" + - "<strong>Partition Id: </strong>" + d.partitionId + "<br/>" + - "<strong>Status: </strong>" + d.status - ).style("left", (d3.event.pageX) + "px") - .style("top", (d3.event.pageY - 28) + "px"); - } else if (d.type == 'groups') { - div.html( - "<strong>Group Instance Id: </strong>" + d.instanceId + "<br/>" + - "<strong>Status: </strong>" + d.status - ).style("left", (d3.event.pageX) + "px") - .style("top", (d3.event.pageY - 28) + "px"); - } else { - div.html( - "<strong>Alias: </strong>" + d.name + "<br/>" - ).style("left", (d3.event.pageX) + "px") - .style("top", (d3.event.pageY - 28) + "px"); - } - - }) - .on("mouseout", function (d) { - div.transition() - .duration(500) - .style("opacity", 0); - }); - - nodeEnter.append("rect") - .attr("x", -15) - .attr("y", -15) - .attr("width", 30) - .attr("height", 30) - .style("fill", function (d) { - if (d.status == 'Active' || d.status == 'Activated') { - return "#1abc9c"; - } else if (d.status == 'Created') { - return "#e67e22"; - } else if (d.status == 'Inactive') { - return "#7f8c8d"; - } else if (d.status == 'Terminated') { - return "#c0392b"; - }else{ - return "#1abc9c"; - } - }); - - nodeEnter.append("image") - .attr("xlink:href", - function (d) { - if (d.type == 'clusters') { - return "../../../themes/theme0/images/topology/cluster.png"; - } else if (d.type == 'groups') { - return "../../../themes/theme0/images/topology/group.png"; - } else if (d.type == 'members') { - return "../../../themes/theme0/images/topology/member.png"; - } else { - return "../../../themes/theme0/images/topology/application.png"; - } - }) - .attr("class", "created") - .attr("x", -16) - .attr("y", -16) - .attr("width", 32) - .attr("height", 32); - - - nodeEnter.append("text") - .attr("y", function (d) { - return d.children || d._children ? -20 : 20; - }) - .attr("dy", ".35em") - .attr("text-anchor", "middle") - .text(function (d) { - if(d.type == 'members') { - return ''; - }else if(d.type == 'clusters') { - return d.alias; - }else if(d.type == 'groups'){ - return d.groupId; - }else{ - return d.name; - } - - }) - .style("fill-opacity", 1); - - // add the tool tip - var div = d3.select("body").append("div") - .attr("class", "tooltip") - .style("opacity", 0); - - // Declare the links⦠- var link = svg.selectAll("path.link") - .data(links, function (d) { - return d.target.id; - }); - - // Enter the links. - link.enter().insert("path", "g") - .attr("class", "link") - .attr("d", diagonal); - - } + var topologydata = {{{topologyData}}}; //initial generation with deafult call update(genTree(topologydata)); http://git-wip-us.apache.org/repos/asf/stratos/blob/0251ad3a/components/org.apache.stratos.manager.console/console/themes/theme0/partials/applications_view.hbs ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.manager.console/console/themes/theme0/partials/applications_view.hbs b/components/org.apache.stratos.manager.console/console/themes/theme0/partials/applications_view.hbs new file mode 100644 index 0000000..8555799 --- /dev/null +++ b/components/org.apache.stratos.manager.console/console/themes/theme0/partials/applications_view.hbs @@ -0,0 +1,25 @@ +<div id="centered"> + <div class="row title"> + <div class="title-main text-center"> + <h1>Application - {{applicationName}}</h1> + </div> + </div> + <div class='container' id='content'> + <div class='row'> + <div class='container text-center form-toolbar'> + <div class='col-md-1'><button class='btn btn-default btn-lg' type='button' onclick='window.location.replace(document.referrer)'> Back</button></div> + </div> + </div> + <div class="right-side"> + <div class="app-creator"> + <div id="whiteboard"> + + </div> + </div> + </div> + </div> + +</div> +<script> + var applicationJSON = {{{applicationJSON}}}; +</script> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/stratos/blob/0251ad3a/components/org.apache.stratos.manager.console/console/themes/theme0/partials/configure_form.hbs ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.manager.console/console/themes/theme0/partials/configure_form.hbs b/components/org.apache.stratos.manager.console/console/themes/theme0/partials/configure_form.hbs index 52e6105..7fe9149 100644 --- a/components/org.apache.stratos.manager.console/console/themes/theme0/partials/configure_form.hbs +++ b/components/org.apache.stratos.manager.console/console/themes/theme0/partials/configure_form.hbs @@ -18,7 +18,7 @@ <div class='row'> <div class='container text-center form-toolbar'> {{#if isEdit}} - <div class='col-md-4'><button class='btn btn-default btn-lg' type='button' onclick='window.location.replace(document.referrer)'> Back</button></div> + <div class='col-md-1'><button class='btn btn-default btn-lg' type='button' onclick='window.location.replace(document.referrer)'> Back</button></div> {{else}} <div class='col-md-5'> <div class="editor-button"> @@ -30,7 +30,7 @@ </div> <div class='col-md-7'> - <button class='btn btn-info btn-lg pull-right' type='button' id='deploy' data-form='{{formContext}}'> Deploy {{formTitle}}</button> + <button class='btn btn-info btn-lg pull-right' type='button' id='deploy' data-form='{{formContext}}'> Add {{formTitle}}</button> <button class='btn btn-default btn-lg pull-right button-gap' type='button' onclick='window.location.replace(document.referrer)'> Cancel</button> </div> @@ -97,18 +97,18 @@ <div class="toggle-menu-icon"> <i class="fa fa-gears "></i> </div> - <h2 class="truncate">{{groupId}} </h2> + <h2 class="truncate">{{clusterId}} </h2> <div class="toggle-menu-description">{{description}}</div> <div class="list-button" style="display: none;"> <button class="btn btn-info btn-lg hover-details" type="button" id="details_list_{{id}}" - data-url="{{url ""}}/configure/docker/{{groupId}}/" > Details + data-url="{{url ""}}/configure/docker/{{clusterId}}/" > Details </button> </div> <div class="bottom-bar-wrapper"> <div class="bottom-bar"> <button class="btn btn-info btn-lg hover-details" type="button" id="details_{{id}}" - data-url="{{url ""}}/configure/docker/{{groupId}}/" > Details + data-url="{{url ""}}/configure/docker/{{clusterId}}/" > Details </button> </div> </div> @@ -313,7 +313,7 @@ var payload = editor.getValue(); var btn = $(this); var formtype = '{{formContext}}'; - btn.html("<i class='fa fa-spinner fa-spin'></i> Deploying..."); + btn.html("<i class='fa fa-spinner fa-spin'></i> Adding..."); $.ajax({ type: "POST", url: caramel.context + "/controllers/configure/configure_requests.jag", @@ -330,7 +330,7 @@ } }) .always(function () { - btn.html('Deploy'); + btn.html('Add' + '{{formTitle}}'); }); });//end of deploy button trigger http://git-wip-us.apache.org/repos/asf/stratos/blob/0251ad3a/components/org.apache.stratos.manager.console/console/themes/theme0/partials/my_cartridges.hbs ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.manager.console/console/themes/theme0/partials/my_cartridges.hbs b/components/org.apache.stratos.manager.console/console/themes/theme0/partials/my_cartridges.hbs deleted file mode 100644 index ebf8c08..0000000 --- a/components/org.apache.stratos.manager.console/console/themes/theme0/partials/my_cartridges.hbs +++ /dev/null @@ -1,122 +0,0 @@ -<div class="row title"> - <div class="title-main text-center"> - <h1>{{content_title}}</h1> - </div> -</div> -<div class="container content"> - <div class="row text-center"> - - {{#if content_body.sections}} - <div class="row form-toolbar "> - <div class="col-md-5 col-sm-3 text-left"> - <!--<input type="text" class="form-control" placeholder="Search">--> - <div class="btn-group"> - <a href="#" id="list" class="btn btn-default"> - <i class="fa fa-list-ul"></i> List - </a> - <a href="#" id="grid" class="btn btn-default"> - <i class="fa fa-th"></i> Grid - </a> - </div> - </div> - </div> - <div class="row general-table row-overide"> - {{#each content_body.sections}} - <!--<div data-url="{{url ""}}/mycartridges/info/{{cartridgeAlias}}" class="data-url">--> - - <div class="col-md-4 block grid-group-item border-right"> - <div class="toggle-menu-icon"> - <i class="fa icon-{{cartridgeType}} fa-inbox"></i> - </div> - {{#if loadBalancer}} - <h2>{{displayName}} - {{version}}</h2> - <div class="cartridge-description">{{description}}</div> - <div class="lb-description">This will be auto subscribed for you</div> - {{else}} - <h2>{{cartridgeAlias}} ({{displayName}} - {{version}})</h2> - {{#if multiTenant}} - Multi Tenant Enabled - {{else}} - Single Tenant - {{/if}} - <div class="toggle-menu-description">{{description}}</div> - <div class="bottom-bar-wrapper"> - <div class="bottom-bar"> - <button class="btn btn-danger btn-lg hover-unsubscribe" type="button" id="unsubscribe_{{cartridgeAlias}}" - data-cartridge="{{cartridgeAlias}}" > Unsubscribe - </button> - <button class="btn btn-info btn-lg hover-details" type="button" id="details_{{cartridgeAlias}}" - data-url="{{url ""}}/mycartridges/info/{{cartridgeAlias}}" > Details - </button> - - - </div> - </div> - {{/if}} - </div> - <!--</div>--> - {{/each}} - - </div> - - {{else}} - <div class="row no-item row-overide"> - <div class="row title"> - <h2>No Cartridge found..</h2> - <a type="button" class="btn btn-primary btn-lg" href="{{url ""}}/cartridges/">Subscribe to Cartridge</a> - </div> - </div> - {{/if}} - </div> -</div> - -<script> - $(document).ready(function () { - - $('.general-table .grid-group-item').hover(function () { - $(this).find('.bottom-bar').stop().animate({bottom: '37px'}, 'slow'); - }, function () { - $(this).find('.bottom-bar').stop().animate({bottom: '-32px'}, 'slow'); - }); - - $('.general-table').on('click', '.hover-details', function (event) { - window.location = $(this).attr("data-url"); - }); - - $('.general-table').on('click', '.hover-unsubscribe', function (event) { - var cartridge_name = $(this).attr("data-cartridge"); - noty({ - text: 'Are you sure want to unsubscribe from cartridge <strong><i>'+ cartridge_name+'</i></strong> ?', - layout: 'bottomRight', - buttons: [ - {addClass: 'btn btn-primary', text: 'YES', onClick: function($noty) { - $noty.close(); - $.ajax({ - type: "POST", - url: caramel.context + "/controllers/cartridges/unsubscription_requests.jag", - dataType: 'json', - data: { "cartridge_name":cartridge_name}, - success: function (data) { - if (data.status == 'error') { - var n = noty({text: data.message, layout: 'bottomRight', type: 'error'}); - } else if (data.status == 'warning') { - var n = noty({text: data.message, layout: 'bottomRight', type: 'warning'}); - } else { - var n = noty({text: data.message, layout: 'bottomRight', type: 'success'}); - location.reload(); - } - } - }) - } - }, - {addClass: 'btn btn-danger', text: 'NO', onClick: function($noty) { - $noty.close(); - } - } - ] - }); - }); - - }); - -</script> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/stratos/blob/0251ad3a/components/org.apache.stratos.manager.console/console/themes/theme0/partials/my_cartridges_info.hbs ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.manager.console/console/themes/theme0/partials/my_cartridges_info.hbs b/components/org.apache.stratos.manager.console/console/themes/theme0/partials/my_cartridges_info.hbs deleted file mode 100644 index 8db8a05..0000000 --- a/components/org.apache.stratos.manager.console/console/themes/theme0/partials/my_cartridges_info.hbs +++ /dev/null @@ -1,22 +0,0 @@ -<div class="row title"> - <div class="title-main text-center"> - <h1>{{content_title}}</h1> - </div> -</div> -<div class="container content"> - <div class="row text-center"> - <div class='container text-center form-toolbar'> - <div class='col-md-5'> - <button class='btn btn-default btn-lg pull-left button-gap' type='button' onclick='window.location.replace(document.referrer)'> Back</button> - </div> - <div class='col-md-7'> - </div> - </div> - <div class="row general-table row-overide"> - <table class="table"> - {{{content_body.myCartridgeInfo}}} - </table> - </div> - - </div> -</div> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/stratos/blob/0251ad3a/components/org.apache.stratos.manager.console/console/themes/theme0/partials/users_form.hbs ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.manager.console/console/themes/theme0/partials/users_form.hbs b/components/org.apache.stratos.manager.console/console/themes/theme0/partials/users_form.hbs index 9325ec1..026391b 100644 --- a/components/org.apache.stratos.manager.console/console/themes/theme0/partials/users_form.hbs +++ b/components/org.apache.stratos.manager.console/console/themes/theme0/partials/users_form.hbs @@ -3,7 +3,7 @@ <div class="row title"> <div class="title-main text-center"> {{#if isForm}} - <h1>Add new {{formTitle}}</h1> + <h1>Add New {{formTitle}}</h1> {{else}} <h1>{{formTitle}}</h1> {{/if}} @@ -15,7 +15,7 @@ <div class='container text-center form-toolbar'> <div class='col-md-5'></div> <div class='col-md-7 '> - <button class='btn btn-info btn-lg pull-right' type='button' id='deploy' data-form=''> Add {{formContext}}</button> + <button class='btn btn-info btn-lg pull-right' type='button' id='deploy' data-form=''> Add New {{formTitle}}</button> <button class='btn btn-default btn-lg pull-right button-gap' type='button' onclick='window.location.replace(document.referrer)'> Cancel </button> </div> @@ -34,7 +34,7 @@ {{else}} <div class="row title"> <div class="title-main text-center"> - <h1>{{formTitle}}</h1> + <h1>{{formTitle}}s</h1> </div> </div> <div class="container content"> @@ -101,7 +101,7 @@ </div> <h2>{{tenantDomain}} </h2> - <div class="toggle-menu-description">{{email}} - {{createdDate}} </div> + <div class="toggle-menu-description">{{email}} - {{#UnixConvert createdDate}}{{/UnixConvert}} </div> </div> {{/each}} {{/ifCond}} @@ -142,7 +142,13 @@ editor.on('change', function () { // Get an array of errors from the validator var errors = editor.validate(); - // var indicator = document.getElementById('valid_indicator'); + if (errors.length) { + for (var i = 0; i < errors.length; i++) { + var n = noty({text: errors[i].message + ' in ' + errors[i].path, layout: 'bottomRight', + type: 'error', timeout: 2000}); + } + + } }); {{else}} @@ -222,7 +228,7 @@ } }) .always(function () { - btn.html('Add '+formtype); + btn.html('Add New '+formtype); }); });//end of deploy button trigger
