grafana/public/app/features/datasources/DataSourcePermissions.tsx

148 lines
4.4 KiB
TypeScript
Raw Normal View History

2018-10-08 09:05:37 -05:00
import React, { PureComponent } from 'react';
import { connect } from 'react-redux';
2018-10-09 04:07:23 -05:00
import SlideDown from '../../core/components/Animations/SlideDown';
2018-10-09 09:05:40 -05:00
import AddDataSourcePermissions from './AddDataSourcePermissions';
2018-10-09 09:53:59 -05:00
import DataSourcePermissionsList from './DataSourcePermissionsList';
2018-10-09 09:05:40 -05:00
import { AclTarget } from 'app/types/acl';
2018-10-10 03:39:48 -05:00
import {
addDataSourcePermission,
enableDataSourcePermissions,
loadDataSourcePermissions,
removeDataSourcePermission,
} from './state/actions';
2018-10-09 09:05:40 -05:00
import { DashboardAcl, DataSourcePermission } from 'app/types';
import { getRouteParamsId } from '../../core/selectors/location';
2018-10-08 09:05:37 -05:00
2018-10-09 09:05:40 -05:00
export interface Props {
2018-10-10 03:39:48 -05:00
dataSourcePermission: { enabled: boolean; datasouceId: number; permissions: DataSourcePermission[] };
2018-10-09 09:05:40 -05:00
pageId: number;
addDataSourcePermission: typeof addDataSourcePermission;
2018-10-10 03:39:48 -05:00
enableDataSourcePermissions: typeof enableDataSourcePermissions;
2018-10-09 09:05:40 -05:00
loadDataSourcePermissions: typeof loadDataSourcePermissions;
removeDataSourcePermission: typeof removeDataSourcePermission;
}
2018-10-08 09:05:37 -05:00
2018-10-09 04:07:23 -05:00
interface State {
isAdding: boolean;
}
export class DataSourcePermissions extends PureComponent<Props, State> {
state = {
isAdding: false,
};
2018-10-09 09:05:40 -05:00
componentDidMount() {
this.fetchDataSourcePermissions();
}
async fetchDataSourcePermissions() {
const { pageId, loadDataSourcePermissions } = this.props;
return await loadDataSourcePermissions(pageId);
}
2018-10-09 04:07:23 -05:00
onOpenAddPermissions = () => {
this.setState({
isAdding: true,
});
};
2018-10-10 03:39:48 -05:00
onEnablePermissions = () => {
const { pageId, enableDataSourcePermissions } = this.props;
enableDataSourcePermissions(pageId);
};
2018-10-09 09:05:40 -05:00
onAddPermission = state => {
const { pageId, addDataSourcePermission } = this.props;
const data = {
permission: state.permission,
userId: 0,
teamId: 0,
};
if (state.type === AclTarget.Team) {
data.teamId = state.teamId;
} else if (state.team === AclTarget.User) {
data.userId = state.userId;
}
addDataSourcePermission(pageId, data);
};
onRemovePermission = (item: DashboardAcl) => {
this.props.removeDataSourcePermission(1, 1);
};
2018-10-09 04:07:23 -05:00
onCancelAddPermission = () => {
this.setState({
isAdding: false,
});
};
2018-10-08 09:05:37 -05:00
render() {
2018-10-10 03:39:48 -05:00
const { dataSourcePermission } = this.props;
2018-10-09 04:07:23 -05:00
const { isAdding } = this.state;
2018-10-10 03:39:48 -05:00
const isPermissionsEnabled = dataSourcePermission.enabled;
2018-10-09 04:07:23 -05:00
2018-10-08 09:05:37 -05:00
return (
<div>
2018-10-09 04:07:23 -05:00
<div className="page-action-bar">
<h3 className="page-sub-heading">Permissions</h3>
<div className="page-action-bar__spacer" />
2018-10-10 03:39:48 -05:00
{!isPermissionsEnabled && (
<button className="btn btn-success pull-right" onClick={this.onEnablePermissions} disabled={isAdding}>
Enable Permissions
</button>
)}
{isPermissionsEnabled && (
<button className="btn btn-success pull-right" onClick={this.onOpenAddPermissions} disabled={isAdding}>
<i className="fa fa-plus" /> Add Permission
</button>
)}
2018-10-09 04:07:23 -05:00
</div>
2018-10-10 03:39:48 -05:00
{!isPermissionsEnabled ? (
<div className="empty-list-cta">
<div className="empty-list-cta__title">{'Permissions not enabled for this data source.'}</div>
<button onClick={this.onEnablePermissions} className="empty-list-cta__button btn btn-xlarge btn-success">
{'Enable'}
</button>
<div className="empty-list-cta__pro-tip">
<i className="fa fa-rocket" /> ProTip:{' '}
{'Only admins will be able to query the data source after you enable permissions.'}
</div>
</div>
) : (
<div>
<SlideDown in={isAdding}>
<AddDataSourcePermissions
onAddPermission={state => this.onAddPermission(state)}
onCancel={this.onCancelAddPermission}
/>
</SlideDown>
<DataSourcePermissionsList
items={dataSourcePermission.permissions}
onRemoveItem={item => this.onRemovePermission(item)}
/>
</div>
)}
2018-10-08 09:05:37 -05:00
</div>
);
}
}
function mapStateToProps(state) {
2018-10-09 09:05:40 -05:00
return {
pageId: getRouteParamsId(state.location),
2018-10-10 03:39:48 -05:00
dataSourcePermission: state.dataSources.dataSourcePermission,
2018-10-09 09:05:40 -05:00
};
2018-10-08 09:05:37 -05:00
}
2018-10-09 09:05:40 -05:00
const mapDispatchToProps = {
addDataSourcePermission,
2018-10-10 03:39:48 -05:00
enableDataSourcePermissions,
2018-10-09 09:05:40 -05:00
loadDataSourcePermissions,
removeDataSourcePermission,
};
export default connect(mapStateToProps, mapDispatchToProps)(DataSourcePermissions);