AddDataSourcePermissions.tsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import React, { PureComponent } from 'react';
  2. import { UserPicker } from 'app/core/components/Picker/UserPicker';
  3. import { Team, TeamPicker } from 'app/core/components/Picker/TeamPicker';
  4. import DescriptionPicker, { OptionWithDescription } from 'app/core/components/Picker/DescriptionPicker';
  5. import { dataSourceAclLevels, AclTarget, DataSourcePermissionLevel } from 'app/types/acl';
  6. import { User } from 'app/types';
  7. export interface Props {
  8. onAddPermission: (state) => void;
  9. onCancel: () => void;
  10. }
  11. interface State {
  12. userId: number;
  13. teamId: number;
  14. type: AclTarget;
  15. permission: DataSourcePermissionLevel;
  16. }
  17. export class AddDataSourcePermissions extends PureComponent<Props, State> {
  18. cleanState = () => ({
  19. userId: 0,
  20. teamId: 0,
  21. type: AclTarget.Team,
  22. permission: DataSourcePermissionLevel.Query,
  23. });
  24. state = this.cleanState();
  25. isValid() {
  26. switch (this.state.type) {
  27. case AclTarget.Team:
  28. return this.state.teamId > 0;
  29. case AclTarget.User:
  30. return this.state.userId > 0;
  31. }
  32. return true;
  33. }
  34. onTeamSelected = (team: Team) => {
  35. this.setState({ teamId: team ? team.id : 0 });
  36. };
  37. onUserSelected = (user: User) => {
  38. this.setState({ userId: user ? user.id : 0 });
  39. };
  40. onPermissionChanged = (permission: OptionWithDescription) => {
  41. this.setState({ permission: permission.value });
  42. };
  43. onTypeChanged = event => {
  44. const type = event.target.value as AclTarget;
  45. this.setState({ type: type, userId: 0, teamId: 0 });
  46. };
  47. onSubmit = async event => {
  48. event.preventDefault();
  49. await this.props.onAddPermission(this.state);
  50. this.setState(this.cleanState());
  51. };
  52. render() {
  53. const { onCancel } = this.props;
  54. const { type, teamId, userId, permission } = this.state;
  55. const pickerClassName = 'width-20';
  56. const aclTargets = [{ value: AclTarget.Team, text: 'Team' }, { value: AclTarget.User, text: 'User' }];
  57. return (
  58. <div className="gf-form-inline cta-form">
  59. <button className="cta-form__close btn btn-transparent" onClick={onCancel}>
  60. <i className="fa fa-close" />
  61. </button>
  62. <form name="addPermission" onSubmit={this.onSubmit}>
  63. <h5>Add Permission For</h5>
  64. <div className="gf-form-inline">
  65. <div className="gf-form">
  66. <select className="gf-form-input gf-size-auto" value={type} onChange={this.onTypeChanged}>
  67. {aclTargets.map((option, idx) => {
  68. return (
  69. <option key={idx} value={option.value}>
  70. {option.text}
  71. </option>
  72. );
  73. })}
  74. </select>
  75. </div>
  76. {type === AclTarget.User && (
  77. <div className="gf-form">
  78. <UserPicker onSelected={this.onUserSelected} value={userId.toString()} className={pickerClassName} />
  79. </div>
  80. )}
  81. {type === AclTarget.Team && (
  82. <div className="gf-form">
  83. <TeamPicker onSelected={this.onTeamSelected} value={teamId.toString()} className={pickerClassName} />
  84. </div>
  85. )}
  86. <div className="gf-form">
  87. <DescriptionPicker
  88. optionsWithDesc={dataSourceAclLevels}
  89. onSelected={this.onPermissionChanged}
  90. value={permission}
  91. disabled={false}
  92. className={'gf-form-input--form-dropdown-right'}
  93. />
  94. </div>
  95. <div className="gf-form">
  96. <button data-save-permission className="btn btn-success" type="submit" disabled={!this.isValid()}>
  97. Save
  98. </button>
  99. </div>
  100. </div>
  101. </form>
  102. </div>
  103. );
  104. }
  105. }
  106. export default AddDataSourcePermissions;