mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	UI: Fix deploy VM wizard vApp properties (#8072)
This PR fixes the vApp properties values sent as part of the deployVirtualMachine API through the UI Fixes: #7998
This commit is contained in:
		
							parent
							
								
									a8700bff7f
								
							
						
					
					
						commit
						b09acb8fd0
					
				| @ -470,13 +470,13 @@ | ||||
| 
 | ||||
|                         <span v-if="property.type && property.type==='boolean'"> | ||||
|                           <a-switch | ||||
|                             v-model:checked="form['properties.' + escapePropertyKey(property.key)]" | ||||
|                             v-model:checked="form.properties[escapePropertyKey(property.key)]" | ||||
|                             :placeholder="property.description" | ||||
|                           /> | ||||
|                         </span> | ||||
|                         <span v-else-if="property.type && (property.type==='int' || property.type==='real')"> | ||||
|                           <a-input-number | ||||
|                             v-model:value="form['properties.'+ escapePropertyKey(property.key)]" | ||||
|                             v-model:value="form.properties[escapePropertyKey(property.key)]" | ||||
|                             :placeholder="property.description" | ||||
|                             :min="getPropertyQualifiers(property.qualifiers, 'number-select').min" | ||||
|                             :max="getPropertyQualifiers(property.qualifiers, 'number-select').max" /> | ||||
| @ -485,7 +485,7 @@ | ||||
|                           <a-select | ||||
|                             showSearch | ||||
|                             optionFilterProp="label" | ||||
|                             v-model:value="form['properties.' + escapePropertyKey(property.key)]" | ||||
|                             v-model:value="form.properties[escapePropertyKey(property.key)]" | ||||
|                             :placeholder="property.description" | ||||
|                             :filterOption="(input, option) => { | ||||
|                               return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0 | ||||
| @ -498,12 +498,12 @@ | ||||
|                         </span> | ||||
|                         <span v-else-if="property.type && property.type==='string' && property.password"> | ||||
|                           <a-input-password | ||||
|                             v-model:value="form['properties.' + escapePropertyKey(property.key)]" | ||||
|                             v-model:value="form.properties[escapePropertyKey(property.key)]" | ||||
|                             :placeholder="property.description" /> | ||||
|                         </span> | ||||
|                         <span v-else> | ||||
|                           <a-input | ||||
|                             v-model:value="form['properties.' + escapePropertyKey(property.key)]" | ||||
|                             v-model:value="form.properties[escapePropertyKey(property.key)]" | ||||
|                             :placeholder="property.description" /> | ||||
|                         </span> | ||||
|                       </a-form-item> | ||||
| @ -1509,61 +1509,7 @@ export default { | ||||
|           }) | ||||
|         } | ||||
| 
 | ||||
|         if (this.vm.templateid && this.templateProperties && Object.keys(this.templateProperties).length > 0) { | ||||
|           this.templateProperties.forEach((props, category) => { | ||||
|             props.forEach((property, propertyIndex) => { | ||||
|               if (property.type && property.type === 'boolean') { | ||||
|                 this.form['properties.' + this.escapePropertyKey(property.key)] = property.value === 'TRUE' | ||||
|               } else if (property.type && (property.type === 'int' || property.type === 'real')) { | ||||
|                 this.form['properties.' + this.escapePropertyKey(property.key)] = property.value | ||||
|               } else if (property.type && property.type === 'string' && property.qualifiers && property.qualifiers.startsWith('ValueMap')) { | ||||
|                 this.form['properties.' + this.escapePropertyKey(property.key)] = property.value && property.value.length > 0 | ||||
|                   ? property.value | ||||
|                   : this.getPropertyQualifiers(property.qualifiers, 'select')[0] | ||||
|               } else if (property.type && property.type === 'string' && property.password) { | ||||
|                 this.form['properties.' + this.escapePropertyKey(property.key)] = property.value | ||||
|                 this.rules['properties.' + this.escapePropertyKey(property.key)] = [{ | ||||
|                   validator: async (rule, value) => { | ||||
|                     if (!property.qualifiers) { | ||||
|                       return Promise.resolve() | ||||
|                     } | ||||
|                     var minlength = this.getPropertyQualifiers(property.qualifiers, 'number-select').min | ||||
|                     var maxlength = this.getPropertyQualifiers(property.qualifiers, 'number-select').max | ||||
|                     var errorMessage = '' | ||||
|                     var isPasswordInvalidLength = function () { | ||||
|                       return false | ||||
|                     } | ||||
|                     if (minlength) { | ||||
|                       errorMessage = this.$t('message.validate.minlength').replace('{0}', minlength) | ||||
|                       isPasswordInvalidLength = function () { | ||||
|                         return !value || value.length < minlength | ||||
|                       } | ||||
|                     } | ||||
|                     if (maxlength !== Number.MAX_SAFE_INTEGER) { | ||||
|                       if (minlength) { | ||||
|                         errorMessage = this.$t('message.validate.range.length').replace('{0}', minlength).replace('{1}', maxlength) | ||||
|                         isPasswordInvalidLength = function () { | ||||
|                           return !value || (maxlength < value.length || value.length < minlength) | ||||
|                         } | ||||
|                       } else { | ||||
|                         errorMessage = this.$t('message.validate.maxlength').replace('{0}', maxlength) | ||||
|                         isPasswordInvalidLength = function () { | ||||
|                           return !value || value.length > maxlength | ||||
|                         } | ||||
|                       } | ||||
|                     } | ||||
|                     if (isPasswordInvalidLength()) { | ||||
|                       return Promise.reject(errorMessage) | ||||
|                     } | ||||
|                     return Promise.resolve() | ||||
|                   } | ||||
|                 }] | ||||
|               } else { | ||||
|                 this.form['properties.' + this.escapePropertyKey(property.key)] = property.value | ||||
|               } | ||||
|             }) | ||||
|           }) | ||||
|         } | ||||
|         this.updateFormProperties() | ||||
| 
 | ||||
|         if (this.vm.templateid && this.templateLicenses && this.templateLicenses.length > 0) { | ||||
|           this.rules.licensesaccepted = [{ | ||||
| @ -2582,6 +2528,64 @@ export default { | ||||
|       this.dataPreFill.memory = params.memory | ||||
|       this.handleSearchFilter('serviceOfferings', params) | ||||
|     }, | ||||
|     updateFormProperties () { | ||||
|       if (this.vm.templateid && this.templateProperties && Object.keys(this.templateProperties).length > 0) { | ||||
|         this.form.properties = {} | ||||
|         Object.keys(this.templateProperties).forEach((category, categoryIndex) => { | ||||
|           this.templateProperties[category].forEach((property, _) => { | ||||
|             if (property.type && property.type === 'boolean') { | ||||
|               this.form.properties[this.escapePropertyKey(property.key)] = property.value === 'TRUE' | ||||
|             } else if (property.type && (property.type === 'int' || property.type === 'real')) { | ||||
|               this.form.properties[this.escapePropertyKey(property.key)] = property.value | ||||
|             } else if (property.type && property.type === 'string' && property.qualifiers && property.qualifiers.startsWith('ValueMap')) { | ||||
|               this.form.properties[this.escapePropertyKey(property.key)] = property.value && property.value.length > 0 | ||||
|                 ? property.value | ||||
|                 : this.getPropertyQualifiers(property.qualifiers, 'select')[0] | ||||
|             } else if (property.type && property.type === 'string' && property.password) { | ||||
|               this.form.properties[this.escapePropertyKey(property.key)] = property.value | ||||
|               this.rules['properties.' + this.escapePropertyKey(property.key)] = [{ | ||||
|                 validator: async (rule, value) => { | ||||
|                   if (!property.qualifiers) { | ||||
|                     return Promise.resolve() | ||||
|                   } | ||||
|                   var minlength = this.getPropertyQualifiers(property.qualifiers, 'number-select').min | ||||
|                   var maxlength = this.getPropertyQualifiers(property.qualifiers, 'number-select').max | ||||
|                   var errorMessage = '' | ||||
|                   var isPasswordInvalidLength = function () { | ||||
|                     return false | ||||
|                   } | ||||
|                   if (minlength) { | ||||
|                     errorMessage = this.$t('message.validate.minlength').replace('{0}', minlength) | ||||
|                     isPasswordInvalidLength = function () { | ||||
|                       return !value || value.length < minlength | ||||
|                     } | ||||
|                   } | ||||
|                   if (maxlength !== Number.MAX_SAFE_INTEGER) { | ||||
|                     if (minlength) { | ||||
|                       errorMessage = this.$t('message.validate.range.length').replace('{0}', minlength).replace('{1}', maxlength) | ||||
|                       isPasswordInvalidLength = function () { | ||||
|                         return !value || (maxlength < value.length || value.length < minlength) | ||||
|                       } | ||||
|                     } else { | ||||
|                       errorMessage = this.$t('message.validate.maxlength').replace('{0}', maxlength) | ||||
|                       isPasswordInvalidLength = function () { | ||||
|                         return !value || value.length > maxlength | ||||
|                       } | ||||
|                     } | ||||
|                   } | ||||
|                   if (isPasswordInvalidLength()) { | ||||
|                     return Promise.reject(errorMessage) | ||||
|                   } | ||||
|                   return Promise.resolve() | ||||
|                 } | ||||
|               }] | ||||
|             } else { | ||||
|               this.form.properties[this.escapePropertyKey(property.key)] = property.value | ||||
|             } | ||||
|           }) | ||||
|         }) | ||||
|       } | ||||
|     }, | ||||
|     updateTemplateParameters () { | ||||
|       if (this.template) { | ||||
|         this.templateNics = this.fetchTemplateNics(this.template) | ||||
| @ -2599,6 +2603,7 @@ export default { | ||||
|             this.updateComputeOffering(null) // reset as existing selection may be incompatible | ||||
|           } | ||||
|         }, 500) | ||||
|         this.updateFormProperties() | ||||
|       } | ||||
|     }, | ||||
|     onSelectTemplateConfigurationId (value) { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user