mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	* ui: refactor labels with tooltip in forms Adds new Vue component TooltipLabel for easier re-use Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com> * changes Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com> * changes Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com> * changes Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com> * changes Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com> * changes Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com> * moved component in widgets Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com> * moved TooltipButton in widgets Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com> * missing change in previous commit Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com> * changes Signed-off-by: Abhishek Kumar <abhishek.kumar@shapeblue.com> * fix Signed-off-by: Abhishek Kumar <abhishek.kumar@shapeblue.com> * form improvements Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com> * tooltip icon class fix Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com> * fix Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com> * Update ui/src/views/storage/UploadLocalVolume.vue Co-authored-by: Pearl Dsilva <pearl1594@gmail.com> * Update ui/src/views/storage/CreateVolume.vue Co-authored-by: davidjumani <dj.davidjumani1994@gmail.com> * fix Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com> Co-authored-by: Pearl Dsilva <pearl1594@gmail.com> Co-authored-by: davidjumani <dj.davidjumani1994@gmail.com>
		
			
				
	
	
		
			305 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			305 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| // 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.
 | |
| <template>
 | |
|   <div>
 | |
|     <a-button type="dashed" icon="plus" style="width: 100%; margin-bottom: 15px" @click="openCreateModal">
 | |
|       {{ $t('label.create.project.role') }}
 | |
|     </a-button>
 | |
|     <a-row :gutter="12">
 | |
|       <a-col :md="24" :lg="24">
 | |
|         <a-table
 | |
|           size="small"
 | |
|           :loading="loading"
 | |
|           :columns="columns"
 | |
|           :dataSource="dataSource"
 | |
|           :rowKey="(record,idx) => record.projectid + '-' + idx"
 | |
|           :pagination="false">
 | |
|           <template slot="expandedRowRender" slot-scope="record">
 | |
|             <ProjectRolePermissionTab class="table" :resource="resource" :role="record"/>
 | |
|           </template>
 | |
|           <template slot="name" slot-scope="record"> {{ record }} </template>
 | |
|           <template slot="description" slot-scope="record">
 | |
|             {{ record }}
 | |
|           </template>
 | |
|           <span slot="action" slot-scope="text, record">
 | |
|             <tooltip-button
 | |
|               tooltipPlacement="top"
 | |
|               :tooltip="$t('label.update.project.role')"
 | |
|               icon="edit"
 | |
|               size="small"
 | |
|               style="margin:10px"
 | |
|               @click="openUpdateModal(record)" />
 | |
|             <tooltip-button
 | |
|               tooltipPlacement="top"
 | |
|               :tooltip="$t('label.remove.project.role')"
 | |
|               type="danger"
 | |
|               icon="delete"
 | |
|               size="small"
 | |
|               @click="deleteProjectRole(record)" />
 | |
|           </span>
 | |
|         </a-table>
 | |
|         <a-modal
 | |
|           :title="$t('label.edit.project.role')"
 | |
|           v-model="editModalVisible"
 | |
|           :footer="null"
 | |
|           :afterClose="closeAction"
 | |
|           :maskClosable="false">
 | |
|           <a-form
 | |
|             :form="form"
 | |
|             @submit="updateProjectRole"
 | |
|             layout="vertical">
 | |
|             <a-form-item :label="$t('label.name')">
 | |
|               <a-input v-decorator="['name']" autoFocus></a-input>
 | |
|             </a-form-item>
 | |
|             <a-form-item :label="$t('label.description')">
 | |
|               <a-input v-decorator="['description']"></a-input>
 | |
|             </a-form-item>
 | |
|             <div :span="24" class="action-button">
 | |
|               <a-button @click="closeAction">{{ this.$t('label.cancel') }}</a-button>
 | |
|               <a-button type="primary" @click="updateProjectRole" :loading="loading">{{ $t('label.ok') }}</a-button>
 | |
|             </div>
 | |
|             <span slot="action" slot-scope="text, record">
 | |
|               <tooltip-button
 | |
|                 tooltipPlacement="top"
 | |
|                 :tooltip="$t('label.update.project.role')"
 | |
|                 icon="edit"
 | |
|                 size="small"
 | |
|                 style="margin:10px"
 | |
|                 @click="openUpdateModal(record)" />
 | |
|               <tooltip-button
 | |
|                 tooltipPlacement="top"
 | |
|                 :tooltip="$t('label.remove.project.role')"
 | |
|                 type="danger"
 | |
|                 icon="edit"
 | |
|                 size="small"
 | |
|                 @click="deleteProjectRole(record)" />
 | |
|             </span>
 | |
|           </a-form>
 | |
|         </a-modal>
 | |
|         <a-modal
 | |
|           :title="$t('label.create.project.role')"
 | |
|           v-model="createModalVisible"
 | |
|           :footer="null"
 | |
|           :afterClose="closeAction"
 | |
|           :maskClosable="false">
 | |
|           <a-form
 | |
|             :form="form"
 | |
|             @submit="createProjectRole"
 | |
|             layout="vertical">
 | |
|             <a-form-item :label="$t('label.name')">
 | |
|               <a-input
 | |
|                 v-decorator="[ 'name', { rules: [{ required: true, message: 'Please provide input' }] }]"
 | |
|                 autoFocus></a-input>
 | |
|             </a-form-item>
 | |
|             <a-form-item :label="$t('label.description')">
 | |
|               <a-input v-decorator="[ 'description' ]"></a-input>
 | |
|             </a-form-item>
 | |
|             <div :span="24" class="action-button">
 | |
|               <a-button @click="closeAction">{{ this.$t('label.cancel') }}</a-button>
 | |
|               <a-button type="primary" @click="createProjectRole" :loading="loading">{{ $t('label.ok') }}</a-button>
 | |
|             </div>
 | |
|           </a-form>
 | |
|         </a-modal>
 | |
|       </a-col>
 | |
|     </a-row>
 | |
|   </div>
 | |
| </template>
 | |
| <script>
 | |
| import { api } from '@/api'
 | |
| import ProjectRolePermissionTab from '@/views/project/iam/ProjectRolePermissionTab'
 | |
| import TooltipButton from '@/components/widgets/TooltipButton'
 | |
| export default {
 | |
|   name: 'ProjectRoleTab',
 | |
|   props: {
 | |
|     resource: {
 | |
|       type: Object,
 | |
|       required: true
 | |
|     }
 | |
|   },
 | |
|   components: {
 | |
|     ProjectRolePermissionTab,
 | |
|     TooltipButton
 | |
|   },
 | |
|   data () {
 | |
|     return {
 | |
|       columns: [],
 | |
|       dataSource: [],
 | |
|       loading: false,
 | |
|       createModalVisible: false,
 | |
|       editModalVisible: false,
 | |
|       selectedRole: null,
 | |
|       projectPermisssions: [],
 | |
|       customStyle: 'margin-bottom: -10px; border-bottom-style: none'
 | |
|     }
 | |
|   },
 | |
|   beforeCreate () {
 | |
|     this.form = this.$form.createForm(this)
 | |
|   },
 | |
|   created () {
 | |
|     this.columns = [
 | |
|       {
 | |
|         title: this.$t('label.name'),
 | |
|         dataIndex: 'name',
 | |
|         width: '35%',
 | |
|         scopedSlots: { customRender: 'name' }
 | |
|       },
 | |
|       {
 | |
|         title: this.$t('label.description'),
 | |
|         dataIndex: 'description'
 | |
|       },
 | |
|       {
 | |
|         title: this.$t('label.action'),
 | |
|         dataIndex: 'action',
 | |
|         width: 100,
 | |
|         scopedSlots: { customRender: 'action' }
 | |
|       }
 | |
|     ]
 | |
|   },
 | |
|   mounted () {
 | |
|     this.fetchData()
 | |
|   },
 | |
|   watch: {
 | |
|     resource (newItem, oldItem) {
 | |
|       if (!newItem || !newItem.id) {
 | |
|         return
 | |
|       }
 | |
|       this.resource = newItem
 | |
|       this.fetchData()
 | |
|     }
 | |
|   },
 | |
|   methods: {
 | |
|     fetchData () {
 | |
|       this.loading = true
 | |
|       api('listProjectRoles', { projectid: this.resource.id }).then(json => {
 | |
|         const projectRoles = json.listprojectrolesresponse.projectrole
 | |
|         if (!projectRoles || projectRoles.length === 0) {
 | |
|           this.dataSource = []
 | |
|           return
 | |
|         }
 | |
|         this.dataSource = projectRoles
 | |
|       }).catch(error => {
 | |
|         this.$notifyError(error)
 | |
|       }).finally(() => {
 | |
|         this.loading = false
 | |
|       })
 | |
|     },
 | |
|     openUpdateModal (role) {
 | |
|       this.selectedRole = role
 | |
|       this.editModalVisible = true
 | |
|     },
 | |
|     openCreateModal () {
 | |
|       this.createModalVisible = true
 | |
|     },
 | |
|     updateProjectRole (e) {
 | |
|       e.preventDefault()
 | |
|       this.form.validateFields((err, values) => {
 | |
|         if (err) {
 | |
|           return
 | |
|         }
 | |
|         var params = {}
 | |
|         this.loading = true
 | |
|         params.projectid = this.resource.id
 | |
|         params.id = this.selectedRole.id
 | |
|         for (const key in values) {
 | |
|           const input = values[key]
 | |
|           if (input === undefined) {
 | |
|             continue
 | |
|           }
 | |
|           params[key] = input
 | |
|         }
 | |
|         api('updateProjectRole', params).then(response => {
 | |
|           this.$notification.success({
 | |
|             message: this.$t('label.update.project.role'),
 | |
|             description: this.$t('label.update.project.role')
 | |
|           })
 | |
|           this.fetchData()
 | |
|           this.closeAction()
 | |
|         }).catch(error => {
 | |
|           this.$notifyError(error)
 | |
|         }).finally(() => {
 | |
|           this.loading = false
 | |
|         })
 | |
|       })
 | |
|     },
 | |
|     closeAction () {
 | |
|       if (this.editModalVisible) {
 | |
|         this.editModalVisible = false
 | |
|       }
 | |
|       if (this.createModalVisible) {
 | |
|         this.createModalVisible = false
 | |
|       }
 | |
|     },
 | |
|     createProjectRole (e) {
 | |
|       e.preventDefault()
 | |
|       this.form.validateFields((err, values) => {
 | |
|         if (err) {
 | |
|           return
 | |
|         }
 | |
|         this.loading = true
 | |
|         var params = {}
 | |
|         params.projectid = this.resource.id
 | |
|         for (const key in values) {
 | |
|           const input = values[key]
 | |
|           if (input === undefined) {
 | |
|             continue
 | |
|           }
 | |
|           params[key] = input
 | |
|         }
 | |
|         api('createProjectRole', params).then(response => {
 | |
|           this.$notification.success({
 | |
|             message: this.$t('label.create.project.role'),
 | |
|             description: this.$t('label.create.project.role')
 | |
|           })
 | |
|           this.fetchData()
 | |
|           this.closeAction()
 | |
|         }).catch(error => {
 | |
|           this.$notifyError(error)
 | |
|         }).finally(() => {
 | |
|           this.loading = false
 | |
|         })
 | |
|       })
 | |
|     },
 | |
|     deleteProjectRole (role) {
 | |
|       this.loading = true
 | |
|       api('deleteProjectRole', {
 | |
|         projectid: this.resource.id,
 | |
|         id: role.id
 | |
|       }).then(response => {
 | |
|         this.$notification.success({
 | |
|           message: this.$t('label.delete.project.role'),
 | |
|           description: this.$t('label.delete.project.role')
 | |
|         })
 | |
|         this.fetchData()
 | |
|         this.closeAction()
 | |
|       }).catch(error => {
 | |
|         this.$notifyError(error)
 | |
|       }).finally(() => {
 | |
|         this.loading = false
 | |
|       })
 | |
|     }
 | |
|   }
 | |
| }
 | |
| </script>
 | |
| <style lang="scss" scoped>
 | |
| .action-button {
 | |
|     text-align: right;
 | |
|     button {
 | |
|       margin-right: 5px;
 | |
|     }
 | |
|   }
 | |
| </style>
 |