FolderPermissions.tsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import React, { PureComponent } from 'react';
  2. import { hot } from 'react-hot-loader';
  3. import { connect } from 'react-redux';
  4. import Page from 'app/core/components/Page/Page';
  5. import { Tooltip } from '@grafana/ui';
  6. import { NavModel } from '@grafana/data';
  7. import { SlideDown } from 'app/core/components/Animations/SlideDown';
  8. import { getNavModel } from 'app/core/selectors/navModel';
  9. import { StoreState, FolderState } from 'app/types';
  10. import { DashboardAcl, PermissionLevel, NewDashboardAclItem } from 'app/types/acl';
  11. import {
  12. getFolderByUid,
  13. getFolderPermissions,
  14. updateFolderPermission,
  15. removeFolderPermission,
  16. addFolderPermission,
  17. } from './state/actions';
  18. import { getLoadingNav } from './state/navModel';
  19. import PermissionList from 'app/core/components/PermissionList/PermissionList';
  20. import AddPermission from 'app/core/components/PermissionList/AddPermission';
  21. import PermissionsInfo from 'app/core/components/PermissionList/PermissionsInfo';
  22. export interface Props {
  23. navModel: NavModel;
  24. folderUid: string;
  25. folder: FolderState;
  26. getFolderByUid: typeof getFolderByUid;
  27. getFolderPermissions: typeof getFolderPermissions;
  28. updateFolderPermission: typeof updateFolderPermission;
  29. removeFolderPermission: typeof removeFolderPermission;
  30. addFolderPermission: typeof addFolderPermission;
  31. }
  32. export interface State {
  33. isAdding: boolean;
  34. }
  35. export class FolderPermissions extends PureComponent<Props, State> {
  36. constructor(props: Props) {
  37. super(props);
  38. this.state = {
  39. isAdding: false,
  40. };
  41. }
  42. componentDidMount() {
  43. this.props.getFolderByUid(this.props.folderUid);
  44. this.props.getFolderPermissions(this.props.folderUid);
  45. }
  46. onOpenAddPermissions = () => {
  47. this.setState({ isAdding: true });
  48. };
  49. onRemoveItem = (item: DashboardAcl) => {
  50. this.props.removeFolderPermission(item);
  51. };
  52. onPermissionChanged = (item: DashboardAcl, level: PermissionLevel) => {
  53. this.props.updateFolderPermission(item, level);
  54. };
  55. onAddPermission = (newItem: NewDashboardAclItem) => {
  56. return this.props.addFolderPermission(newItem);
  57. };
  58. onCancelAddPermission = () => {
  59. this.setState({ isAdding: false });
  60. };
  61. render() {
  62. const { navModel, folder } = this.props;
  63. const { isAdding } = this.state;
  64. if (folder.id === 0) {
  65. return (
  66. <Page navModel={navModel}>
  67. <Page.Contents isLoading={true}>
  68. <span />
  69. </Page.Contents>
  70. </Page>
  71. );
  72. }
  73. const folderInfo = { title: folder.title, url: folder.url, id: folder.id };
  74. return (
  75. <Page navModel={navModel}>
  76. <Page.Contents>
  77. <div className="page-action-bar">
  78. <h3 className="page-sub-heading">Folder Permissions</h3>
  79. <Tooltip placement="auto" content={<PermissionsInfo />}>
  80. <div className="page-sub-heading-icon">
  81. <i className="gicon gicon-question gicon--has-hover" />
  82. </div>
  83. </Tooltip>
  84. <div className="page-action-bar__spacer" />
  85. <button className="btn btn-primary pull-right" onClick={this.onOpenAddPermissions} disabled={isAdding}>
  86. Add Permission
  87. </button>
  88. </div>
  89. <SlideDown in={isAdding}>
  90. <AddPermission onAddPermission={this.onAddPermission} onCancel={this.onCancelAddPermission} />
  91. </SlideDown>
  92. <PermissionList
  93. items={folder.permissions}
  94. onRemoveItem={this.onRemoveItem}
  95. onPermissionChanged={this.onPermissionChanged}
  96. isFetching={false}
  97. folderInfo={folderInfo}
  98. />
  99. </Page.Contents>
  100. </Page>
  101. );
  102. }
  103. }
  104. const mapStateToProps = (state: StoreState) => {
  105. const uid = state.location.routeParams.uid;
  106. return {
  107. navModel: getNavModel(state.navIndex, `folder-permissions-${uid}`, getLoadingNav(1)),
  108. folderUid: uid,
  109. folder: state.folder,
  110. };
  111. };
  112. const mapDispatchToProps = {
  113. getFolderByUid,
  114. getFolderPermissions,
  115. updateFolderPermission,
  116. removeFolderPermission,
  117. addFolderPermission,
  118. };
  119. export default hot(module)(
  120. connect(
  121. mapStateToProps,
  122. mapDispatchToProps
  123. )(FolderPermissions)
  124. );