DataSourcePermissions.tsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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 { DataSourcePermissionDTO } from 'app/types';
  15. import { getRouteParamsId } from '../../core/selectors/location';
  16. export interface Props {
  17. dataSourcePermission: DataSourcePermissionDTO;
  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. };
  57. if (state.type === AclTarget.Team) {
  58. addDataSourcePermission(pageId, Object.assign(data, { teamId: state.teamId }));
  59. } else if (state.type === AclTarget.User) {
  60. addDataSourcePermission(pageId, Object.assign(data, { userId: state.userId }));
  61. }
  62. };
  63. onRemovePermission = item => {
  64. this.props.removeDataSourcePermission(item.datasourceId, item.id);
  65. };
  66. onCancelAddPermission = () => {
  67. this.setState({
  68. isAdding: false,
  69. });
  70. };
  71. render() {
  72. const { dataSourcePermission } = this.props;
  73. const { isAdding } = this.state;
  74. const isPermissionsEnabled = dataSourcePermission.enabled;
  75. return (
  76. <div>
  77. <div className="page-action-bar">
  78. <h3 className="page-sub-heading">Permissions</h3>
  79. <div className="page-action-bar__spacer" />
  80. {isPermissionsEnabled && [
  81. <button
  82. key="add-permission"
  83. className="btn btn-success pull-right"
  84. onClick={this.onOpenAddPermissions}
  85. disabled={isAdding}
  86. >
  87. <i className="fa fa-plus" /> Add Permission
  88. </button>,
  89. <button key="disable-permissions" className="btn btn-danger pull-right" onClick={this.onDisablePermissions}>
  90. Disable Permissions
  91. </button>,
  92. ]}
  93. </div>
  94. {!isPermissionsEnabled ? (
  95. <div className="empty-list-cta">
  96. <div className="empty-list-cta__title">{'Permissions not enabled for this data source.'}</div>
  97. <button onClick={this.onEnablePermissions} className="empty-list-cta__button btn btn-xlarge btn-success">
  98. {'Enable'}
  99. </button>
  100. <div className="empty-list-cta__pro-tip">
  101. <i className="fa fa-rocket" /> ProTip:{' '}
  102. {'Only admins will be able to query the data source after you enable permissions.'}
  103. </div>
  104. </div>
  105. ) : (
  106. <div>
  107. <SlideDown in={isAdding}>
  108. <AddDataSourcePermissions
  109. onAddPermission={state => this.onAddPermission(state)}
  110. onCancel={this.onCancelAddPermission}
  111. />
  112. </SlideDown>
  113. <DataSourcePermissionsList
  114. items={dataSourcePermission.permissions}
  115. onRemoveItem={item => this.onRemovePermission(item)}
  116. />
  117. </div>
  118. )}
  119. </div>
  120. );
  121. }
  122. }
  123. function mapStateToProps(state) {
  124. return {
  125. pageId: getRouteParamsId(state.location),
  126. dataSourcePermission: state.dataSources.dataSourcePermission,
  127. };
  128. }
  129. const mapDispatchToProps = {
  130. addDataSourcePermission,
  131. enableDataSourcePermissions,
  132. disableDataSourcePermissions,
  133. loadDataSourcePermissions,
  134. removeDataSourcePermission,
  135. };
  136. export default connect(mapStateToProps, mapDispatchToProps)(DataSourcePermissions);