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);
}