DashboardPermissions.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import React, { PureComponent } from 'react';
  2. import { Tooltip } from '@grafana/ui';
  3. import { SlideDown } from 'app/core/components/Animations/SlideDown';
  4. import { StoreState, FolderInfo } from 'app/types';
  5. import { DashboardAcl, PermissionLevel, NewDashboardAclItem } from 'app/types/acl';
  6. import {
  7. getDashboardPermissions,
  8. addDashboardPermission,
  9. removeDashboardPermission,
  10. updateDashboardPermission,
  11. } from '../../state/actions';
  12. import PermissionList from 'app/core/components/PermissionList/PermissionList';
  13. import AddPermission from 'app/core/components/PermissionList/AddPermission';
  14. import PermissionsInfo from 'app/core/components/PermissionList/PermissionsInfo';
  15. import { connectWithStore } from 'app/core/utils/connectWithReduxStore';
  16. export interface Props {
  17. dashboardId: number;
  18. folder?: FolderInfo;
  19. permissions: DashboardAcl[];
  20. getDashboardPermissions: typeof getDashboardPermissions;
  21. updateDashboardPermission: typeof updateDashboardPermission;
  22. removeDashboardPermission: typeof removeDashboardPermission;
  23. addDashboardPermission: typeof addDashboardPermission;
  24. }
  25. export interface State {
  26. isAdding: boolean;
  27. }
  28. export class DashboardPermissions extends PureComponent<Props, State> {
  29. constructor(props) {
  30. super(props);
  31. this.state = {
  32. isAdding: false,
  33. };
  34. }
  35. componentDidMount() {
  36. this.props.getDashboardPermissions(this.props.dashboardId);
  37. }
  38. onOpenAddPermissions = () => {
  39. this.setState({ isAdding: true });
  40. };
  41. onRemoveItem = (item: DashboardAcl) => {
  42. this.props.removeDashboardPermission(this.props.dashboardId, item);
  43. };
  44. onPermissionChanged = (item: DashboardAcl, level: PermissionLevel) => {
  45. this.props.updateDashboardPermission(this.props.dashboardId, item, level);
  46. };
  47. onAddPermission = (newItem: NewDashboardAclItem) => {
  48. return this.props.addDashboardPermission(this.props.dashboardId, newItem);
  49. };
  50. onCancelAddPermission = () => {
  51. this.setState({ isAdding: false });
  52. };
  53. render() {
  54. const { permissions, folder } = this.props;
  55. const { isAdding } = this.state;
  56. return (
  57. <div>
  58. <div className="dashboard-settings__header">
  59. <div className="page-action-bar">
  60. <h3 className="d-inline-block">Permissions</h3>
  61. <Tooltip placement="auto" content={<PermissionsInfo />}>
  62. <div className="page-sub-heading-icon">
  63. <i className="gicon gicon-question gicon--has-hover" />
  64. </div>
  65. </Tooltip>
  66. <div className="page-action-bar__spacer" />
  67. <button className="btn btn-primary pull-right" onClick={this.onOpenAddPermissions} disabled={isAdding}>
  68. Add Permission
  69. </button>
  70. </div>
  71. </div>
  72. <SlideDown in={isAdding}>
  73. <AddPermission onAddPermission={this.onAddPermission} onCancel={this.onCancelAddPermission} />
  74. </SlideDown>
  75. <PermissionList
  76. items={permissions}
  77. onRemoveItem={this.onRemoveItem}
  78. onPermissionChanged={this.onPermissionChanged}
  79. isFetching={false}
  80. folderInfo={folder}
  81. />
  82. </div>
  83. );
  84. }
  85. }
  86. const mapStateToProps = (state: StoreState) => ({
  87. permissions: state.dashboard.permissions,
  88. });
  89. const mapDispatchToProps = {
  90. getDashboardPermissions,
  91. addDashboardPermission,
  92. removeDashboardPermission,
  93. updateDashboardPermission,
  94. };
  95. export default connectWithStore(DashboardPermissions, mapStateToProps, mapDispatchToProps);