mirror of https://github.com/grafana/grafana
parent
f68ac20218
commit
05bfc36516
@ -1,3 +1,4 @@ |
||||
import { updateLocation } from './location'; |
||||
import { updateNavIndex } from './navModel'; |
||||
|
||||
export { updateLocation }; |
||||
export { updateLocation, updateNavIndex }; |
||||
|
@ -0,0 +1,3 @@ |
||||
export const getRouteParamsId = state => state.routeParams.id; |
||||
|
||||
export const getRouteParamsPage = state => state.routeParams.page; |
@ -0,0 +1,63 @@ |
||||
import React from 'react'; |
||||
import { shallow } from 'enzyme'; |
||||
import { TeamPages, Props } from './TeamPages'; |
||||
import { NavModel, Team } from '../../types'; |
||||
import { getMockTeam } from './__mocks__/teamMocks'; |
||||
|
||||
jest.mock('app/core/config', () => ({ |
||||
buildInfo: { isEnterprise: true }, |
||||
})); |
||||
|
||||
const setup = (propOverrides?: object) => { |
||||
const props: Props = { |
||||
navModel: {} as NavModel, |
||||
teamId: 1, |
||||
loadTeam: jest.fn(), |
||||
pageName: 'members', |
||||
team: {} as Team, |
||||
}; |
||||
|
||||
Object.assign(props, propOverrides); |
||||
|
||||
const wrapper = shallow(<TeamPages {...props} />); |
||||
const instance = wrapper.instance(); |
||||
|
||||
return { |
||||
wrapper, |
||||
instance, |
||||
}; |
||||
}; |
||||
|
||||
describe('Render', () => { |
||||
it('should render component', () => { |
||||
const { wrapper } = setup(); |
||||
|
||||
expect(wrapper).toMatchSnapshot(); |
||||
}); |
||||
|
||||
it('should render member page if team not empty', () => { |
||||
const { wrapper } = setup({ |
||||
team: getMockTeam(), |
||||
}); |
||||
|
||||
expect(wrapper).toMatchSnapshot(); |
||||
}); |
||||
|
||||
it('should render settings page', () => { |
||||
const { wrapper } = setup({ |
||||
team: getMockTeam(), |
||||
pageName: 'settings', |
||||
}); |
||||
|
||||
expect(wrapper).toMatchSnapshot(); |
||||
}); |
||||
|
||||
it('should render group sync page', () => { |
||||
const { wrapper } = setup({ |
||||
team: getMockTeam(), |
||||
pageName: 'groupsync', |
||||
}); |
||||
|
||||
expect(wrapper).toMatchSnapshot(); |
||||
}); |
||||
}); |
@ -1,77 +1,106 @@ |
||||
import React from 'react'; |
||||
import React, { PureComponent } from 'react'; |
||||
import { connect } from 'react-redux'; |
||||
import _ from 'lodash'; |
||||
import { hot } from 'react-hot-loader'; |
||||
import { inject, observer } from 'mobx-react'; |
||||
import config from 'app/core/config'; |
||||
import PageHeader from 'app/core/components/PageHeader/PageHeader'; |
||||
import { NavStore } from 'app/stores/NavStore/NavStore'; |
||||
import { TeamsStore, Team } from 'app/stores/TeamsStore/TeamsStore'; |
||||
import { ViewStore } from 'app/stores/ViewStore/ViewStore'; |
||||
import TeamMembers from './TeamMembers'; |
||||
import TeamSettings from './TeamSettings'; |
||||
import TeamGroupSync from './TeamGroupSync'; |
||||
import { NavModel, Team } from '../../types'; |
||||
import { loadTeam } from './state/actions'; |
||||
import { getTeam } from './state/selectors'; |
||||
import { getNavModel } from '../../core/selectors/navModel'; |
||||
import { getRouteParamsId, getRouteParamsPage } from '../../core/selectors/location'; |
||||
|
||||
interface Props { |
||||
nav: typeof NavStore.Type; |
||||
teams: typeof TeamsStore.Type; |
||||
view: typeof ViewStore.Type; |
||||
export interface Props { |
||||
team: Team; |
||||
loadTeam: typeof loadTeam; |
||||
teamId: number; |
||||
pageName: string; |
||||
navModel: NavModel; |
||||
} |
||||
|
||||
@inject('nav', 'teams', 'view') |
||||
@observer |
||||
export class TeamPages extends React.Component<Props, any> { |
||||
interface State { |
||||
isSyncEnabled: boolean; |
||||
currentPage: string; |
||||
} |
||||
|
||||
enum PageTypes { |
||||
Members = 'members', |
||||
Settings = 'settings', |
||||
GroupSync = 'groupsync', |
||||
} |
||||
|
||||
export class TeamPages extends PureComponent<Props, State> { |
||||
constructor(props) { |
||||
super(props); |
||||
|
||||
this.isSyncEnabled = config.buildInfo.isEnterprise; |
||||
this.currentPage = this.getCurrentPage(); |
||||
this.state = { |
||||
isSyncEnabled: config.buildInfo.isEnterprise, |
||||
}; |
||||
} |
||||
|
||||
componentDidMount() { |
||||
this.loadTeam(); |
||||
} |
||||
|
||||
async loadTeam() { |
||||
const { teams, nav, view } = this.props; |
||||
|
||||
await teams.loadById(view.routeParams.get('id')); |
||||
const { loadTeam, teamId } = this.props; |
||||
|
||||
nav.initTeamPage(this.getCurrentTeam(), this.currentPage, this.isSyncEnabled); |
||||
} |
||||
|
||||
getCurrentTeam(): Team { |
||||
const { teams, view } = this.props; |
||||
return teams.map.get(view.routeParams.get('id')); |
||||
await loadTeam(teamId); |
||||
} |
||||
|
||||
getCurrentPage() { |
||||
const pages = ['members', 'settings', 'groupsync']; |
||||
const currentPage = this.props.view.routeParams.get('page'); |
||||
const currentPage = this.props.pageName; |
||||
return _.includes(pages, currentPage) ? currentPage : pages[0]; |
||||
} |
||||
|
||||
render() { |
||||
const { nav } = this.props; |
||||
const currentTeam = this.getCurrentTeam(); |
||||
renderPage() { |
||||
const { team } = this.props; |
||||
const { isSyncEnabled } = this.state; |
||||
const currentPage = this.getCurrentPage(); |
||||
|
||||
switch (currentPage) { |
||||
case PageTypes.Members: |
||||
return <TeamMembers team={team} />; |
||||
|
||||
if (!nav.main) { |
||||
return null; |
||||
case PageTypes.Settings: |
||||
return <TeamSettings team={team} />; |
||||
|
||||
case PageTypes.GroupSync: |
||||
return isSyncEnabled && <TeamGroupSync team={team} />; |
||||
} |
||||
|
||||
return null; |
||||
} |
||||
|
||||
render() { |
||||
const { team, navModel } = this.props; |
||||
|
||||
return ( |
||||
<div> |
||||
<PageHeader model={nav as any} /> |
||||
{currentTeam && ( |
||||
<div className="page-container page-body"> |
||||
{this.currentPage === 'members' && <TeamMembers team={currentTeam} />} |
||||
{this.currentPage === 'settings' && <TeamSettings team={currentTeam} />} |
||||
{this.currentPage === 'groupsync' && this.isSyncEnabled && <TeamGroupSync team={currentTeam} />} |
||||
</div> |
||||
)} |
||||
<PageHeader model={navModel} /> |
||||
{team && Object.keys(team).length !== 0 && <div className="page-container page-body">{this.renderPage()}</div>} |
||||
</div> |
||||
); |
||||
} |
||||
} |
||||
|
||||
export default hot(module)(TeamPages); |
||||
function mapStateToProps(state) { |
||||
const teamId = getRouteParamsId(state.location); |
||||
const pageName = getRouteParamsPage(state.location) || 'members'; |
||||
|
||||
return { |
||||
navModel: getNavModel(state.navIndex, `team-${pageName}-${teamId}`), |
||||
teamId: teamId, |
||||
pageName: pageName, |
||||
team: getTeam(state.team), |
||||
}; |
||||
} |
||||
|
||||
const mapDispatchToProps = { |
||||
loadTeam, |
||||
}; |
||||
|
||||
export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(TeamPages)); |
||||
|
@ -0,0 +1,59 @@ |
||||
export const getMockNavModel = (pageName: string) => { |
||||
return { |
||||
node: { |
||||
active: false, |
||||
icon: 'gicon gicon-team', |
||||
id: `team-${pageName}-2`, |
||||
text: `${pageName}`, |
||||
url: 'org/teams/edit/2/members', |
||||
parentItem: { |
||||
img: '/avatar/b5695b61c91d13e7fa2fe71cfb95de9b', |
||||
id: 'team-2', |
||||
subTitle: 'Manage members & settings', |
||||
url: '', |
||||
text: 'test1', |
||||
breadcrumbs: [{ title: 'Teams', url: 'org/teams' }], |
||||
children: [ |
||||
{ |
||||
active: false, |
||||
icon: 'gicon gicon-team', |
||||
id: 'team-members-2', |
||||
text: 'Members', |
||||
url: 'org/teams/edit/2/members', |
||||
}, |
||||
{ |
||||
active: false, |
||||
icon: 'fa fa-fw fa-sliders', |
||||
id: 'team-settings-2', |
||||
text: 'Settings', |
||||
url: 'org/teams/edit/2/settings', |
||||
}, |
||||
], |
||||
}, |
||||
}, |
||||
main: { |
||||
img: '/avatar/b5695b61c91d13e7fa2fe71cfb95de9b', |
||||
id: 'team-2', |
||||
subTitle: 'Manage members & settings', |
||||
url: '', |
||||
text: 'test1', |
||||
breadcrumbs: [{ title: 'Teams', url: 'org/teams' }], |
||||
children: [ |
||||
{ |
||||
active: true, |
||||
icon: 'gicon gicon-team', |
||||
id: 'team-members-2', |
||||
text: 'Members', |
||||
url: 'org/teams/edit/2/members', |
||||
}, |
||||
{ |
||||
active: false, |
||||
icon: 'fa fa-fw fa-sliders', |
||||
id: 'team-settings-2', |
||||
text: 'Settings', |
||||
url: 'org/teams/edit/2/settings', |
||||
}, |
||||
], |
||||
}, |
||||
}; |
||||
}; |
@ -0,0 +1,87 @@ |
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP |
||||
|
||||
exports[`Render should render component 1`] = ` |
||||
<div> |
||||
<PageHeader |
||||
model={Object {}} |
||||
/> |
||||
</div> |
||||
`; |
||||
|
||||
exports[`Render should render group sync page 1`] = ` |
||||
<div> |
||||
<PageHeader |
||||
model={Object {}} |
||||
/> |
||||
<div |
||||
className="page-container page-body" |
||||
> |
||||
<TeamGroupSync |
||||
team={ |
||||
Object { |
||||
"avatarUrl": "some/url/", |
||||
"email": "test@test.com", |
||||
"groups": Array [], |
||||
"id": 1, |
||||
"memberCount": 1, |
||||
"members": Array [], |
||||
"name": "test", |
||||
"search": "", |
||||
} |
||||
} |
||||
/> |
||||
</div> |
||||
</div> |
||||
`; |
||||
|
||||
exports[`Render should render member page if team not empty 1`] = ` |
||||
<div> |
||||
<PageHeader |
||||
model={Object {}} |
||||
/> |
||||
<div |
||||
className="page-container page-body" |
||||
> |
||||
<TeamMembers |
||||
team={ |
||||
Object { |
||||
"avatarUrl": "some/url/", |
||||
"email": "test@test.com", |
||||
"groups": Array [], |
||||
"id": 1, |
||||
"memberCount": 1, |
||||
"members": Array [], |
||||
"name": "test", |
||||
"search": "", |
||||
} |
||||
} |
||||
/> |
||||
</div> |
||||
</div> |
||||
`; |
||||
|
||||
exports[`Render should render settings page 1`] = ` |
||||
<div> |
||||
<PageHeader |
||||
model={Object {}} |
||||
/> |
||||
<div |
||||
className="page-container page-body" |
||||
> |
||||
<TeamSettings |
||||
team={ |
||||
Object { |
||||
"avatarUrl": "some/url/", |
||||
"email": "test@test.com", |
||||
"groups": Array [], |
||||
"id": 1, |
||||
"memberCount": 1, |
||||
"members": Array [], |
||||
"name": "test", |
||||
"search": "", |
||||
} |
||||
} |
||||
/> |
||||
</div> |
||||
</div> |
||||
`; |
Loading…
Reference in new issue