|
|
@@ -1,77 +1,90 @@
|
|
|
import React, { Component } from 'react';
|
|
|
-import { observer } from 'mobx-react';
|
|
|
-import { aclTypes } from 'app/stores/PermissionsStore/PermissionsStore';
|
|
|
import { UserPicker, User } from 'app/core/components/Picker/UserPicker';
|
|
|
import { TeamPicker, Team } from 'app/core/components/Picker/TeamPicker';
|
|
|
import DescriptionPicker, { OptionWithDescription } from 'app/core/components/Picker/DescriptionPicker';
|
|
|
-import { permissionOptions } from 'app/stores/PermissionsStore/PermissionsStore';
|
|
|
+import {
|
|
|
+ dashboardPermissionLevels,
|
|
|
+ dashboardAclTargets,
|
|
|
+ AclTarget,
|
|
|
+ PermissionLevel,
|
|
|
+ NewDashboardAclItem,
|
|
|
+ OrgRole,
|
|
|
+} from 'app/types/acl';
|
|
|
|
|
|
export interface Props {
|
|
|
- permissions: any;
|
|
|
+ onAddPermission: (item: NewDashboardAclItem) => void;
|
|
|
+ onCancel: () => void;
|
|
|
}
|
|
|
|
|
|
-@observer
|
|
|
-class AddPermissions extends Component<Props, any> {
|
|
|
+class AddPermissions extends Component<Props, NewDashboardAclItem> {
|
|
|
constructor(props) {
|
|
|
super(props);
|
|
|
+ this.state = this.getCleanState();
|
|
|
}
|
|
|
|
|
|
- componentWillMount() {
|
|
|
- const { permissions } = this.props;
|
|
|
- permissions.resetNewType();
|
|
|
+ getCleanState() {
|
|
|
+ return {
|
|
|
+ userId: 0,
|
|
|
+ teamId: 0,
|
|
|
+ type: AclTarget.Team,
|
|
|
+ permission: PermissionLevel.View,
|
|
|
+ };
|
|
|
}
|
|
|
|
|
|
onTypeChanged = evt => {
|
|
|
- const { value } = evt.target;
|
|
|
- const { permissions } = this.props;
|
|
|
-
|
|
|
- permissions.setNewType(value);
|
|
|
+ const type = evt.target.value as AclTarget;
|
|
|
+
|
|
|
+ switch (type) {
|
|
|
+ case AclTarget.User:
|
|
|
+ case AclTarget.Team:
|
|
|
+ this.setState({ type: type, userId: 0, teamId: 0, role: undefined });
|
|
|
+ break;
|
|
|
+ case AclTarget.Editor:
|
|
|
+ this.setState({ type: type, userId: 0, teamId: 0, role: OrgRole.Editor });
|
|
|
+ break;
|
|
|
+ case AclTarget.Viewer:
|
|
|
+ this.setState({ type: type, userId: 0, teamId: 0, role: OrgRole.Viewer });
|
|
|
+ break;
|
|
|
+ }
|
|
|
};
|
|
|
|
|
|
onUserSelected = (user: User) => {
|
|
|
- const { permissions } = this.props;
|
|
|
- if (!user) {
|
|
|
- permissions.newItem.setUser(null, null);
|
|
|
- return;
|
|
|
- }
|
|
|
- return permissions.newItem.setUser(user.id, user.login, user.avatarUrl);
|
|
|
+ this.setState({ userId: user ? user.id : 0 });
|
|
|
};
|
|
|
|
|
|
onTeamSelected = (team: Team) => {
|
|
|
- const { permissions } = this.props;
|
|
|
- if (!team) {
|
|
|
- permissions.newItem.setTeam(null, null);
|
|
|
- return;
|
|
|
- }
|
|
|
- return permissions.newItem.setTeam(team.id, team.name, team.avatarUrl);
|
|
|
+ this.setState({ teamId: team ? team.id : 0 });
|
|
|
};
|
|
|
|
|
|
onPermissionChanged = (permission: OptionWithDescription) => {
|
|
|
- const { permissions } = this.props;
|
|
|
- return permissions.newItem.setPermission(permission.value);
|
|
|
+ this.setState({ permission: permission.value });
|
|
|
};
|
|
|
|
|
|
- resetNewType() {
|
|
|
- const { permissions } = this.props;
|
|
|
- return permissions.resetNewType();
|
|
|
- }
|
|
|
-
|
|
|
- onSubmit = evt => {
|
|
|
+ onSubmit = async evt => {
|
|
|
evt.preventDefault();
|
|
|
- const { permissions } = this.props;
|
|
|
- permissions.addStoreItem();
|
|
|
+ await this.props.onAddPermission(this.state);
|
|
|
+ this.setState(this.getCleanState());
|
|
|
};
|
|
|
|
|
|
+ isValid() {
|
|
|
+ switch (this.state.type) {
|
|
|
+ case AclTarget.Team:
|
|
|
+ return this.state.teamId > 0;
|
|
|
+ case AclTarget.User:
|
|
|
+ return this.state.userId > 0;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
render() {
|
|
|
- const { permissions } = this.props;
|
|
|
- const newItem = permissions.newItem;
|
|
|
+ const { onCancel } = this.props;
|
|
|
+ const newItem = this.state;
|
|
|
const pickerClassName = 'width-20';
|
|
|
-
|
|
|
- const isValid = newItem.isValid();
|
|
|
+ const isValid = this.isValid();
|
|
|
|
|
|
return (
|
|
|
<div className="gf-form-inline cta-form">
|
|
|
- <button className="cta-form__close btn btn-transparent" onClick={permissions.hideAddPermissions}>
|
|
|
+ <button className="cta-form__close btn btn-transparent" onClick={onCancel}>
|
|
|
<i className="fa fa-close" />
|
|
|
</button>
|
|
|
<form name="addPermission" onSubmit={this.onSubmit}>
|
|
|
@@ -80,7 +93,7 @@ class AddPermissions extends Component<Props, any> {
|
|
|
<div className="gf-form">
|
|
|
<div className="gf-form-select-wrapper">
|
|
|
<select className="gf-form-input gf-size-auto" value={newItem.type} onChange={this.onTypeChanged}>
|
|
|
- {aclTypes.map((option, idx) => {
|
|
|
+ {dashboardAclTargets.map((option, idx) => {
|
|
|
return (
|
|
|
<option key={idx} value={option.value}>
|
|
|
{option.text}
|
|
|
@@ -91,21 +104,29 @@ class AddPermissions extends Component<Props, any> {
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
- {newItem.type === 'User' ? (
|
|
|
+ {newItem.type === AclTarget.User ? (
|
|
|
<div className="gf-form">
|
|
|
- <UserPicker onSelected={this.onUserSelected} value={newItem.userId} className={pickerClassName} />
|
|
|
+ <UserPicker
|
|
|
+ onSelected={this.onUserSelected}
|
|
|
+ value={newItem.userId.toString()}
|
|
|
+ className={pickerClassName}
|
|
|
+ />
|
|
|
</div>
|
|
|
) : null}
|
|
|
|
|
|
- {newItem.type === 'Group' ? (
|
|
|
+ {newItem.type === AclTarget.Team ? (
|
|
|
<div className="gf-form">
|
|
|
- <TeamPicker onSelected={this.onTeamSelected} value={newItem.teamId} className={pickerClassName} />
|
|
|
+ <TeamPicker
|
|
|
+ onSelected={this.onTeamSelected}
|
|
|
+ value={newItem.teamId.toString()}
|
|
|
+ className={pickerClassName}
|
|
|
+ />
|
|
|
</div>
|
|
|
) : null}
|
|
|
|
|
|
<div className="gf-form">
|
|
|
<DescriptionPicker
|
|
|
- optionsWithDesc={permissionOptions}
|
|
|
+ optionsWithDesc={dashboardPermissionLevels}
|
|
|
onSelected={this.onPermissionChanged}
|
|
|
value={newItem.permission}
|
|
|
disabled={false}
|