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);