diff --git a/ui/scripts/templates.js b/ui/scripts/templates.js index 7a99d79b4fc..d926d05b821 100644 --- a/ui/scripts/templates.js +++ b/ui/scripts/templates.js @@ -204,11 +204,42 @@ } }, - osTypeId: { - label: 'label.os.type', + osCategory: { + label: 'OS Category', select: function(args) { $.ajax({ - url: createURL("listOsTypes"), + url: createURL("listOsCategories"), + dataType: "json", + async: true, + success: function(json) { + var osCats = json.listoscategoriesresponse.oscategory; + var items = []; + if (isAdmin()) + items.push({id: -1, description: "All OS"}); + $(osCats).each(function() { + items.push({id: this.id, description: this.name}); + }); + args.response.success({data: items}); + } + }); + } + }, + + osTypeId: { + label: 'label.os.type', + dependsOn: 'osCategory', + select: function(args) { + if(args.osCategory == null) + return; + + var apiCmd; + if(args.osCategory == -1) + apiCmd = "listOsTypes"; + else + apiCmd = "listOsTypes&oscategoryid=" + args.osCategory; + + $.ajax({ + url: createURL(apiCmd), dataType: "json", async: true, success: function(json) { @@ -783,15 +814,46 @@ isBoolean: true, isChecked: true }, - + + osCategory: { + label: 'OS Category', + dependsOn: 'isBootable', + select: function(args) { + $.ajax({ + url: createURL("listOsCategories"), + dataType: "json", + async: true, + success: function(json) { + var osCats = json.listoscategoriesresponse.oscategory; + var items = []; + if (isAdmin()) + items.push({id: -1, description: "All OS"}); + $(osCats).each(function() { + items.push({id: this.id, description: this.name}); + }); + args.response.success({data: items}); + } + }); + } + }, + osTypeId: { label: 'label.os.type', - dependsOn: 'isBootable', + dependsOn: ['isBootable','osCategory'], isHidden: false, validation: { required: true }, select: function(args) { + if(args.osCategory == null) + return; + + var apiCmd; + if(args.osCategory == -1) + apiCmd = "listOsTypes"; + else + apiCmd = "listOsTypes&oscategoryid=" + args.osCategory; + $.ajax({ - url: createURL("listOsTypes"), + url: createURL(apiCmd), dataType: "json", async: true, success: function(json) { diff --git a/ui/scripts/ui/dialog.js b/ui/scripts/ui/dialog.js index de44eb0ccf4..86db690146c 100644 --- a/ui/scripts/ui/dialog.js +++ b/ui/scripts/ui/dialog.js @@ -117,52 +117,56 @@ var $value = $('
').addClass('value') .appendTo($formItem); var $input, $dependsOn, selectFn, selectArgs; - var dependsOn = field.dependsOn; + var dependsOn = $.isArray(field.dependsOn) ? field.dependsOn : [field.dependsOn] ; //now an array // Depends on fields - if (field.dependsOn) { - $formItem.attr('depends-on', dependsOn); - $dependsOn = $form.find('input, select').filter(function() { - return $(this).attr('name') === dependsOn; - }); + if (dependsOn.length) { + $.each(dependsOn, function(key, value){ + var dependsOn = value; - if ($dependsOn.is('[type=checkbox]')) { - var isReverse = args.form.fields[dependsOn].isReverse; - - // Checkbox - $dependsOn.bind('click', function(event) { - var $target = $(this); - var $dependent = $target.closest('form').find('[depends-on=\'' + dependsOn + '\']'); - - if (($target.is(':checked') && !isReverse) || - ($target.is(':unchecked') && isReverse)) { - $dependent.css('display', 'inline-block'); - $dependent.each(function() { - if ($(this).data('dialog-select-fn')) { - $(this).data('dialog-select-fn')(); - } - }); - } else if (($target.is(':unchecked') && !isReverse) || - ($target.is(':checked') && isReverse)) { - $dependent.hide(); - } - - $dependent.find('input[type=checkbox]').click(); - - if (!isReverse) { - $dependent.find('input[type=checkbox]').attr('checked', false); - } else { - $dependent.find('input[type=checkbox]').attr('checked', true); - } - - return true; + $formItem.attr('depends-on-'+value, dependsOn); + $dependsOn = $form.find('input, select').filter(function() { + return $(this).attr('name') === dependsOn; }); - // Show fields by default if it is reverse checkbox - if (isReverse) { - $dependsOn.click(); - } - } + if ($dependsOn.is('[type=checkbox]')) { + var isReverse = args.form.fields[dependsOn].isReverse; + + // Checkbox + $dependsOn.bind('click', function(event) { + var $target = $(this); + var $dependent = $target.closest('form').find('[depends-on-' + value + '=\'' + dependsOn + '\']'); + + if (($target.is(':checked') && !isReverse) || + ($target.is(':unchecked') && isReverse)) { + $dependent.css('display', 'inline-block'); + $dependent.each(function() { + if ($(this).find('select').data('dialog-select-fn')) { + $(this).find('select').data('dialog-select-fn')(); + } + }); + } else if (($target.is(':unchecked') && !isReverse) || + ($target.is(':checked') && isReverse)) { + $dependent.hide(); + } + + $dependent.find('input[type=checkbox]').click(); + + if (!isReverse) { + $dependent.find('input[type=checkbox]').attr('checked', false); + } else { + $dependent.find('input[type=checkbox]').attr('checked', true); + } + + return true; + }); + + // Show fields by default if it is reverse checkbox + if (isReverse) { + $dependsOn.click(); + } + }; + }); } // Determine field type of input @@ -207,31 +211,35 @@ // Pass form item to provider for additional manipulation $.extend(selectArgs, { $select: $input }); - if (dependsOn) { - $dependsOn = $input.closest('form').find('input, select').filter(function() { - return $(this).attr('name') === dependsOn; + if (dependsOn.length) { + $.each(dependsOn, function(key, value){ + var dependsOn = value; + + $dependsOn = $input.closest('form').find('input, select').filter(function() { + return $(this).attr('name') === dependsOn; + }); + + $dependsOn.bind('change', function(event) { + var $target = $(this); + + if (!$dependsOn.is('select')) return true; + + var dependsOnArgs = {}; + + $input.find('option').remove(); + + if (!$target.children().size()) return true; + + dependsOnArgs[dependsOn] = $target.val(); + selectFn($.extend(selectArgs, dependsOnArgs)); + + return true; + }); + + if (!$dependsOn.is('select')) { + selectFn(selectArgs); + } }); - - $dependsOn.bind('change', function(event) { - var $target = $(this); - - if (!$dependsOn.is('select')) return true; - - var dependsOnArgs = {}; - - $input.find('option').remove(); - - if (!$target.children().size()) return true; - - dependsOnArgs[dependsOn] = $target.val(); - selectFn($.extend(selectArgs, dependsOnArgs)); - - return true; - }); - - if (!$dependsOn.is('select')) { - selectFn(selectArgs); - } } else { selectFn(selectArgs); }