2022-02-13 23:39:27 +08:00
// Copyright 2021 The Casdoor Authors. All Rights Reserved.
2021-06-14 19:09:04 +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-18 20:57:38 +08:00
import { DeleteOutlined , DownOutlined , UpOutlined } from "@ant-design/icons" ;
2022-07-10 15:45:55 +08:00
import { Button , Col , Row , Select , Switch , Table , Tooltip } from "antd" ;
2021-06-14 19:09:04 +08:00
import * as Setting from "./Setting" ;
import i18next from "i18next" ;
2021-11-28 18:46:20 +08:00
import * as Provider from "./auth/Provider" ;
2021-06-14 19:09:04 +08:00
2022-07-10 15:45:55 +08:00
const { Option } = Select ;
2021-06-14 19:09:04 +08:00
class ProviderTable extends React . Component {
constructor ( props ) {
super ( props ) ;
this . state = {
classes : props ,
} ;
}
updateTable ( table ) {
this . props . onUpdateTable ( table ) ;
}
updateField ( table , index , key , value ) {
table [ index ] [ key ] = value ;
this . updateTable ( table ) ;
}
addRow ( table ) {
2022-10-28 13:38:14 +08:00
const row = { name : Setting . getNewRowNameForTable ( table , "Please select a provider" ) , canSignUp : true , canSignIn : true , canUnlink : true , alertType : "None" , rule : "None" } ;
2021-06-14 19:09:04 +08:00
if ( table === undefined ) {
table = [ ] ;
}
table = Setting . addRow ( table , row ) ;
this . updateTable ( table ) ;
}
deleteRow ( table , i ) {
table = Setting . deleteRow ( table , i ) ;
this . updateTable ( table ) ;
}
upRow ( table , i ) {
table = Setting . swapRow ( table , i - 1 , i ) ;
this . updateTable ( table ) ;
}
downRow ( table , i ) {
table = Setting . swapRow ( table , i , i + 1 ) ;
this . updateTable ( table ) ;
}
renderTable ( table ) {
2021-07-10 01:19:31 +08:00
let columns = [
2021-06-14 19:09:04 +08:00
{
title : i18next . t ( "provider:Name" ) ,
2022-07-10 15:45:55 +08:00
dataIndex : "name" ,
key : "name" ,
2021-06-14 19:09:04 +08:00
render : ( text , record , index ) => {
return (
2022-07-10 15:45:55 +08:00
< Select virtual = { false } style = { { width : "100%" } }
value = { text }
onChange = { value => {
this . updateField ( table , index , "name" , value ) ;
const provider = Setting . getArrayItem ( this . props . providers , "name" , value ) ;
this . updateField ( table , index , "provider" , provider ) ;
} } >
2021-06-14 19:09:04 +08:00
{
2021-07-09 23:12:13 +08:00
Setting . getDeduplicatedArray ( this . props . providers , table , "name" ) . map ( ( provider , index ) => < Option key = { index } value = { provider . name } > { provider . name } < / O p t i o n > )
2021-06-14 19:09:04 +08:00
}
< / S e l e c t >
2022-07-10 15:45:55 +08:00
) ;
2022-08-06 23:54:56 +08:00
} ,
2021-06-14 19:09:04 +08:00
} ,
2021-11-28 18:46:20 +08:00
{
title : i18next . t ( "provider:Category" ) ,
2022-07-10 15:45:55 +08:00
dataIndex : "category" ,
key : "category" ,
width : "100px" ,
2021-11-28 18:46:20 +08:00
render : ( text , record , index ) => {
const provider = Setting . getArrayItem ( this . props . providers , "name" , record . name ) ;
return provider ? . category ;
2022-08-06 23:54:56 +08:00
} ,
2021-11-28 18:46:20 +08:00
} ,
{
title : i18next . t ( "provider:Type" ) ,
2022-07-10 15:45:55 +08:00
dataIndex : "type" ,
key : "type" ,
width : "80px" ,
2021-11-28 18:46:20 +08:00
render : ( text , record , index ) => {
const provider = Setting . getArrayItem ( this . props . providers , "name" , record . name ) ;
return Provider . getProviderLogoWidget ( provider ) ;
2022-08-06 23:54:56 +08:00
} ,
2021-11-28 18:46:20 +08:00
} ,
2021-06-14 19:09:04 +08:00
{
2022-11-06 21:14:26 +08:00
title : i18next . t ( "provider:Can signup" ) ,
2022-07-10 15:45:55 +08:00
dataIndex : "canSignUp" ,
key : "canSignUp" ,
width : "120px" ,
2021-06-14 19:09:04 +08:00
render : ( text , record , index ) => {
2021-07-12 01:08:48 +08:00
if ( record . provider ? . category !== "OAuth" ) {
2021-07-10 01:19:31 +08:00
return null ;
}
2021-06-14 19:09:04 +08:00
return (
< Switch checked = { text } onChange = { checked => {
2022-07-10 15:45:55 +08:00
this . updateField ( table , index , "canSignUp" , checked ) ;
2021-06-14 19:09:04 +08:00
} } / >
2022-07-10 15:45:55 +08:00
) ;
2022-08-06 23:54:56 +08:00
} ,
2021-06-14 19:09:04 +08:00
} ,
{
2022-11-06 21:14:26 +08:00
title : i18next . t ( "provider:Can signin" ) ,
2022-07-10 15:45:55 +08:00
dataIndex : "canSignIn" ,
key : "canSignIn" ,
width : "120px" ,
2021-06-14 19:09:04 +08:00
render : ( text , record , index ) => {
2021-07-12 01:08:48 +08:00
if ( record . provider ? . category !== "OAuth" ) {
2021-07-10 01:19:31 +08:00
return null ;
}
2021-06-14 19:09:04 +08:00
return (
< Switch checked = { text } onChange = { checked => {
2022-07-10 15:45:55 +08:00
this . updateField ( table , index , "canSignIn" , checked ) ;
2021-06-14 19:09:04 +08:00
} } / >
2022-07-10 15:45:55 +08:00
) ;
2022-08-06 23:54:56 +08:00
} ,
2021-06-14 19:09:04 +08:00
} ,
{
2022-11-06 21:14:26 +08:00
title : i18next . t ( "provider:Can unlink" ) ,
2022-07-10 15:45:55 +08:00
dataIndex : "canUnlink" ,
key : "canUnlink" ,
width : "120px" ,
2021-06-14 19:09:04 +08:00
render : ( text , record , index ) => {
2021-07-12 01:08:48 +08:00
if ( record . provider ? . category !== "OAuth" ) {
2021-07-10 01:19:31 +08:00
return null ;
}
2021-06-14 19:09:04 +08:00
return (
< Switch checked = { text } onChange = { checked => {
2022-07-10 15:45:55 +08:00
this . updateField ( table , index , "canUnlink" , checked ) ;
2021-06-14 19:09:04 +08:00
} } / >
2022-07-10 15:45:55 +08:00
) ;
2022-08-06 23:54:56 +08:00
} ,
2021-06-14 19:09:04 +08:00
} ,
2021-06-18 02:02:43 +08:00
{
2022-11-06 21:14:26 +08:00
title : i18next . t ( "provider:Prompted" ) ,
2022-07-10 15:45:55 +08:00
dataIndex : "prompted" ,
key : "prompted" ,
width : "120px" ,
2021-06-18 02:02:43 +08:00
render : ( text , record , index ) => {
2021-07-12 01:08:48 +08:00
if ( record . provider ? . category !== "OAuth" ) {
2021-07-10 01:19:31 +08:00
return null ;
}
2021-06-18 02:02:43 +08:00
return (
< Switch checked = { text } onChange = { checked => {
2022-07-10 15:45:55 +08:00
this . updateField ( table , index , "prompted" , checked ) ;
2021-06-18 02:02:43 +08:00
} } / >
2022-07-10 15:45:55 +08:00
) ;
2022-08-06 23:54:56 +08:00
} ,
2021-06-18 02:02:43 +08:00
} ,
2021-07-10 01:19:31 +08:00
// {
// title: i18next.t("provider:alertType"),
// dataIndex: 'alertType',
// key: 'alertType',
// width: '120px',
// render: (text, record, index) => {
// return (
2023-01-12 23:11:11 +08:00
// <Select virtual={false} style={{width: '100%'}} value={text} onChange={(value => {
2021-07-10 01:19:31 +08:00
// this.updateField(table, index, 'alertType', value);
// })}>
// {
// [
// {id: 'None', name: 'None'},
// {id: 'Once', name: 'Once'},
// {id: 'Always', name: 'Always'},
// ].map((item, index) => <Option key={index} value={item.id}>{item.name}</Option>)
// }
// </Select>
// )
// }
// },
2022-10-28 13:38:14 +08:00
{
title : i18next . t ( "application:Rule" ) ,
dataIndex : "rule" ,
key : "rule" ,
width : "100px" ,
render : ( text , record , index ) => {
if ( record . provider ? . category !== "Captcha" ) {
return null ;
}
return (
< Select virtual = { false } style = { { width : "100%" } }
value = { text }
defaultValue = "None"
onChange = { value => {
this . updateField ( table , index , "rule" , value ) ;
} } >
< Option key = "None" value = "None" > { i18next . t ( "application:None" ) } < / O p t i o n >
< Option key = "Always" value = "Always" > { i18next . t ( "application:Always" ) } < / O p t i o n >
< / S e l e c t >
) ;
} ,
} ,
2021-06-14 19:09:04 +08:00
{
title : i18next . t ( "general:Action" ) ,
2022-07-10 15:45:55 +08:00
key : "action" ,
width : "100px" ,
2021-06-14 19:09:04 +08:00
render : ( text , record , index ) => {
return (
< div >
< Tooltip placement = "bottomLeft" title = { i18next . t ( "general:Up" ) } >
< Button style = { { marginRight : "5px" } } disabled = { index === 0 } icon = { < UpOutlined / > } size = "small" onClick = { ( ) => this . upRow ( table , index ) } / >
< / T o o l t i p >
< Tooltip placement = "topLeft" title = { i18next . t ( "general:Down" ) } >
< Button style = { { marginRight : "5px" } } disabled = { index === table . length - 1 } icon = { < DownOutlined / > } size = "small" onClick = { ( ) => this . downRow ( table , index ) } / >
< / T o o l t i p >
< Tooltip placement = "topLeft" title = { i18next . t ( "general:Delete" ) } >
< Button icon = { < DeleteOutlined / > } size = "small" onClick = { ( ) => this . deleteRow ( table , index ) } / >
< / T o o l t i p >
< / d i v >
) ;
2022-08-06 23:54:56 +08:00
} ,
2021-06-14 19:09:04 +08:00
} ,
] ;
2021-11-19 21:27:22 +08:00
if ( ! this . props . application . enableSignUp ) {
2021-07-10 01:19:31 +08:00
columns = columns . filter ( column => column . key !== "canSignUp" ) ;
}
2021-06-14 19:09:04 +08:00
return (
2022-07-10 15:45:55 +08:00
< Table scroll = { { x : "max-content" } } rowKey = "name" columns = { columns } dataSource = { table } size = "middle" bordered pagination = { false }
title = { ( ) => (
< div >
{ this . props . title } & nbsp ; & nbsp ; & nbsp ; & nbsp ;
< Button style = { { marginRight : "5px" } } type = "primary" size = "small" onClick = { ( ) => this . addRow ( table ) } > { i18next . t ( "general:Add" ) } < / B u t t o n >
< / d i v >
) }
2021-06-14 19:09:04 +08:00
/ >
) ;
}
render ( ) {
return (
< div >
2022-07-10 15:45:55 +08:00
< Row style = { { marginTop : "20px" } } >
2021-06-14 19:09:04 +08:00
< Col span = { 24 } >
{
this . renderTable ( this . props . table )
}
< / C o l >
< / R o w >
< / d i v >
2022-07-10 15:45:55 +08:00
) ;
2021-06-14 19:09:04 +08:00
}
}
export default ProviderTable ;