From 16c67a49109eb5e81c85efaa153a737dea4dc712 Mon Sep 17 00:00:00 2001 From: utchoang Date: Mon, 3 Feb 2020 14:53:44 +0700 Subject: [PATCH 01/24] Add filter possibility to selections --- src/views/compute/DeployVM.vue | 105 +++++++++++++++--- .../compute/wizard/AffinityGroupSelection.vue | 50 +++++++-- src/views/compute/wizard/ComputeSelection.vue | 53 +++++++-- .../compute/wizard/DiskOfferingSelection.vue | 72 +++++++++--- src/views/compute/wizard/NetworkSelection.vue | 75 +++++++++---- .../compute/wizard/SshKeyPairSelection.vue | 53 +++++++-- .../compute/wizard/TemplateIsoSelection.vue | 18 ++- 7 files changed, 337 insertions(+), 89 deletions(-) diff --git a/src/views/compute/DeployVM.vue b/src/views/compute/DeployVM.vue index eb0a5f723..e4cfc98eb 100644 --- a/src/views/compute/DeployVM.vue +++ b/src/views/compute/DeployVM.vue @@ -60,6 +60,7 @@ @@ -79,7 +81,9 @@ @@ -87,7 +91,9 @@ @@ -113,7 +121,9 @@ @@ -134,7 +144,9 @@ @@ -219,6 +231,15 @@ export default { networks: [], sshKeyPairs: [] }, + loading: { + templates: false, + isos: false, + serviceOfferings: false, + diskOfferings: false, + affinityGroups: false, + networks: false, + sshKeyPairs: false + }, instanceConfig: [], template: {}, iso: {}, @@ -263,26 +284,49 @@ export default { } }, serviceOfferings: { - list: 'listServiceOfferings' + list: 'listServiceOfferings', + options: { + page: 1, + pageSize: 10, + keyword: undefined + } }, diskOfferings: { - list: 'listDiskOfferings' + list: 'listDiskOfferings', + options: { + page: 1, + pageSize: 10, + keyword: undefined + } }, zones: { list: 'listZones' }, affinityGroups: { - list: 'listAffinityGroups' + list: 'listAffinityGroups', + options: { + page: 1, + pageSize: 10, + keyword: undefined + } }, sshKeyPairs: { - list: 'listSSHKeyPairs' + list: 'listSSHKeyPairs', + options: { + page: 1, + pageSize: 10, + keyword: undefined + } }, networks: { list: 'listNetworks', options: { zoneid: _.get(this.zone, 'id'), canusefordeploy: true, - projectid: store.getters.project.id + projectid: store.getters.project.id, + page: 1, + pageSize: 10, + keyword: undefined } } } @@ -368,7 +412,7 @@ export default { this.form.getFieldDecorator('affinitygroupids', { initialValue: [], preserve: true }) this.form.getFieldDecorator('isoid', { initialValue: [], preserve: true }) this.form.getFieldDecorator('networkids', { initialValue: [], preserve: true }) - this.form.getFieldDecorator('keypair', { initialValue: [], preserve: true }) + this.form.getFieldDecorator('keypair', { initialValue: undefined, preserve: true }) }, created () { _.each(this.params, this.fetchOptions) @@ -409,6 +453,7 @@ export default { console.log('wizard submit') }, fetchOptions (param, name) { + this.loading[name] = true param.loading = true param.opts = [] const options = param.options || {} @@ -416,6 +461,11 @@ export default { api(param.list, options).then((response) => { param.loading = false _.map(response, (responseItem, responseKey) => { + if (Object.keys(responseItem).length === 0) { + this.options[name] = [] + this.$forceUpdate() + return + } if (!responseKey.includes('response')) { return } @@ -431,26 +481,41 @@ export default { }).catch(function (error) { console.log(error.stack) param.loading = false + }).finally(() => { + this.loading[name] = false }) }, fetchIsos (isoFilter) { - api('listIsos', { - zoneid: _.get(this.zone, 'id'), - isofilter: isoFilter, - bootable: true - }).then((response) => { - const concatedIsos = _.concat(this.options.isos, _.get(response, 'listisosresponse.iso', [])) - this.options.isos = _.uniqWith(concatedIsos, _.isEqual) - this.$forceUpdate() - }).catch((reason) => { - // ToDo: Handle errors - console.log(reason) + return new Promise((resolve, reject) => { + api('listIsos', { + zoneid: _.get(this.zone, 'id'), + isofilter: isoFilter, + bootable: true + }).then((response) => { + resolve(response) + }).catch((reason) => { + // ToDo: Handle errors + reject(reason) + }) }) }, fetchAllIsos () { + const promises = [] this.options.isos = [] + this.loading.isos = true this.isoFilter.forEach((filter) => { - this.fetchIsos(filter) + promises.push(this.fetchIsos(filter)) + }) + Promise.all(promises).then(response => { + response.forEach((resItem) => { + const concatedIsos = _.concat(this.options.isos, _.get(resItem, 'listisosresponse.iso', [])) + this.options.isos = _.uniqWith(concatedIsos, _.isEqual) + this.$forceUpdate() + }) + }).catch((reason) => { + console.log(reason) + }).finally(() => { + this.loading.isos = false }) }, onTemplatesIsosCollapseChange (key) { @@ -466,6 +531,10 @@ export default { this.fetchOptions(this.params.templates, 'templates') this.fetchOptions(this.params.networks, 'networks') }) + }, + handleSearchFilter (name, options) { + this.params[name].options = { ...options } + this.fetchOptions(this.params[name], name) } } } diff --git a/src/views/compute/wizard/AffinityGroupSelection.vue b/src/views/compute/wizard/AffinityGroupSelection.vue index c13cbcc9a..fad33fee1 100644 --- a/src/views/compute/wizard/AffinityGroupSelection.vue +++ b/src/views/compute/wizard/AffinityGroupSelection.vue @@ -16,15 +16,23 @@ // under the License. diff --git a/src/views/compute/wizard/ComputeSelection.vue b/src/views/compute/wizard/ComputeSelection.vue index dfe4e4950..64d460e53 100644 --- a/src/views/compute/wizard/ComputeSelection.vue +++ b/src/views/compute/wizard/ComputeSelection.vue @@ -16,16 +16,25 @@ // under the License. diff --git a/src/views/compute/wizard/DiskOfferingSelection.vue b/src/views/compute/wizard/DiskOfferingSelection.vue index f56374572..c8cf15f18 100644 --- a/src/views/compute/wizard/DiskOfferingSelection.vue +++ b/src/views/compute/wizard/DiskOfferingSelection.vue @@ -16,20 +16,34 @@ // under the License. diff --git a/src/views/compute/wizard/NetworkSelection.vue b/src/views/compute/wizard/NetworkSelection.vue index 5eeeb342c..d0f6151b0 100644 --- a/src/views/compute/wizard/NetworkSelection.vue +++ b/src/views/compute/wizard/NetworkSelection.vue @@ -16,29 +16,38 @@ // under the License. diff --git a/src/views/compute/wizard/TemplateIsoSelection.vue b/src/views/compute/wizard/TemplateIsoSelection.vue index 27796fee9..549e8817a 100644 --- a/src/views/compute/wizard/TemplateIsoSelection.vue +++ b/src/views/compute/wizard/TemplateIsoSelection.vue @@ -22,10 +22,12 @@ - + + +
@@ -60,6 +62,10 @@ export default { inputDecorator: { type: String, default: '' + }, + loading: { + type: Boolean, + default: false } }, data () { @@ -117,4 +123,8 @@ export default { .search-input { margin: 0.5rem 0 1rem; } + + /deep/.ant-tabs-nav-scroll { + min-height: 45px; + } From 85c5fe935ab06325bfbc7b0eaebf666c70ef3d48 Mon Sep 17 00:00:00 2001 From: utchoang Date: Tue, 4 Feb 2020 13:11:28 +0700 Subject: [PATCH 02/24] Network selection: Add new network --- src/views/compute/DeployVM.vue | 61 +++++++++++++- src/views/compute/wizard/NetworksCreation.vue | 82 +++++++++++++++---- 2 files changed, 126 insertions(+), 17 deletions(-) diff --git a/src/views/compute/DeployVM.vue b/src/views/compute/DeployVM.vue index e4cfc98eb..92edc4d78 100644 --- a/src/views/compute/DeployVM.vue +++ b/src/views/compute/DeployVM.vue @@ -130,7 +130,10 @@ - + + @@ -220,6 +223,7 @@ export default { mixins: [mixin, mixinDevice], data () { return { + zoneId: '', vm: {}, options: { templates: [], @@ -247,6 +251,7 @@ export default { diskOffering: {}, affinityGroups: [], networks: [], + networksAdd: [], zone: {}, sshKeyPair: {}, isoFilter: [ @@ -441,6 +446,9 @@ export default { networkids: ids }) }, + updateDataCreatedNetworks (networks) { + this.networksAdd = networks + }, updateSshKeyPairs (name) { this.form.setFieldsValue({ keypair: name @@ -449,8 +457,20 @@ export default { getText (option) { return _.get(option, 'displaytext', _.get(option, 'name')) }, - handleSubmit () { + handleSubmit (e) { console.log('wizard submit') + e.preventDefault() + this.form.validateFields((err, values) => { + if (err) { + return + } + console.log(values) + this.createNetworks(values.zoneid).then(response => { + console.log(response) + }).catch(error => { + console.log(error) + }) + }) }, fetchOptions (param, name) { this.loading[name] = true @@ -523,7 +543,8 @@ export default { this.fetchAllIsos() } }, - onSelectZoneId () { + onSelectZoneId (value) { + this.zoneId = value this.$nextTick(() => { if (this.options.isos.length !== 0) { this.fetchAllIsos() @@ -535,6 +556,40 @@ export default { handleSearchFilter (name, options) { this.params[name].options = { ...options } this.fetchOptions(this.params[name], name) + }, + createNetworks (zoneId) { + return new Promise((resolve, reject) => { + if (this.networksAdd.length === 0) { + resolve() + return + } + const promises = [] + this.networksAdd.forEach((item) => { + const params = {} + params.zoneid = zoneId + params.name = item.name + params.displayText = item.name + params.networkOfferingId = item.networkOfferingId + params.vpcid = item.vpcid + + promises.push(this.createNetwork(params)) + }) + Promise.all(promises).then(response => { + resolve(response) + }).catch(error => { + reject(error) + }) + }) + }, + createNetwork (params) { + return new Promise((resolve, reject) => { + api('createNetwork', params).then(json => { + const networkRes = _.get(json, 'createnetworkresponse.network', []) + resolve(networkRes.id) + }).catch(error => { + reject(error) + }) + }) } } } diff --git a/src/views/compute/wizard/NetworksCreation.vue b/src/views/compute/wizard/NetworksCreation.vue index a708402ec..a9652c879 100644 --- a/src/views/compute/wizard/NetworksCreation.vue +++ b/src/views/compute/wizard/NetworksCreation.vue @@ -21,32 +21,37 @@ v-if="networkItems.length > 0" :columns="columns" :dataSource="networkItems" + :rowKey="record => record.key" :pagination="false" > -