|
|
|
@ -1,6 +1,10 @@ |
|
|
|
|
import React, { Component } from 'react'; |
|
|
|
|
import PermissionsList from './PermissionsList'; |
|
|
|
|
import _ from 'lodash'; |
|
|
|
|
import DevTools from 'mobx-react-devtools'; |
|
|
|
|
import { inject, observer } from 'mobx-react'; |
|
|
|
|
import { Provider } from 'mobx-react'; |
|
|
|
|
import { store } from 'app/stores/store'; |
|
|
|
|
|
|
|
|
|
export interface DashboardAcl { |
|
|
|
|
id?: number; |
|
|
|
@ -24,12 +28,25 @@ export interface IProps { |
|
|
|
|
error: any; |
|
|
|
|
newType: any; |
|
|
|
|
aclTypes: any; |
|
|
|
|
typeChanged: any; |
|
|
|
|
backendSrv: any; |
|
|
|
|
dashboardId: number; |
|
|
|
|
permissions: any; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
class Permissions extends Component<IProps, any> { |
|
|
|
|
render() { |
|
|
|
|
return ( |
|
|
|
|
<Provider {...store}> |
|
|
|
|
<PermissionsInner {...this.props} /> |
|
|
|
|
</Provider> |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@inject('permissions') |
|
|
|
|
@observer |
|
|
|
|
class PermissionsInner extends Component<IProps, any> { |
|
|
|
|
// TODO Remove Inner from Name when we get access via ReactContainer
|
|
|
|
|
dashboardId: any; |
|
|
|
|
meta: any; |
|
|
|
|
items: DashboardAcl[]; |
|
|
|
@ -50,58 +67,34 @@ class Permissions extends Component<IProps, any> { |
|
|
|
|
|
|
|
|
|
constructor(props) { |
|
|
|
|
super(props); |
|
|
|
|
this.dashboardId = this.props.dashboardId; |
|
|
|
|
this.backendSrv = this.props.backendSrv; |
|
|
|
|
|
|
|
|
|
const { dashboardId, backendSrv, permissions } = this.props; |
|
|
|
|
|
|
|
|
|
this.dashboardId = dashboardId; |
|
|
|
|
this.backendSrv = backendSrv; |
|
|
|
|
this.permissionChanged = this.permissionChanged.bind(this); |
|
|
|
|
console.log('this.setState', this.setState); |
|
|
|
|
this.typeChanged = this.typeChanged.bind(this); |
|
|
|
|
this.removeItem = this.removeItem.bind(this); |
|
|
|
|
permissions.load(this.dashboardId); |
|
|
|
|
|
|
|
|
|
this.state = { |
|
|
|
|
items: [], |
|
|
|
|
newType: '', |
|
|
|
|
newType: 'Group', |
|
|
|
|
canUpdate: false, |
|
|
|
|
error: '', |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
componentWillMount() { |
|
|
|
|
this.getAcl(this.props.dashboardId); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
getAcl(dashboardId: number) { |
|
|
|
|
return this.backendSrv.get(`/api/dashboards/id/${dashboardId}/acl`).then(result => { |
|
|
|
|
console.log('this', this.setState); |
|
|
|
|
const items = result.map(this.prepareViewModel.bind(this)); |
|
|
|
|
// this.items = _.map(result, this.prepareViewModel.bind(this));
|
|
|
|
|
this.setState(prevState => { |
|
|
|
|
return { |
|
|
|
|
...prevState, |
|
|
|
|
items: this.sortItems(items), |
|
|
|
|
}; |
|
|
|
|
}); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
sortItems(items) { |
|
|
|
|
return _.orderBy(items, ['sortRank', 'sortName'], ['desc', 'asc']); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
permissionChanged() { |
|
|
|
|
this.setState(prevState => { |
|
|
|
|
return { |
|
|
|
|
...prevState, |
|
|
|
|
canUpdate: true, |
|
|
|
|
}; |
|
|
|
|
}); |
|
|
|
|
permissionChanged(evt) { |
|
|
|
|
// TODO
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
removeItem(index) { |
|
|
|
|
this.setState(prevState => { |
|
|
|
|
return { |
|
|
|
|
...prevState, |
|
|
|
|
items: this.state.items.splice(index, 1), |
|
|
|
|
canUpdate: true, |
|
|
|
|
}; |
|
|
|
|
}); |
|
|
|
|
const { permissions } = this.props; |
|
|
|
|
permissions.removeStoreItem(index); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
update() { |
|
|
|
@ -168,29 +161,91 @@ class Permissions extends Component<IProps, any> { |
|
|
|
|
return item; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// componentWillUpdate(nextProps, nextState) {
|
|
|
|
|
// console.log('nextProps', nextProps);
|
|
|
|
|
// console.log('nextState', nextState);
|
|
|
|
|
// }
|
|
|
|
|
isDuplicate(origItem, newItem) { |
|
|
|
|
if (origItem.inherited) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// componentWillReceiveProps(nextProps) {
|
|
|
|
|
// console.log('nextPropzzzz', nextProps);
|
|
|
|
|
// }
|
|
|
|
|
return ( |
|
|
|
|
(origItem.role && newItem.role && origItem.role === newItem.role) || |
|
|
|
|
(origItem.userId && newItem.userId && origItem.userId === newItem.userId) || |
|
|
|
|
(origItem.teamId && newItem.teamId && origItem.teamId === newItem.teamId) |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
render() { |
|
|
|
|
const { error, newType, aclTypes, typeChanged } = this.props; |
|
|
|
|
isValid(item) { |
|
|
|
|
const dupe = _.find(this.items, it => { |
|
|
|
|
return this.isDuplicate(it, item); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
if (dupe) { |
|
|
|
|
this.error = this.duplicateError; |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const { items, canUpdate } = this.state; |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const handleTypeChange = () => { |
|
|
|
|
typeChanged(); |
|
|
|
|
}; |
|
|
|
|
addNewItem(item) { |
|
|
|
|
if (!this.isValid(item)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
this.error = ''; |
|
|
|
|
|
|
|
|
|
item.dashboardId = this.dashboardId; |
|
|
|
|
|
|
|
|
|
let newItems = this.state.items; |
|
|
|
|
newItems.push(this.prepareViewModel(item)); |
|
|
|
|
|
|
|
|
|
this.setState(prevState => { |
|
|
|
|
return { |
|
|
|
|
...prevState, |
|
|
|
|
items: this.sortItems(newItems), |
|
|
|
|
canUpdate: true, |
|
|
|
|
}; |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
resetNewType() { |
|
|
|
|
this.setState(prevState => { |
|
|
|
|
return { |
|
|
|
|
newType: 'Group', |
|
|
|
|
}; |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
typeChanged(evt) { |
|
|
|
|
const { value } = evt.target; |
|
|
|
|
this.setState(prevState => { |
|
|
|
|
return { |
|
|
|
|
...prevState, |
|
|
|
|
newType: value, |
|
|
|
|
}; |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
typeChanged___() { |
|
|
|
|
const { newType } = this.state; |
|
|
|
|
if (newType === 'Viewer' || newType === 'Editor') { |
|
|
|
|
this.addNewItem({ permission: 1, role: newType }); |
|
|
|
|
this.resetNewType(); |
|
|
|
|
this.setState(prevState => { |
|
|
|
|
return { |
|
|
|
|
...prevState, |
|
|
|
|
canUpdate: true, |
|
|
|
|
}; |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
render() { |
|
|
|
|
const { error, aclTypes, permissions } = this.props; |
|
|
|
|
const { newType } = this.state; |
|
|
|
|
|
|
|
|
|
return ( |
|
|
|
|
<div className="gf-form-group"> |
|
|
|
|
asd |
|
|
|
|
<PermissionsList |
|
|
|
|
permissions={items} |
|
|
|
|
permissions={permissions.items.toJS()} |
|
|
|
|
permissionsOptions={this.permissionOptions} |
|
|
|
|
removeItem={this.removeItem} |
|
|
|
|
permissionChanged={this.permissionChanged} |
|
|
|
@ -202,7 +257,7 @@ class Permissions extends Component<IProps, any> { |
|
|
|
|
<div className="gf-form-inline"> |
|
|
|
|
<div className="gf-form"> |
|
|
|
|
<div className="gf-form-select-wrapper"> |
|
|
|
|
<select className="gf-form-input gf-size-auto" onChange={handleTypeChange}> |
|
|
|
|
<select className="gf-form-input gf-size-auto" onChange={this.typeChanged}> |
|
|
|
|
{aclTypes.map((option, idx) => { |
|
|
|
|
return ( |
|
|
|
|
<option key={idx} value={option.value}> |
|
|
|
@ -222,12 +277,16 @@ class Permissions extends Component<IProps, any> { |
|
|
|
|
</div> |
|
|
|
|
{newType === 'User' ? ( |
|
|
|
|
<div className="gf-form"> |
|
|
|
|
{' '} |
|
|
|
|
User picker |
|
|
|
|
<user-picker user-picked="ctrl.userPicked($user)" /> |
|
|
|
|
</div> |
|
|
|
|
) : null} |
|
|
|
|
|
|
|
|
|
{newType === 'Group' ? ( |
|
|
|
|
<div className="gf-form"> |
|
|
|
|
{' '} |
|
|
|
|
Team picker |
|
|
|
|
<team-picker team-picked="ctrl.groupPicked($group)" /> |
|
|
|
|
</div> |
|
|
|
|
) : null} |
|
|
|
@ -243,11 +302,12 @@ class Permissions extends Component<IProps, any> { |
|
|
|
|
) : null} |
|
|
|
|
</div> |
|
|
|
|
<div className="gf-form-button-row"> |
|
|
|
|
<button type="button" className="btn btn-danger" onClick={this.update} disabled={!canUpdate}> |
|
|
|
|
<button type="button" className="btn btn-danger" onClick={this.update} disabled={!permissions.canUpdate}> |
|
|
|
|
Update Permissions |
|
|
|
|
</button> |
|
|
|
|
</div> |
|
|
|
|
asd3 |
|
|
|
|
<DevTools /> |
|
|
|
|
</div> |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|