Skip to content

Commit

Permalink
Refactor search list routes (ant-design#440)
Browse files Browse the repository at this point in the history
* refactor search list

* Fix third level breadcrumb name, close ant-design#304

* use match.url

* use match.url

* use match.path

* fix match url & path
  • Loading branch information
afc163 authored Dec 18, 2017
1 parent 69a9d9b commit e111d7b
Show file tree
Hide file tree
Showing 12 changed files with 713 additions and 786 deletions.
27 changes: 15 additions & 12 deletions src/common/nav.js
Original file line number Diff line number Diff line change
Expand Up @@ -90,19 +90,22 @@ export const getNavData = app => [
component: dynamicWrapper(app, ['list'], () => import('../routes/List/CardList')),
},
{
name: '搜索列表(项目)',
path: 'cover-card-list',
component: dynamicWrapper(app, ['list'], () => import('../routes/List/CoverCardList')),
},
{
name: '搜索列表(应用)',
path: 'filter-card-list',
component: dynamicWrapper(app, ['list'], () => import('../routes/List/FilterCardList')),
},
{
name: '搜索列表(文章)',
name: '搜索列表',
path: 'search',
component: dynamicWrapper(app, ['list'], () => import('../routes/List/SearchList')),
component: dynamicWrapper(app, [], () => import('../routes/List/List')),
children: [{
name: '搜索列表(项目)',
path: 'projects',
component: dynamicWrapper(app, ['list'], () => import('../routes/List/Projects')),
}, {
name: '搜索列表(应用)',
path: 'applications',
component: dynamicWrapper(app, ['list'], () => import('../routes/List/Applications')),
}, {
name: '搜索列表(文章)',
path: 'articles',
component: dynamicWrapper(app, ['list'], () => import('../routes/List/Articles')),
}],
},
],
},
Expand Down
7 changes: 5 additions & 2 deletions src/layouts/BasicLayout.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ class BasicLayout extends React.PureComponent {
static childContextTypes = {
location: PropTypes.object,
breadcrumbNameMap: PropTypes.object,
routeData: PropTypes.array,
}
getChildContext() {
const { location, navData, getRouteData } = this.props;
Expand All @@ -52,7 +53,7 @@ class BasicLayout extends React.PureComponent {
component: item.component,
};
});
return { location, breadcrumbNameMap };
return { location, breadcrumbNameMap, routeData };
}
getPageTitle() {
const { location, getRouteData } = this.props;
Expand All @@ -68,8 +69,10 @@ class BasicLayout extends React.PureComponent {
getMenuData = (data, parentPath) => {
let arr = [];
data.forEach((item) => {
if (item.children) {
if (item.name) {
arr.push({ path: `${parentPath}/${item.path}`, name: item.name });
}
if (item.children) {
arr = arr.concat(this.getMenuData(item.children, `${parentPath}/${item.path}`));
}
});
Expand Down
199 changes: 199 additions & 0 deletions src/routes/List/Applications.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,199 @@
import React, { PureComponent } from 'react';
import numeral from 'numeral';
import { connect } from 'dva';
import { Row, Col, Form, Card, Select, Icon, Avatar, List, Tooltip, Dropdown, Menu } from 'antd';

import StandardFormRow from '../../components/StandardFormRow';
import TagSelect from '../../components/TagSelect';

import styles from './Projects.less';

const { Option } = Select;
const FormItem = Form.Item;

const formatWan = (val) => {
const v = val * 1;
if (!v || isNaN(v)) return '';

let result = val;
if (val > 10000) {
result = Math.floor(val / 10000);
result = <span>{result}<em className={styles.wan}></em></span>;
}
return result;
};

/* eslint react/no-array-index-key: 0 */
@Form.create()
@connect(state => ({
list: state.list,
}))
export default class FilterCardList extends PureComponent {
componentDidMount() {
this.props.dispatch({
type: 'list/fetch',
payload: {
count: 8,
},
});
}

handleFormSubmit = () => {
const { form, dispatch } = this.props;
// setTimeout 用于保证获取表单值是在所有表单字段更新完毕的时候
setTimeout(() => {
form.validateFields((err) => {
if (!err) {
// eslint-disable-next-line
dispatch({
type: 'list/fetch',
payload: {
count: 8,
},
});
}
});
}, 0);
}

render() {
const { list: { list, loading }, form } = this.props;
const { getFieldDecorator } = form;

const CardInfo = ({ activeUser, newUser }) => (
<div className={styles.cardInfo}>
<div>
<p>活跃用户</p>
<p>{activeUser}</p>
</div>
<div>
<p>新增用户</p>
<p>{newUser}</p>
</div>
</div>
);

const formItemLayout = {
wrapperCol: {
xs: { span: 24 },
sm: { span: 16 },
},
};

const itemMenu = (
<Menu>
<Menu.Item>
<a target="_blank" rel="noopener noreferrer" href="http://www.alipay.com/">1st menu item</a>
</Menu.Item>
<Menu.Item>
<a target="_blank" rel="noopener noreferrer" href="http://www.taobao.com/">2nd menu item</a>
</Menu.Item>
<Menu.Item>
<a target="_blank" rel="noopener noreferrer" href="http://www.tmall.com/">3d menu item</a>
</Menu.Item>
</Menu>
);

return (
<div className={styles.filterCardList}>
<Card bordered={false}>
<Form layout="inline">
<StandardFormRow title="所属类目" block style={{ paddingBottom: 11 }}>
<FormItem>
{getFieldDecorator('category')(
<TagSelect onChange={this.handleFormSubmit} expandable>
<TagSelect.Option value="cat1">类目一</TagSelect.Option>
<TagSelect.Option value="cat2">类目二</TagSelect.Option>
<TagSelect.Option value="cat3">类目三</TagSelect.Option>
<TagSelect.Option value="cat4">类目四</TagSelect.Option>
<TagSelect.Option value="cat5">类目五</TagSelect.Option>
<TagSelect.Option value="cat6">类目六</TagSelect.Option>
<TagSelect.Option value="cat7">类目七</TagSelect.Option>
<TagSelect.Option value="cat8">类目八</TagSelect.Option>
<TagSelect.Option value="cat9">类目九</TagSelect.Option>
<TagSelect.Option value="cat10">类目十</TagSelect.Option>
<TagSelect.Option value="cat11">类目十一</TagSelect.Option>
<TagSelect.Option value="cat12">类目十二</TagSelect.Option>
</TagSelect>
)}
</FormItem>
</StandardFormRow>
<StandardFormRow
title="其它选项"
grid
last
>
<Row gutter={16}>
<Col lg={8} md={10} sm={10} xs={24}>
<FormItem
{...formItemLayout}
label="作者"
>
{getFieldDecorator('author', {})(
<Select
onChange={this.handleFormSubmit}
placeholder="不限"
style={{ maxWidth: 200, width: '100%' }}
>
<Option value="lisa">王昭君</Option>
</Select>
)}
</FormItem>
</Col>
<Col lg={8} md={10} sm={10} xs={24}>
<FormItem
{...formItemLayout}
label="好评度"
>
{getFieldDecorator('rate', {})(
<Select
onChange={this.handleFormSubmit}
placeholder="不限"
style={{ maxWidth: 200, width: '100%' }}
>
<Option value="good">优秀</Option>
<Option value="normal">普通</Option>
</Select>
)}
</FormItem>
</Col>
</Row>
</StandardFormRow>
</Form>
</Card>
<List
rowKey="id"
style={{ marginTop: 24 }}
grid={{ gutter: 24, xl: 4, lg: 3, md: 3, sm: 2, xs: 1 }}
loading={loading}
dataSource={list}
renderItem={item => (
<List.Item key={item.id}>
<Card
hoverable
bodyStyle={{ paddingBottom: 20 }}
actions={[
<Tooltip title="下载"><Icon type="download" /></Tooltip>,
<Tooltip title="编辑"><Icon type="edit" /></Tooltip>,
<Tooltip title="分享"><Icon type="share-alt" /></Tooltip>,
<Dropdown overlay={itemMenu}><Icon type="ellipsis" /></Dropdown>,
]}
>
<Card.Meta
avatar={<Avatar size="small" src={item.avatar} />}
title={item.title}
/>
<div className={styles.cardItemContent}>
<CardInfo
activeUser={formatWan(item.activeUser)}
newUser={numeral(item.newUser).format('0,0')}
/>
</div>
</Card>
</List.Item>
)}
/>
</div>
);
}
}
File renamed without changes.
Loading

0 comments on commit e111d7b

Please sign in to comment.