github.com/cockroachdb/cockroach@v20.2.0-alpha.1+incompatible/pkg/ui/src/views/databases/containers/databaseGrants/index.tsx (about) 1 // Copyright 2018 The Cockroach Authors. 2 // 3 // Use of this software is governed by the Business Source License 4 // included in the file licenses/BSL.txt. 5 // 6 // As of the Change Date specified in that file, in accordance with 7 // the Business Source License, use of this software will be governed 8 // by the Apache License, Version 2.0, included in the file 9 // licenses/APL.txt. 10 11 import React from "react"; 12 import { connect } from "react-redux"; 13 import * as protos from "src/js/protos"; 14 import { refreshDatabaseDetails, refreshTableDetails, refreshTableStats } from "src/redux/apiReducers"; 15 import { LocalSetting } from "src/redux/localsettings"; 16 import { AdminUIState } from "src/redux/state"; 17 import { databaseDetails, DatabaseSummaryExplicitData, grants as selectGrants, tableInfos, DatabaseSummaryBase } from "src/views/databases/containers/databaseSummary"; 18 import { SortSetting } from "src/views/shared/components/sortabletable"; 19 import { SortedTable } from "src/views/shared/components/sortedtable"; 20 import { SummaryBar, SummaryHeadlineStat } from "src/views/shared/components/summaryBar"; 21 22 class DatabaseGrantsSortedTable extends SortedTable<protos.cockroach.server.serverpb.DatabaseDetailsResponse.Grant> {} 23 24 const grantsSortSetting = new LocalSetting<AdminUIState, SortSetting>( 25 "databases/sort_setting/grants", (s) => s.localSettings, 26 ); 27 28 // DatabaseSummaryGrants displays a summary section describing the grants 29 // active on a single database. 30 class DatabaseSummaryGrants extends DatabaseSummaryBase { 31 totalUsers() { 32 const grants = this.props.grants; 33 return grants && grants.length; 34 } 35 36 render() { 37 const { grants, sortSetting } = this.props; 38 const dbID = this.props.name; 39 40 const numTables = tableInfos && tableInfos.length || 0; 41 42 return ( 43 <div className="database-summary"> 44 <div className="database-summary-title"> 45 <h2 className="base-heading">{dbID}</h2> 46 </div> 47 <div className="l-columns"> 48 <div className="l-columns__left"> 49 <div className="database-summary-table sql-table"> 50 { 51 (numTables === 0) ? "" : 52 <DatabaseGrantsSortedTable 53 data={grants as protos.cockroach.server.serverpb.DatabaseDetailsResponse.Grant[]} 54 sortSetting={sortSetting} 55 onChangeSortSetting={(setting) => this.props.setSort(setting)} 56 columns={[ 57 { 58 title: "User", 59 cell: (grant) => grant.user, 60 sort: (grant) => grant.user, 61 }, 62 { 63 title: "Grants", 64 cell: (grant) => grant.privileges.join(", "), 65 }, 66 ]} /> 67 } 68 </div> 69 </div> 70 <div className="l-columns__right"> 71 <SummaryBar> 72 <SummaryHeadlineStat 73 title="Total Users" 74 tooltip="Total users that have been granted permissions on this table." 75 value={this.totalUsers()} /> 76 </SummaryBar> 77 </div> 78 </div> 79 </div> 80 ); 81 } 82 } 83 84 const mapStateToProps = (state: AdminUIState, ownProps: DatabaseSummaryExplicitData) => ({ // RootState contains declaration for whole state 85 tableInfos: tableInfos(state, ownProps.name), 86 sortSetting: grantsSortSetting.selector(state), 87 dbResponse: databaseDetails(state)[ownProps.name] && databaseDetails(state)[ownProps.name].data, 88 grants: selectGrants(state, ownProps.name), 89 }); 90 91 const mapDispatchToProps = { 92 setSort: grantsSortSetting.set, 93 refreshDatabaseDetails, 94 refreshTableDetails, 95 refreshTableStats, 96 }; 97 98 // Connect the DatabaseSummaryGrants class with our redux store. 99 export default connect( 100 mapStateToProps, 101 mapDispatchToProps, 102 )(DatabaseSummaryGrants as any);