Permissions.tsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. import React, { Component } from 'react';
  2. import PermissionsList from './PermissionsList';
  3. import { observer } from 'mobx-react';
  4. import UserPicker, { User } from 'app/core/components/Picker/UserPicker';
  5. import TeamPicker, { Team } from 'app/core/components/Picker/TeamPicker';
  6. import { aclTypes } from 'app/stores/PermissionsStore/PermissionsStore';
  7. import { FolderInfo } from './FolderInfo';
  8. export interface DashboardAcl {
  9. id?: number;
  10. dashboardId?: number;
  11. userId?: number;
  12. userLogin?: string;
  13. userEmail?: string;
  14. teamId?: number;
  15. team?: string;
  16. permission?: number;
  17. permissionName?: string;
  18. role?: string;
  19. icon?: string;
  20. nameHtml?: string;
  21. inherited?: boolean;
  22. sortName?: string;
  23. sortRank?: number;
  24. }
  25. export interface IProps {
  26. dashboardId: number;
  27. folderInfo?: FolderInfo;
  28. permissions?: any;
  29. isFolder: boolean;
  30. backendSrv: any;
  31. }
  32. @observer
  33. class Permissions extends Component<IProps, any> {
  34. constructor(props) {
  35. super(props);
  36. const { dashboardId, isFolder, folderInfo } = this.props;
  37. this.permissionChanged = this.permissionChanged.bind(this);
  38. this.typeChanged = this.typeChanged.bind(this);
  39. this.removeItem = this.removeItem.bind(this);
  40. this.userPicked = this.userPicked.bind(this);
  41. this.teamPicked = this.teamPicked.bind(this);
  42. this.loadStore(dashboardId, isFolder, folderInfo && folderInfo.id === 0);
  43. }
  44. loadStore(dashboardId, isFolder, isInRoot = false) {
  45. return this.props.permissions.load(dashboardId, isFolder, isInRoot);
  46. }
  47. permissionChanged(index: number, permission: number, permissionName: string) {
  48. const { permissions } = this.props;
  49. permissions.updatePermissionOnIndex(index, permission, permissionName);
  50. }
  51. removeItem(index: number) {
  52. const { permissions } = this.props;
  53. permissions.removeStoreItem(index);
  54. }
  55. resetNewType() {
  56. const { permissions } = this.props;
  57. permissions.resetNewType();
  58. }
  59. typeChanged(evt) {
  60. const { value } = evt.target;
  61. const { permissions, dashboardId } = this.props;
  62. if (value === 'Viewer' || value === 'Editor') {
  63. permissions.addStoreItem({ permission: 1, role: value, dashboardId: dashboardId }, dashboardId);
  64. this.resetNewType();
  65. return;
  66. }
  67. permissions.setNewType(value);
  68. }
  69. userPicked(user: User) {
  70. const { permissions, dashboardId } = this.props;
  71. return permissions.addStoreItem({
  72. userId: user.id,
  73. userLogin: user.login,
  74. permission: 1,
  75. dashboardId: dashboardId,
  76. });
  77. }
  78. teamPicked(team: Team) {
  79. const { permissions, dashboardId } = this.props;
  80. return permissions.addStoreItem({
  81. teamId: team.id,
  82. team: team.name,
  83. permission: 1,
  84. dashboardId: dashboardId,
  85. });
  86. }
  87. render() {
  88. const { permissions, folderInfo, backendSrv } = this.props;
  89. return (
  90. <div className="gf-form-group">
  91. <PermissionsList
  92. permissions={permissions.items}
  93. removeItem={this.removeItem}
  94. permissionChanged={this.permissionChanged}
  95. fetching={permissions.fetching}
  96. folderInfo={folderInfo}
  97. />
  98. <div className="gf-form-inline">
  99. <form name="addPermission" className="gf-form-group">
  100. <h6 className="muted">Add Permission For</h6>
  101. <div className="gf-form-inline">
  102. <div className="gf-form">
  103. <div className="gf-form-select-wrapper">
  104. <select
  105. className="gf-form-input gf-size-auto"
  106. value={permissions.newType}
  107. onChange={this.typeChanged}
  108. >
  109. {aclTypes.map((option, idx) => {
  110. return (
  111. <option key={idx} value={option.value}>
  112. {option.text}
  113. </option>
  114. );
  115. })}
  116. </select>
  117. </div>
  118. </div>
  119. {permissions.newType === 'User' ? (
  120. <div className="gf-form">
  121. <UserPicker backendSrv={backendSrv} handlePicked={this.userPicked} />
  122. </div>
  123. ) : null}
  124. {permissions.newType === 'Group' ? (
  125. <div className="gf-form">
  126. <TeamPicker backendSrv={backendSrv} handlePicked={this.teamPicked} />
  127. </div>
  128. ) : null}
  129. </div>
  130. </form>
  131. {permissions.error ? (
  132. <div className="gf-form width-17">
  133. <span ng-if="ctrl.error" className="text-error p-l-1">
  134. <i className="fa fa-warning" />
  135. {permissions.error}
  136. </span>
  137. </div>
  138. ) : null}
  139. </div>
  140. </div>
  141. );
  142. }
  143. }
  144. export default Permissions;