DataSourcePermissions.tsx 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. import React, { PureComponent } from 'react';
  2. import { connect } from 'react-redux';
  3. import SlideDown from '../../core/components/Animations/SlideDown';
  4. import AddDataSourcePermissions from './AddDataSourcePermissions';
  5. import DataSourcePermissionsList from './DataSourcePermissionsList';
  6. import { AclTarget } from 'app/types/acl';
  7. import {
  8. addDataSourcePermission,
  9. enableDataSourcePermissions,
  10. loadDataSourcePermissions,
  11. removeDataSourcePermission,
  12. } from './state/actions';
  13. import { DashboardAcl, DataSourcePermission } from 'app/types';
  14. import { getRouteParamsId } from '../../core/selectors/location';
  15. export interface Props {
  16. dataSourcePermission: { enabled: boolean; datasouceId: number; permissions: DataSourcePermission[] };
  17. pageId: number;
  18. addDataSourcePermission: typeof addDataSourcePermission;
  19. enableDataSourcePermissions: typeof enableDataSourcePermissions;
  20. loadDataSourcePermissions: typeof loadDataSourcePermissions;
  21. removeDataSourcePermission: typeof removeDataSourcePermission;
  22. }
  23. interface State {
  24. isAdding: boolean;
  25. }
  26. export class DataSourcePermissions extends PureComponent<Props, State> {
  27. state = {
  28. isAdding: false,
  29. };
  30. componentDidMount() {
  31. this.fetchDataSourcePermissions();
  32. }
  33. async fetchDataSourcePermissions() {
  34. const { pageId, loadDataSourcePermissions } = this.props;
  35. return await loadDataSourcePermissions(pageId);
  36. }
  37. onOpenAddPermissions = () => {
  38. this.setState({
  39. isAdding: true,
  40. });
  41. };
  42. onEnablePermissions = () => {
  43. const { pageId, enableDataSourcePermissions } = this.props;
  44. enableDataSourcePermissions(pageId);
  45. };
  46. onAddPermission = state => {
  47. const { pageId, addDataSourcePermission } = this.props;
  48. const data = {
  49. permission: state.permission,
  50. userId: 0,
  51. teamId: 0,
  52. };
  53. if (state.type === AclTarget.Team) {
  54. data.teamId = state.teamId;
  55. } else if (state.team === AclTarget.User) {
  56. data.userId = state.userId;
  57. }
  58. addDataSourcePermission(pageId, data);
  59. };
  60. onRemovePermission = (item: DashboardAcl) => {
  61. this.props.removeDataSourcePermission(1, 1);
  62. };
  63. onCancelAddPermission = () => {
  64. this.setState({
  65. isAdding: false,
  66. });
  67. };
  68. render() {
  69. const { dataSourcePermission } = this.props;
  70. const { isAdding } = this.state;
  71. const isPermissionsEnabled = dataSourcePermission.enabled;
  72. return (
  73. <div>
  74. <div className="page-action-bar">
  75. <h3 className="page-sub-heading">Permissions</h3>
  76. <div className="page-action-bar__spacer" />
  77. {!isPermissionsEnabled && (
  78. <button className="btn btn-success pull-right" onClick={this.onEnablePermissions} disabled={isAdding}>
  79. Enable Permissions
  80. </button>
  81. )}
  82. {isPermissionsEnabled && (
  83. <button className="btn btn-success pull-right" onClick={this.onOpenAddPermissions} disabled={isAdding}>
  84. <i className="fa fa-plus" /> Add Permission
  85. </button>
  86. )}
  87. </div>
  88. {!isPermissionsEnabled ? (
  89. <div className="empty-list-cta">
  90. <div className="empty-list-cta__title">{'Permissions not enabled for this data source.'}</div>
  91. <button onClick={this.onEnablePermissions} className="empty-list-cta__button btn btn-xlarge btn-success">
  92. {'Enable'}
  93. </button>
  94. <div className="empty-list-cta__pro-tip">
  95. <i className="fa fa-rocket" /> ProTip:{' '}
  96. {'Only admins will be able to query the data source after you enable permissions.'}
  97. </div>
  98. </div>
  99. ) : (
  100. <div>
  101. <SlideDown in={isAdding}>
  102. <AddDataSourcePermissions
  103. onAddPermission={state => this.onAddPermission(state)}
  104. onCancel={this.onCancelAddPermission}
  105. />
  106. </SlideDown>
  107. <DataSourcePermissionsList
  108. items={dataSourcePermission.permissions}
  109. onRemoveItem={item => this.onRemovePermission(item)}
  110. />
  111. </div>
  112. )}
  113. </div>
  114. );
  115. }
  116. }
  117. function mapStateToProps(state) {
  118. return {
  119. pageId: getRouteParamsId(state.location),
  120. dataSourcePermission: state.dataSources.dataSourcePermission,
  121. };
  122. }
  123. const mapDispatchToProps = {
  124. addDataSourcePermission,
  125. enableDataSourcePermissions,
  126. loadDataSourcePermissions,
  127. removeDataSourcePermission,
  128. };
  129. export default connect(mapStateToProps, mapDispatchToProps)(DataSourcePermissions);