On 11/11/2014 12:27 AM, Wen Wang wrote:
Hi Aline,
When using iSCSI or SCSI, the disk size is read from the response and
the input is disabled:
I tested it and it is not working in that way for me.
I tested on Fedora 20 and Firefox 33.
Above is my 1G iSCSI test from my machine. The function is realized by
the code below:
+ $('select',
'#form-template-storage').change(function() {
+ var selectedItem = $(this).parent().parent();
+ var tempStorageName = $(this).val();
+ tempStorageName =tempStorageName.split('/')[0];
+ var scsiCap;
+ $.each(result, function(index, storageEntities) {
+ if (tempStorageName === storageEntities.name) {
+ selectedItem.find('.template-storage-type').val(storageEntities.type);
+ scsiCap = storageEntities.capacity /
Math.pow(1024, 3);
}
+ })
+ if (tempStorageName === 'iscsi' ||
tempStorageName === 'scsi') {
+ $('.template-storage-disk',
selectedItem).attr('readonly', true).val(scsiCap);
+ } else {
+ $('.template-storage-disk',
selectedItem).attr('readonly', false).val('10');
}
});
Best Regards
Wang Wen
On 11/10/2014 11:54 PM, Aline Manera wrote:
>
> Just one comment;
>
> When a SCSI/iSCSI pool/volume is selected the the "Disk size" must be
> set with the volume size and the input box must be disabled.
>
> It was done by the following code:
>
> - $('#template-edit-storagePool').change(function() {
> - storagepool = $(this).val();
> - var storageArray = storagepool.split("/");
> - if (storageArray.length > 3) {
> - volumeName = storageArray.pop();
> - poolName = storageArray.pop();
> - kimchi.getStoragePoolVolume(poolName, volumeName,
> function(result) {
> - $('input[name="disks"]',
> templateEditForm).val(result.capacity / Math.pow(1024,3));
> - $('input[name="disks"]',
> templateEditForm).attr('disabled','disabled');
> - return false;
> - }, function (err) {
> - kimchi.message.error(err.responseJSON.reason);
>
>
>
> On 11/05/2014 08:17 AM, Wen Wang wrote:
>> From: Wen Wang <wenwang(a)linux.vnet.ibm.com>
>>
>> V1 -> V2:
>>
>> 1) Enable "iSCSI" and "SCSI" for storage.
>> 2) Changed the storage tab from "storage" to "Storage".
>> 3) Fix the defect that when editing/adding "Storage" or
"Interface"
>> line
>> went down issue.
>> 4) "Storage" and "Interface" content can display properly on
Remote and
>> Image created template.
>> 5) Fix the defect that "Image" didn't show properly when using a
Image
>> created template.
>>
>> This patch redesigned "Edit Template" diaguage in
"Templates". New
>> "Edit
>> Template" will display all the related information into tabs of
>> "General", "Storage" and "Interface". Due to
unfinished back-end work,
>> functions are not fully supported, which will be finished in the future
>> work.
>>
>> Temporary disabled functions:
>> 1) Multiple disk operation with multiple storage pools edit in template
>> for which reason the add button in "Storage" tab is disabled.
>> 2) iSCSI and SCSI storage pool add is removed since we are going to
>> allow this kind of operation in the process of creating a VM.
>>
>> Signed-off-by: Wen Wang <wenwang(a)linux.vnet.ibm.com>
>> ---
>> ui/css/theme-default/template-edit.css | 116 +++++++----
>> ui/js/src/kimchi.template_edit_main.js | 364
>> +++++++++++++++++++++++---------
>> ui/pages/template-edit.html.tmpl | 168 ++++++++-------
>> 3 files changed, 432 insertions(+), 216 deletions(-)
>>
>> diff --git a/ui/css/theme-default/template-edit.css
>> b/ui/css/theme-default/template-edit.css
>> index 4975f1b..094e909 100644
>> --- a/ui/css/theme-default/template-edit.css
>> +++ b/ui/css/theme-default/template-edit.css
>> @@ -17,24 +17,33 @@
>> */
>> #template-edit-window {
>> font-size: 13px;
>> - height: 600px;
>> - width: 1000px;
>> + height: 500px;
>> + width: 800px;
>> }
>>
>> -.template-edit-fieldset {
>> - float: left;
>> - padding: 1em;
>> +#edit-template-tabs {
>> + background: none repeat scroll 0 0 transparent;
>> + border: medium none;
>> + height: 100%;
>> + padding: 0;
>> }
>>
>> -.template-edit-wrapper-label, .template-edit-wrapper-controls {
>> +#edit-template-tabs .form-template-inline-wrapper {
>> + display: inline-block;
>> vertical-align: top;
>> - width: 470px;
>> }
>>
>> .template-edit-wrapper-label {
>> - height: 18px;
>> - line-height: 18px;
>> - margin-top: 8px;
>> + vertical-align: top;
>> + min-width: 100px;
>> + height: 35px;
>> + line-height: 35px;
>> + margin: 7px 0 8px;
>> +}
>> +
>> +.template-edit-wrapper-controls {
>> + vertical-align: top;
>> + width: 400px;
>> }
>>
>> .template-edit-wrapper-controls input[type="text"] {
>> @@ -56,7 +65,7 @@
>>
>> .template-edit-wrapper-controls > .dropdown {
>> margin: 5px 0 0 1px;
>> - width: 440px;
>> + width: 372px;
>> }
>>
>> .template-edit-wrapper-controls input[type="text"][disabled] {
>> @@ -65,41 +74,72 @@
>> cursor: not-allowed;
>> }
>>
>> -.hidden-area {
>> - display: none;
>> +#edit-template-tabs .template-tab-header {
>> + margin-bottom: 8px;
>> + padding-bottom: 2px;
>> + font-weight: bold;
>> + border-bottom: 1px solid #999999;
>> + overflow: hidden;
>> }
>>
>> -.template-edit-wrapper-controls .select-list-box {
>> - width: 464px;
>> - max-height: 168px;
>> - overflow: auto;
>> - margin-top: 5px;
>> - border: 1px solid #ccc;
>> +#edit-template-tabs .template-tab-header .action-area {
>> + float: right;
>> + height: 20px;
>> + width: 20px;
>> }
>>
>> -.template-edit-wrapper-controls .select-list-box>li>label {
>> - display: block;
>> +#edit-template-tabs .template-interface-cell {
>> + display: inline-block;
>> + width: 250px;
>> }
>>
>> -.template-edit-wrapper-controls .select-list-box>li>label>
>> -input[type="checkbox"] {
>> - display: none;
>> +#edit-template-tabs .template-storage-cell{
>> + display: inline-block;
>> + width: 230px;
>> +}
>> +
>> +#edit-template-tabs .template-storage-cell label {
>> + height: 25px;
>> + padding: 2px;
>> + border: 1px;
>> }
>>
>> -.template-edit-wrapper-controls .select-list-box>li>label>.item {
>> - display: block;
>> - height: 41px;
>> - line-height: 41px;
>> - padding: 0 20px 0 40px;
>> - border-bottom: 1px solid #ccc;
>> - box-shadow: 0px 1px 1px #fff;
>> - text-shadow: -1px -1px 1px #ddd, 1px 1px 1px #fff;
>> - color: #222;
>> - font-size: 12px;
>> +#form-template-storage .template-tab-body select {
>> + width: 140px;
>> }
>>
>> -.template-edit-wrapper-controls .select-list-box>li>label>
>> -input[type="checkbox"]:CHECKED+.item {
>> - background: #f8f8f8
>> url(../images/theme-default/check-green.png) no-repeat
>> - 10px center;
>> +#form-template-storage .template-tab-body input {
>> + width: 56px;
>> + height: 17px;
>> }
>> +
>> +#form-template-storage .template-tab-body .template-storage-name {
>> + width: 220px;
>> +}
>> +
>> +#edit-template-tabs .template-tab-body input[readonly] {
>> + background: none repeat scroll 0 0 rgba(0, 0, 0, 0);
>> + border-color: transparent;
>> + text-overflow: ellipsis;
>> +}
>> +
>> +#edit-template-tabs .template-tab-body .item {
>> + height: 25px;
>> +}
>> +
>> +#form-template-interface .template-tab-body select {
>> + width: 180px;
>> +}
>> +
>> +#edit-template-tabs .template-tab-body .action-area {
>> + float: right;
>> +}
>> +
>> +#edit-template-tabs .template-tab-body .action-area button {
>> + width: 20px;
>> + height: 20px;
>> +}
>> +
>> +#edit-template-tabs .hide {
>> + display: none;
>> +}
>> \ No newline at end of file
>> diff --git a/ui/js/src/kimchi.template_edit_main.js
>> b/ui/js/src/kimchi.template_edit_main.js
>> index 2f4cc9a..12a9f20 100644
>> --- a/ui/js/src/kimchi.template_edit_main.js
>> +++ b/ui/js/src/kimchi.template_edit_main.js
>> @@ -16,19 +16,23 @@
>> * limitations under the License.
>> */
>> kimchi.template_edit_main = function() {
>> - var templateEditForm = $('#form-template-edit');
>> + var templateEditMain = $('#edit-template-tabs');
>> var origDisks;
>> var origPool;
>> + var origNetworks;
>> var templateDiskSize;
>> - $('#template-name',
>> templateEditForm).val(kimchi.selectedTemplate);
>> - kimchi.retrieveTemplate(kimchi.selectedTemplate,
>> function(template) {
>> + $('#template-name',
>> templateEditMain).val(kimchi.selectedTemplate);
>> + templateEditMain.tabs();
>> +
>> + var initTemplate = function(template) {
>> origDisks = template.disks;
>> origPool = template.storagepool;
>> + origNetworks = template.networks;
>> for(var i=0;i<template.disks.length;i++){
>> if(template.disks[i].base){
>> template["vm-image"] = template.disks[i].base;
>> - $('#templ-edit-cdrom').addClass('hide-content');
>> - $('#templ-edit-vm-image').removeClass('hide-content');
>> + $('.templ-edit-cdrom').addClass('hide');
>> + $('.templ-edit-vm-image').removeClass('hide');
>> break;
>> }
>> }
>> @@ -37,18 +41,12 @@ kimchi.template_edit_main = function() {
>> if (prop == 'graphics') {
>> value = value["type"];
>> }
>> - $('input[name="' + prop + '"]',
>> templateEditForm).val(value);
>> - }
>> - var disks = template.disks;
>> - $('input[name="disks"]').val(disks[0].size);
>> - templateDiskSize = $('input[name="disks"]').val();
>> - if (disks[0].volume) {
>> - var spool_value = $('#form-template-edit
>> [name="storagepool"]').val();
>> - $('input[name="storagepool"]',
>> templateEditForm).val(spool_value + '/' + disks[0].volume);
>> - $('input[name="disks"]',
>> templateEditForm).attr('disabled','disabled');
>> + $('input[name="' + prop + '"]',
>> templateEditMain).val(value);
>> }
>>
>> var vncOpt = [{label: 'VNC', value: 'vnc'}];
>> + $('#template-edit-graphics').append('<option
>> selected>VNC</option>');
>> +
$('#template-edit-graphics').append('<option>Spice</option>');
>> kimchi.select('template-edit-graphics-list', vncOpt);
>> var enableSpice = function() {
>> if (kimchi.capabilities == undefined) {
>> @@ -61,119 +59,281 @@ kimchi.template_edit_main = function() {
>> }
>> };
>> enableSpice();
>> -
>> - var scsipools = {};
>> - kimchi.listStoragePools(function(result) {
>> - var options = [];
>> - if (result && result.length) {
>> - $.each(result, function(index, storagePool) {
>> - if ((storagePool.state=="active") &&
>> (storagePool.type !== 'kimchi-iso')) {
>> - if ((storagePool.type == 'iscsi') ||
>> (storagePool.type == 'scsi')){
>> - scsipools[storagePool.name] = [];
>> - kimchi.listStorageVolumes(storagePool.name, function(result) {
>> - if (result && result.length) {
>> - $.each(result, function(index,
>> storageVolume) {
>> - options.push({
>> - label: storagePool.name
>> + '/' + storageVolume.name,
>> - value: '/storagepools/'
>> + storagePool.name + '/' + storageVolume.name
>> - });
>> - scsipools[storagePool.name].push(storageVolume)
>> - });
>> - }
>> - kimchi.select('template-edit-storagePool-list', options);
>> - });
>> + var initStorage = function(result) {
>> + var scsipools = {};
>> + var addStorageItem = function(storageData) {
>> + var thisName;
>> + var thisType;
>> + var thisDisk;
>> + var nodeStorage =
>> $.parseHTML(kimchi.substitute($('#template-storage-pool-tmpl').html(),
>> storageData));
>> + $('.template-tab-body',
>> '#form-template-storage').append(nodeStorage);
>> + $('.edit', '#form-template-storage').button({
>> + icons : {primary : 'ui-icon-pencil'},
>> + text : false
>> + }).click(function(evt) {
>> + evt.preventDefault();
>> + var storageItem = $(this).parent().parent();
>> + thisName = $('.template-storage-name',
>> storageItem).val();
>> + thisType = $('.template-storage-type',
>> storageItem).val();
>> + thisDisk = $('.template-storage-disk',
>> storageItem).val();
>> + $('.template-storage-name', storageItem).hide();
>> + $('.template-storage-disk',
>> storageItem).attr('readonly', false);
>> + if (thisType === 'iscsi' || thisType ===
'scsi') {
>> + $('.template-storage-disk',
>> storageItem).attr('readonly', true);
>> + } else {
>> + $('.template-storage-disk',
>> storageItem).attr('readonly', false);
>> + }
>> + $('.save', storageItem).parent().show();
>> + $('.delete', storageItem).parent().hide();
>> + var selectedStorage = $('select',
>> storageItem).val();
>> + $('.template-storage-name',
>> storageItem).val(selectedStorage).hide();
>> + $('select', storageItem).val(thisName).show();
>> + });
>> + $('.delete', '#form-template-storage').button({
>> + icons : {primary : 'ui-icon-trash'},
>> + text : false
>> + }).click(function(evt) {
>> + evt.preventDefault();
>> + $(this).parent().parent().remove();
>> + });
>> + $('.cancel', '#form-template-storage').button({
>> + icons : {primary :
>> 'ui-icon-arrowreturnthick-1-w'},
>> + text : false
>> + }).click(function(evt) {
>> + evt.preventDefault();
>> + var cancelEntity = $(this).parent().parent();
>> + if ($('.template-storage-name',
>> cancelEntity).val() === 'null') {
>> + cancelEntity.remove();
>> + } else {
>> + $('select', cancelEntity).hide();
>> + $('.template-storage-name',
>> cancelEntity).val(thisName).attr('readonly', true).show();
>> + $('.template-storage-type',
>> cancelEntity).val(thisType).attr('readonly', true);
>> + $('.template-storage-disk',
>> cancelEntity).val(thisDisk).attr('readonly', true);
>> + $('.save', cancelEntity).parent().hide();
>> + $('.edit', cancelEntity).parent().show();
>> + }
>> + });
>> + $('.save', '#form-template-storage').button({
>> + icons : {primary : 'ui-icon-disk'},
>> + text : false
>> + }).click(function(evt) {
>> + evt.preventDefault();
>> + var storageItem = $(this).parent().parent();
>> + $('.save', storageItem).parent().hide();
>> + $('.delete', storageItem).parent().show();
>> + var selectedStorage = $('select',
>> storageItem).val();
>> + $('.template-storage-name',
>> storageItem).val(selectedStorage).attr('readonly', true).show();
>> + $('.template-storage-disk',
>> storageItem).attr('readonly', true);
>> + $('.template-storage-type',
>> storageItem).attr('readonly', true);
>> + $('select', storageItem).hide();
>> + });
>> + var storageOptions = '';
>> + var scsiOptions = '';
>> + $('select',
>> '#form-template-storage').find('option').remove();
>> + $.each(result, function(index, storageEntities) {
>> + if((storageEntities.state === 'active') &&
>> (storageEntities.type != 'kimchi-iso')) {
>> + if(storageEntities.type === 'iscsi' ||
>> storageEntities.type === 'scsi') {
>> + kimchi.listStorageVolumes(storageEntities.name,
>> function(currentVolume) {
>> + $.each(currentVolume,
>> function(indexSCSI, scsiEntities) {
>> + scsiOptions += '<option>' +
>> storageEntities.name + '/' + scsiEntities.name +
'</option>';
>> + });
>> + $('select',
>> '#form-template-storage').append(scsiOptions);
>> + }, function() {});
>> + } else {
>> + var isSlected = storageEntities.name
>> === 'default' ? ' selected' : '';
>> + storageOptions += '<option' + isSlected
>> + '>' + storageEntities.name + '</option>';
>> }
>> - else {
>> - options.push({
>> - label: storagePool.name,
>> - value: '/storagepools/' +
>> storagePool.name
>> - });
>> + }
>> + });
>> + $('select',
>> '#form-template-storage').append(storageOptions);
>> + $('select',
>> '#form-template-storage').change(function() {
>> + var selectedItem = $(this).parent().parent();
>> + var tempStorageName = $(this).val();
>> + tempStorageName =tempStorageName.split('/')[0];
>> + var scsiCap;
>> + $.each(result, function(index, storageEntities) {
>> + if (tempStorageName ===
>> storageEntities.name) {
>> +
>> selectedItem.find('.template-storage-type').val(storageEntities.type);
>> + scsiCap = storageEntities.capacity /
>> Math.pow(1024, 3);
>> }
>> + })
>> + if (tempStorageName === 'iscsi' ||
>> tempStorageName === 'scsi') {
>> + $('.template-storage-disk',
>> selectedItem).attr('readonly', true).val(scsiCap);
>> + } else {
>> + $('.template-storage-disk',
>> selectedItem).attr('readonly', false).val('10');
>> }
>> });
>> - }
>> - if ($.isEmptyObject(scsipools)) {
>> - kimchi.select('template-edit-storagePool-list', options);
>> - }
>> - });
>> - kimchi.listNetworks(function(result) {
>> - if(result && result.length > 0) {
>> - var html = '';
>> - var tmpl = $('#tmpl-network').html();
>> - $.each(result, function(index, network) {
>> - if (result[index].state === 'active')
>> - html += kimchi.substitute(tmpl, network);
>> + };
>> +
>> + if ((origDisks && origDisks.length) && (origPool
&&
>> origPool.length)) {
>> + splitPool = origPool.split('/');
>> + var defaultPool;
>> + var defaultType;
>> + $.each(result, function(index, poolEntities) {
>> + if (poolEntities.name ===
>> splitPool[splitPool.length-1]) {
>> + defaultType = poolEntities.type;
>> + defaultPool = splitPool[splitPool.length-1]
>> + }
>> });
>> - $('#template-edit-network-list').html(html).show();
>> - if(template.networks && template.networks.length >
>> 0) {
>> - $('input[name="networks"]',
>> templateEditForm).each(function(index, element) {
>> - var value = $(element).val();
>> - if(template.networks.indexOf(value) >= 0) {
>> - $(element).prop('checked', true);
>> - }
>> - });
>> + if (origDisks[0]['volume']) {
>> + defaultPool = defaultPool + '/' +
>> origDisks[0]['volume'];
>> }
>> - } else {
>> - $('#template-edit-network-list').hide();
>> + $.each(origDisks, function(index, diskEntities) {
>> + var storageNodeData = {
>> + viewMode : '',
>> + editMode : 'hide',
>> + storageName : defaultPool,
>> + storageType : defaultType,
>> + storageDisk : diskEntities.size
>> + }
>> + addStorageItem(storageNodeData);
>> + });
>> + $('.template-storage-disk').attr('readonly',
true);
>> }
>> - });
>> - });
>>
>> - $('#template-edit-storagePool').change(function() {
>> - storagepool = $(this).val();
>> - var storageArray = storagepool.split("/");
>> - if (storageArray.length > 3) {
>> - volumeName = storageArray.pop();
>> - poolName = storageArray.pop();
>> - kimchi.getStoragePoolVolume(poolName, volumeName,
>> function(result) {
>> - $('input[name="disks"]',
>> templateEditForm).val(result.capacity / Math.pow(1024,3));
>> - $('input[name="disks"]',
>> templateEditForm).attr('disabled','disabled');
>> - return false;
>> - }, function (err) {
>> - kimchi.message.error(err.responseJSON.reason);
>> + $('#template-edit-storage-add-button').button({
>> + icons: {
>> + primary: "ui-icon-plusthick"
>> + },
>> + text: false,
>> + disabled: true
>> + }).click(function(event) {
>> + event.preventDefault();
>> + var storageNodeData = {
>> + viewMode : 'hide',
>> + editMode : '',
>> + storageName : 'null',
>> + storageType : 'dir',
>> + storageDisk : '10'
>> + }
>> + addStorageItem(storageNodeData);
>> });
>> - } else {
>> - $('input[name="disks"]',
>> templateEditForm).removeAttr('disabled');
>> - $('input[name="disks"]',
>> templateEditForm).val(templateDiskSize);
>> - }
>> - });
>> - $('input[name="disks"]',
templateEditForm).keyup(function() {
>> - templateDiskSize = $('input[name="disks"]',
>> templateEditForm).val();
>> - });
>> + };
>> + var initInterface = function(result) {
>> + var addInterfaceItem = function(networkData) {
>> + var nodeInterface =
>> $.parseHTML(kimchi.substitute($('#template-interface-tmpl').html(),
>> networkData));
>> + $('.template-tab-body',
>> '#form-template-interface').append(nodeInterface);
>> + $('.edit', '#form-template-interface').button({
>> + icons : {primary : 'ui-icon-pencil'},
>> + text : false,
>> + disabled : true
>> + });
>> + $('.delete',
'#form-template-interface').button({
>> + icons : {primary : 'ui-icon-trash'},
>> + text : false
>> + }).click(function(evt) {
>> + evt.preventDefault();
>> + $(this).parent().parent().remove();
>> + });
>> + $('.cancel',
'#form-template-interface').button({
>> + icons : {primary :
>> 'ui-icon-arrowreturnthick-1-w'},
>> + text : false
>> + }).click(function(evt) {
>> + evt.preventDefault();
>> + $(this).parent().parent().remove();
>> + });
>> + $('.save', '#form-template-interface').button({
>> + icons : {primary : 'ui-icon-disk'},
>> + text : false
>> + }).click(function(evt) {
>> + evt.preventDefault();
>> + var interItem = $(this).parent().parent();
>> + $('.save', interItem).parent().hide();
>> + $('.delete', interItem).parent().show();
>> + var selectedInterface = $('select',
>> interItem).val();
>> + $('.template-interface-name',
>> interItem).val(selectedInterface).show();
>> + $('select', interItem).hide();
>> + });
>> + var networkOptions = '';
>> + for(var i=0;i<result.length;i++){
>> + if(result[i].state === "active") {
>> + var isSlected = i==0 ? ' selected' :
'';
>> + networkOptions += '<option' + isSlected +
>> '>' + result[i].name + '</option>';
>> + }
>> + }
>> + $('select',
>> '#form-template-interface').find('option').remove();
>> + $('select',
>> '#form-template-interface').append(networkOptions);
>> + };
>> + if(result && result.length > 0) {
>> + $.each(result, function(index, data) {
>> + if($.inArray(data.name, origNetworks) > -1) {
>> + addInterfaceItem({
>> + mac : '',
>> + network : data.name,
>> + type : 'network',
>> + viewMode : '',
>> + editMode : 'hide'
>> + });
>> + }
>> + });
>> + }
>> + $('#template-edit-interface-add-button').button({
>> + icons: {
>> + primary: 'ui-icon-plusthick'
>> + },
>> + text: false
>> + }).click(function(evt) {
>> + evt.preventDefault();
>> + addInterfaceItem({
>> + mac : '',
>> + network : '',
>> + type : 'network',
>> + viewMode : 'hide',
>> + editMode : ''
>> + });
>> + });
>> + };
>> + kimchi.listNetworks(initInterface);
>> + kimchi.listStoragePools(initStorage);
>> + };
>> + kimchi.retrieveTemplate(kimchi.selectedTemplate, initTemplate);
>> +
>>
>> $('#tmpl-edit-button-save').on('click', function() {
>> - var editableFields = [ 'name', 'cpus', 'memory',
>> 'storagepool', 'disks', 'graphics'];
>> + var editableFields = [ 'name', 'cpus', 'memory',
'disks',
>> 'graphics'];
>> var data = {};
>> + //Fix me: Only support one storage pool now
>> + var storages = $('.template-tab-body .item',
>> '#form-template-storage');
>> + var tempName = $('.template-storage-name', storages).val();
>> + tempName = tempName.split('/');
>> + var tempNameHead =tempName[0];
>> + var tempNameTail = tempNameHead;
>> + if(tempNameHead === 'iscsi' || tempNameHead =='scsi') {
>> + tempNameTail = tempName[tempName.length-1];
>> + }
>> + tempName = '/storagepools/' + tempNameHead;
>> + data['storagepool'] = tempName;
>> $.each(editableFields, function(i, field) {
>> /* Support only 1 disk at this moment */
>> if (field == 'disks') {
>> - origDisks[0].size = Number($('#form-template-edit
>> [name="' + field + '"]').val());
>> + var tmpItem = $('#form-template-storage .item');
>> + origDisks[0].size =
>> Number($('.template-storage-disk', tmpItem).val());
>> + if($('.template-storage-type', tmpItem).val() ===
>> 'iscsi' || $('.template-storage-type', tmpItem).val()
=='scsi') {
>> + origDisks[0]['volume'] = tempNameTail;
>> + } else {
>> + origDisks[0]['volume'] && delete
>> origDisks[0]['volume'];
>> + }
>> data[field] = origDisks;
>> }
>> else if (field == 'graphics') {
>> - var type = $('#form-template-edit [name="' + field +
>> '"]').val();
>> + var type = $('#form-template-general [name="' +
>> field + '"]').val();
>> data[field] = {'type': type};
>> }
>> else {
>> - data[field] = $('#form-template-edit [name="' +
>> field + '"]').val();
>> + data[field] = $('#form-template-general [name="' +
>> field + '"]').val();
>> }
>> });
>> data['memory'] = Number(data['memory']);
>> data['cpus'] = Number(data['cpus']);
>> - storagepool = data['storagepool'];
>> - storageArray = storagepool.split("/");
>> - if (storageArray.length > 3){
>> - /* Support only 1 disk at this moment */
>> - data["disks"][0].volume = storageArray.pop();
>> - data['storagepool'] = storageArray.join("/");
>> - } else if (data["disks"][0].volume) {
>> - delete data["disks"][0].volume;
>> - }
>> - var networks = templateEditForm.serializeObject().networks;
>> - if (networks instanceof Array) {
>> - data.networks = networks;
>> - } else if (networks != null) {
>> - data.networks = [networks];
>> + var networks = $('.template-tab-body .item',
>> '#form-template-interface');
>> + var networkForUpdate = new Array();
>> + $.each(networks, function(index, networkEntities) {
>> + networkForUpdate.push($('.template-interface-name',
>> networkEntities).val());
>> + });
>> + if (networkForUpdate instanceof Array) {
>> + data.networks = networkForUpdate;
>> + } else if (networkForUpdate != null) {
>> + data.networks = [networkForUpdate];
>> } else {
>> data.networks = [];
>> }
>> diff --git a/ui/pages/template-edit.html.tmpl
>> b/ui/pages/template-edit.html.tmpl
>> index 5a71d91..018ac10 100644
>> --- a/ui/pages/template-edit.html.tmpl
>> +++ b/ui/pages/template-edit.html.tmpl
>> @@ -28,74 +28,67 @@
>> <div class="close">X</div>
>> </header>
>> <div class="content">
>> - <form id="form-template-edit">
>> + <div id="edit-template-tabs">
>> <input type="hidden" id="template-name"
>> name="templateName" />
>> - <fieldset class="template-edit-fieldset">
>> - <div>
>> + <ul>
>> + <li>
>> + <a
href="#form-template-general">$_("General")</a>
>> + </li>
>> + <li>
>> + <a
href="#form-template-storage">$_("Storage")</a>
>> + </li>
>> + <li>
>> + <a
>> href="#form-template-interface">$_("Interface")</a>
>> + </li>
>> + </ul>
>> + <form id="form-template-general">
>> + <div class="form-template-inline-wrapper">
>> <div class="template-edit-wrapper-label">
>> <label
>> for="template-edit-id-textbox">$_("Name")</label>
>> </div>
>> - <div
class="template-edit-wrapper-controls">
>> - <input id="template-edit-id-textbox"
>> name="name" type="text" />
>> - </div>
>> - </div>
>> - <div>
>> <div class="template-edit-wrapper-label">
>> <label
>>
for="template-edit-vendor-textbox">$_("Vendor")</label>
>> </div>
>> - <div
class="template-edit-wrapper-controls">
>> - <input id="template-edit-vendor-textbox"
>> name="os_distro" type="text" disabled="disabled"
/>
>> - </div>
>> - </div>
>> - <div>
>> <div class="template-edit-wrapper-label">
>> <label
>>
for="template-edit-version-textbox">$_("Version")</label>
>> </div>
>> - <div
class="template-edit-wrapper-controls">
>> - <input id="template-edit-version-textbox"
>> name="os_version" type="text" disabled="disabled"
/>
>> - </div>
>> - </div>
>> - <div>
>> <div class="template-edit-wrapper-label">
>> <label
>> for="template-edit-cpu-textbox">$_("CPU
Number")</label>
>> </div>
>> - <div
class="template-edit-wrapper-controls">
>> - <input id="template-edit-cpu-textbox"
>> name="cpus" type="text" />
>> - </div>
>> - </div>
>> - <div>
>> <div class="template-edit-wrapper-label">
>> <label
>> for="template-edit-memory-textbox">$_("Memory
(MB)")</label>
>> </div>
>> - <div
class="template-edit-wrapper-controls">
>> - <input id="template-edit-memory-textbox"
>> name="memory" type="text" />
>> + <div class="template-edit-wrapper-label
>> templ-edit-cdrom">
>> + <label
>>
for="template-edit-cdrom-textbox">$_("CDROM")</label>
>> + </div>
>> + <div class="template-edit-wrapper-label
>> templ-edit-vm-image hide">
>> + <label
>> for="template-edit-vmimage-textbox">$_("Image
File")</label>
>> </div>
>> - </div>
>> - <div>
>> <div class="template-edit-wrapper-label">
>> - <label
>> for="template-edit-disk-textbox">$_("Disk
(GB)")</label>
>> + <label>$_("Graphics")</label>
>> </div>
>> + </div>
>> + <div class="form-template-inline-wrapper">
>> <div
class="template-edit-wrapper-controls">
>> - <input id="template-edit-disk-textbox"
>> name="disks" type="text" />
>> + <input id="template-edit-id-textbox"
>> name="name" type="text" />
>> </div>
>> - </div>
>> - </fieldset>
>> - <fieldset class="template-edit-fieldset">
>> - <div id="templ-edit-cdrom">
>> - <div class="template-edit-wrapper-label">
>> - <label
>>
for="template-edit-cdrom-textbox">$_("CDROM")</label>
>> + <div
class="template-edit-wrapper-controls">
>> + <input id="template-edit-vendor-textbox"
>> name="os_distro" type="text" disabled="disabled"
/>
>> </div>
>> <div
class="template-edit-wrapper-controls">
>> - <input id="template-edit-cdrom-textbox"
>> name="cdrom" type="text" disabled="disabled"/>
>> + <input id="template-edit-version-textbox"
>> name="os_version" type="text" disabled="disabled"
/>
>> </div>
>> - </div>
>> - <div id="templ-edit-vm-image"
class="hide-content">
>> - <div
>> class="template-edit-wrapper-label">$_("Image
File")</div>
>> - <div
>> class="template-edit-wrapper-controls"><input
name="vm-image"
>> type="text" disabled/></div>
>> - </div>
>> - <div>
>> - <div class="template-edit-wrapper-label">
>> - <label>$_("Graphics")</label>
>> + <div
class="template-edit-wrapper-controls">
>> + <input id="template-edit-cpu-textbox"
>> name="cpus" type="text" />
>> + </div>
>> + <div
class="template-edit-wrapper-controls">
>> + <input id="template-edit-memory-textbox"
>> name="memory" type="text" />
>> + </div>
>> + <div class="template-edit-wrapper-controls
>> templ-edit-cdrom">
>> + <input id="template-edit-cdrom-textbox"
>> name="cdrom" type="text" disabled="disabled" />
>> + </div>
>> + <div class="template-edit-wrapper-controls
>> templ-edit-vm-image hide">
>> + <input id="template-edit-vmimage-textbox"
>> name="vm-image" type="text" disabled="disabled"
/>
>> </div>
>> <div
class="template-edit-wrapper-controls">
>> <div class="btn dropdown popable">
>> @@ -108,40 +101,26 @@
>> </div>
>> </div>
>> </div>
>> - <div>
>> - <div class="template-edit-wrapper-label">
>> - <label>$_("Storage Pool")</label>
>> - </div>
>> - <div
class="template-edit-wrapper-controls">
>> - <div class="btn dropdown popable">
>> - <input id="template-edit-storagePool"
>> name="storagepool" type="hidden" />
>> - <span class="text"
>> id="template-edit-storage-label"></span><span
class="arrow"></span>
>> - <div class="popover" style="width:
100%">
>> - <ul class="select-list"
>> id="template-edit-storagePool-list"
>> data-target="template-edit-storagePool"
>> data-label="template-edit-storage-label">
>> - </ul>
>> - </div>
>> - </div>
>> - </div>
>> + </form>
>> + <form id="form-template-storage">
>> + <div class="template-tab-header">
>> + <span
class="template-storage-cell">$_("Storage
>> Pool")</span>
>> + <span
>> class="template-storage-cell">$_("Type")</span>
>> + <span
>> class="template-storage-cell">$_("Disk(GB)")</span>
>> + <button type="button"
>> id="template-edit-storage-add-button"
class="action-area"></button>
>> </div>
>> - <div>
>> - <div class="template-edit-wrapper-label">
>> - <label>$_("Network")</label>
>> - </div>
>> - <div
class="template-edit-wrapper-controls">
>> - <ul class="select-list-box"
>> id="template-edit-network-list">
>> - </ul>
>> - <script id="tmpl-network"
type="text/html">
>> - <li>
>> - <label>
>> - <input name="networks"
>> type="checkbox" value="{name}" />
>> - <span
class="item">{name}</span>
>> - </label>
>> - </li>
>> - </script>
>> - </div>
>> + <div class="template-tab-body">
>> </div>
>> - </fieldset>
>> - </form>
>> + </form>
>> + <form id="form-template-interface">
>> + <div class="template-tab-header">
>> + <span
>>
class="template-interface-cell">$_("Network")</span>
>> + <span
>> class="template-interface-cell">$_("Type")</span>
>> + <button type="button"
>> id="template-edit-interface-add-button"
class="action-area"></button>
>> + </div>
>> + <div class="template-tab-body"></div>
>> + </form>
>> + </div>
>> </div>
>> <footer>
>> <div class="btn-group">
>> @@ -152,3 +131,40 @@
>> <script>
>> kimchi.template_edit_main();
>> </script>
>> +<script id="template-storage-pool-tmpl"
type="text/html">
>> + <div class='item'>
>> + <span class="template-storage-cell">
>> + <input class="template-storage-name {viewMode}"
>> value={storageName} readonly=true type="text"/>
>> + <select class="{editMode}"></select>
>> + </span>
>> + <span class="template-storage-cell">
>> + <input class="template-storage-type"
>> value={storageType} readonly=true type="text" />
>> + </span>
>> + <span class="template-storage-cell">
>> + <input class="template-storage-disk"
>> value={storageDisk} type="text" />
>> + </span>
>> + <span class="action-area {editMode}">
>> + <button class="save"></button><button
>> class="cancel"></button>
>> + </span>
>> + <span class="action-area {viewMode}">
>> + <button class="edit"></button><button
>> class="delete"></button>
>> + </span>
>> + </div>
>> +</script>
>> +<script id="template-interface-tmpl"
type="text/html">
>> + <div class="item">
>> + <span class="template-interface-cell">
>> + <input class="template-interface-name {viewMode}"
>> readonly="true" type="text" value={network} />
>> + <select class="{editMode}"></select>
>> + </span>
>> + <span class="template-interface-cell">
>> + <input value={type} readonly=true type="text" />
>> + </span>
>> + <span class="action-area {editMode}">
>> + <button class="save"></button><button
>> class="cancel"></button>
>> + </span>
>> + <span class="action-area {viewMode}">
>> + <button class="edit"></button><button
>> class="delete"></button>
>> + </span>
>> + </div>
>> +</script>
>> \ No newline at end of file
>
>