blob: 48f269af739bb158acf043023d18d08d622d943e [file] [log] [blame]
<!--
Licensed 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 class="app-container">
<el-button type="primary" icon="el-icon-plus" @click="handleCreateRoleBinding">Create RoleBinding</el-button>
<el-row :gutter="24">
<el-col :xs="{span: 24}" :sm="{span: 24}" :md="{span: 24}" :lg="{span: 24}" :xl="{span: 24}" style="margin-top:15px">
<el-table
v-loading="roleBindingListLoading"
:key="roleBindingTableKey"
:data="roleBindingList"
border
fit
highlight-current-row
style="width: 100%;">
<el-table-column label="Role Binding Name" min-width="50px" align="center">
<template slot-scope="scope">
<span>{{ scope.row.name }}</span>
</template>
</el-table-column>
<el-table-column label="Role name" align="center" min-width="100px">
<template slot-scope="scope">
<span>{{ scope.row.roleName }}</span>
</template>
</el-table-column>
<el-table-column label="User Name" align="center" min-width="100px">
<template slot-scope="scope">
<span>{{ scope.row.userName }}</span>
</template>
</el-table-column>
<el-table-column label="Binding Description" align="center" min-width="100px">
<template slot-scope="scope">
<span>{{ scope.row.description }}</span>
</template>
</el-table-column>
<el-table-column :label="$t('table.actions')" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button :disabled="scope.row.resourceType=='TENANTS'" type="primary" size="mini" @click="handleUpdateRole(scope.row)">{{ $t('table.edit') }}</el-button>
<el-button :disabled="scope.row.resourceType=='TENANTS'" size="mini" type="danger" @click="handleDeleteRole(scope.row)">{{ $t('table.delete') }}</el-button>
</template>
</el-table-column>
</el-table>
</el-col>
</el-row>
<el-dialog :title="textMap[dialogStatus]" :visible.sync="dialogFormVisible" width="30%">
<el-form ref="form" :rules="rules" :model="form" label-position="top">
<el-form-item v-if="dialogStatus==='create'" label="Name" prop="name">
<el-input v-model="form.name" placeholder="Please input name"/>
</el-form-item>
<el-form-item v-if="dialogStatus==='create'" label="Description">
<el-input :rows="2" v-model="form.description" placeholder="Please input description" type="textarea"/>
</el-form-item>
<el-form-item v-if="dialogStatus==='create'" label="Role Name" prop="roleName">
<el-select
v-model="form.roleName"
placeholder="Please select role name"
style="width:100%">
<el-option
v-for="item in roleListOptions"
:key="item.value"
:label="item.label"
:value="item.value"/>
</el-select>
</el-form-item>
<el-form-item v-if="dialogStatus==='create'" label="User Name" prop="userName">
<el-input :rows="2" v-model="form.userName" placeholder="Please input user name"/>
</el-form-item>
<el-form-item v-if="dialogStatus==='update'" label="Role binding name">
<span>{{ form.name }} </span>
</el-form-item>
<el-form-item v-if="dialogStatus==='update'" label="Role Name">
<el-select v-model="form.roleName" placeholder="Please select role" style="width:100%">
<el-option
v-for="item in roleListOptions"
:key="item.value"
:label="item.label"
:value="item.value"/>
</el-select>
</el-form-item>
<el-form-item v-if="dialogStatus==='update'" label="User Name">
<el-input :rows="2" v-model="form.userName" placeholder="Please input user name"/>
</el-form-item>
<el-form-item v-if="dialogStatus==='update'" label="Description">
<el-input :rows="2" v-model="form.description" placeholder="Please input description" type="textarea"/>
</el-form-item>
<el-form-item v-if="dialogStatus==='delete'">
<h4>Delete Role Binding {{ form.name }}</h4>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleOptions()">{{ $t('table.confirm') }}</el-button>
<el-button @click="dialogFormVisible = false">{{ $t('table.cancel') }}</el-button>
</el-form-item>
</el-form>
</el-dialog>
</div>
</template>
<script>
import {
fetchRoleBinding,
putRoleBinding,
updateRoleBinding,
deleteRoleBinding
} from '@/api/roleBinding'
import { fetchRoles } from '@/api/roles'
export default {
name: 'RoleBinding',
data() {
return {
roleBindingList: [],
roleBindingTableKey: 0,
roleBindingListLoading: false,
textMap: {
create: 'New role binding',
delete: 'Delete role binding',
update: 'Update role binding'
},
dialogFormVisible: false,
dialogStatus: '',
form: {
name: '',
description: '',
roleName: '',
roleId: 0,
userName: '',
userId: 0
},
roleListOptions: [],
roleNameValue: '',
temp: {
'name': '',
'description': '',
'roleName': '',
'roleId': 0,
'userName': '',
'userId': 0
},
superUser: false,
description: '',
rules: {
name: [{ required: true, message: 'Name is required', trigger: 'blur' }]
}
}
},
created() {
this.getRoleBinding()
},
methods: {
getRoleBinding() {
fetchRoleBinding().then(response => {
if (!response.data) return
this.roleBindingList = []
for (var i = 0; i < response.data.data.length; i++) {
this.roleBindingList.push({
'name': response.data.data[i].name,
'description': response.data.data[i].description,
'roleName': response.data.data[i].roleName,
'roleId': response.data.data[i].roleId,
'userName': response.data.data[i].userName,
'userId': response.data.data[i].userId
})
}
})
},
handleCreateRoleBinding() {
this.form.name = ''
this.form.description = ''
this.form.roleName = ''
this.form.roleId = 0
this.form.userName = ''
this.form.userId = 0
this.dialogFormVisible = true
this.handleGetRoles()
this.dialogStatus = 'create'
},
handleDeleteRole(row) {
this.temp.name = row.name
this.temp.roleId = row.roleId
this.temp.userId = row.userId
this.dialogFormVisible = true
this.dialogStatus = 'delete'
},
handleUpdateRole(row) {
this.form.name = row.name
this.form.description = row.description
this.form.roleName = row.roleName
this.form.roleId = row.roleId
this.form.userName = row.userName
this.form.userId = row.userId
this.handleGetRoles()
this.dialogFormVisible = true
this.dialogStatus = 'update'
},
handleOptions() {
this.$refs['form'].validate((valid) => {
if (valid) {
switch (this.dialogStatus) {
case 'create':
this.createRoleBinding()
break
case 'delete':
this.deleteRoleBinding()
break
case 'update':
this.updateRoleBinding()
break
}
}
})
},
createRoleBinding() {
const data = {
'name': this.form.name,
'description': this.form.description,
'roleId': this.form.roleId,
'userId': 0,
'roleSource': 'placeholder'
}
this.roleBindingList = []
putRoleBinding(this.form.roleName, this.form.userName, data).then(response => {
if (!response.data) return
if (response.data.hasOwnProperty('error')) {
this.$notify({
title: 'error',
message: response.data.error,
type: 'error',
duration: 2000
})
return
}
this.$notify({
title: 'success',
message: 'Create role binding success',
type: 'success',
duration: 2000
})
this.dialogFormVisible = false
this.getRoleBinding()
})
},
updateRoleBinding() {
const data = {
'description': this.form.description,
'roleId': this.form.roleId,
'userId': this.form.userId,
'name': this.form.name
}
updateRoleBinding(this.form.roleName, this.form.userName, data).then(response => {
if (!response.data) return
if (response.data.hasOwnProperty('error')) {
this.$notify({
title: 'error',
message: response.data.error,
type: 'error',
duration: 2000
})
return
}
this.$notify({
title: 'success',
message: 'Update role binding success',
type: 'success',
duration: 2000
})
this.dialogFormVisible = false
this.getRoleBinding()
})
},
deleteRoleBinding() {
const data = {
'name': this.temp.name,
'roleId': this.temp.roleId,
'userId': this.temp.userId
}
deleteRoleBinding(data).then(response => {
if (!response.data) return
if (response.data.hasOwnProperty('error')) {
this.$notify({
title: 'error',
message: response.data.error,
type: 'error',
duration: 2000
})
return
}
this.$notify({
title: 'success',
message: 'Delete role success',
type: 'success',
duration: 2000
})
this.dialogFormVisible = false
this.getRoleBinding()
})
},
handleGetRoles() {
fetchRoles().then(response => {
if (!response.data) return
this.roleListOptions = []
for (var i = 0; i < response.data.data.length; i++) {
this.roleListOptions.push({
'value': response.data.data[i].roleName,
'label': response.data.data[i].roleName
})
}
})
}
}
}
</script>