diff --git a/src/components/academy/__tests__/Missions.tsx b/src/components/academy/__tests__/Missions.tsx deleted file mode 100644 index 7299eed477..0000000000 --- a/src/components/academy/__tests__/Missions.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import { mount } from 'enzyme' -import * as React from 'react' -import { MemoryRouter } from 'react-router' - -import { mockAssessmentOverviews } from '../../../mocks/api' -import { mockRouterProps } from '../../../mocks/components' -import Missions, { IMissionsProps } from '../Missions' - -const mockUndefinedMissions: IMissionsProps = { - ...mockRouterProps('/academy/missions', {}), - handleAssessmentOverviewFetch: () => {} -} - -const mockEmptyMissions: IMissionsProps = { - ...mockRouterProps('/academy/missions', {}), - assessmentOverviews: [], - handleAssessmentOverviewFetch: () => {} -} - -const mockPresentMissions: IMissionsProps = { - ...mockRouterProps('/academy/missions', {}), - assessmentOverviews: mockAssessmentOverviews, - handleAssessmentOverviewFetch: () => {} -} - -test('Missions page "loading" content renders correctly', () => { - const app = ( - - - - ) - const tree = mount(app) - expect(tree.debug()).toMatchSnapshot() -}) - -test('Missions page with 0 missions renders correctly', () => { - const app = ( - - - - ) - const tree = mount(app) - expect(tree.debug()).toMatchSnapshot() -}) - -test('Missions page with multiple loaded missions renders correctly', () => { - const app = ( - - - - ) - const tree = mount(app) - expect(tree.debug()).toMatchSnapshot() -}) diff --git a/src/components/academy/index.tsx b/src/components/academy/index.tsx index eef12ebe29..63ea0adfaf 100644 --- a/src/components/academy/index.tsx +++ b/src/components/academy/index.tsx @@ -1,11 +1,14 @@ +/* tslint:disable: jsx-no-lambda */ + import * as qs from 'query-string' import * as React from 'react' import { Redirect, Route, RouteComponentProps, Switch } from 'react-router' -import MissionsContainer from '../../containers/academy/MissionsContainer' +import AssessmentListingContainer from '../../containers/assessment/AssessmentListingContainer' import Game from '../../containers/GameContainer' import { isAcademyRe } from '../../reducers/session' import { HistoryHelper } from '../../utils/history' +import { AssessmentCategories, AssessmentCategory } from '../assessment/assessmentShape' import AcademyNavigationBar from './NavigationBar' interface IAcademyProps extends IDispatchProps, IOwnProps, IStateProps, RouteComponentProps<{}> {} @@ -23,17 +26,37 @@ export interface IStateProps { historyHelper: HistoryHelper } +const assessmentListingRenderFactory = (cat: AssessmentCategory) => ( + routerProps: RouteComponentProps +) => + export const Academy: React.SFC = props => ( {checkLoggedIn(props)} - + - - - - + + + + diff --git a/src/components/academy/Missions.tsx b/src/components/assessment/AssessmentListing.tsx similarity index 51% rename from src/components/academy/Missions.tsx rename to src/components/assessment/AssessmentListing.tsx index f7412603bb..2ecfdcac29 100644 --- a/src/components/academy/Missions.tsx +++ b/src/components/assessment/AssessmentListing.tsx @@ -4,47 +4,50 @@ import * as React from 'react' import { RouteComponentProps } from 'react-router' import { NavLink } from 'react-router-dom' -import AssessmentContainer from '../../containers/AssessmentContainer' +import AssessmentContainer from '../../containers/assessment' import { OwnProps as AssessmentProps } from '../assessment' +import { AssessmentCategory } from '../assessment/assessmentShape' import { IAssessmentOverview } from '../assessment/assessmentShape' import ContentDisplay, { IContentDisplayProps } from '../commons/ContentDisplay' -export interface IMissionParams { - missionId?: string +export interface IAssessmentParams { + assessmentId?: string } -export interface IMissionsProps extends RouteComponentProps { +export interface IAssessmentListingProps extends RouteComponentProps { assessmentOverviews?: IAssessmentOverview[] + assessmentCategory: AssessmentCategory handleAssessmentOverviewFetch: () => void } -export type StateProps = Pick -export type DispatchProps = Pick +export type DispatchProps = Pick +export type OwnProps = Pick +export type StateProps = Pick -class Missions extends React.Component { +class AssessmentListing extends React.Component { public render() { - // make missionIdParam a number - let missionIdParam: number | null = - this.props.match.params.missionId === undefined + // make assessmentId a number + let assessmentIdParam: number | null = + this.props.match.params.assessmentId === undefined ? NaN - : parseInt(this.props.match.params.missionId, 10) + : parseInt(this.props.match.params.assessmentId, 10) // set as null if the parsing failed - missionIdParam = Number.isInteger(missionIdParam) ? missionIdParam : null + assessmentIdParam = Number.isInteger(assessmentIdParam) ? assessmentIdParam : null - // if there is no mission specified, Render only information. - if (missionIdParam === null) { + // if there is no assessmentId specified, Render only information. + if (assessmentIdParam === null) { const props: IContentDisplayProps = { display: , loadContentDispatch: this.props.handleAssessmentOverviewFetch } return ( - + ) } else { const props: AssessmentProps = { - missionId: missionIdParam + assessmentId: assessmentIdParam } return } @@ -61,31 +64,31 @@ export const AssessmentOverviewCard: React.SFC = p } else if (props.assessmentOverviews.length === 0) { return } - const cards = props.assessmentOverviews.map((mission, index) => ( + const cards = props.assessmentOverviews.map((overview, index) => ( - - PICTURE - - - {mission.title} + + PICTURE + + + {overview.title} - + Mission 0 : 123123 XP (hardcoded) - - {mission.shortSummary} + + {overview.shortSummary} - - - - + + + + Due: 12/12/12 - + = p return <>{cards}> } -export default Missions +export default AssessmentListing diff --git a/src/components/assessment/__tests__/AssessmentListing.tsx b/src/components/assessment/__tests__/AssessmentListing.tsx new file mode 100644 index 0000000000..4dd01e941b --- /dev/null +++ b/src/components/assessment/__tests__/AssessmentListing.tsx @@ -0,0 +1,58 @@ +import { mount } from 'enzyme' +import * as React from 'react' +import { MemoryRouter } from 'react-router' + +import { mockAssessmentOverviews } from '../../../mocks/api' +import { mockRouterProps } from '../../../mocks/components' +import AssessmentListing, { IAssessmentListingProps } from '../AssessmentListing' +import { AssessmentCategories } from '../assessmentShape' + +const mockUndefinedAssessmentListing: IAssessmentListingProps = { + ...mockRouterProps('/academy/missions', {}), + handleAssessmentOverviewFetch: () => {}, + assessmentCategory: AssessmentCategories.MISSION +} + +const mockEmptyAssessmentListing: IAssessmentListingProps = { + ...mockRouterProps('/academy/missions', {}), + assessmentOverviews: [], + handleAssessmentOverviewFetch: () => {}, + assessmentCategory: AssessmentCategories.MISSION +} + +const mockPresentAssessmentListing: IAssessmentListingProps = { + ...mockRouterProps('/academy/missions', {}), + assessmentOverviews: mockAssessmentOverviews, + handleAssessmentOverviewFetch: () => {}, + assessmentCategory: AssessmentCategories.MISSION +} + +test('AssessmentListing page "loading" content renders correctly', () => { + const app = ( + + + + ) + const tree = mount(app) + expect(tree.debug()).toMatchSnapshot() +}) + +test('AssessmentListing page with 0 missions renders correctly', () => { + const app = ( + + + + ) + const tree = mount(app) + expect(tree.debug()).toMatchSnapshot() +}) + +test('AssessmentListing page with multiple loaded missions renders correctly', () => { + const app = ( + + + + ) + const tree = mount(app) + expect(tree.debug()).toMatchSnapshot() +}) diff --git a/src/components/academy/__tests__/__snapshots__/Missions.tsx.snap b/src/components/assessment/__tests__/__snapshots__/AssessmentListing.tsx.snap similarity index 78% rename from src/components/academy/__tests__/__snapshots__/Missions.tsx.snap rename to src/components/assessment/__tests__/__snapshots__/AssessmentListing.tsx.snap index f486527f38..d468ede2c8 100644 --- a/src/components/academy/__tests__/__snapshots__/Missions.tsx.snap +++ b/src/components/assessment/__tests__/__snapshots__/AssessmentListing.tsx.snap @@ -1,10 +1,10 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`Missions page "loading" content renders correctly 1`] = ` +exports[`AssessmentListing page "loading" content renders correctly 1`] = ` " - - + + @@ -37,16 +37,16 @@ exports[`Missions page "loading" content renders correctly 1`] = ` - + " `; -exports[`Missions page with 0 missions renders correctly 1`] = ` +exports[`AssessmentListing page with 0 missions renders correctly 1`] = ` " - - + + @@ -77,16 +77,16 @@ exports[`Missions page with 0 missions renders correctly 1`] = ` - + " `; -exports[`Missions page with multiple loaded missions renders correctly 1`] = ` +exports[`AssessmentListing page with multiple loaded missions renders correctly 1`] = ` " - - + + @@ -94,33 +94,33 @@ exports[`Missions page with multiple loaded missions renders correctly 1`] = ` - - - + + + PICTURE - - + + An Odessey to Runes - + Mission 0 : 123123 XP (hardcoded) - + Once upon a time, Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin nec vulputate sapien. Fusce vel lacus fermentum, efficitur ipsum. - - - - - - + + + + + + time @@ -136,8 +136,8 @@ exports[`Missions page with multiple loaded missions renders correctly 1`] = ` - - + + @@ -163,33 +163,33 @@ exports[`Missions page with multiple loaded missions renders correctly 1`] = ` - - - + + + PICTURE - - + + The Secret to Streams - + Mission 0 : 123123 XP (hardcoded) - + Once upon a time, Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin nec vulputate sapien. Fusce vel lacus fermentum, efficitur ipsum. - - - - - - + + + + + + time @@ -205,8 +205,8 @@ exports[`Missions page with multiple loaded missions renders correctly 1`] = ` - - + + @@ -232,33 +232,33 @@ exports[`Missions page with multiple loaded missions renders correctly 1`] = ` - - - + + + PICTURE - - + + A sample Sidequest - + Mission 0 : 123123 XP (hardcoded) - + Once upon a time, Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin nec vulputate sapien. Fusce vel lacus fermentum, efficitur ipsum. - - - - - - + + + + + + time @@ -274,8 +274,8 @@ exports[`Missions page with multiple loaded missions renders correctly 1`] = ` - - + + @@ -301,33 +301,33 @@ exports[`Missions page with multiple loaded missions renders correctly 1`] = ` - - - + + + PICTURE - - + + A closed Mission - + Mission 0 : 123123 XP (hardcoded) - + Once upon a time, Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin nec vulputate sapien. Fusce vel lacus fermentum, efficitur ipsum. - - - - - - + + + + + + time @@ -343,8 +343,8 @@ exports[`Missions page with multiple loaded missions renders correctly 1`] = ` - - + + @@ -370,33 +370,33 @@ exports[`Missions page with multiple loaded missions renders correctly 1`] = ` - - - + + + PICTURE - - + + A closed sidequest - + Mission 0 : 123123 XP (hardcoded) - + Once upon a time, Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin nec vulputate sapien. Fusce vel lacus fermentum, efficitur ipsum. - - - - - - + + + + + + time @@ -412,8 +412,8 @@ exports[`Missions page with multiple loaded missions renders correctly 1`] = ` - - + + @@ -445,7 +445,7 @@ exports[`Missions page with multiple loaded missions renders correctly 1`] = ` - + " `; diff --git a/src/components/assessment/index.tsx b/src/components/assessment/index.tsx index c923086512..281602f141 100644 --- a/src/components/assessment/index.tsx +++ b/src/components/assessment/index.tsx @@ -13,17 +13,17 @@ export type StateProps = { assessment?: IAssessment } -export type OwnProps = { missionId: number } +export type OwnProps = { assessmentId: number } export type DispatchProps = { - handleAssessmentFetch: (missionId: number) => void + handleAssessmentFetch: (assessmentId: number) => void } class Assessment extends React.Component { public state = { showOverlay: true } public componentWillMount() { - this.props.handleAssessmentFetch(this.props.missionId) + this.props.handleAssessmentFetch(this.props.assessmentId) } public render() { diff --git a/src/containers/academy/MissionsContainer.ts b/src/containers/assessment/AssessmentListingContainer.ts similarity index 56% rename from src/containers/academy/MissionsContainer.ts rename to src/containers/assessment/AssessmentListingContainer.ts index e764716872..d0b685551a 100644 --- a/src/containers/academy/MissionsContainer.ts +++ b/src/containers/assessment/AssessmentListingContainer.ts @@ -3,19 +3,20 @@ import { withRouter } from 'react-router' import { bindActionCreators, Dispatch } from 'redux' import { fetchAssessmentOverviews } from '../../actions/session' -import Missions, { DispatchProps, StateProps } from '../../components/academy/Missions' -import { - AssessmentCategories, - IAssessmentOverview -} from '../../components/assessment/assessmentShape' +import AssessmentListing, { + DispatchProps, + OwnProps, + StateProps +} from '../../components/assessment/AssessmentListing' +import { IAssessmentOverview } from '../../components/assessment/assessmentShape' import { IState } from '../../reducers/states' -const isMission = (x: IAssessmentOverview) => x.category === AssessmentCategories.MISSION - -const mapStateToProps: MapStateToProps = state => { +const mapStateToProps: MapStateToProps = (state, props) => { + const categoryFilter = (overview: IAssessmentOverview) => + overview.category === props.assessmentCategory return { assessmentOverviews: state.session.assessmentOverviews - ? state.session.assessmentOverviews.filter(isMission) + ? state.session.assessmentOverviews.filter(categoryFilter) : undefined } } @@ -28,4 +29,4 @@ const mapDispatchToProps: MapDispatchToProps = (dispatch: Dis dispatch ) -export default withRouter(connect(mapStateToProps, mapDispatchToProps)(Missions)) +export default withRouter(connect(mapStateToProps, mapDispatchToProps)(AssessmentListing)) diff --git a/src/containers/AssessmentContainer.ts b/src/containers/assessment/index.ts similarity index 74% rename from src/containers/AssessmentContainer.ts rename to src/containers/assessment/index.ts index 0d7f419fcd..298f0476db 100644 --- a/src/containers/AssessmentContainer.ts +++ b/src/containers/assessment/index.ts @@ -1,13 +1,13 @@ import { connect, MapDispatchToProps, MapStateToProps } from 'react-redux' import { bindActionCreators, Dispatch } from 'redux' -import { fetchAssessment } from '../actions/session' -import Assessment, { DispatchProps, OwnProps, StateProps } from '../components/assessment' -import { IState } from '../reducers/states' +import { fetchAssessment } from '../../actions/session' +import Assessment, { DispatchProps, OwnProps, StateProps } from '../../components/assessment' +import { IState } from '../../reducers/states' const mapStateToProps: MapStateToProps = (state, props) => { return { - assessment: state.session.assessments.get(props.missionId) + assessment: state.session.assessments.get(props.assessmentId) } } diff --git a/src/styles/_academy.scss b/src/styles/_academy.scss index 888ec50d70..70601f21ee 100644 --- a/src/styles/_academy.scss +++ b/src/styles/_academy.scss @@ -17,11 +17,3 @@ padding: 0.5rem 0 0 0; } } - -.Missions { - color: $cadet-color-3; - .mission-info { - background-color: $cadet-color-5; - text-align: justify; - } -} diff --git a/src/styles/_assessment.scss b/src/styles/_assessment.scss index 664ab5ec1f..4cbdfba7d3 100644 --- a/src/styles/_assessment.scss +++ b/src/styles/_assessment.scss @@ -10,3 +10,11 @@ margin-top: 1rem; } } + +.AssessmentListing { + color: $cadet-color-3; + .listing { + background-color: $cadet-color-5; + text-align: justify; + } +}
{mission.shortSummary}
{overview.shortSummary}
Once upon a time, Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin nec vulputate sapien. Fusce vel lacus fermentum, efficitur ipsum.