DataSourcePermissions.tsx 4.8 KB

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