From d3f294a57ca448af98705d25997a1a73fddb1784 Mon Sep 17 00:00:00 2001 From: Jerko Steiner Date: Mon, 25 Mar 2019 18:27:32 +0800 Subject: [PATCH] Add packages/client/src/crumbs --- packages/client/src/breadcrumbs/index.ts | 1 - .../Breadcrumbs.tsx => crumbs/Crumb.tsx} | 11 ++-- .../Crumbs.test.tsx} | 6 +-- packages/client/src/crumbs/CrumbsActions.ts | 25 +++++++++ .../src/crumbs/CrumbsConnector.test.tsx | 52 +++++++++++++++++++ .../client/src/crumbs/CrumbsConnector.tsx | 17 ++++++ packages/client/src/crumbs/CrumbsReducer.tsx | 22 ++++++++ packages/client/src/crumbs/index.ts | 4 ++ packages/client/src/index.ts | 1 + packages/client/src/team/TeamManager.tsx | 22 ++++---- packages/client/src/test-utils/TestUtils.tsx | 17 ++++-- 11 files changed, 156 insertions(+), 22 deletions(-) delete mode 100644 packages/client/src/breadcrumbs/index.ts rename packages/client/src/{breadcrumbs/Breadcrumbs.tsx => crumbs/Crumb.tsx} (62%) rename packages/client/src/{breadcrumbs/Breadcrumbs.test.tsx => crumbs/Crumbs.test.tsx} (87%) create mode 100644 packages/client/src/crumbs/CrumbsActions.ts create mode 100644 packages/client/src/crumbs/CrumbsConnector.test.tsx create mode 100644 packages/client/src/crumbs/CrumbsConnector.tsx create mode 100644 packages/client/src/crumbs/CrumbsReducer.tsx create mode 100644 packages/client/src/crumbs/index.ts diff --git a/packages/client/src/breadcrumbs/index.ts b/packages/client/src/breadcrumbs/index.ts deleted file mode 100644 index f35988d..0000000 --- a/packages/client/src/breadcrumbs/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './Breadcrumbs' diff --git a/packages/client/src/breadcrumbs/Breadcrumbs.tsx b/packages/client/src/crumbs/Crumb.tsx similarity index 62% rename from packages/client/src/breadcrumbs/Breadcrumbs.tsx rename to packages/client/src/crumbs/Crumb.tsx index 01d9afe..b560221 100644 --- a/packages/client/src/breadcrumbs/Breadcrumbs.tsx +++ b/packages/client/src/crumbs/Crumb.tsx @@ -2,7 +2,7 @@ import React from 'react' import {Breadcrumb, BreadcrumbItem} from 'bloomer' import {Link} from 'react-router-dom' -export interface IBreadcrumbsProps { +export interface ICrumbProps { links: Array<{ name: string to: string @@ -10,17 +10,22 @@ export interface IBreadcrumbsProps { current: string } -export class Breadcrumbs extends React.PureComponent { +export class Crumb extends React.PureComponent { render() { return (
    + + Home + {this.props.links.map((link, i) => ( {link.name} ))} - {this.props.current} + + {this.props.current} +
) diff --git a/packages/client/src/breadcrumbs/Breadcrumbs.test.tsx b/packages/client/src/crumbs/Crumbs.test.tsx similarity index 87% rename from packages/client/src/breadcrumbs/Breadcrumbs.test.tsx rename to packages/client/src/crumbs/Crumbs.test.tsx index 3f36513..f0de691 100644 --- a/packages/client/src/breadcrumbs/Breadcrumbs.test.tsx +++ b/packages/client/src/crumbs/Crumbs.test.tsx @@ -1,17 +1,17 @@ import React from 'react' -import {Breadcrumbs} from './Breadcrumbs' +import {Crumb} from './Crumb' import {TestUtils} from '../test-utils' import {MemoryRouter} from 'react-router-dom' const t = new TestUtils() -describe('Breadcrumbs', () => { +describe('Crumb', () => { describe('render', () => { it('renders', () => { const {node} = t.render( - + +type Action = GetAction + +export class CrumbsActions { + setCrumbs(breadcrumbs: ICrumbs): Action<'BREADCRUMBS_SET'> { + return { + payload: breadcrumbs, + type: 'BREADCRUMBS_SET', + } + } +} diff --git a/packages/client/src/crumbs/CrumbsConnector.test.tsx b/packages/client/src/crumbs/CrumbsConnector.test.tsx new file mode 100644 index 0000000..130a12a --- /dev/null +++ b/packages/client/src/crumbs/CrumbsConnector.test.tsx @@ -0,0 +1,52 @@ +import * as Feature from './' +import React from 'react' +import {MemoryRouter} from 'react-router-dom' +import {TestUtils} from '../test-utils' + +const t = new TestUtils() + +describe('CrumbsConnector', () => { + + const createTestCase = () => t.withProvider({ + reducers: {Crumbs: Feature.Crumbs}, + select: s => s.Crumbs, + }) + .withState({ + Crumbs: { + links: [{ + name: 'One', + to: '/one', + }, { + name: 'Two', + to: '/two', + }], + current: 'Three', + }, + }) + .withComponent(select => new Feature.CrumbsConnector().connect(select)) + .withJSX(Component => ) + + describe('render', () => { + it('renders', () => { + const {node} = createTestCase().render({}) + + expect(node.innerHTML).toMatch(/href="\/one"/) + expect(node.innerHTML).toMatch(/href="\/two"/) + expect(node.innerHTML).toMatch(/Three/) + }) + }) + + describe('BREADCRUMBS_SET', () => { + it('updates breadcrumbs', () => { + const {render, store} = createTestCase() + const actions = new Feature.CrumbsActions() + store.dispatch(actions.setCrumbs({ + links: [], + current: 'Crumbtest', + })) + const {node} = render({}) + expect(node.innerHTML).toMatch(/Crumbtest/) + }) + }) + +}) diff --git a/packages/client/src/crumbs/CrumbsConnector.tsx b/packages/client/src/crumbs/CrumbsConnector.tsx new file mode 100644 index 0000000..c97359e --- /dev/null +++ b/packages/client/src/crumbs/CrumbsConnector.tsx @@ -0,0 +1,17 @@ +import {Crumb} from './Crumb' +import {Connector, IStateSelector} from '../redux' +import {ICrumbsState} from './CrumbsReducer' +import {CrumbsActions} from './CrumbsActions' + +export class CrumbsConnector extends Connector { + protected readonly breadcrumbsActions = new CrumbsActions() + + connect(getLocalState: IStateSelector) { + return this.wrap( + getLocalState, + state => state, + dispatch => ({}), + Crumb, + ) + } +} diff --git a/packages/client/src/crumbs/CrumbsReducer.tsx b/packages/client/src/crumbs/CrumbsReducer.tsx new file mode 100644 index 0000000..1ff5a62 --- /dev/null +++ b/packages/client/src/crumbs/CrumbsReducer.tsx @@ -0,0 +1,22 @@ +import {ICrumbs, CrumbsActionType} from './CrumbsActions' + +export interface ICrumbsState extends ICrumbs { +} + +const defaultState: ICrumbsState = { + links: [], + current: 'Home', +} + +export function Crumbs(state = defaultState, action: CrumbsActionType) + : ICrumbsState { + switch (action.type) { + case 'BREADCRUMBS_SET': + return { + links: action.payload.links, + current: action.payload.current, + } + default: + return state + } +} diff --git a/packages/client/src/crumbs/index.ts b/packages/client/src/crumbs/index.ts new file mode 100644 index 0000000..1653ea0 --- /dev/null +++ b/packages/client/src/crumbs/index.ts @@ -0,0 +1,4 @@ +export * from './Crumb' +export * from './CrumbsActions' +export * from './CrumbsConnector' +export * from './CrumbsReducer' diff --git a/packages/client/src/index.ts b/packages/client/src/index.ts index e5c6efa..fa62fb2 100644 --- a/packages/client/src/index.ts +++ b/packages/client/src/index.ts @@ -1,5 +1,6 @@ export * from './actions' export * from './components' +export * from './crumbs' export * from './csrf' export * from './http' export * from './login' diff --git a/packages/client/src/team/TeamManager.tsx b/packages/client/src/team/TeamManager.tsx index 63de648..a5ede0d 100644 --- a/packages/client/src/team/TeamManager.tsx +++ b/packages/client/src/team/TeamManager.tsx @@ -1,11 +1,11 @@ import React from 'react' import {ITeam, IUserInTeam, ReadonlyRecord} from '@rondo/common' +import {Panel, PanelBlock, PanelHeading} from 'bloomer' import {Route, Switch} from 'react-router-dom' import {TeamActions} from './TeamActions' import {TeamEditor} from './TeamEditor' import {TeamList} from './TeamList' import {TeamUserList} from './TeamUserList' -import {Panel, PanelBlock, PanelHeading} from 'bloomer' export interface ITeamManagerProps { createTeam: TeamActions['createTeam'] @@ -36,20 +36,22 @@ export class TeamManager extends React.PureComponent {
- + <> + + }/> { const {teamId: teamIdParam} = match.params const teamId = teamIdParam ? Number(teamIdParam) : undefined const team = teamId ? teamsById[teamId] : undefined return ( - + <> Edit Team: {team && team.name} @@ -70,7 +72,7 @@ export class TeamManager extends React.PureComponent { userKeysByTeamId={this.props.userKeysByTeamId} usersByKey={this.props.usersByKey} />} - + ) }}/> diff --git a/packages/client/src/test-utils/TestUtils.tsx b/packages/client/src/test-utils/TestUtils.tsx index f265c7a..3ff36cb 100644 --- a/packages/client/src/test-utils/TestUtils.tsx +++ b/packages/client/src/test-utils/TestUtils.tsx @@ -15,7 +15,6 @@ import { interface IRenderParams { reducers: ReducersMapObject - state?: DeepPartial select: IStateSelector // getComponent: ( // select: IStateSelector) => React.ComponentType, @@ -51,11 +50,19 @@ export class TestUtils { withProvider = AnyAction>( params: IRenderParams, ) { - const {reducers, state, select} = params + const {reducers, select} = params - const store = this.createStore({ + let store = this.createStore({ reducer: this.combineReducers(reducers), - })(state) + })() + + const withState = (state: DeepPartial) => { + store = this.createStore({ + reducer: this.combineReducers(reducers), + })(state) + + return {withComponent} + } const withComponent = ( getComponent: (select: IStateSelector) => @@ -96,6 +103,6 @@ export class TestUtils { return self } - return {withComponent} + return {withState, withComponent} } }