
From: samhenri <samuel.guimaraes@eldorado.org.br> Signed-off-by: samhenri <samuel.guimaraes@eldorado.org.br> --- .../kimchi/ui/css/theme-default/network.css | 267 --------------------- src/wok/plugins/kimchi/ui/js/src/kimchi.network.js | 72 +++--- src/wok/plugins/kimchi/ui/pages/network.html.tmpl | 185 ++++++++------ 3 files changed, 139 insertions(+), 385 deletions(-) delete mode 100644 src/wok/plugins/kimchi/ui/css/theme-default/network.css diff --git a/src/wok/plugins/kimchi/ui/css/theme-default/network.css b/src/wok/plugins/kimchi/ui/css/theme-default/network.css deleted file mode 100644 index fc8a24f..0000000 --- a/src/wok/plugins/kimchi/ui/css/theme-default/network.css +++ /dev/null @@ -1,267 +0,0 @@ -/* - * Project Kimchi - * - * Copyright IBM, Corp. 2013-2015 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -.network { - margin: 5px; -} - -.network .grid-control { - height: 40px; - padding: 5px 0; -} - -.network .grid-control .filter { - width: 300px; - padding: 5px; - float: right; -} - -.network .list .column-name { - width: 20%; - max-width: 20%; - text-overflow: ellipsis; -} - -.network .list .column-state { - width: 10%; -} - -.network .list .column-type { - width: 15%; -} - -.network .list .column-interface { - width: 15%; -} - -.network .list .column-space { - width: 25%; -} - -.network .list .column-action { - display: inline-block; - float: right; - height: 40px; -} - -.network .list .hide-action-item { - display: none; -} - -.network .list .menu-container { - display: none; - top: 58px; -} - -.network .list .action-button { - float: right; - margin-top: 2px; - margin-left: 5px; -} - -.network .list .action-button-icon { - background: url("../images/theme-default/arrow-down-black.png") no-repeat - scroll center center transparent; -} - -.network .list .ui-state-disabled { - margin: 0px; -} - -.network .list .network-state { - display: inline-block; - height: 16px; - width: 16px; - border-radius: 8px; - margin-left: 10px; -} - -.network .list .nw-loading { - background: #c0c0c0 url(../images/theme-default/loading.gif) - center no-repeat; -} - -.network .list .up { - background: linear-gradient(to bottom, #BFD255 0%, #8EB92A 50%, - #72AA00 51%, #9ECB2D 100%) repeat scroll 0 0 transparent; -} - -.network .list .down { - background: linear-gradient(to bottom, #AFAFAF 0%, #AFAFAF 50%, - #AFAFAF 51%, #AFAFAF 100%) repeat scroll 0 0 transparent; -} - -.network-config { - font-family: Arial; - font-size: 12px; - margin-bottom: 40px; - display: none; -} - -.network-config .section-container { - margin-top: 20px; -} - -.network-config .section-container:first-child { - margin-top: 10px; -} - -.network-config .section-container:last-child { - height: 200px; -} - -.network-config .section-container .bridged-inline { - display: inline-block; - vertical-align: top; - max-width: 520px; -} - -.network-config .section-header { - font-size: 14px; - font-weight: lighter; -} - -.network-config .section-content { - margin-top: 10px; -} - -.network-config input[type="text"] { - border: 1px solid #CCCCCC; - font-size: 16px; - height: 30px; - width: 300px; - line-height: 30px; - padding: 0 5px; -} - -.network-config input.invalid-field[type="text"] { - border-color: #FF4444; -} - -.network-config input.invalid-field[type="text"][disabled] { - border-color: #666666; -} - -.network-config input[type="radio"] { - margin-right: 5px; - margin-top: 0px; -} - -.network-config select { - color: #666666; - border: solid 1px; - background-color: white; - padding: 3px 4px 3px 0; -} - -.network-config .input-container { - height: 20px; -} - -.network-config label { - vertical-align: top; -} - -.network-type-wrapper-controls input[type="text"] { - height: 38px; - line-height: 38px; - background: #fff; - -webkit-border-radius: 5px; - border-radius: 5px; - box-shadow: 2px 2px 2px #eee inset; - border-top: 1px solid #bbb; - border-left: 1px solid #bbb; - padding: 0 10px; - margin-top: 5px; - width: 50px; -} - -.network-type-wrapper-controls > .dropdown { - margin: 5px 0 0 1px; - width: 180px; -} - -.network-type-wrapper-controls input[type="text"][disabled] { - color: #bbb; - background-color: #fafafa; - cursor: not-allowed; -} - -.network-type-wrapper-controls span[type="text"] { - padding: 0 10px; -} - -.bridge-option-column { - display: inline-block; - vertical-align: middle; -} - -.bridge-option-column label { - margin-left: 42px; -} - -.network-type-wrapper-controls { - width: 80px; - display: inline-block; - vertical-align: top; - padding: 5px 5px 5px 22px; -} - -#enableVlan { - margin-left: 42px; - vertical-align: middle; -} - -#labelEnableVlan { - vertical-align: middle; -} - -#labelNetworkVlanID { - margin-left: 42px; - vertical-align: middle; - display: none; -} - -#networkVlanID { - width: 80px; - vertical-align: middle; - display: none; -} - -.network-config .input-hint-icon { - margin: -1px 1px 0 0; - display: inline-block; -} - -.network-config .input-hint { - margin-top: 3px; -} - -.network-config .input-hint-text { - color: #999999; - font-weight: lighter; - font-size: 12px; -} - -.ui-state-default a { - color: #212121; -} - -#networkConfig { - padding-left: 30px; -} diff --git a/src/wok/plugins/kimchi/ui/js/src/kimchi.network.js b/src/wok/plugins/kimchi/ui/js/src/kimchi.network.js index c43b59a..13d2cd1 100644 --- a/src/wok/plugins/kimchi/ui/js/src/kimchi.network.js +++ b/src/wok/plugins/kimchi/ui/js/src/kimchi.network.js @@ -21,7 +21,7 @@ kimchi.NETWORK_TYPE_BRIDGE = "bridged"; kimchi.initNetwork = function() { if(wok.tabMode['network'] === 'admin') { $('.tools').attr('style','display'); - $('#network-content .header span:last-child').attr('style','display'); + $('#networkGrid .wok-nw-grid-header span:last-child').attr('style','display'); kimchi.initNetworkCreation(); } kimchi.initNetworkListView(); @@ -47,9 +47,9 @@ kimchi.initNetworkListView = function() { network.persistent = data[i].persistent; kimchi.addNetworkItem(network); } - $('#networkGrid').grid({enableSorting: false}); - $('input', $('.grid-control', '#network-content')).on('keyup', function(){ - $('#networkGrid').grid('filter', $(this).val()); + $('#networkGrid').dataGrid({enableSorting: false}); + $('input', $('.grid-control', '#network-content-container')).on('keyup', function(){ + $('#networkGrid').dataGrid('filter', $(this).val()); }); }); }; @@ -59,8 +59,6 @@ kimchi.addNetworkItem = function(network) { $("#networkBody").append(itemNode); if(wok.tabMode["network"] === "admin") { $(".column-action").attr("style","display"); - } else { - $(".column-space").addClass('column-space-no-border-right'); } kimchi.addNetworkActions(network); return itemNode; @@ -77,67 +75,67 @@ kimchi.getNetworkItemHtml = function(network) { network.type = i18n["network_type_" + network.type]; } - var disable_in_use = network.in_use ? "ui-state-disabled" : ""; + var disable_in_use = network.in_use ? "disabled" : ""; var networkItem = wok.substitute($('#networkItem').html(), { name : network.name, state : network.state, type : network.type, interface: network.interface, addrSpace : network.addrSpace, - startClass : network.state === "up" ? "hide-action-item" : "", - stopClass : network.state === "down" ? "hide-action-item" : disable_in_use, + startClass : network.state === "up" ? "wok-hide-action-item" : "", + stopClass : network.state === "down" ? "wok-hide-action-item" : disable_in_use, stopDisabled : network.in_use ? "disabled" : "", - deleteClass : network.state === "up" || network.in_use ? "ui-state-disabled" : "", + deleteClass : network.state === "up" || network.in_use ? "disabled" : "", deleteDisabled: network.state === "up" || network.in_use ? "disabled" : "" }); return networkItem; }; kimchi.stopNetwork = function(network,menu) { - $(".network-state", $("#" + wok.escapeStr(network.name))).switchClass("up", "nw-loading"); - $("[nwAct='stop']", menu).addClass("ui-state-disabled"); + $(".network-state", $("#" + wok.escapeStr(network.name))).switchClass("up", "loading"); + $("[nwAct='stop']", menu).addClass("disabled"); kimchi.toggleNetwork(network.name, false, function() { - $("[nwAct='start']", menu).removeClass("hide-action-item"); - $("[nwAct='stop']", menu).addClass("hide-action-item"); - $("[nwAct='stop']", menu).removeClass("ui-state-disabled"); + $("[nwAct='start']", menu).removeClass("wok-hide-action-item"); + $("[nwAct='stop']", menu).addClass("wok-hide-action-item"); + $("[nwAct='stop']", menu).removeClass("disabled"); if (!network.in_use) { - $("[nwAct='delete']", menu).removeClass("ui-state-disabled"); + $("[nwAct='delete']", menu).removeClass("disabled"); $(":first-child", $("[nwAct='delete']", menu)).removeAttr("disabled"); } - $(".network-state", $("#" + wok.escapeStr(network.name))).switchClass("nw-loading", "down"); + $(".network-state", $("#" + wok.escapeStr(network.name))).switchClass("loading", "down"); }, function(err) { - $(".network-state", $("#" + wok.escapeStr(network.name))).switchClass("nw-loading", "up"); + $(".network-state", $("#" + wok.escapeStr(network.name))).switchClass("loading", "up"); if (!network.in_use) { - $("[nwAct='stop']", menu).removeClass("ui-state-disabled"); + $("[nwAct='stop']", menu).removeClass("disabled"); } wok.message.error(err.responseJSON.reason); }); } kimchi.addNetworkActions = function(network) { - $(".menu-container", "#" + wok.escapeStr(network.name)).menu(); + //$(".dropdown-menu", "#" + wok.escapeStr(network.name)).menu(); - $('#' + wok.escapeStr(network.name)).on('click', '.menu-container li', function(evt) { + $('#' + wok.escapeStr(network.name)).on('click', '.dropdown-menu li', function(evt) { var menu = $(evt.currentTarget).parent(); if ($(evt.currentTarget).attr("nwAct") === "start") { $(".network-state", $("#" + wok.escapeStr(network.name))).switchClass("down", "nw-loading"); - $("[nwAct='start']", menu).addClass("ui-state-disabled"); - $("[nwAct='delete']", menu).addClass("ui-state-disabled"); + $("[nwAct='start']", menu).addClass("disabled"); + $("[nwAct='delete']", menu).addClass("disabled"); $(":first-child", $("[nwAct='delete']", menu)).attr("disabled", true); kimchi.toggleNetwork(network.name, true, function() { - $("[nwAct='start']", menu).addClass("hide-action-item"); - $("[nwAct='start']", menu).removeClass("ui-state-disabled"); - $("[nwAct='stop']", menu).removeClass("hide-action-item"); + $("[nwAct='start']", menu).addClass("wok-hide-action-item"); + $("[nwAct='start']", menu).removeClass("disabled"); + $("[nwAct='stop']", menu).removeClass("wok-hide-action-item"); network.state = "up"; if (network.in_use) { - $("[nwAct='stop']", menu).addClass("ui-state-disabled"); + $("[nwAct='stop']", menu).addClass("disabled"); } $(".network-state", $("#" + wok.escapeStr(network.name))).switchClass("nw-loading", "up"); }, function(err) { $(".network-state", $("#" + wok.escapeStr(network.name))).switchClass("nw-loading","down"); - $("[nwAct='start']", menu).removeClass("ui-state-disabled"); + $("[nwAct='start']", menu).removeClass("disabled"); if (!network.in_use) { - $("[nwAct='delete']", menu).removeClass("ui-state-disabled"); + $("[nwAct='delete']", menu).removeClass("disabled"); } $(":first-child", $("[nwAct='delete']", menu)).removeAttr("disabled"); wok.message.error(err.responseJSON.reason); @@ -155,7 +153,7 @@ kimchi.addNetworkActions = function(network) { }; wok.confirm(settings, function() { kimchi.stopNetwork(network, menu); - $('#networkGrid').grid('deleteRow', $(evt.currentTarget).parents(".row")); + $('#networkGrid').dataGrid('deleteRow', $(evt.currentTarget).parents(".row")); }, null); } else { @@ -173,17 +171,13 @@ kimchi.addNetworkActions = function(network) { cancel : i18n['KCHAPI6003M'] }, function() { kimchi.deleteNetwork(network.name, function() { - $('#networkGrid').grid('deleteRow', $(evt.currentTarget).parents(".row")); + $('#networkGrid').dataGrid('deleteRow', $(evt.currentTarget).parents(".row")); }); }, null); } }); - $("#networkBody .column-action .popable").button({ - icons : { - secondary : "action-button-icon" - } - }); + //$("#networkBody .column-action .dropdown.menu-flat").button(); }; @@ -217,7 +211,7 @@ kimchi.initNetworkCreation = function() { network.interface = result.interface ? result.interface : i18n["KCHNET6001M"]; network.addrSpace = result.subnet ? result.subnet : i18n["KCHNET6001M"]; network.persistent = result.persistent; - $('#networkGrid').grid('addRow', kimchi.addNetworkItem(network)); + $('#networkGrid').dataGrid('addRow', kimchi.addNetworkItem(network)); $("#networkConfig").dialog("close"); }, function(data) { wok.message.error(data.responseJSON.reason); @@ -231,13 +225,13 @@ kimchi.initNetworkDialog = function() { buttonsObj= {}; buttonsObj['id'] = "networkFormOk"; buttonsObj['text'] = i18n.KCHAPI6005M; - buttonsObj['class'] = "btn-normal"; + buttonsObj['class'] = "btn btn-default"; buttonsObj['disabled'] = true; buttonsObj['click'] = function() { }; buttonsObjCancel= {}; buttonsObjCancel['id'] = "networkFormCancel"; buttonsObjCancel['text'] = i18n.KCHAPI6003M; - buttonsObjCancel['class'] = "btn-normal"; + buttonsObjCancel['class'] = "btn btn-default"; buttonsObjCancel['disabled'] = false; buttonsObjCancel['click'] = function() { $(this).dialog("close"); diff --git a/src/wok/plugins/kimchi/ui/pages/network.html.tmpl b/src/wok/plugins/kimchi/ui/pages/network.html.tmpl index 915feac..75721d7 100644 --- a/src/wok/plugins/kimchi/ui/pages/network.html.tmpl +++ b/src/wok/plugins/kimchi/ui/pages/network.html.tmpl @@ -29,102 +29,129 @@ <script src="plugins/kimchi/js/kimchi.min.js"></script> </head> <body> -<div class="toolbar"> - <div class="tools" style="display:none"> - <a id="networkAdd" class="btn-tool" href="javascript:void(0);"><span class="icon add">+</span></a> - </div> -</div> -<div id="network-content" class="network"> - <div class="grid-control"><input type="text" class="filter" placeholder="$_("Filter")"></div> - <div id="networkGrid" class="list"> - <div> - <span class="column-name">$_("Network Name")</span><!-- - --><span class="column-state">$_("State")</span><!-- - --><span class="column-type">$_("Network Type")</span><!-- - --><span class="column-interface">$_("Interface")</span><!-- - --><span class="column-space">$_("Address Space")</span><!-- - --><span style="display:none">$_("Actions")</span> - </div> - <div id="networkBody" class="empty-when-logged-off"></div> - </div> - <div id="networkConfig" class="network-config"> - <div class="section-container"> - <div class="section-header">1. $_("Network Name")</div> - <div class="section-content"> - <input type="text" id="networkName" /> - <div class="input-hint"> - <span class="icon-info-circled light-grey c1 help-inline"></span> - <span class="input-hint-text help-inline">$_("Name should not contain '/' and '\"'.")</span> - </div> +<div id="network-root-container"> + <nav class="navbar navbar-default toolbar"> + <div class="container"> + <!-- Brand and toggle get grouped for better mobile display --> + <div class="navbar-header"> + <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#toolbar" aria-expanded="false"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </button> + </div> + <!-- Collect the nav links, forms, and other content for toggling --> + <div class="collapse navbar-collapse" id="toolbar"> + <ul class="nav navbar-nav navbar-right tools" display="none"> + <li><a id="networkAdd" class="btn-tool" href="javascript:void(0);"><i class="fa fa-plus-circle"></i><span>Add a Network</span></a></li> + </ul> </div> </div> - <div class="section-container"> - <div class="section-header">2. $_("Network Type")</div> - <div class="section-content"> - <div class="input-container"> - <input type="radio" id="networkTypeIso" name="networkType" value="isolated" /> - <label for="networkTypeIso">$_("Isolated: no external network connection")</label> + </nav> + <div id="network-content-container"> + <div class="container"> + <div class="row grid-control"> + <div class="pull-right"> + <label for="network-filter" class="sr-only">$_("Filter"):</label> + <input type="text" class="filter form-control" placeholder="$_("Filter")"> </div> - <div class="input-container"> - <input type="radio" id="networkTypeNat" name="networkType" value="nat" /> - <label for="networkTypeNat">$_("NAT: outbound physical network connection only")</label> + </div> + <div id="networkGrid"> + <div> + <span class="column-state"><span class="sr-only">$_("State")</span></span><!-- + --><span class="column-name">$_("Network Name")</span><!-- + --><span class="column-type">$_("Network Type")</span><!-- + --><span class="column-interface">$_("Interface")</span><!-- + --><span class="column-space">$_("Address Space")</span><!-- + --><span class="column-action" style="display:none"> + <span class="sr-only">$_("Actions")</span><!-- + --></span> </div> - <div class="input-container"> - <div class="bridged-inline"> - <input type="radio" id="networkTypeBri" name="networkType" value="bridged" /> - </div> - <div class="bridged-inline"> - <label for="networkTypeBri">$_("Bridged: Virtual machines are connected to physical network directly")</label><br /> - <label id="networkBriDisabledLabel" style="display:none">$_("(No interfaces found)")</label> + <div id="networkBody" class="empty-when-logged-off"></div> + </div> + <div id="networkConfig" class="network-config"> + <div class="section-container"> + <div class="section-header">1. $_("Network Name")</div> + <div class="section-content"> + <input type="text" id="networkName" /> + <div class="input-hint"> + <span class="icon-info-circled light-grey c1 help-inline"></span> + <span class="input-hint-text help-inline">$_("Name should not contain '/' and '\"'.")</span> + </div> </div> </div> - <div id="bridgeOptions"> - <div> - <div class="bridge-option-column"> - <label for="networkInterface">$_("Destination"): </label> + <div class="section-container"> + <div class="section-header">2. $_("Network Type")</div> + <div class="section-content"> + <div class="input-container"> + <input type="radio" id="networkTypeIso" name="networkType" value="isolated" /> + <label for="networkTypeIso">$_("Isolated: no external network connection")</label> + </div> + <div class="input-container"> + <input type="radio" id="networkTypeNat" name="networkType" value="nat" /> + <label for="networkTypeNat">$_("NAT: outbound physical network connection only")</label> + </div> + <div class="input-container"> + <div class="bridged-inline"> + <input type="radio" id="networkTypeBri" name="networkType" value="bridged" /> + </div> + <div class="bridged-inline"> + <label for="networkTypeBri">$_("Bridged: Virtual machines are connected to physical network directly")</label><br /> + <label id="networkBriDisabledLabel" style="display:none">$_("(No interfaces found)")</label> + </div> </div> - <div class="bridge-option-column"> - <div class="network-type-wrapper-controls"> - <div id ="networkDestinationID"> - <input id="networkDestinationInputId" name="type" type="hidden"/> - <span id="networkDestinationLabel" type="text"></span><span class="arrow"></span> - <div> - <ul id="networkInterface"></ul> + <div id="bridgeOptions"> + <div> + <div class="bridge-option-column"> + <label for="networkInterface">$_("Destination"): </label> + </div> + <div class="bridge-option-column"> + <div class="network-type-wrapper-controls"> + <div id ="networkDestinationID"> + <input id="networkDestinationInputId" name="type" type="hidden"/> + <span id="networkDestinationLabel" type="text"></span><span class="arrow"></span> + <div> + <ul id="networkInterface"></ul> + </div> + </div> </div> </div> </div> + <div> + <input id="enableVlan" type="checkbox" value="" /> + <label for="enableVlan" id="labelEnableVlan">$_("Enable VLAN") </label> + </div> + <label for="networkVlanID" id="labelNetworkVlanID">$_("VLAN ID"): </label> + <input type="text" id="networkVlanID" class="network-label"/> + </div> </div> </div> - <div> - <input id="enableVlan" type="checkbox" value="" /> - <label for="enableVlan" id="labelEnableVlan">$_("Enable VLAN") </label> - </div> - <label for="networkVlanID" id="labelNetworkVlanID">$_("VLAN ID"): </label> - <input type="text" id="networkVlanID" class="network-label"/> - </div> </div> </div> </div> - </div> </div> <script id="networkItem" type="text/html"> - <div id='{name}' class='remove-when-logged-off'> - <span class='column-name' title="{name}" val="{name}">{name}</span><!-- - --><span class='column-state' val="{state}"><span class='network-state {state}'></span></span><!-- - --><span class='column-type' val="{type}">{type}</span><!-- - --><span class='column-interface' val="{interface}">{interface}</span><!-- - --><span class='column-space' val="{addrSpace}">{addrSpace}</span><!-- - --><span class='column-action' style="display:none"> - <span class="ui-button-secondary dropdown popable action-button"> - $_("Actions") - <ul class='popover actionsheet right-side menu-container'> - <li nwAct="start" class='{startClass}'><a class='button-big'>$_("Start")</a></li> - <li nwAct="stop" class='{stopClass}'><a {stopDisabled} class='button-big'>$_("Stop")</a></li> - <li nwAct="delete" class='{deleteClass}'><a {deleteDisabled} class='red'>$_("Delete")</a></li> - </ul> - </span> - </span> - </div> + <div id='{name}' class='wok-nw-grid-body remove-when-logged-off '> + <span class='column-state' val="{state}"><span class='network-state {state}'><i class="fa fa-power-off"></i><span class="wok-nw-loading-icon"></span></span></span><!-- + --><span class='column-name' title="{name}" val="{name}">{name}</span><!-- + --><span class='column-type' val="{type}">{type}</span><!-- + --><span class='column-interface' val="{interface}">{interface}</span><!-- + --><span class='column-space' val="{addrSpace}">{addrSpace}</span><!-- + --><span class='column-action' style="display:none"> + <span class="pull-right"> + <div class="dropdown menu-flat"> + <button class="btn btn-primary dropdown-toggle" type="button" data-toggle="dropdown" aria-expanded="false"><span class="edit-alt"></span>$_("Actions")<span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + <li role="presentation" nwAct="start" class='{startClass}'><a><i class="fa fa-undo"></i>$_("Start")</a></li> + <li role="presentation" nwAct="stop" class='{stopClass}'><a {stopDisabled}><i class="fa fa-ban"></i>$_("Stop")</a></li> + <li role="presentation" nwAct="delete" class='critical {deleteClass}'><a {deleteDisabled}><i class="fa fa-minus-circle"></i>$_("Delete")</a></li> + </ul> + </div> + </span> + </span> + </div> </script> <script> kimchi.initNetwork(); -- 1.9.3