diff --git a/appveyor.yml b/appveyor.yml index ee06d65cbacf9b4f0a1be49056cfdba29f6a2319..22ae1886fd47d6336b59621b4060f1803c295582 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -2,6 +2,10 @@ environment: nodejs_version: "8" +# this is how to allow failing jobs in the matrix +matrix: + fast_finish: true # set this flag to immediately finish build once one of the jobs fails. + # Install scripts. (runs after repo cloning) install: # Get the latest stable version of Node.js or io.js diff --git a/package.json b/package.json index 09e944ec07443fda05abcc28a34ddb25154a1c53..7282742ff5dbbb59d2528ef318893c12711b9285 100755 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "react-document-title": "^2.0.3", "react-dom": "^16.2.0", "react-fittext": "^1.0.0", + "rollbar": "^2.3.4", "url-polyfill": "^1.0.10" }, "devDependencies": { @@ -72,7 +73,6 @@ "regenerator-runtime": "^0.11.1", "roadhog": "^2.1.0", "roadhog-api-doc": "^0.3.4", - "rollbar": "^2.3.4", "stylelint": "^8.4.0", "stylelint-config-standard": "^18.0.0" }, diff --git a/src/common/menu.js b/src/common/menu.js index 21b58d7ae9ffe8b77e3b53d58e9db6eb56322918..50f8a46406f846851b9a4423428b9dfbdf444ab4 100644 --- a/src/common/menu.js +++ b/src/common/menu.js @@ -115,7 +115,7 @@ const menuData = [{ }], }]; -function formatter(data, parentPath = '', parentAuthority) { +function formatter(data, parentPath = '/', parentAuthority) { return data.map((item) => { let { path } = item; if (!isUrl(path)) { diff --git a/src/common/router.js b/src/common/router.js index 1664ee72b9c89287d472cc14d2b126eb6c16d70e..cbd584efbc96b5cfc4e1c17ac8d4305026a6259c 100644 --- a/src/common/router.js +++ b/src/common/router.js @@ -92,12 +92,15 @@ export const getRouterData = (app) => { component: dynamicWrapper(app, ['form'], () => import('../routes/Forms/StepForm')), }, '/form/step-form/info': { + name: '分步表单(填写转账信息)', component: dynamicWrapper(app, ['form'], () => import('../routes/Forms/StepForm/Step1')), }, '/form/step-form/confirm': { + name: '分步表单(确认转账信息)', component: dynamicWrapper(app, ['form'], () => import('../routes/Forms/StepForm/Step2')), }, '/form/step-form/result': { + name: '分步表单(完成)', component: dynamicWrapper(app, ['form'], () => import('../routes/Forms/StepForm/Step3')), }, '/form/advanced-form': { @@ -193,7 +196,7 @@ export const getRouterData = (app) => { // Regular match item name // eg. router /user/:id === /user/chen const pathRegexp = pathToRegexp(path); - const menuKey = Object.keys(menuData).find(key => pathRegexp.test(`/${key}`)); + const menuKey = Object.keys(menuData).find(key => pathRegexp.test(`${key}`)); let menuItem = {}; // If menuKey is not empty if (menuKey) { diff --git a/src/components/Authorized/PromiseRender.js b/src/components/Authorized/PromiseRender.js index 22f1fcb720af8bf4e3f3c769b9c9bf5a46945958..43a4fa9ebda499a44ff20d6f05392ec3d49761fc 100644 --- a/src/components/Authorized/PromiseRender.js +++ b/src/components/Authorized/PromiseRender.js @@ -6,9 +6,17 @@ export default class PromiseRender extends React.PureComponent { component: null, }; componentDidMount() { - const ok = this.checkIsInstantiation(this.props.ok); - const error = this.checkIsInstantiation(this.props.error); - this.props.promise + this.setRenderComponent(this.props); + } + componentWillReceiveProps(nextProps) { + // new Props enter + this.setRenderComponent(nextProps); + } + // set render Component : ok or error + setRenderComponent(props) { + const ok = this.checkIsInstantiation(props.ok); + const error = this.checkIsInstantiation(props.error); + props.promise .then(() => { this.setState({ component: ok, diff --git a/src/components/CountDown/index.js b/src/components/CountDown/index.js index e1e85bc225ffd4a87cda94ec5a18f975dc494058..f7aa6e0822aab726fbb09b231be5e71ec7d15834 100644 --- a/src/components/CountDown/index.js +++ b/src/components/CountDown/index.js @@ -51,9 +51,8 @@ class CountDown extends Component { } lastTime = targetTime - new Date().getTime(); - return { - lastTime, + lastTime: lastTime < 0 ? 0 : lastTime, }; } // defaultFormat = time => ( @@ -63,11 +62,11 @@ class CountDown extends Component { const hours = 60 * 60 * 1000; const minutes = 60 * 1000; - const h = fixedZero(Math.floor(time / hours)); - const m = fixedZero(Math.floor((time - (h * hours)) / minutes)); - const s = fixedZero(Math.floor((time - (h * hours) - (m * minutes)) / 1000)); + const h = Math.floor(time / hours); + const m = Math.floor((time - (h * hours)) / minutes); + const s = Math.floor((time - (h * hours) - (m * minutes)) / 1000); return ( - {h}:{m}:{s} + {fixedZero(h)}:{fixedZero(m)}:{fixedZero(s)} ); } tick = () => { @@ -96,9 +95,8 @@ class CountDown extends Component { } render() { - const { format = this.defaultFormat, ...rest } = this.props; + const { format = this.defaultFormat, onEnd, ...rest } = this.props; const { lastTime } = this.state; - const result = format(lastTime); return ({result}); diff --git a/src/components/PageHeader/index.js b/src/components/PageHeader/index.js index df5148749dad22b35ebb0bd9122429e96ef5e813..d85e716576d3cc7702b5bf107d5c29e5994484eb 100644 --- a/src/components/PageHeader/index.js +++ b/src/components/PageHeader/index.js @@ -4,7 +4,7 @@ import pathToRegexp from 'path-to-regexp'; import { Breadcrumb, Tabs } from 'antd'; import classNames from 'classnames'; import styles from './index.less'; - +import { urlToList } from '../utils/pathTools'; const { TabPane } = Tabs; export function getBreadcrumb(breadcrumbNameMap, url) { @@ -19,14 +19,6 @@ export function getBreadcrumb(breadcrumbNameMap, url) { return breadcrumb || {}; } -// /userinfo/2144/id => ['/userinfo','/useinfo/2144,'/userindo/2144/id'] -export function urlToList(url) { - const urllist = url.split('/').filter(i => i); - return urllist.map((urlItem, index) => { - return `/${urllist.slice(0, index + 1).join('/')}`; - }); -} - export default class PageHeader extends PureComponent { static contextTypes = { routes: PropTypes.array, @@ -44,29 +36,35 @@ export default class PageHeader extends PureComponent { routes: this.props.routes || this.context.routes, params: this.props.params || this.context.params, routerLocation: this.props.location || this.context.location, - breadcrumbNameMap: this.props.breadcrumbNameMap || this.context.breadcrumbNameMap, + breadcrumbNameMap: + this.props.breadcrumbNameMap || this.context.breadcrumbNameMap, }; }; // Generated according to props - conversionFromProps= () => { + conversionFromProps = () => { const { - breadcrumbList, breadcrumbSeparator, linkElement = 'a', + breadcrumbList, + breadcrumbSeparator, + linkElement = 'a', } = this.props; return ( - + {breadcrumbList.map(item => ( - {item.href ? (createElement(linkElement, { - [linkElement === 'a' ? 'href' : 'to']: item.href, - }, item.title)) : item.title} + {item.href + ? createElement( + linkElement, + { + [linkElement === 'a' ? 'href' : 'to']: item.href, + }, + item.title, + ) + : item.title} - ))} + ))} ); - } + }; conversionFromLocation = (routerLocation, breadcrumbNameMap) => { const { breadcrumbSeparator, linkElement = 'a' } = this.props; // Convert the url to an array @@ -74,7 +72,8 @@ export default class PageHeader extends PureComponent { // Loop data mosaic routing const extraBreadcrumbItems = pathSnippets.map((url, index) => { const currentBreadcrumb = getBreadcrumb(breadcrumbNameMap, url); - const isLinkable = (index !== pathSnippets.length - 1) && currentBreadcrumb.component; + const isLinkable = + index !== pathSnippets.length - 1 && currentBreadcrumb.component; return currentBreadcrumb.name && !currentBreadcrumb.hideInBreadcrumb ? ( {createElement( @@ -88,26 +87,33 @@ export default class PageHeader extends PureComponent { // Add home breadcrumbs to your head extraBreadcrumbItems.unshift( - {createElement(linkElement, { - [linkElement === 'a' ? 'href' : 'to']: '/' }, '首页')} - + {createElement( + linkElement, + { + [linkElement === 'a' ? 'href' : 'to']: '/', + }, + '首页', + )} + , ); return ( - + {extraBreadcrumbItems} ); - } + }; /** * 将参数转化为面包屑 * Convert parameters into breadcrumbs */ conversionBreadcrumbList = () => { const { breadcrumbList, breadcrumbSeparator } = this.props; - const { routes, params, routerLocation, breadcrumbNameMap } = this.getBreadcrumbProps(); + const { + routes, + params, + routerLocation, + breadcrumbNameMap, + } = this.getBreadcrumbProps(); if (breadcrumbList && breadcrumbList.length) { return this.conversionFromProps(); } @@ -126,28 +132,41 @@ export default class PageHeader extends PureComponent { } // 根据 location 生成 面包屑 // Generate breadcrumbs based on location - if (location && location.pathname) { + if (routerLocation && routerLocation.pathname) { return this.conversionFromLocation(routerLocation, breadcrumbNameMap); } return null; - } + }; // 渲染Breadcrumb 子节点 // Render the Breadcrumb child node itemRender = (route, params, routes, paths) => { const { linkElement = 'a' } = this.props; const last = routes.indexOf(route) === routes.length - 1; - return (last || !route.component) - ? {route.breadcrumbName} - : createElement(linkElement, { - href: paths.join('/') || '/', - to: paths.join('/') || '/', - }, route.breadcrumbName); - } + return last || !route.component ? ( + {route.breadcrumbName} + ) : ( + createElement( + linkElement, + { + href: paths.join('/') || '/', + to: paths.join('/') || '/', + }, + route.breadcrumbName, + ) + ); + }; render() { const { - title, logo, action, content, extraContent, - tabList, className, tabActiveKey, tabBarExtraContent, + title, + logo, + action, + content, + extraContent, + tabList, + className, + tabActiveKey, + tabBarExtraContent, } = this.props; const clsString = classNames(styles.pageHeader, className); @@ -175,12 +194,13 @@ export default class PageHeader extends PureComponent {
{content &&
{content}
} - {extraContent &&
{extraContent}
} + {extraContent && ( +
{extraContent}
+ )}
- { - tabList && + {tabList && tabList.length && ( - { - tabList.map(item => ) - } + {tabList.map(item => )} - ) - } + )} ); } diff --git a/src/components/PageHeader/index.test.js b/src/components/PageHeader/index.test.js index 385a3d31da4910474fd67b83a2c607b57b8c6dfc..d9aaa0004e7e682a690f2f3a59175abe9093a210 100644 --- a/src/components/PageHeader/index.test.js +++ b/src/components/PageHeader/index.test.js @@ -1,23 +1,5 @@ -import { getBreadcrumb, urlToList } from './index'; - -describe('test urlToList', () => { - it('A path', () => { - expect(urlToList('/userinfo')).toEqual(['/userinfo']); - }); - it('Secondary path', () => { - expect(urlToList('/userinfo/2144')).toEqual([ - '/userinfo', - '/userinfo/2144', - ]); - }); - it('Three paths', () => { - expect(urlToList('/userinfo/2144/addr')).toEqual([ - '/userinfo', - '/userinfo/2144', - '/userinfo/2144/addr', - ]); - }); -}); +import { getBreadcrumb } from './index'; +import { urlToList } from '../utils/pathTools'; const routerData = { '/dashboard/analysis': { @@ -36,17 +18,17 @@ const routerData = { describe('test getBreadcrumb', () => { it('Simple url', () => { expect(getBreadcrumb(routerData, '/dashboard/analysis').name).toEqual( - '分析页' + '分析页', ); }); it('Parameters url', () => { expect(getBreadcrumb(routerData, '/userinfo/2144').name).toEqual( - '用户信息' + '用户信息', ); }); it('The middle parameter url', () => { expect(getBreadcrumb(routerData, '/userinfo/2144/addr').name).toEqual( - '收货订单' + '收货订单', ); }); it('Loop through the parameters', () => { diff --git a/src/components/SiderMenu/SiderMenu.js b/src/components/SiderMenu/SiderMenu.js index 4811894da1f5d837a2a18307b58f2d81586c5944..072f5cea9eb4326ea3e0dafd0abde9c18a3311b2 100644 --- a/src/components/SiderMenu/SiderMenu.js +++ b/src/components/SiderMenu/SiderMenu.js @@ -3,6 +3,7 @@ import { Layout, Menu, Icon } from 'antd'; import pathToRegexp from 'path-to-regexp'; import { Link } from 'dva/router'; import styles from './index.less'; +import { urlToList } from '../utils/pathTools'; const { Sider } = Layout; const { SubMenu } = Menu; @@ -21,10 +22,17 @@ const getIcon = (icon) => { return icon; }; +export const getMeunMatcheys = (flatMenuKeys, path) => { + return flatMenuKeys.filter((item) => { + return pathToRegexp(item).test(path); + }); +}; + export default class SiderMenu extends PureComponent { constructor(props) { super(props); this.menus = props.menuData; + this.flatMenuKeys = this.getFlatMenuKeys(props.menuData); this.state = { openKeys: this.getDefaultCollapsedSubMenus(props), }; @@ -43,30 +51,11 @@ export default class SiderMenu extends PureComponent { */ getDefaultCollapsedSubMenus(props) { const { location: { pathname } } = props || this.props; - // eg. /list/search/articles = > ['','list','search','articles'] - let snippets = pathname.split('/'); - // Delete the end - // eg. delete 'articles' - snippets.pop(); - // Delete the head - // eg. delete '' - snippets.shift(); - // eg. After the operation is completed, the array should be ['list','search'] - // eg. Forward the array as ['list','list/search'] - snippets = snippets.map((item, index) => { - // If the array length > 1 - if (index > 0) { - // eg. search => ['list','search'].join('/') - return snippets.slice(0, index + 1).join('/'); - } - // index 0 to not do anything - return item; - }); - snippets = snippets.map((item) => { - return this.getSelectedMenuKeys(`/${item}`)[0]; - }); - // eg. ['list','list/search'] - return snippets; + return urlToList(pathname) + .map((item) => { + return getMeunMatcheys(this.flatMenuKeys, item)[0]; + }) + .filter(item => item); } /** * Recursively flatten the data @@ -77,29 +66,17 @@ export default class SiderMenu extends PureComponent { let keys = []; menus.forEach((item) => { if (item.children) { - keys.push(item.path); keys = keys.concat(this.getFlatMenuKeys(item.children)); - } else { - keys.push(item.path); } + keys.push(item.path); }); return keys; } /** - * Get selected child nodes - * /user/chen => ['user','/user/:id'] + * 判断是否是http链接.返回 Link 或 a + * Judge whether it is http link.return a or Link + * @memberof SiderMenu */ - getSelectedMenuKeys = (path) => { - const flatMenuKeys = this.getFlatMenuKeys(this.menus); - return flatMenuKeys.filter((item) => { - return pathToRegexp(`/${item}(.*)`).test(path); - }); - } - /** - * 判断是否是http链接.返回 Link 或 a - * Judge whether it is http link.return a or Link - * @memberof SiderMenu - */ getMenuItemPath = (item) => { const itemPath = this.conversionPath(item.path); const icon = getIcon(item.icon); @@ -108,7 +85,8 @@ export default class SiderMenu extends PureComponent { if (/^https?:\/\//.test(itemPath)) { return ( - {icon}{name} + {icon} + {name} ); } @@ -117,16 +95,23 @@ export default class SiderMenu extends PureComponent { to={itemPath} target={target} replace={itemPath === this.props.location.pathname} - onClick={this.props.isMobile ? () => { this.props.onCollapse(true); } : undefined} + onClick={ + this.props.isMobile + ? () => { + this.props.onCollapse(true); + } + : undefined + } > - {icon}{name} + {icon} + {name} ); - } + }; /** * get SubMenu or Item */ - getSubMenuOrItem=(item) => { + getSubMenuOrItem = (item) => { if (item.children && item.children.some(child => child.name)) { return ( {item.name} - ) : item.name - } + ) : ( + item.name + ) + } key={item.path} > {this.getNavMenuItems(item.children)} @@ -145,16 +132,14 @@ export default class SiderMenu extends PureComponent { ); } else { return ( - - {this.getMenuItemPath(item)} - + {this.getMenuItemPath(item)} ); } - } + }; /** - * 获得菜单子节点 - * @memberof SiderMenu - */ + * 获得菜单子节点 + * @memberof SiderMenu + */ getNavMenuItems = (menusData) => { if (!menusData) { return []; @@ -162,49 +147,60 @@ export default class SiderMenu extends PureComponent { return menusData .filter(item => item.name && !item.hideInMenu) .map((item) => { + // make dom const ItemDom = this.getSubMenuOrItem(item); return this.checkPermissionItem(item.authority, ItemDom); }) - .filter(item => !!item); - } + .filter(item => item); + }; + // Get the currently selected menu + getSelectedMenuKeys = () => { + const { location: { pathname } } = this.props; + return urlToList(pathname).map(itemPath => + getMeunMatcheys(this.flatMenuKeys, itemPath).pop(), + ); + }; // conversion Path // 转化路径 - conversionPath=(path) => { + conversionPath = (path) => { if (path && path.indexOf('http') === 0) { return path; } else { return `/${path || ''}`.replace(/\/+/g, '/'); } - } + }; // permission to check checkPermissionItem = (authority, ItemDom) => { if (this.props.Authorized && this.props.Authorized.check) { const { check } = this.props.Authorized; - return check( - authority, - ItemDom - ); + return check(authority, ItemDom); } return ItemDom; + }; + isMainMenu = (key) => { + return this.menus.some( + item => + key && (item.key === key || item.path === key), + ); } handleOpenChange = (openKeys) => { const lastOpenKey = openKeys[openKeys.length - 1]; - const isMainMenu = this.menus.some( - item => lastOpenKey && (item.key === lastOpenKey || item.path === lastOpenKey) - ); + const moreThanOne = openKeys.filter(openKey => this.isMainMenu(openKey)).length > 1; this.setState({ - openKeys: isMainMenu ? [lastOpenKey] : [...openKeys], + openKeys: moreThanOne ? [lastOpenKey] : [...openKeys], }); - } + }; render() { - const { logo, collapsed, location: { pathname }, onCollapse } = this.props; + const { logo, collapsed, onCollapse } = this.props; const { openKeys } = this.state; // Don't show popup menu when it is been collapsed - const menuProps = collapsed ? {} : { - openKeys, - }; + const menuProps = collapsed + ? {} + : { + openKeys, + }; // if pathname can't match, use the nearest parent's key - let selectedKeys = this.getSelectedMenuKeys(pathname); + let selectedKeys = this.getSelectedMenuKeys(); if (!selectedKeys.length) { selectedKeys = [openKeys[openKeys.length - 1]]; } diff --git a/src/components/SiderMenu/SilderMenu.test.js b/src/components/SiderMenu/SilderMenu.test.js new file mode 100644 index 0000000000000000000000000000000000000000..e6f1f55a8dc578a8ad156171e6b4be423b730abd --- /dev/null +++ b/src/components/SiderMenu/SilderMenu.test.js @@ -0,0 +1,36 @@ +import { getMeunMatcheys } from './SiderMenu'; + +const meun = [ + '/dashboard', + '/userinfo', + '/dashboard/name', + '/userinfo/:id', + '/userinfo/:id/info', +]; + +describe('test meun match', () => { + it('simple path', () => { + expect(getMeunMatcheys(meun, '/dashboard')).toEqual(['/dashboard']); + }); + it('error path', () => { + expect(getMeunMatcheys(meun, '/dashboardname')).toEqual([]); + }); + + it('Secondary path', () => { + expect(getMeunMatcheys(meun, '/dashboard/name')).toEqual([ + '/dashboard/name', + ]); + }); + + it('Parameter path', () => { + expect(getMeunMatcheys(meun, '/userinfo/2144')).toEqual([ + '/userinfo/:id', + ]); + }); + + it('three parameter path', () => { + expect(getMeunMatcheys(meun, '/userinfo/2144/info')).toEqual([ + '/userinfo/:id/info', + ]); + }); +}); diff --git a/src/components/utils/pathTools.js b/src/components/utils/pathTools.js new file mode 100644 index 0000000000000000000000000000000000000000..7d49400a41c6f975b072bb4cda467218be40e9c6 --- /dev/null +++ b/src/components/utils/pathTools.js @@ -0,0 +1,7 @@ +// /userinfo/2144/id => ['/userinfo','/useinfo/2144,'/userindo/2144/id'] +export function urlToList(url) { + const urllist = url.split('/').filter(i => i); + return urllist.map((urlItem, index) => { + return `/${urllist.slice(0, index + 1).join('/')}`; + }); +} diff --git a/src/components/utils/pathTools.test.js b/src/components/utils/pathTools.test.js new file mode 100644 index 0000000000000000000000000000000000000000..4daf28b4b8438d7d03b671ca542858c025bb95bf --- /dev/null +++ b/src/components/utils/pathTools.test.js @@ -0,0 +1,20 @@ +import { urlToList } from './pathTools'; + +describe('test urlToList', () => { + it('A path', () => { + expect(urlToList('/userinfo')).toEqual(['/userinfo']); + }); + it('Secondary path', () => { + expect(urlToList('/userinfo/2144')).toEqual([ + '/userinfo', + '/userinfo/2144', + ]); + }); + it('Three paths', () => { + expect(urlToList('/userinfo/2144/addr')).toEqual([ + '/userinfo', + '/userinfo/2144', + '/userinfo/2144/addr', + ]); + }); +}); diff --git a/src/layouts/BasicLayout.js b/src/layouts/BasicLayout.js index 324af33a28c332cb7165ccfecb5ab7784be61061..732b13f37885d7620b714de95cfc49c4e20b1190 100644 --- a/src/layouts/BasicLayout.js +++ b/src/layouts/BasicLayout.js @@ -27,8 +27,8 @@ const getRedirect = (item) => { if (item && item.children) { if (item.children[0] && item.children[0].path) { redirectData.push({ - from: `/${item.path}`, - to: `/${item.children[0].path}`, + from: `${item.path}`, + to: `${item.children[0].path}`, }); item.children.forEach((children) => { getRedirect(children); diff --git a/src/routes/List/Applications.less b/src/routes/List/Applications.less index ae1ace86981e8526984047da2682881041765385..a06bd5b1f32046fd0c39a59354910672c37473e0 100644 --- a/src/routes/List/Applications.less +++ b/src/routes/List/Applications.less @@ -14,6 +14,9 @@ .ant-card-actions { background: #f7f9fa; } + .ant-list .ant-list-item-content-single { + max-width: 100%; + } } .cardInfo { .clearfix(); diff --git a/src/routes/List/CardList.less b/src/routes/List/CardList.less index a635a88f80902be22120817498f70b9e1edec864..c4c2e57351f28797d62246cb9bb55d63551659e4 100644 --- a/src/routes/List/CardList.less +++ b/src/routes/List/CardList.less @@ -25,6 +25,12 @@ .item { height: 64px; } + + :global { + .ant-list .ant-list-item-content-single { + max-width: 100%; + } + } } .extraImg { diff --git a/src/routes/List/Projects.js b/src/routes/List/Projects.js index 3c0c9e1b39002e262ae1d573b6b8da61d281750d..48e83c8f284da49e336f9e2de523cae28342e243 100644 --- a/src/routes/List/Projects.js +++ b/src/routes/List/Projects.js @@ -6,6 +6,7 @@ import { Row, Col, Form, Card, Select, List } from 'antd'; import StandardFormRow from '../../components/StandardFormRow'; import TagSelect from '../../components/TagSelect'; import AvatarList from '../../components/AvatarList'; +import Ellipsis from '../../components/Ellipsis'; import styles from './Projects.less'; @@ -54,7 +55,7 @@ export default class CoverCardList extends PureComponent { ( @@ -65,7 +66,7 @@ export default class CoverCardList extends PureComponent { > {item.title}} - description={item.subDescription} + description={{item.subDescription}} />
{moment(item.updatedAt).fromNow()} diff --git a/src/routes/List/Projects.less b/src/routes/List/Projects.less index 129bb17d5116e065af7c1a02bb3e02f57380f6bb..890a1ad2ebf0efdc1ff0224fbf956f31f28116f7 100644 --- a/src/routes/List/Projects.less +++ b/src/routes/List/Projects.less @@ -46,4 +46,10 @@ .cardList { margin-top: 24px; } + + :global { + .ant-list .ant-list-item-content-single { + max-width: 100%; + } + } }