mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	Problem: Users don't know what keys/values to enter for template and VM details. Root Cause: The feature does not exist that can list possible details and options. Solution: Based on the possible VM and template details handled by the codebase, those details were refactored and a list API is introduced that can return users those details along with possible values. When users add details now, they will be presented with a list of key details and their possible options if any. Signed-off-by: Rohit Yadav <rohit.yadav@shapeblue.com>
		
			
				
	
	
		
			227 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			227 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // Licensed to the Apache Software Foundation (ASF) under one
 | |
| // or more contributor license agreements.  See the NOTICE file
 | |
| // distributed with this work for additional information
 | |
| // regarding copyright ownership.  The ASF licenses this file
 | |
| // to you 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.
 | |
| 
 | |
| (function($, cloudStack) {
 | |
|     cloudStack.uiCustom.granularSettings = function(args) {
 | |
|         var dataProvider = args.dataProvider;
 | |
|         var actions = args.actions;
 | |
| 
 | |
|         return function(args) {
 | |
|             var context = args.context;
 | |
| 
 | |
|             var listView = {
 | |
|                 id: 'settings',
 | |
|                 fields: {
 | |
|                     name: {
 | |
|                         label: 'label.name'
 | |
|                     },
 | |
|                     description: {
 | |
|                         label: 'label.description'
 | |
|                     },
 | |
|                     value: {
 | |
|                         label: 'label.value',
 | |
|                         editable: true
 | |
|                     }
 | |
|                 },
 | |
|                 actions: {
 | |
|                     edit: {
 | |
|                         label: 'label.change.value',
 | |
|                         action: actions.edit
 | |
|                     }
 | |
|                 },
 | |
|                 dataProvider: dataProvider
 | |
|             };
 | |
| 
 | |
|             var $listView = $('<div>').listView({
 | |
|                 context: context,
 | |
|                 listView: listView
 | |
|             });
 | |
| 
 | |
|             return $listView;
 | |
|         }
 | |
|     };
 | |
|     cloudStack.uiCustom.granularDetails = function(args) {
 | |
|         var dataProvider = args.dataProvider;
 | |
|         var actions = args.actions;
 | |
|         var resourceType = args.resourceType;
 | |
| 
 | |
|         return function(args) {
 | |
|             var context = args.context;
 | |
| 
 | |
|             var listView = {
 | |
|                 id: 'details',
 | |
|                 fields: {
 | |
|                     name: {
 | |
|                         label: 'label.name'
 | |
|                     },
 | |
|                     value: {
 | |
|                         label: 'label.value',
 | |
|                         editable: true
 | |
|                     }
 | |
|                 },
 | |
|                 actions: {
 | |
|                     edit: {
 | |
|                         label: 'label.change.value',
 | |
|                         action: actions.edit
 | |
|                     },
 | |
|                     remove: {
 | |
|                         label: 'Remove Setting',
 | |
|                         messages: {
 | |
|                             confirm: function(args) {
 | |
|                                 return 'Delete Setting';
 | |
|                             },
 | |
|                             notification: function(args) {
 | |
|                                 return 'Setting deleted';
 | |
|                             }
 | |
|                         },
 | |
|                         action: actions.remove,
 | |
|                         notification: {
 | |
|                             poll: function(args) {
 | |
|                                 args.complete();
 | |
|                             }
 | |
|                         }
 | |
|                     },
 | |
|                     add : {
 | |
|                         label: 'Add Setting',
 | |
|                         messages: {
 | |
|                             confirm: function(args) {
 | |
|                                 return 'Add Setting';
 | |
|                             },
 | |
|                             notification: function(args) {
 | |
|                                 return 'Setting added';
 | |
|                             }
 | |
|                         },
 | |
|                         preFilter: function(args) {
 | |
|                             return true;
 | |
|                         },
 | |
|                         createForm: {
 | |
|                             title: 'Add New Setting',
 | |
|                             preFilter: function(args) {
 | |
|                                 var data = {
 | |
|                                     resourcetype: resourceType
 | |
|                                 };
 | |
|                                 if (resourceType === 'UserVm') {
 | |
|                                     data.resourceid = args.context.instances[0].id;
 | |
|                                 }
 | |
|                                 if (resourceType === 'Template') {
 | |
|                                     data.resourceid = args.context.templates[0].id;
 | |
|                                 }
 | |
| 
 | |
|                                 $.ajax({
 | |
|                                     url: createURL("listDetailOptions"),
 | |
|                                     data: data,
 | |
|                                     dataType: "json",
 | |
|                                     success: function(json) {
 | |
|                                         var details = json.listdetailoptionsresponse.detailoptions.details;
 | |
|                                         var keys = [];
 | |
|                                         Object.keys(details).forEach(function(key,index) {
 | |
|                                             keys.push(key);
 | |
|                                         });
 | |
|                                         $(args.$form.find('input[name="name"]')).blur();
 | |
|                                         $(args.$form.find('input[name="name"]')).autocomplete({
 | |
|                                             minLength: 0,
 | |
|                                             delay: 0,
 | |
|                                             source: keys.sort(),
 | |
|                                             select: function(event, ui) {
 | |
|                                                 const key = ui.item.value;
 | |
|                                                 const options = details[key];
 | |
|                                                 $(args.$form.find('input[name="value"]')).autocomplete({
 | |
|                                                     minLength: 0,
 | |
|                                                     delay: 0,
 | |
|                                                     autoFocus: true,
 | |
|                                                     source: options.sort()
 | |
|                                                 }).focus(function() {
 | |
|                                                     $(this).data("uiAutocomplete").search($(this).val());
 | |
|                                                 });
 | |
|                                             }
 | |
|                                         }).focus(function() {
 | |
|                                             $(this).data("uiAutocomplete").search($(this).val());
 | |
|                                         });
 | |
|                                     }
 | |
|                                 });
 | |
| 
 | |
|                                 return true;
 | |
|                             },
 | |
|                             fields: {
 | |
|                                 name: {
 | |
|                                     label: 'label.name',
 | |
|                                     validation: {
 | |
|                                         required: true
 | |
|                                     }
 | |
|                                 },
 | |
|                                 value: {
 | |
|                                     label: 'label.value',
 | |
|                                     validation: {
 | |
|                                         required: true
 | |
|                                     }
 | |
|                                 }
 | |
|                             }
 | |
|                         },
 | |
|                         action: actions.add
 | |
|                     }
 | |
|                 },
 | |
|                 dataProvider: function(args) {
 | |
|                     var data = {
 | |
|                         resourcetype: resourceType
 | |
|                     };
 | |
|                     if (resourceType === 'UserVm') {
 | |
|                         data.resourceid = args.context.instances[0].id;
 | |
|                     }
 | |
|                     if (resourceType === 'Template') {
 | |
|                         data.resourceid = args.context.templates[0].id;
 | |
|                     }
 | |
| 
 | |
|                     $.ajax({
 | |
|                         url: createURL("listDetailOptions"),
 | |
|                         data: data,
 | |
|                         dataType: "json",
 | |
|                         success: function(json) {
 | |
|                             var details = json.listdetailoptionsresponse.detailoptions.details;
 | |
|                             var tbody = $.find('#details-tab-settings .data-table tbody');
 | |
|                             $(tbody).on('DOMNodeInserted', "tr", function() {
 | |
|                                 $.each($.find('#details-tab-settings .data-table tbody tr'), function(idx, row) {
 | |
|                                     const key = $(row).find('td.name').attr('title');
 | |
|                                     const options = details[key];
 | |
|                                     if (options) {
 | |
|                                         $($(row).find('input.edit')).autocomplete({
 | |
|                                             minLength: 0,
 | |
|                                             delay: 0,
 | |
|                                             autoFocus: true,
 | |
|                                             source: options.sort()
 | |
|                                         }).focus(function() {
 | |
|                                             $(this).data("uiAutocomplete").search("");
 | |
|                                         });
 | |
|                                         $(row).find('input.edit').blur();
 | |
|                                     }
 | |
|                                 });
 | |
|                             });
 | |
|                             dataProvider(args);
 | |
|                         }
 | |
|                     });
 | |
|                 }
 | |
|             };
 | |
| 
 | |
|             var $listView = $('<div>').listView({
 | |
|                 context: context,
 | |
|                 listView: listView
 | |
|             });
 | |
| 
 | |
|             return $listView;
 | |
|         }
 | |
|     };
 | |
| }(jQuery, cloudStack));
 |