2022-02-13 23:39:27 +08:00
// Copyright 2021 The Casdoor Authors. All Rights Reserved.
2022-01-01 16:28:06 +08:00
//
// 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.
import React from "react" ;
2022-07-10 15:45:55 +08:00
import { Button , Card , Col , Input , Row , Select , Switch } from "antd" ;
2022-01-01 16:28:06 +08:00
import * as PermissionBackend from "./backend/PermissionBackend" ;
import * as OrganizationBackend from "./backend/OrganizationBackend" ;
import * as UserBackend from "./backend/UserBackend" ;
2023-09-06 00:10:33 +08:00
import * as GroupBackend from "./backend/GroupBackend" ;
2022-01-01 16:28:06 +08:00
import * as Setting from "./Setting" ;
import i18next from "i18next" ;
import * as RoleBackend from "./backend/RoleBackend" ;
2022-05-24 18:27:47 +08:00
import * as ModelBackend from "./backend/ModelBackend" ;
2022-07-13 00:34:35 +08:00
import * as ApplicationBackend from "./backend/ApplicationBackend" ;
2022-08-15 14:09:12 +08:00
import moment from "moment/moment" ;
2022-01-01 16:28:06 +08:00
class PermissionEditPage extends React . Component {
constructor ( props ) {
super ( props ) ;
this . state = {
classes : props ,
organizationName : props . organizationName !== undefined ? props . organizationName : props . match . params . organizationName ,
2023-07-26 12:08:35 +07:00
permissionName : decodeURIComponent ( props . match . params . permissionName ) ,
2022-01-01 16:28:06 +08:00
permission : null ,
organizations : [ ] ,
2022-10-10 00:53:55 +08:00
model : null ,
2022-01-01 16:28:06 +08:00
users : [ ] ,
2023-09-06 00:10:33 +08:00
groups : [ ] ,
2022-01-01 16:28:06 +08:00
roles : [ ] ,
2022-05-24 18:27:47 +08:00
models : [ ] ,
2022-07-13 00:34:35 +08:00
resources : [ ] ,
2022-02-25 18:16:02 +08:00
mode : props . location . mode !== undefined ? props . location . mode : "edit" ,
2022-01-01 16:28:06 +08:00
} ;
}
UNSAFE _componentWillMount ( ) {
this . getPermission ( ) ;
this . getOrganizations ( ) ;
}
getPermission ( ) {
PermissionBackend . getPermission ( this . state . organizationName , this . state . permissionName )
2023-06-27 20:33:47 +07:00
. then ( ( res ) => {
2023-07-23 09:49:16 +08:00
const permission = res . data ;
if ( permission === null ) {
2023-06-09 21:52:30 +08:00
this . props . history . push ( "/404" ) ;
return ;
}
2023-06-27 20:33:47 +07:00
if ( res . status === "error" ) {
Setting . showMessage ( "error" , res . msg ) ;
return ;
}
2022-01-01 16:28:06 +08:00
this . setState ( {
2023-07-23 09:49:16 +08:00
permission : permission ,
2022-01-01 16:28:06 +08:00
} ) ;
2023-07-23 09:49:16 +08:00
this . getUsers ( permission . owner ) ;
2023-09-06 00:10:33 +08:00
this . getGroups ( permission . owner ) ;
2023-07-23 09:49:16 +08:00
this . getRoles ( permission . owner ) ;
this . getModels ( permission . owner ) ;
this . getResources ( permission . owner ) ;
this . getModel ( permission . owner , permission . model ) ;
2022-01-01 16:28:06 +08:00
} ) ;
}
getOrganizations ( ) {
OrganizationBackend . getOrganizations ( "admin" )
. then ( ( res ) => {
this . setState ( {
2023-07-23 09:49:16 +08:00
organizations : res . data || [ ] ,
2022-01-01 16:28:06 +08:00
} ) ;
} ) ;
}
getUsers ( organizationName ) {
UserBackend . getUsers ( organizationName )
. then ( ( res ) => {
2023-06-27 20:33:47 +07:00
if ( res . status === "error" ) {
Setting . showMessage ( "error" , res . msg ) ;
return ;
}
2023-07-23 09:49:16 +08:00
2022-01-01 16:28:06 +08:00
this . setState ( {
2023-07-23 09:49:16 +08:00
users : res . data ,
2022-01-01 16:28:06 +08:00
} ) ;
} ) ;
}
2023-09-06 00:10:33 +08:00
getGroups ( organizationName ) {
GroupBackend . getGroups ( organizationName )
. then ( ( res ) => {
if ( res . status === "error" ) {
Setting . showMessage ( "error" , res . msg ) ;
return ;
}
this . setState ( {
groups : res . data ,
} ) ;
} ) ;
}
2022-01-01 16:28:06 +08:00
getRoles ( organizationName ) {
RoleBackend . getRoles ( organizationName )
. then ( ( res ) => {
2023-06-27 20:33:47 +07:00
if ( res . status === "error" ) {
Setting . showMessage ( "error" , res . msg ) ;
return ;
}
2023-07-23 09:49:16 +08:00
2022-01-01 16:28:06 +08:00
this . setState ( {
2023-07-23 09:49:16 +08:00
roles : res . data ,
2022-01-01 16:28:06 +08:00
} ) ;
} ) ;
}
2022-05-24 18:27:47 +08:00
getModels ( organizationName ) {
ModelBackend . getModels ( organizationName )
. then ( ( res ) => {
2023-06-27 20:33:47 +07:00
if ( res . status === "error" ) {
Setting . showMessage ( "error" , res . msg ) ;
return ;
}
2023-07-23 09:49:16 +08:00
2022-05-24 18:27:47 +08:00
this . setState ( {
2023-07-23 09:49:16 +08:00
models : res . data ,
2022-05-24 18:27:47 +08:00
} ) ;
} ) ;
}
2022-10-10 00:53:55 +08:00
getModel ( organizationName , modelName ) {
2023-07-23 09:49:16 +08:00
if ( modelName === "" ) {
return ;
}
2022-10-10 00:53:55 +08:00
ModelBackend . getModel ( organizationName , modelName )
. then ( ( res ) => {
this . setState ( {
2023-07-23 09:49:16 +08:00
model : res . data ,
2022-10-10 00:53:55 +08:00
} ) ;
} ) ;
}
2022-07-13 00:34:35 +08:00
getResources ( organizationName ) {
ApplicationBackend . getApplicationsByOrganization ( "admin" , organizationName )
. then ( ( res ) => {
this . setState ( {
2023-07-23 09:49:16 +08:00
resources : res . data || [ ] ,
2022-07-13 00:34:35 +08:00
} ) ;
} ) ;
}
2022-01-01 16:28:06 +08:00
parsePermissionField ( key , value ) {
if ( [ "" ] . includes ( key ) ) {
value = Setting . myParseInt ( value ) ;
}
return value ;
}
updatePermissionField ( key , value ) {
2022-10-10 00:53:55 +08:00
if ( key === "model" ) {
this . getModel ( this . state . permission . owner , value ) ;
}
2022-01-01 16:28:06 +08:00
value = this . parsePermissionField ( key , value ) ;
2022-08-08 23:35:24 +08:00
const permission = this . state . permission ;
2022-01-01 16:28:06 +08:00
permission [ key ] = value ;
this . setState ( {
permission : permission ,
} ) ;
}
2022-10-10 00:53:55 +08:00
hasRoleDefinition ( model ) {
if ( model !== null ) {
return model . modelText . includes ( "role_definition" ) ;
}
return false ;
}
2022-01-01 16:28:06 +08:00
renderPermission ( ) {
return (
< Card size = "small" title = {
< div >
2022-02-25 18:16:02 +08:00
{ this . state . mode === "add" ? i18next . t ( "permission:New Permission" ) : i18next . t ( "permission:Edit Permission" ) } & nbsp ; & nbsp ; & nbsp ; & nbsp ;
2022-01-01 16:28:06 +08:00
< Button onClick = { ( ) => this . submitPermissionEdit ( false ) } > { i18next . t ( "general:Save" ) } < / B u t t o n >
2022-07-10 15:45:55 +08:00
< Button style = { { marginLeft : "20px" } } type = "primary" onClick = { ( ) => this . submitPermissionEdit ( true ) } > { i18next . t ( "general:Save & Exit" ) } < / B u t t o n >
{ this . state . mode === "add" ? < Button style = { { marginLeft : "20px" } } onClick = { ( ) => this . deletePermission ( ) } > { i18next . t ( "general:Cancel" ) } < / B u t t o n > : n u l l }
2022-01-01 16:28:06 +08:00
< / d i v >
2022-08-06 23:43:09 +08:00
} style = { ( Setting . isMobile ( ) ) ? { margin : "5px" } : { } } type = "inner" >
2022-07-10 15:45:55 +08:00
< Row style = { { marginTop : "10px" } } >
< Col style = { { marginTop : "5px" } } span = { ( Setting . isMobile ( ) ) ? 22 : 2 } >
2022-01-01 16:28:06 +08:00
{ Setting . getLabel ( i18next . t ( "general:Organization" ) , i18next . t ( "general:Organization - Tooltip" ) ) } :
< / C o l >
< Col span = { 22 } >
2023-05-09 00:06:52 +08:00
< Select virtual = { false } style = { { width : "100%" } } disabled = { ! Setting . isAdminUser ( this . props . account ) } value = { this . state . permission . owner } onChange = { ( owner => {
2022-07-10 15:45:55 +08:00
this . updatePermissionField ( "owner" , owner ) ;
2022-01-15 21:11:47 +08:00
this . getUsers ( owner ) ;
2023-09-06 00:10:33 +08:00
this . getGroups ( owner ) ;
2022-01-15 21:11:47 +08:00
this . getRoles ( owner ) ;
2022-07-16 15:00:42 +08:00
this . getModels ( owner ) ;
this . getResources ( owner ) ;
2023-01-12 23:11:11 +08:00
} ) }
options = { this . state . organizations . map ( ( organization ) => Setting . getOption ( organization . name , organization . name ) )
} / >
2022-01-01 16:28:06 +08:00
< / C o l >
< / R o w >
2022-07-10 15:45:55 +08:00
< Row style = { { marginTop : "20px" } } >
< Col style = { { marginTop : "5px" } } span = { ( Setting . isMobile ( ) ) ? 22 : 2 } >
2022-01-01 16:28:06 +08:00
{ Setting . getLabel ( i18next . t ( "general:Name" ) , i18next . t ( "general:Name - Tooltip" ) ) } :
< / C o l >
< Col span = { 22 } >
< Input value = { this . state . permission . name } onChange = { e => {
2022-07-10 15:45:55 +08:00
this . updatePermissionField ( "name" , e . target . value ) ;
2022-01-01 16:28:06 +08:00
} } / >
< / C o l >
< / R o w >
2022-07-10 15:45:55 +08:00
< Row style = { { marginTop : "20px" } } >
< Col style = { { marginTop : "5px" } } span = { ( Setting . isMobile ( ) ) ? 22 : 2 } >
2022-01-01 16:28:06 +08:00
{ Setting . getLabel ( i18next . t ( "general:Display name" ) , i18next . t ( "general:Display name - Tooltip" ) ) } :
< / C o l >
< Col span = { 22 } >
< Input value = { this . state . permission . displayName } onChange = { e => {
2022-07-10 15:45:55 +08:00
this . updatePermissionField ( "displayName" , e . target . value ) ;
2022-01-01 16:28:06 +08:00
} } / >
< / C o l >
< / R o w >
2023-06-03 18:49:57 +08:00
< Row style = { { marginTop : "20px" } } >
< Col style = { { marginTop : "5px" } } span = { ( Setting . isMobile ( ) ) ? 22 : 2 } >
{ Setting . getLabel ( i18next . t ( "general:Description" ) , i18next . t ( "general:Description - Tooltip" ) ) } :
< / C o l >
< Col span = { 22 } >
< Input value = { this . state . permission . description } onChange = { e => {
this . updatePermissionField ( "description" , e . target . value ) ;
} } / >
< / C o l >
< / R o w >
2022-07-10 15:45:55 +08:00
< Row style = { { marginTop : "20px" } } >
< Col style = { { marginTop : "5px" } } span = { ( Setting . isMobile ( ) ) ? 22 : 2 } >
2022-05-24 18:27:47 +08:00
{ Setting . getLabel ( i18next . t ( "general:Model" ) , i18next . t ( "general:Model - Tooltip" ) ) } :
< / C o l >
< Col span = { 22 } >
2022-07-10 15:45:55 +08:00
< Select virtual = { false } style = { { width : "100%" } } value = { this . state . permission . model } onChange = { ( model => {
this . updatePermissionField ( "model" , model ) ;
2023-01-12 23:11:11 +08:00
} ) }
options = { this . state . models . map ( ( model ) => Setting . getOption ( model . name , model . name ) )
} / >
2022-05-24 18:27:47 +08:00
< / C o l >
< / R o w >
2022-08-18 11:49:32 +08:00
< Row style = { { marginTop : "20px" } } >
< Col style = { { marginTop : "5px" } } span = { ( Setting . isMobile ( ) ) ? 22 : 2 } >
{ Setting . getLabel ( i18next . t ( "general:Adapter" ) , i18next . t ( "general:Adapter - Tooltip" ) ) } :
< / C o l >
< Col span = { 22 } >
< Input value = { this . state . permission . adapter } onChange = { e => {
this . updatePermissionField ( "adapter" , e . target . value ) ;
} } / >
< / C o l >
< / R o w >
2022-07-10 15:45:55 +08:00
< Row style = { { marginTop : "20px" } } >
< Col style = { { marginTop : "5px" } } span = { ( Setting . isMobile ( ) ) ? 22 : 2 } >
2022-01-01 16:28:06 +08:00
{ Setting . getLabel ( i18next . t ( "role:Sub users" ) , i18next . t ( "role:Sub users - Tooltip" ) ) } :
< / C o l >
< Col span = { 22 } >
2023-05-31 17:36:11 +08:00
< Select virtual = { false } mode = "multiple" style = { { width : "100%" } } value = { this . state . permission . users }
2023-01-12 23:11:11 +08:00
onChange = { ( value => { this . updatePermissionField ( "users" , value ) ; } ) }
2023-10-13 15:41:23 +08:00
options = { [
Setting . getOption ( i18next . t ( "organization:All" ) , "*" ) ,
... this . state . users . map ( ( user ) => Setting . getOption ( ` ${ user . owner } / ${ user . name } ` , ` ${ user . owner } / ${ user . name } ` ) ) ,
] }
2023-01-12 23:11:11 +08:00
/ >
2022-01-01 16:28:06 +08:00
< / C o l >
< / R o w >
2023-09-06 00:10:33 +08:00
< Row style = { { marginTop : "20px" } } >
< Col style = { { marginTop : "5px" } } span = { ( Setting . isMobile ( ) ) ? 22 : 2 } >
{ Setting . getLabel ( i18next . t ( "role:Sub groups" ) , i18next . t ( "role:Sub groups - Tooltip" ) ) } :
< / C o l >
< Col span = { 22 } >
< Select virtual = { false } mode = "multiple" style = { { width : "100%" } } value = { this . state . permission . groups }
onChange = { ( value => { this . updatePermissionField ( "groups" , value ) ; } ) }
2023-10-13 15:41:23 +08:00
options = { [
Setting . getOption ( i18next . t ( "organization:All" ) , "*" ) ,
... this . state . groups . map ( ( group ) => Setting . getOption ( ` ${ group . owner } / ${ group . name } ` , ` ${ group . owner } / ${ group . name } ` ) ) ,
] }
2023-09-06 00:10:33 +08:00
/ >
< / C o l >
< / R o w >
2022-07-10 15:45:55 +08:00
< Row style = { { marginTop : "20px" } } >
< Col style = { { marginTop : "5px" } } span = { ( Setting . isMobile ( ) ) ? 22 : 2 } >
2022-01-01 16:28:06 +08:00
{ Setting . getLabel ( i18next . t ( "role:Sub roles" ) , i18next . t ( "role:Sub roles - Tooltip" ) ) } :
< / C o l >
< Col span = { 22 } >
2023-12-02 15:26:52 +08:00
< Select disabled = { ! this . hasRoleDefinition ( this . state . model ) } placeholder = { this . hasRoleDefinition ( this . state . model ) ? "" : "This field is disabled because the model is empty or it doesn't support RBAC (in another word, doesn't contain [role_definition])" } virtual = { false } mode = "multiple" style = { { width : "100%" } } value = { this . state . permission . roles }
2023-01-12 23:11:11 +08:00
onChange = { ( value => { this . updatePermissionField ( "roles" , value ) ; } ) }
2023-10-13 15:41:23 +08:00
options = { [
Setting . getOption ( i18next . t ( "organization:All" ) , "*" ) ,
... this . state . roles . filter ( roles => ( roles . owner !== this . state . roles . owner || roles . name !== this . state . roles . name ) ) . map ( ( permission ) => Setting . getOption ( ` ${ permission . owner } / ${ permission . name } ` , ` ${ permission . owner } / ${ permission . name } ` ) ) ,
] }
/ >
2022-01-01 16:28:06 +08:00
< / C o l >
< / R o w >
2022-08-15 10:24:26 +08:00
< Row style = { { marginTop : "20px" } } >
< Col style = { { marginTop : "5px" } } span = { ( Setting . isMobile ( ) ) ? 22 : 2 } >
{ Setting . getLabel ( i18next . t ( "role:Sub domains" ) , i18next . t ( "role:Sub domains - Tooltip" ) ) } :
< / C o l >
< Col span = { 22 } >
2023-01-12 23:11:11 +08:00
< Select virtual = { false } mode = "tags" style = { { width : "100%" } } value = { this . state . permission . domains }
onChange = { ( value => {
this . updatePermissionField ( "domains" , value ) ;
} ) }
2023-10-13 15:41:23 +08:00
options = { [
Setting . getOption ( i18next . t ( "organization:All" ) , "*" ) ,
2023-12-02 15:26:52 +08:00
... this . state . permission . domains . filter ( domain => domain !== "*" ) . map ( ( domain ) => Setting . getOption ( domain , domain ) ) ,
2023-10-13 15:41:23 +08:00
] }
/ >
2022-08-15 10:24:26 +08:00
< / C o l >
< / R o w >
2022-07-10 15:45:55 +08:00
< Row style = { { marginTop : "20px" } } >
< Col style = { { marginTop : "5px" } } span = { ( Setting . isMobile ( ) ) ? 22 : 2 } >
2022-01-01 16:28:06 +08:00
{ Setting . getLabel ( i18next . t ( "permission:Resource type" ) , i18next . t ( "permission:Resource type - Tooltip" ) ) } :
< / C o l >
< Col span = { 22 } >
2022-07-10 15:45:55 +08:00
< Select virtual = { false } style = { { width : "100%" } } value = { this . state . permission . resourceType } onChange = { ( value => {
this . updatePermissionField ( "resourceType" , value ) ;
2023-06-09 21:52:30 +08:00
this . updatePermissionField ( "resources" , [ ] ) ;
2023-01-12 23:11:11 +08:00
} ) }
options = { [
{ value : "Application" , name : i18next . t ( "general:Application" ) } ,
{ value : "TreeNode" , name : i18next . t ( "permission:TreeNode" ) } ,
2023-06-09 21:52:30 +08:00
{ value : "Custom" , name : i18next . t ( "general:Custom" ) } ,
2023-01-12 23:11:11 +08:00
] . map ( ( item ) => Setting . getOption ( item . name , item . value ) ) }
/ >
2022-07-13 00:34:35 +08:00
< / C o l >
< / R o w >
< Row style = { { marginTop : "20px" } } >
< Col style = { { marginTop : "5px" } } span = { ( Setting . isMobile ( ) ) ? 22 : 2 } >
2023-03-19 01:01:39 +08:00
{ Setting . getLabel ( i18next . t ( "general:Resources" ) , i18next . t ( "permission:Resources - Tooltip" ) ) } :
2022-07-13 00:34:35 +08:00
< / C o l >
< Col span = { 22 } >
2023-06-09 21:52:30 +08:00
< Select virtual = { false } mode = { ( this . state . permission . resourceType === "Custom" ) ? "tags" : "multiple" } style = { { width : "100%" } } value = { this . state . permission . resources }
2023-01-12 23:11:11 +08:00
onChange = { ( value => { this . updatePermissionField ( "resources" , value ) ; } ) }
2023-10-13 15:41:23 +08:00
options = { [
Setting . getOption ( i18next . t ( "organization:All" ) , "*" ) ,
... this . state . resources . map ( ( resource ) => Setting . getOption ( ` ${ resource . name } ` , ` ${ resource . name } ` ) ) ,
] }
/ >
2022-01-01 16:28:06 +08:00
< / C o l >
< / R o w >
2022-07-10 15:45:55 +08:00
< Row style = { { marginTop : "20px" } } >
< Col style = { { marginTop : "5px" } } span = { ( Setting . isMobile ( ) ) ? 22 : 2 } >
2022-01-01 16:28:06 +08:00
{ Setting . getLabel ( i18next . t ( "permission:Actions" ) , i18next . t ( "permission:Actions - Tooltip" ) ) } :
< / C o l >
< Col span = { 22 } >
2023-07-26 14:49:45 +08:00
< Select virtual = { false } mode = { ( this . state . permission . resourceType === "Custom" ) ? "tags" : "multiple" } style = { { width : "100%" } } value = { this . state . permission . actions } onChange = { ( value => {
2022-07-10 15:45:55 +08:00
this . updatePermissionField ( "actions" , value ) ;
2023-01-12 23:11:11 +08:00
} ) }
options = { [
{ value : "Read" , name : i18next . t ( "permission:Read" ) } ,
{ value : "Write" , name : i18next . t ( "permission:Write" ) } ,
{ value : "Admin" , name : i18next . t ( "permission:Admin" ) } ,
] . map ( ( item ) => Setting . getOption ( item . name , item . value ) ) }
/ >
2022-01-01 16:28:06 +08:00
< / C o l >
< / R o w >
2022-07-10 15:45:55 +08:00
< Row style = { { marginTop : "20px" } } >
< Col style = { { marginTop : "5px" } } span = { ( Setting . isMobile ( ) ) ? 22 : 2 } >
2022-01-01 16:28:06 +08:00
{ Setting . getLabel ( i18next . t ( "permission:Effect" ) , i18next . t ( "permission:Effect - Tooltip" ) ) } :
< / C o l >
< Col span = { 22 } >
2022-07-10 15:45:55 +08:00
< Select virtual = { false } style = { { width : "100%" } } value = { this . state . permission . effect } onChange = { ( value => {
this . updatePermissionField ( "effect" , value ) ;
2023-01-12 23:11:11 +08:00
} ) }
options = { [
{ value : "Allow" , name : i18next . t ( "permission:Allow" ) } ,
{ value : "Deny" , name : i18next . t ( "permission:Deny" ) } ,
] . map ( ( item ) => Setting . getOption ( item . name , item . value ) ) }
/ >
2022-01-01 16:28:06 +08:00
< / C o l >
< / R o w >
2022-07-10 15:45:55 +08:00
< Row style = { { marginTop : "20px" } } >
< Col style = { { marginTop : "5px" } } span = { ( Setting . isMobile ( ) ) ? 19 : 2 } >
2022-01-01 16:28:06 +08:00
{ Setting . getLabel ( i18next . t ( "general:Is enabled" ) , i18next . t ( "general:Is enabled - Tooltip" ) ) } :
< / C o l >
< Col span = { 1 } >
< Switch checked = { this . state . permission . isEnabled } onChange = { checked => {
2022-07-10 15:45:55 +08:00
this . updatePermissionField ( "isEnabled" , checked ) ;
2022-01-01 16:28:06 +08:00
} } / >
< / C o l >
< / R o w >
2022-08-15 14:09:12 +08:00
< Row style = { { marginTop : "20px" } } >
< Col style = { { marginTop : "5px" } } span = { ( Setting . isMobile ( ) ) ? 22 : 2 } >
{ Setting . getLabel ( i18next . t ( "permission:Submitter" ) , i18next . t ( "permission:Submitter - Tooltip" ) ) } :
< / C o l >
< Col span = { 22 } >
< Input disabled = { true } value = { this . state . permission . submitter } onChange = { e => {
this . updatePermissionField ( "submitter" , e . target . value ) ;
} } / >
< / C o l >
< / R o w >
< Row style = { { marginTop : "20px" } } >
< Col style = { { marginTop : "5px" } } span = { ( Setting . isMobile ( ) ) ? 22 : 2 } >
{ Setting . getLabel ( i18next . t ( "permission:Approver" ) , i18next . t ( "permission:Approver - Tooltip" ) ) } :
< / C o l >
< Col span = { 22 } >
< Input disabled = { true } value = { this . state . permission . approver } onChange = { e => {
this . updatePermissionField ( "approver" , e . target . value ) ;
} } / >
< / C o l >
< / R o w >
< Row style = { { marginTop : "20px" } } >
< Col style = { { marginTop : "5px" } } span = { ( Setting . isMobile ( ) ) ? 22 : 2 } >
{ Setting . getLabel ( i18next . t ( "permission:Approve time" ) , i18next . t ( "permission:Approve time - Tooltip" ) ) } :
< / C o l >
< Col span = { 22 } >
< Input disabled = { true } value = { Setting . getFormattedDate ( this . state . permission . approveTime ) } onChange = { e => {
this . updatePermissionField ( "approveTime" , e . target . value ) ;
} } / >
< / C o l >
< / R o w >
< Row style = { { marginTop : "20px" } } >
< Col style = { { marginTop : "5px" } } span = { ( Setting . isMobile ( ) ) ? 22 : 2 } >
2023-03-19 01:01:39 +08:00
{ Setting . getLabel ( i18next . t ( "general:State" ) , i18next . t ( "general:State - Tooltip" ) ) } :
2022-08-15 14:09:12 +08:00
< / C o l >
< Col span = { 22 } >
2023-01-12 23:11:11 +08:00
< Select virtual = { false } disabled = { ! Setting . isLocalAdminUser ( this . props . account ) } style = { { width : "100%" } } value = { this . state . permission . state } onChange = { ( value => {
2022-08-15 14:09:12 +08:00
if ( this . state . permission . state !== value ) {
if ( value === "Approved" ) {
this . updatePermissionField ( "approver" , this . props . account . name ) ;
this . updatePermissionField ( "approveTime" , moment ( ) . format ( ) ) ;
} else {
this . updatePermissionField ( "approver" , "" ) ;
this . updatePermissionField ( "approveTime" , "" ) ;
}
}
this . updatePermissionField ( "state" , value ) ;
2023-01-12 23:11:11 +08:00
} ) }
options = { [
{ value : "Approved" , name : i18next . t ( "permission:Approved" ) } ,
{ value : "Pending" , name : i18next . t ( "permission:Pending" ) } ,
] . map ( ( item ) => Setting . getOption ( item . name , item . value ) ) }
/ >
2022-08-15 14:09:12 +08:00
< / C o l >
< / R o w >
2022-01-01 16:28:06 +08:00
< / C a r d >
2022-07-10 15:45:55 +08:00
) ;
2022-01-01 16:28:06 +08:00
}
2023-10-10 21:47:38 +08:00
submitPermissionEdit ( exitAfterSave ) {
2022-08-19 00:09:26 +08:00
if ( this . state . permission . users . length === 0 && this . state . permission . roles . length === 0 ) {
Setting . showMessage ( "error" , "The users and roles cannot be empty at the same time" ) ;
return ;
}
2022-08-21 15:28:19 +08:00
// if (this.state.permission.domains.length === 0) {
// Setting.showMessage("error", "The domains cannot be empty");
// return;
// }
2022-08-19 00:09:26 +08:00
if ( this . state . permission . resources . length === 0 ) {
Setting . showMessage ( "error" , "The resources cannot be empty" ) ;
return ;
}
if ( this . state . permission . actions . length === 0 ) {
Setting . showMessage ( "error" , "The actions cannot be empty" ) ;
return ;
}
if ( ! Setting . isLocalAdminUser ( this . props . account ) && this . state . permission . submitter !== this . props . account . name ) {
Setting . showMessage ( "error" , "A normal user can only modify the permission submitted by itself" ) ;
return ;
}
2022-08-08 23:35:24 +08:00
const permission = Setting . deepCopy ( this . state . permission ) ;
2022-01-01 16:28:06 +08:00
PermissionBackend . updatePermission ( this . state . organizationName , this . state . permissionName , permission )
. then ( ( res ) => {
2022-12-02 00:06:28 +08:00
if ( res . status === "ok" ) {
Setting . showMessage ( "success" , i18next . t ( "general:Successfully saved" ) ) ;
2022-01-01 16:28:06 +08:00
this . setState ( {
2024-07-06 11:24:08 +08:00
organizationName : this . state . permission . owner ,
2022-01-01 16:28:06 +08:00
permissionName : this . state . permission . name ,
} ) ;
2023-10-10 21:47:38 +08:00
if ( exitAfterSave ) {
2022-07-10 15:45:55 +08:00
this . props . history . push ( "/permissions" ) ;
2022-01-01 16:28:06 +08:00
} else {
2023-07-26 12:08:35 +07:00
this . props . history . push ( ` /permissions/ ${ this . state . permission . owner } / ${ encodeURIComponent ( this . state . permission . name ) } ` ) ;
2022-01-01 16:28:06 +08:00
}
} else {
2022-12-02 00:06:28 +08:00
Setting . showMessage ( "error" , ` ${ i18next . t ( "general:Failed to save" ) } : ${ res . msg } ` ) ;
2022-07-10 15:45:55 +08:00
this . updatePermissionField ( "name" , this . state . permissionName ) ;
2022-01-01 16:28:06 +08:00
}
} )
. catch ( error => {
2022-12-02 00:06:28 +08:00
Setting . showMessage ( "error" , ` ${ i18next . t ( "general:Failed to connect to server" ) } : ${ error } ` ) ;
2022-01-01 16:28:06 +08:00
} ) ;
}
2022-02-25 18:16:02 +08:00
deletePermission ( ) {
PermissionBackend . deletePermission ( this . state . permission )
2022-12-02 00:06:28 +08:00
. then ( ( res ) => {
if ( res . status === "ok" ) {
this . props . history . push ( "/permissions" ) ;
} else {
Setting . showMessage ( "error" , ` ${ i18next . t ( "general:Failed to delete" ) } : ${ res . msg } ` ) ;
}
2022-02-25 18:16:02 +08:00
} )
. catch ( error => {
2022-12-02 00:06:28 +08:00
Setting . showMessage ( "error" , ` ${ i18next . t ( "general:Failed to connect to server" ) } : ${ error } ` ) ;
2022-02-25 18:16:02 +08:00
} ) ;
}
2022-01-01 16:28:06 +08:00
render ( ) {
return (
< div >
{
this . state . permission !== null ? this . renderPermission ( ) : null
}
2022-07-10 15:45:55 +08:00
< div style = { { marginTop : "20px" , marginLeft : "40px" } } >
2022-01-01 16:28:06 +08:00
< Button size = "large" onClick = { ( ) => this . submitPermissionEdit ( false ) } > { i18next . t ( "general:Save" ) } < / B u t t o n >
2022-07-10 15:45:55 +08:00
< Button style = { { marginLeft : "20px" } } type = "primary" size = "large" onClick = { ( ) => this . submitPermissionEdit ( true ) } > { i18next . t ( "general:Save & Exit" ) } < / B u t t o n >
{ this . state . mode === "add" ? < Button style = { { marginLeft : "20px" } } size = "large" onClick = { ( ) => this . deletePermission ( ) } > { i18next . t ( "general:Cancel" ) } < / B u t t o n > : n u l l }
2022-01-01 16:28:06 +08:00
< / d i v >
< / d i v >
) ;
}
}
export default PermissionEditPage ;