Revision c566f369

b/snf-cyclades-app/synnefo/ui/static/snf/css/main.css
2555 2555
}
2556 2556

  
2557 2557
.hidden {
2558
    display:none !important; 
2558
    display:none; 
2559 2559
}
2560 2560

  
2561 2561
div.actions a.selected, div.actions a.selected:hover, div.machine-actions a.selected, div.machine-actions a.selected:hover {
......
5157 5157
    width: 624px !important;
5158 5158
}
5159 5159

  
5160
.create-vm .vm-network .list-cont.personalize-cont:last-child .confirm-params {
5161
  margin-right: 0!important;
5162
}
5163

  
5164
.create-vm .vm-network .list-cont.personalize-cont:last-child {
5165
  border-right: none;
5166
  margin-right: 0;
5167
  width: 298px;
5168
}
5169

  
5170
.create-vm .vm-network .list-cont.personalize-cont .confirm-params {
5171
  max-height: 240px;
5172
}
5173

  
5174
.create-vm .vm-network .list-cont.personalize-cont {
5175
  height: 330px;
5176
}
5177

  
5178
.create-vm .vm-network .list-cont.personalize-cont {
5179
    width: 47%;
5180
}
5181

  
5160 5182
.create-vm .header-step.current {
5161 5183
    font-weight: bold;
5162 5184
}
......
5381 5403
}
5382 5404

  
5383 5405
.create-vm .create-step-cont li.ssh-key-option.selected,
5406
.create-vm .create-step-cont li.list-item-option.selected,
5384 5407
.create-vm ul li.selected {
5385 5408
    background-color: #FF7F2A;
5386 5409
    background-image:linear-gradient(top, #FF9955, #E88B4D);
......
5927 5950
.create-vm .steps-history .steps-history-cont.current {
5928 5951
    background-color: #A1C8DB;
5929 5952
    color: #fff;
5930
    width: 468px;
5953
    width: 416px;
5931 5954
}
5932 5955

  
5933 5956
.create-vm .steps-history-step {
......
6186 6209
    margin-right: 10px;
6187 6210
}
6188 6211

  
6189
.create-vm .create-step-cont li.ssh-key-option .check {
6212
.create-vm .create-step-cont li.ssh-key-option .check,
6213
.create-vm .create-step-cont li.list-item-option .check {
6190 6214
    float: right;
6191 6215
    margin-right: 5px;
6192 6216
    margin-top: 0px;
......
6194 6218

  
6195 6219
.create-vm .create-step-cont li.ssh-key-option.selected {
6196 6220
}
6197
.create-vm .create-step-cont li.ssh-key-option.selected:hover {
6221
.create-vm .create-step-cont li.ssh-key-option.selected:hover,
6222
.create-vm .create-step-cont li.list-item-option.selected:hover {
6198 6223
    background-color: #F95;
6199 6224
}
6200 6225

  
6201
.create-vm .create-step-cont li.ssh-key-option:hover {
6226
.create-vm .create-step-cont li.ssh-key-option:hover,
6227
.create-vm .create-step-cont li.list-item-option:hover {
6202 6228
    background-color: #eee;
6203 6229
}
6204 6230

  
6205 6231
.create-vm .create-step-cont li.ssh-key-option.selected {
6206 6232
}
6207 6233

  
6208
.create-vm .create-step-cont li.ssh-key-option {
6234
.create-vm .create-step-cont li.ssh-key-option,
6235
.create-vm .create-step-cont li.list-item-option {
6209 6236
    padding: 6px !important;
6210 6237
}
6211 6238

  
......
6809 6836
.models-view .model-list ul li.model-item.in-progress .item-action {
6810 6837
  display: none !important;
6811 6838
}
6839

  
6812 6840
.models-view .model-list ul li.model-item.in-progress:hover .item-action {
6813 6841
  display: none !important;
6814 6842
}
......
7175 7203
  background-position: 530px center;
7176 7204
  background-repeat: no-repeat;
7177 7205
}
7206

  
7207
#user_public_ips .param.address {
7208
  font-weight: bold;
7209
  margin-right: 10px;
7210
}
b/snf-cyclades-app/synnefo/ui/static/snf/js/ui/web/ui_create_view.js
967 967
        get: function() {
968 968
            return {'flavor': this.current_flavor}
969 969
        }
970
    });
971
    
972

  
973
    views.CreateColumnSelectOptionView = bb.View.extend({
974
        tagName: 'li',
975
        el: undefined,
976
        model: undefined,
977
        id_prefix: 'model-',
978
        tpl: '<input type="checkbox" class="check"/><span class="title"></span>',
979
        className: 'list-item-option clearfix',
980
        events: {
981
          'click': 'handle_click'
982
        },
970 983

  
984
        initialize: function(options) {
985
          _.bindAll(this);
986
          this.model.bind("change", this.render);
987
          this.model.bind("remove", this.remove);
988
          this.selected = false;
989
          if (options.get_model_title) {
990
            this.get_model_title = _.bind(options.get_model_title, this);
991
          }
992
          this.model_title_attr = options.model_title_attr;
993
          $(this.el).append($(this.tpl));
994
        },
995
        
996
        id: function() {
997
          return this.id_prefix + this.model && this.model.id || '';
998
        },
999
        
1000
        handle_click: function() {
1001
          this.selected = !this.selected;
1002
          this.render();
1003
        },
1004

  
1005
        remove: function() {
1006
          this.model.unbind("change", this.render);
1007
          this.model.unbind("remove", this.remove);
1008
        },
1009
        
1010
        get_model_title: function() {
1011
          return this.model.get(this.model_title_attr || 'id');
1012
        },
1013

  
1014
        render: function() {
1015
          $(this.el).find(".title").text(this.get_model_title());
1016
          $(this.el).toggleClass('selected', this.selected);
1017
          if (this.selected) {
1018
            $(this.el).find("input").attr("checked", true);
1019
          } else {
1020
            $(this.el).find("input").attr("checked", false);
1021
          }
1022
        }
1023
    });
1024
    
1025
    views.CreateColumnIPOptionView = views.CreateColumnSelectOptionView.extend({
1026
      get_model_title: function() {
1027
        return this.model.get('ip');
1028
      }
971 1029
    });
972 1030

  
973
    views.CreatePersonalizeView = views.CreateVMStepView.extend({
1031
    views.CreateColumnPrivateNetworkOptionView = views.CreateColumnSelectOptionView.extend({
1032
      get_model_title: function() {
1033
        return this.model.get('name');
1034
      }
1035
    });
1036

  
1037
    views.CreateColumnSelectListView = bb.View.extend({
1038
        collection: undefined,
1039
        header: undefined,
1040
        tagName: 'div',
1041
        extra_class: '',
1042
        el: undefined,
1043
        title_tpl: undefined,
1044
        title: 'List view',
1045
        description: 'List view description.',
1046
        empty_msg: 'No entries.',
1047
        item_cls: views.CreateColumnSelectOptionView,
1048
        className: 'list-cont create-column-select personalize-cont',
1049

  
1050
        initialize: function(options) {
1051
          _.bindAll(this);
1052
          if (options.extra_class) {
1053
            $(this.el).addClass(options.extra_class);
1054
          }
1055
          this.update_collection = options.update_collection;
1056
          this.title = options.title || this.title;
1057
          this.titple_tpl = options.title_tpl || this.title_tpl;
1058
          this.description = options.description || this.description;
1059
          this.empty_msg = options.empty_msg || this.empty_msg;
1060
          this.item_cls = options.item_cls || this.item_cls;
1061
          this.select_first_as_default = options.select_first_as_default;
1062
          this.filter_items = options.filter_items;
1063
          this.post_render_entries = options.post_render_entries || function() {};
1064
          this.init_events = options.init_events || function() {};
1065

  
1066
          this.init_events = _.bind(this.init_events, this);
1067
          this.post_render_entries = _.bind(this.post_render_entries, this);
1068

  
1069
          this._ul = $('<ul class="confirm-params">');
1070
          this._title = $("<h4>");
1071
          this._description = $("<p class='desc'>");
1072
          this._empty = $("<p class='empty hidden desc'>");
1073
          this._empty.html(this.empty_msg);
1074
        
1075
          this.item_views = [];
1076

  
1077
          $(this.el).append(this._title);
1078
          $(this.el).append(this._description);
1079
          $(this.el).append(this._empty);
1080
          $(this.el).append(this._ul);
1081

  
1082
          this['$el'] = $(this.el);
1083

  
1084
          if (!this.title_tpl) { this.title_tpl = this.title };
1085

  
1086
          this.collection.bind("change", this.render_entries);
1087
          this.collection.bind("reset", this.render_entries);
1088
          this.collection.bind("add", this.render_entries);
1089
          this.collection.bind("remove", this.remove_entry);
1090
          
1091
          this.fetcher = undefined;
1092
          if (this.update_collection) {
1093
            this.fetcher_params = [snf.config.update_interval, 
1094
                                  snf.config.update_interval_increase || 500,
1095
                                  snf.config.fast_interval || snf.config.update_interval/2, 
1096
                                  snf.config.update_interval_increase_after_calls || 4,
1097
                                  snf.config.update_interval_max || 20000,
1098
                                  true, 
1099
                                  {is_recurrent: true, update: true}];
1100
              this.fetcher = this.collection.get_fetcher.apply(this.collection, 
1101
                                                _.clone(this.fetcher_params));
1102
              this.fetcher.start();
1103
          }
1104
          this.render();
1105
          this.init_events();
1106
        },
1107
        
1108
        render: function() {
1109
          this._title.html(this.title_tpl);
1110
          this._description.html(this.description);
1111
          this.render_entries();
1112
        },
1113
        
1114
        remove_entry: function(model) {
1115
          if (!this.item_views[model.id]) { return }
1116
          this.item_views[model.id].remove();
1117
          delete this.item_views[model.pk]
1118
        },
1119
        
1120
        get_selected: function() {
1121
          return _.map(_.filter(this.item_views, function(v) { 
1122
            return v.selected
1123
          }), function(v) {
1124
            return v.model
1125
          });
1126
        },
1127
        
1128
        check_empty: function() {
1129
          if (this.item_views.length == 0) {
1130
            this._empty.show();
1131
          } else {
1132
            this._empty.hide();
1133
          }
1134
        },
1135

  
1136
        render_entries: function() {
1137
          var entries;
1138
          if (this.filter_items) {
1139
            entries = this.collection.filter(this.filter_items);
1140
          } else {
1141
            entries = this.collection.models;
1142
          }
1143
          
1144
          var selected = this.get_selected();
1145
          
1146
          _.each(entries, _.bind(function(model) {
1147
            if (this.item_views[model.id]) {
1148
              this.item_views[model.id].render();
1149
            } else {
1150
              var view = new this.item_cls({model:model});
1151
              if (!selected.length && this.select_first_as_default) { 
1152
                view.selected = true; selected = [1] 
1153
              }
1154
              view.render();
1155
              this.item_views[model.id] = view;
1156
              this._ul.append($(view.el));
1157
            }
1158
          }, this));
1159
          this.check_empty();
1160
          this.post_render_entries();
1161
        },
1162

  
1163
        remove: function() {
1164
          _.each(this.item_views, function(v){
1165
            v.remove();
1166
          });
1167
          if (this.update_collection) { this.fetcher.stop() }
1168
          this.unbind();
1169
          this.collection.unbind("change", this.render_entries);
1170
          this.collection.unbind("reset", this.render_entries);
1171
          this.collection.unbind("add", this.render_entries);
1172
          this.collection.unbind("remove", this.remove_entry);
1173
          views.CreateColumnSelectListView.__super__.remove.apply(this, arguments);
1174
        }
1175
    });
1176

  
1177
    views.CreateNetworkingView = views.CreateVMStepView.extend({
974 1178
        step: 3,
975 1179
        initialize: function() {
1180
            views.CreateNetworkingView.__super__.initialize.apply(this, arguments);
1181
            this.init_handlers();
1182
            this.ssh_list = this.$(".ssh ul");
1183
            this.selected_keys = [];
1184

  
1185
            var self = this;
1186
            this.$(".create-ssh-key").click(function() {
1187
                var confirm_close = true;
1188
                if (confirm_close) {
1189
                    snf.ui.main.public_keys_view.show(self.parent);
1190
                } else {
1191
                }
1192
            });
1193

  
1194
        },
1195
        
1196
        init_subviews: function() {
1197
            var create_view = this.parent;
1198
            if (!this.ips_view) {
1199
              this.ips_view = new views.CreateColumnSelectListView({
1200
                collection: synnefo.storage.public_ips,
1201
                extra_class: 'public-ips',
1202
                update_collection: true,
1203
                title: 'IP addresses <span class="create-ip-address"><a href="#">manage ip\'s</a></span>',
1204
                description: 'Select IP addresses to be assigned to the created machine.',
1205
                item_cls: views.CreateColumnIPOptionView,
1206
                empty_msg: 'No IP addresses available. <span><a href="">Create a new IP address.</a></span>',
1207
                select_first_as_default: true,
1208
                filter_items: function(model) { return !model.get_vm() },
1209
                init_events: function() {
1210
                  this.$(".create-ip-address").click(function() {
1211
                      snf.ui.main.public_ips_view.show(create_view);
1212
                  });
1213
                  this.$(".empty a").bind('click', function(e) {
1214
                      e.preventDefault();
1215
                      synnefo.storage.public_ips.create({address:undefined, pool: undefined}, {
1216
                        error: function() {
1217
                          alert("Cannot create new ip address");
1218
                        },
1219
                        skip_api_errors: true,
1220
                      })
1221
                  });
1222
                }
1223
              });
1224
              $(this.ips_view.el).appendTo(this.$(".personalize-conts"));
1225
            }
1226
            if (!this.networks_view) {
1227
              this.networks_view = new views.CreateColumnSelectListView({
1228
                collection: synnefo.storage.networks,
1229
                extra_class: 'private-networks',
1230
                title: 'Private networks',
1231
                description: 'Select private networks to connect the created machine to. You can manage your private networks from the networks tab.',
1232
                item_cls: views.CreateColumnPrivateNetworkOptionView,
1233
                filter_items: function(model) { return !model.is_public() }
1234
              });
1235
              $(this.networks_view.el).appendTo(this.$(".personalize-conts"));
1236
            }
1237
        },
1238

  
1239
        init_handlers: function() {
1240
        },
1241

  
1242
        show: function() {
1243
            views.CreateNetworkingView.__super__.show.apply(this, arguments);
1244
            this.init_subviews();
1245
            this.update_layout();
1246
        },
1247
        
1248
        update_layout: function() {
1249
        },
1250

  
1251
        reset: function() {
1252
            this.selected_keys = [];
1253
            this.update_layout();
1254
        },
1255
        
1256
        get_selected_networks: function() {
1257
          if (!this.networks_view) { return [] }
1258
          return this.networks_view.get_selected();
1259
        },
1260
        
1261
        get_selected_addresses: function() {
1262
          if (!this.networks_view) { return [] }
1263
          return this.ips_view.get_selected();
1264
        },
1265

  
1266
        get: function() {
1267
            return {
1268
              'addresses': this.get_selected_addresses(),
1269
              'networks': this.get_selected_networks()
1270
            }
1271
        },
1272

  
1273
        remove: function() {
1274
          if (this.ips_view) {
1275
            this.ips_view.remove();
1276
            delete this.ips_view;
1277
          }
1278
          
1279
          if (this.networks_view) {
1280
            this.networks_view.remove();
1281
            delete this.networks_view;
1282
          }
1283
        }
1284
    });
1285

  
1286
    views.CreatePersonalizeView = views.CreateVMStepView.extend({
1287
        step: 4,
1288
        initialize: function() {
976 1289
            views.CreateSubmitView.__super__.initialize.apply(this, arguments);
977 1290
            this.roles = this.$("li.predefined-meta.role .values");
978 1291
            this.name = this.$("input.rename-field");
......
1054 1367
        init_handlers: function() {
1055 1368
            this.name.bind("keypress", _.bind(function(e) {
1056 1369
                this.name_changed = true;
1057
                if (e.keyCode == 13) { this.parent.set_step(4); this.parent.update_layout() };    
1370
                if (e.keyCode == 13) { this.parent.set_step(5); this.parent.update_layout() };    
1058 1371
            }, this));
1059 1372

  
1060 1373
            this.name.bind("click", _.bind(function() {
......
1083 1396
            var j = 0;
1084 1397

  
1085 1398
            while (existing && !this.name_changed) {
1086
                var existing = storage.vms.select(function(vm){return vm.get("name") == vm_name}).length
1399
                var existing = storage.vms.select(function(vm){
1400
                  return vm.get("name") == vm_name
1401
                }).length;
1087 1402
                if (existing) {
1088 1403
                    j++;
1089 1404
                    vm_name = orig_name + " " + j;
......
1158 1473
    });
1159 1474

  
1160 1475
    views.CreateSubmitView = views.CreateVMStepView.extend({
1161
        step: 4,
1476
        step: 5,
1162 1477
        initialize: function() {
1163 1478
            views.CreateSubmitView.__super__.initialize.apply(this, arguments);
1164 1479
            this.roles = this.$("li.predefined-meta.role .values");
......
1166 1481
            this.name = this.$("h3.vm-name");
1167 1482
            this.keys = this.$(".confirm-params.ssh");
1168 1483
            this.meta = this.$(".confirm-params.meta");
1484
            this.ip_addresses = this.$(".confirm-params.ip-addresses");
1485
            this.private_networks = this.$(".confirm-params.private-networks");
1169 1486
            this.init_handlers();
1170 1487
        },
1171 1488

  
......
1177 1494
            this.update_layout();
1178 1495
        },
1179 1496
        
1497
        update_network_details: function() {
1498
            var data = this.parent.get_params();
1499
            var ips = data.addresses;
1500
            var networks = data.networks;
1501

  
1502
            this.ip_addresses.empty();
1503
            if (!ips|| ips.length == 0) {
1504
                this.ip_addresses.append(this.make("li", {'class':'empty'}, 
1505
                                           'No ip addresses selected'))
1506
            }
1507
            _.each(ips, _.bind(function(ip) {
1508
                var el = this.make("li", {'class':'selected-ip-address'}, 
1509
                                  ip.get('ip'));
1510
                this.ip_addresses.append(el);
1511
            }, this))
1512

  
1513
            this.private_networks.empty();
1514
            if (!networks || networks.length == 0) {
1515
                this.private_networks.append(this.make("li", {'class':'empty'}, 
1516
                                             'No private networks selected'))
1517
            }
1518
            _.each(networks, _.bind(function(network) {
1519
                var el = this.make("li", {'class':'selected-private-network'}, 
1520
                                  network.get('name'));
1521
                this.private_networks.append(el);
1522
            }, this))
1523

  
1524
        },
1525

  
1180 1526
        update_flavor_details: function() {
1181 1527
            var flavor = this.parent.get_params().flavor;
1182 1528

  
......
1226 1572
                this.meta.append(this.make("li", {'class':'empty'}, 'No tags selected'))
1227 1573
            }
1228 1574
            _.each(meta, _.bind(function(value, key) {
1229
                var el = this.make("li", {'class':"confirm-value"});
1230
                var name = this.make("span", {'class':"ckey"}, key);
1231
                var value = this.make("span", {'class':"cval"}, value);
1575
                var el = this.make("li", {'class':'confirm-value'});
1576
                var name = this.make("span", {'class':'ckey'}, key);
1577
                var value = this.make("span", {'class':'cval'}, value);
1232 1578

  
1233 1579
                $(el).append(name)
1234 1580
                $(el).append(value);
......
1254 1600

  
1255 1601
            this.update_image_details();
1256 1602
            this.update_flavor_details();
1603
            this.update_network_details();
1257 1604

  
1258 1605
            if (!params.image.supports('ssh')) {
1259 1606
                this.keys.hide();
......
1300 1647
            this.steps[1].bind("change", _.bind(function(data) {this.trigger("image:change", data)}, this));
1301 1648

  
1302 1649
            this.steps[2] = new views.CreateFlavorSelectView(this);
1303
            this.steps[3] = new views.CreatePersonalizeView(this);
1304
            this.steps[4] = new views.CreateSubmitView(this);
1650
            this.steps[3] = new views.CreateNetworkingView(this);
1651
            this.steps[4] = new views.CreatePersonalizeView(this);
1652
            this.steps[5] = new views.CreateSubmitView(this);
1305 1653

  
1306 1654
            this.cancel_btn = this.$(".create-controls .cancel");
1307 1655
            this.next_btn = this.$(".create-controls .next");
......
1362 1710
                this.submiting = true;
1363 1711
                if (data.metadata) { meta = data.metadata; }
1364 1712
                if (data.keys && data.keys.length > 0) {
1365
                    personality.push(data.image.personality_data_for_keys(data.keys))
1713
                    personality.push(
1714
                      data.image.personality_data_for_keys(data.keys))
1366 1715
                }
1367 1716

  
1368 1717
                if (personality.length) {
1369 1718
                    extra['personality'] = _.flatten(personality);
1370 1719
                }
1371

  
1372
                storage.vms.create(data.name, data.image, data.flavor, meta, extra, _.bind(function(data){
1720
                
1721
                extra['networks'] = _.map(data.networks, function(n) { return n.get('id') });
1722
                extra['floating_ips'] = _.map(data.addresses, function(ip) { return ip.get('ip') });
1723
                storage.vms.create(data.name, data.image, data.flavor, 
1724
                                   meta, extra, _.bind(function(data){
1373 1725
                    this.close_all();
1374
                    this.password_view.show(data.server.adminPass, data.server.id);
1726
                    this.password_view.show(data.server.adminPass, 
1727
                                            data.server.id);
1375 1728
                    this.submiting = false;
1376 1729
                }, this));
1377 1730
            }
1378 1731
        },
1379 1732

  
1380 1733
        close_all: function() {
1381
            this.hide();
1734
          this.hide();
1735
        },
1736

  
1737
        onClose: function() {
1738
          this.steps[3].remove();
1382 1739
        },
1383 1740

  
1384 1741
        reset: function() {
1385
            this.current_step = 1;
1742
          this.current_step = 1;
1386 1743

  
1387
            this.steps[1].reset();
1388
            this.steps[2].reset();
1389
            this.steps[3].reset();
1390
            this.steps[4].reset();
1744
          this.steps[1].reset();
1745
          this.steps[2].reset();
1746
          this.steps[3].reset();
1747
          this.steps[4].reset();
1391 1748

  
1392
            this.steps[1].show();
1393
            this.steps[2].show();
1394
            this.steps[3].show();
1395
            this.steps[4].show();
1749
          //this.steps[1].show();
1750
          //this.steps[2].show();
1751
          //this.steps[3].show();
1752
          //this.steps[4].show();
1396 1753

  
1397
            this.submit_btn.removeClass("in-progress");
1754
          this.submit_btn.removeClass("in-progress");
1398 1755
        },
1399 1756

  
1400 1757
        onShow: function() {
......
1483 1840
        },
1484 1841

  
1485 1842
        get_params: function() {
1486
            return _.extend({}, this.steps[1].get(), this.steps[2].get(), this.steps[3].get());
1843
            return _.extend({}, this.steps[1].get(), this.steps[2].get(), this.steps[3].get(), this.steps[4].get());
1487 1844
        }
1488 1845
    });
1489 1846
    
b/snf-cyclades-app/synnefo/ui/static/snf/js/ui/web/ui_public_ips_view.js
253 253
        subtitle: "IP addresses",
254 254

  
255 255
        initialize: function(options) {
256
            var self = this;
256 257
            views.PublicIPsOverlay.__super__.initialize.apply(this, arguments);
257 258
            this.subview = new views.PublicIPsView({el:this.$(".public-ips-view")});
258 259
            this.fetcher_params = [snf.config.update_interval, 
......
262 263
                                  snf.config.update_interval_max || 20000,
263 264
                                  true, 
264 265
                                  {is_recurrent: true, update: true}]
266
            this.$(".previous-view-link").live('click', function(){
267
                self.hide();
268
            })
265 269
        },
266 270

  
267 271
        show: function(view) {
272
            this.from_view = view || undefined;
273
            
274
            if (this.from_view) {
275
                this.$(".previous-view-link").show();
276
            } else {
277
                this.$(".previous-view-link").hide();
278
            }
268 279
            if (!this.fetcher) {
269 280
              this.fetcher = snf.storage.public_ips.get_fetcher.apply(snf.storage.public_ips, 
270 281
                                                        _.clone(this.fetcher_params));
......
282 293
            if (this.fetcher) {
283 294
                this.fetcher.stop();
284 295
            }
296
            if (this.from_view) {
297
                this.hiding = true;
298
                this.from_view.skip_reset_on_next_open = true;
299
                this.from_view.show();
300
                this.from_view = undefined;
301
            }
285 302
        }
286 303
        
287 304
    });
b/snf-cyclades-app/synnefo/ui/templates/home.html
684 684
            synnefo.ui.main.bind("ready", function(){
685 685
            });
686 686
            window.setTimeout(function(){
687
                $(".public_ips a").click();
687
              $("#create").click();
688
              window.setTimeout(function() {
689
                //synnefo.ui.main.create_vm_view.show_step(3);
690
              }, 100)
688 691
            }, 800);
689

  
690 692
        })
691 693
    </script>
692 694
</body>
b/snf-cyclades-app/synnefo/ui/templates/partials/create_vm.html
5 5
            id="vm-create-step-history-1">
6 6
            <div class="steps-history-step clearfix">
7 7
                <span class="header-step step-1 clearfix">
8
                    <span class="num">1<span class="subnum">/3</span></span>
8
                    <span class="num">1<span class="subnum">/5</span></span>
9 9
                    <span class="title">
10 10
                        {% trans "Image" %}
11 11
                    </span>
......
24 24
           id="vm-create-step-history-2" >
25 25
            <div class="steps-history-step clearfix">
26 26
                <span class="header-step step-2 clearfix">
27
                    <span class="num">2<span class="subnum">/3</span></span>
27
                    <span class="num">2<span class="subnum">/5</span></span>
28 28
                    <span class="title">
29 29
                        {% trans "Flavor" %}
30 30
                    </span>
......
43 43
            <div class="steps-history-step clearfix"
44 44
                id="vm-create-step-history-3">
45 45
                <span class="header-step step-3 clearfix">
46
                    <span class="num">3<span class="subnum">/3</span></span>
46
                    <span class="num">3<span class="subnum">/5</span></span>
47
                    <span class="title">
48
                        {% trans "Networking" %}
49
                    </span>
50
                    <div class="info">
51
                        <span class="subtitle">
52
                            {% trans "Virtual machine networking configuration" %}
53
                        </span>
54
                        <span class="description">
55
                            {% trans "Select machine IP address and private networks" %}
56
                        </span>
57
                    </div>
58
                </span>
59
            </div>
60
        </div>
61
        <div class="steps-history-cont step4h step-header">
62
            <div class="steps-history-step clearfix"
63
                id="vm-create-step-history-4">
64
                <span class="header-step step-4 clearfix">
65
                    <span class="num">4<span class="subnum">/5</span></span>
47 66
                    <span class="title">
48 67
                        {% trans "Personalize" %}
49 68
                    </span>
......
58 77
                </span>
59 78
            </div>
60 79
        </div>
61
        <div class="steps-history-cont step4h last step-header">
80
        <div class="steps-history-cont step5h last step-header">
62 81
            <div class="steps-history-step clearfix"
63
                id="vm-create-step-history-4">
64
                <span class="header-step step-4 clearfix">
65
                    <span class="num">4<span class="subnum">/3</span></span>
82
                id="vm-create-step-history-5">
83
                <span class="header-step step-5 clearfix">
84
                    <span class="num">5<span class="subnum">/5</span></span>
66 85
                    <span class="title">
67 86
                        {% trans "Confirm" %}
68 87
                    </span>
......
186 205
                </div>
187 206
            </div>
188 207
        </div>
189
        <div class="step-3 vm-personalize create-step-cont clearfix">
208
        <div class="step-3 vm-network create-step-cont clearfix">
209
            <div class="clearfix step-header">
210
            </div>
211
            <div class="step-cont clearfix">
212
                    <div class="personalize-conts clearfix">
213
                    </div>
214
            </div>
215
        </div>
216
        <div class="step-4 vm-personalize create-step-cont clearfix">
190 217
            <div class="clearfix step-header">
191 218
            </div>
192 219
            <div class="step-cont clearfix">
......
245 272
                </div>
246 273
            </div>
247 274
    </div>
248
        <div class="step-4 vm-confirm create-step-cont clearfix">
275
        <div class="step-5 vm-confirm create-step-cont clearfix">
249 276
            <div class="clearfix step-header">
250 277
            </div>
251 278
            <div class="step-cont clearfix">
......
305 332
                                    <span class="value"></span>
306 333
                                </li>
307 334
                            </ul>
308
                        </div>
309
                        <div class="list-cont confirm-cont meta">
310 335
                            <h4>{% trans "Machine Tags" %}</h4>
311 336
                            <ul class="confirm-params meta">
312 337
                            </ul>
338
                        </div>
339
                        <div class="list-cont confirm-cont meta">
313 340
                            <h4>{% trans "SSH Keys" %}</h4>
314 341
                            <ul class="confirm-params ssh">
315 342
                            </ul>
343
                            <h4>{% trans "IP Addresses" %}</h4>
344
                            <ul class="confirm-params ip-addresses">
345
                            </ul>
346
                            <h4>{% trans "Private networks" %}</h4>
347
                            <ul class="confirm-params private-networks">
348
                            </ul>
316 349
                        </div>
317 350
                    </div>
318 351
                </div>
b/snf-cyclades-app/synnefo/ui/templates/partials/ips.html
2 2
<div class="public-ips-view clearfix">
3 3
  <div class="loading-models">{% trans "Loading..." %}</div>
4 4
  <div class="models-view">
5
    <div class="previous-view-link">
6
      <div class="change-view-action">Back to machine create wizard
7
      </div>
8
    </div>
5 9
    <div class="list-wrapper model-list">
6 10
      <h3 class="list-title">{% trans "IP addresses list" %}</h3>
7 11
      <div class="top-actions clearfix">

Also available in: Unified diff