Skip to content

Commit 776f9aa

Browse files
committed
Merge remote-tracking branch 'origin/data-source-instance-to-react' into permissions-code-to-enterprise
2 parents 66311a0 + 1329c70 commit 776f9aa

File tree

4 files changed

+625
-1
lines changed

4 files changed

+625
-1
lines changed

pkg/api/datasources.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ func GetDataSources(c *m.ReqContext) Response {
2222
Datasources: query.Result,
2323
}
2424

25-
datasources := []*m.DataSource{}
25+
var datasources []*m.DataSource
2626
if err := bus.Dispatch(&dsFilterQuery); err != nil {
2727
if err != bus.ErrHandlerNotFound {
2828
return Error(500, "Could not get datasources", err)
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
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+
8+
export interface Props {
9+
onAddPermission: (state) => void;
10+
onCancel: () => void;
11+
}
12+
13+
interface State {
14+
userId: number;
15+
teamId: number;
16+
type: AclTarget;
17+
permission: DataSourcePermissionLevel;
18+
}
19+
20+
export class AddDataSourcePermissions extends PureComponent<Props, State> {
21+
cleanState = () => ({
22+
userId: 0,
23+
teamId: 0,
24+
type: AclTarget.Team,
25+
permission: DataSourcePermissionLevel.Query,
26+
});
27+
28+
state = this.cleanState();
29+
30+
isValid() {
31+
switch (this.state.type) {
32+
case AclTarget.Team:
33+
return this.state.teamId > 0;
34+
case AclTarget.User:
35+
return this.state.userId > 0;
36+
}
37+
return true;
38+
}
39+
40+
onTeamSelected = (team: Team) => {
41+
this.setState({ teamId: team ? team.id : 0 });
42+
};
43+
44+
onUserSelected = (user: User) => {
45+
this.setState({ userId: user ? user.id : 0 });
46+
};
47+
48+
onPermissionChanged = (permission: OptionWithDescription) => {
49+
this.setState({ permission: permission.value });
50+
};
51+
52+
onTypeChanged = event => {
53+
const type = event.target.value as AclTarget;
54+
55+
this.setState({ type: type, userId: 0, teamId: 0 });
56+
};
57+
58+
onSubmit = async event => {
59+
event.preventDefault();
60+
61+
await this.props.onAddPermission(this.state);
62+
this.setState(this.cleanState());
63+
};
64+
65+
render() {
66+
const { onCancel } = this.props;
67+
const { type } = this.state;
68+
69+
const pickerClassName = 'width-20';
70+
const aclTargets = [{ value: AclTarget.Team, text: 'Team' }, { value: AclTarget.User, text: 'User' }];
71+
72+
return (
73+
<div className="gf-form-inline cta-form">
74+
<button className="cta-form__close btn btn-transparent" onClick={onCancel}>
75+
<i className="fa fa-close" />
76+
</button>
77+
<form name="addPermission" onSubmit={this.onSubmit}>
78+
<h5>Add Permission For</h5>
79+
<div className="gf-form-inline">
80+
<div className="gf-form">
81+
<select className="gf-form-input gf-size-auto" value={type} onChange={this.onTypeChanged}>
82+
{aclTargets.map((option, idx) => {
83+
return (
84+
<option key={idx} value={option.value}>
85+
{option.text}
86+
</option>
87+
);
88+
})}
89+
</select>
90+
</div>
91+
{type === AclTarget.User && (
92+
<div className="gf-form">
93+
<UserPicker onSelected={this.onUserSelected} className={pickerClassName} />
94+
</div>
95+
)}
96+
97+
{type === AclTarget.Team && (
98+
<div className="gf-form">
99+
<TeamPicker onSelected={this.onTeamSelected} className={pickerClassName} />
100+
</div>
101+
)}
102+
<div className="gf-form">
103+
<DescriptionPicker
104+
optionsWithDesc={dataSourceAclLevels}
105+
onSelected={this.onPermissionChanged}
106+
disabled={false}
107+
className={'gf-form-input--form-dropdown-right'}
108+
/>
109+
</div>
110+
<div className="gf-form">
111+
<button data-save-permission className="btn btn-success" type="submit" disabled={!this.isValid()}>
112+
Save
113+
</button>
114+
</div>
115+
</div>
116+
</form>
117+
</div>
118+
);
119+
}
120+
}
121+
122+
export default AddDataSourcePermissions;
Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`Render should render component 1`] = `
4+
<div
5+
className="gf-form-inline cta-form"
6+
>
7+
<button
8+
className="cta-form__close btn btn-transparent"
9+
onClick={[MockFunction]}
10+
>
11+
<i
12+
className="fa fa-close"
13+
/>
14+
</button>
15+
<form
16+
name="addPermission"
17+
onSubmit={[Function]}
18+
>
19+
<h5>
20+
Add Permission For
21+
</h5>
22+
<div
23+
className="gf-form-inline"
24+
>
25+
<div
26+
className="gf-form"
27+
>
28+
<select
29+
className="gf-form-input gf-size-auto"
30+
onChange={[Function]}
31+
value="Team"
32+
>
33+
<option
34+
key="0"
35+
value="Team"
36+
>
37+
Team
38+
</option>
39+
<option
40+
key="1"
41+
value="User"
42+
>
43+
User
44+
</option>
45+
</select>
46+
</div>
47+
<div
48+
className="gf-form"
49+
>
50+
<TeamPicker
51+
className="width-20"
52+
onSelected={[Function]}
53+
/>
54+
</div>
55+
<div
56+
className="gf-form"
57+
>
58+
<DescriptionPicker
59+
className="gf-form-input--form-dropdown-right"
60+
disabled={false}
61+
onSelected={[Function]}
62+
optionsWithDesc={
63+
Array [
64+
Object {
65+
"description": "Can query data source.",
66+
"label": "Query",
67+
"value": 1,
68+
},
69+
]
70+
}
71+
/>
72+
</div>
73+
<div
74+
className="gf-form"
75+
>
76+
<button
77+
className="btn btn-success"
78+
data-save-permission={true}
79+
disabled={true}
80+
type="submit"
81+
>
82+
Save
83+
</button>
84+
</div>
85+
</div>
86+
</form>
87+
</div>
88+
`;
89+
90+
exports[`Render should render user picker 1`] = `
91+
<div
92+
className="gf-form-inline cta-form"
93+
>
94+
<button
95+
className="cta-form__close btn btn-transparent"
96+
onClick={[MockFunction]}
97+
>
98+
<i
99+
className="fa fa-close"
100+
/>
101+
</button>
102+
<form
103+
name="addPermission"
104+
onSubmit={[Function]}
105+
>
106+
<h5>
107+
Add Permission For
108+
</h5>
109+
<div
110+
className="gf-form-inline"
111+
>
112+
<div
113+
className="gf-form"
114+
>
115+
<select
116+
className="gf-form-input gf-size-auto"
117+
onChange={[Function]}
118+
value="User"
119+
>
120+
<option
121+
key="0"
122+
value="Team"
123+
>
124+
Team
125+
</option>
126+
<option
127+
key="1"
128+
value="User"
129+
>
130+
User
131+
</option>
132+
</select>
133+
</div>
134+
<div
135+
className="gf-form"
136+
>
137+
<UserPicker
138+
className="width-20"
139+
onSelected={[Function]}
140+
/>
141+
</div>
142+
<div
143+
className="gf-form"
144+
>
145+
<DescriptionPicker
146+
className="gf-form-input--form-dropdown-right"
147+
disabled={false}
148+
onSelected={[Function]}
149+
optionsWithDesc={
150+
Array [
151+
Object {
152+
"description": "Can query data source.",
153+
"label": "Query",
154+
"value": 1,
155+
},
156+
]
157+
}
158+
/>
159+
</div>
160+
<div
161+
className="gf-form"
162+
>
163+
<button
164+
className="btn btn-success"
165+
data-save-permission={true}
166+
disabled={true}
167+
type="submit"
168+
>
169+
Save
170+
</button>
171+
</div>
172+
</div>
173+
</form>
174+
</div>
175+
`;

0 commit comments

Comments
 (0)