Compare commits

...

125 Commits
3.1.5 ... 3.2.2

Author SHA1 Message Date
valleykid
07a0a1f336 Changelog of 3.2.2 (#9409) 2018-02-25 08:38:10 +08:00
valleykid
eab4fdfe95 Update snapshot 2018-02-25 07:57:23 +08:00
Ivan Kravets
86ab00fbbd Use default background for button states (#9411) 2018-02-24 22:25:50 +08:00
Wei Zhu
c28d6f1624 Remove table overflow:hidden, fix #7799 2018-02-24 11:46:46 +08:00
Mathew
947cee4475 fix issue #9359 (#9364)
* fix issue #9359

* fix trailing whitespaces
2018-02-24 11:40:44 +08:00
MinJeong Kim
feaf238dfa fix: set -has-trigger class in sider when -trigger div exists (#9399)
* fix: set `-has-trigger` class in sider when `-trigger` div exists

* fix: fix template expr lint error
2018-02-24 10:35:04 +08:00
Wei Zhu
f1fd85780e Revert "fix type of column dataIndex (#9298)"
This reverts commit f8e996ee8e.

Close #9393
2018-02-22 15:56:37 +08:00
Wei Zhu
dc439bd7c3 Remove generic type from ComponentDecorator, fix #9331 2018-02-22 15:52:35 +08:00
Wei Zhu
2c95ea0e5e docs: document Tabs[onChange] argument
Close #9386
2018-02-22 10:44:53 +08:00
Wei Zhu
aeeebab9d9 Upgrade @babel/types 2018-02-21 18:42:13 +08:00
Wei Zhu
a6ffd332fa docs: fix parameter 2018-02-16 15:20:25 +08:00
Christopher Deutsch
97b09b393b onKeyPress and onKeyDown got the wrong type in #9316 (#9365) 2018-02-15 13:10:35 -06:00
Wei Zhu
a438b9b33f Add spin dot className to custom indicator 2018-02-14 12:56:22 +08:00
Wei Zhu
7d5db31e67 Fix table custom spin indicator
Fix #9355
2018-02-14 12:56:22 +08:00
George Gray
053396810b add @badge-font-weight var (#9352) 2018-02-14 12:35:52 +08:00
George Gray
676635abde var to theme pagination font (#9351) 2018-02-13 21:38:34 +08:00
Dimitri Mitropoulos
c92cf5b778 adds missing argument in Select onChange prop (#9332)
* adds missing argument in Select onChange prop

from the docs: 
`function(value, option:Option/Array<Option>)`

also, (from reality) the callback really does send an option or options array.

* updates type to use ReactElement instead of Object
2018-02-13 07:33:25 -06:00
Arvin Xu
2a1612b0c2 📖 Fix misspelling and blank (#9348)
修改个错别字,补充两处盘古之白
2018-02-13 00:11:25 -06:00
MuYu
1d1ea1ac59 fix switch doc error (#9338) 2018-02-12 12:10:07 +08:00
afc163
b574e8ee14 3.2.1 2018-02-12 10:17:29 +08:00
偏右
0e9743e78a Add changelog of 3.2.1 (#9335)
* Add changelog of 3.2.1

* fix version

* Add English changelog
2018-02-12 10:09:11 +08:00
Wei Zhu
4107a4bd8e docs: Remove next version link
Close #9336
2018-02-11 20:11:40 +08:00
afc163
ba236419be Fix badge API doc 2018-02-11 19:21:12 +08:00
afc163
5294a69296 site: fix home page style 2018-02-11 18:10:02 +08:00
afc163
ec399ba27f site: update link description 2018-02-11 17:59:41 +08:00
afc163
d31612f2de site: renew footer links 2018-02-11 17:54:55 +08:00
afc163
c04377e541 Add more icons, #9092 2018-02-11 17:10:18 +08:00
afc163
626ebf2063 Fix upload list update logic when beforeUpload return false
close #8020 #8779 #9248 #9191

ref #8036
2018-02-11 16:11:13 +08:00
afc163
e3f115dd3d update snapshot 2018-02-11 11:48:59 +08:00
afc163
1ae7da3878 Fix hasFeedback icon position in vertical form layout
close #9153 and #9309
2018-02-11 11:44:49 +08:00
偏右
d72a6dd7b9 Update README.md
close #9254
2018-02-11 11:07:42 +08:00
afc163
f27bc6bd9d fix snapshot 2018-02-09 17:07:33 +08:00
afc163
fff5680743 fix typo 2018-02-09 16:30:14 +08:00
afc163
5accd6367a Fix submenu z-index, close #9218 2018-02-09 15:56:34 +08:00
afc163
2909e5f651 Fix sorter icon click area overflow in Table
close #8979
2018-02-09 15:50:08 +08:00
Wei Zhu
b5f88c0005 Fix table padding close #9319 2018-02-09 14:58:03 +08:00
诸岳
240289ed73 Remove TimePicker wrong line-height style, close #9292 (#9317) 2018-02-09 11:36:43 +08:00
Yury Kozyrev
1e92ff8efd onKeyPress and onKeyDown typings (#9316)
* Update Checkbox.tsx

* Update button.tsx
2018-02-08 20:35:54 -06:00
John Johnson III
3ffe718476 fix typo in less good (#9315)
Fix `background` property value by changing it from `transprent` to `transparent`
2018-02-09 10:05:56 +08:00
Benjy Cui
44063967a1 fix: make Mention autosize height by default, close: #9068 (#9307) 2018-02-08 23:50:42 +08:00
Benjy Cui
2411bdb7b7 fix: placeholder of Mention should not be interactable, close: #9215 (#9306) 2018-02-08 22:39:43 +08:00
Marcus Bransbury
3b6cd56820 Update broken links in docs (#9310)
* update link english

* update link chinese
2018-02-08 06:58:36 -06:00
Wei Zhu
7d3ff69e12 Fix small bordered table style
Fix #8980
2018-02-08 16:14:45 +08:00
jim
7b4abe7568 doc add select component showArrow props document 2018-02-08 16:13:09 +08:00
afc163
dc7d9de4cd revert demo code 2018-02-08 15:52:24 +08:00
afc163
70f3afeda0 Fix ButtonGroup style bug when have disabled button, close #9296 2018-02-08 15:51:53 +08:00
afc163
6577616be2 fix demo 2018-02-08 14:26:33 +08:00
afc163
875024cd1e update onRow usage 2018-02-08 14:25:49 +08:00
afc163
3ed3a078e1 Document for Table onRow, ref #355 2018-02-08 14:14:46 +08:00
Leo
f8e996ee8e fix type of column dataIndex (#9298) 2018-02-07 20:26:03 -06:00
David Tsai
a8f1c35dcb Update introduce.en-US.md (#9299)
Providing clarifying language in the following areas:

* Front-end Implementation
* Who's using Ant Design
* How to Contribute

Additionally, I'd like to follow up with a short visual guide for designers to learn how to contribute to the documentation here.
2018-02-08 10:21:22 +08:00
afc163
a5f29f06a5 Fix select arrow style in IE11 2018-02-07 20:29:40 +08:00
Wei Zhu
e992682aa8 Ignore invalid end date
Fix #9267
2018-02-07 14:23:17 +08:00
afc163
33e2ef0f8d revert 1502d36 to fix #9276
ref #7934
2018-02-07 11:43:21 +08:00
Andreas Cederström
f1bd8d0d11 proper class on avatar when image doesnt exist (#9278) 2018-02-07 10:43:27 +08:00
Ubaldo Quintana
7c062bb118 Update CHANGELOG.en-US.md (#9277)
Fix typos
2018-02-06 20:37:55 -06:00
afc163
59b18b4c26 Fix card loading with empty children, close #9258 2018-02-06 11:45:22 +08:00
Wei Zhu
ca6a8d13bd site: Update Table drag demo
Close #9255
2018-02-05 11:08:16 +08:00
Wei Zhu
c725cbe791 docs: fix release title 2018-02-05 00:02:17 +08:00
Wei Zhu
978c086387 Bump 3.2.0 2018-02-04 23:27:11 +08:00
Wei Zhu
39cd160641 Add 3.2.0 changelog (#9251)
ci skip
2018-02-04 09:20:23 -06:00
Wei Zhu
18188317c1 Update snapshots 2018-02-04 22:20:39 +08:00
Wei Zhu
05de1a522f Upgrade react-slick 2018-02-04 21:08:39 +08:00
Wei Zhu
27a40679ec Upgrade rc-steps 2018-02-04 21:02:28 +08:00
Wei Zhu
c2292793bc Upgrade rc-slider 2018-02-04 21:00:23 +08:00
Wei Zhu
1735d89a66 docs: Update RangePicker[ranges] type 2018-02-04 20:35:28 +08:00
Wei Zhu
49c2a6220b Merge branch 'feature-3.2' 2018-02-04 17:24:16 +08:00
mgrdevport
b87f76e64a Change Calendar mode via property (#9243) 2018-02-04 02:50:50 -06:00
愚指导
df4097ca4d [Select] Pass Option as onChange and onSelect second argument (#9228) 2018-02-04 02:42:33 -06:00
George Gray
22c3097d79 Vars to theme Tabs (#9172) 2018-02-04 02:42:13 -06:00
Wei Zhu
70f30ef065 Trigger onOk when click on preset range (#9213)
Close #7747
2018-02-04 02:41:02 -06:00
ryanhoho
42354989e9 修复默认样式和card样式下,tabPosition=bottom时的样式错误 (#9104) (#9165) 2018-02-04 02:40:44 -06:00
YuChao Liang
75c365aa2c fix(TextArea): calculateNodeHeight (#9107) (#9108) 2018-02-04 02:18:20 -06:00
Zheeeng
24e373a812 Remove span.ant-tag-text in Tag, and remove type casting in Dropdown (#9055)
* Remove span.ant-tag-text

Warp React.ReactNode with span element is not suggested. It may cause anti-specification problem: `<span><span>I'm spec breaker</span></span>`. span is not a general tags container.
Another benefit from this change is keeping the same structure with CheckableTag.
After inspecting the removing of the style of .ant-tag-text, seems bringing no problems. The old example employeed this css class has gone long long time ago. See: 0635877a51

* Use React.Children.only api to supress type casting

By codes, the children and the overlay of Dropdown must be **single** and **valid React.ReactElement**. React.Children.only takes it and report more friendly React internal built error messages.

* Revert hack CSS styles: filling .ant-tag's block area with orphan child anchor
2018-02-04 01:29:56 -06:00
int2d
d89ffcc5b2 Update practical-projects.zh-CN.md (#9244) 2018-02-02 23:20:52 -06:00
George Gray
03c180ff08 Use @btn-primary-bg for primary ghost btn (#9236) 2018-02-02 03:23:14 -06:00
Wei Zhu
29969959f8 Revert "Add test for 3b0a704"
This reverts commit 980b2cc32b.
2018-02-02 15:36:35 +08:00
Wei Zhu
980b2cc32b Add test for 3b0a704 2018-02-02 14:50:55 +08:00
Wei Zhu
aa88c656f1 docs: remove expaned row hover background color
Close #8775
2018-02-02 14:07:57 +08:00
Wei Zhu
a9537e5934 Update snapshot 2018-02-02 12:33:39 +08:00
Wei Zhu
3b0a704df8 Only clear hoverValue when picker is open
Fix #6364
2018-02-02 12:20:26 +08:00
afc163
7a33a9e5d5 Fix extra wrapper of Card children, close #9226 2018-02-02 11:54:19 +08:00
松子
26b58a9808 feat(docs): add a new antd boilerplate. (#9225) 2018-02-02 00:13:45 +08:00
Evert Bouw
0c69d721de Fix(Typings): Add OnHeaderCell property to ColumnProps (#9223)
* Fix(Typings): Add OnHeaderCell property to ColumnProps

* onHeaderCell actually receives the ColumnProps object
2018-02-01 04:54:50 -06:00
Wei Zhu
ef55562deb Attempt to fix #8885 again, add more tests (#9164) 2018-02-01 02:12:42 -06:00
Wei Zhu
bebed2c4ae Allow function for preset range (#9195)
* Allow function for preset range

Close #8281

* Rename RangePickerRange to RangePickerPresetRange
2018-02-01 02:05:57 -06:00
afc163
8d6252cfe1 Fix missing scrollbar in chrome 2018-02-01 13:21:07 +08:00
Wei Zhu
537c79785e Remove .babelrc
Used by jest before.
2018-01-31 17:03:14 +08:00
mgrdevport
5fd741bf21 Pass name prop down to the table selection input (#9054) 2018-01-31 01:07:53 -06:00
afc163
6c46692160 Tweak confirm title style 2018-01-31 14:46:45 +08:00
Wei Zhu
842c7f21d9 Fix RangePicker input (#9009)
fix #6999
fix https://github.com/react-component/calendar/issues/286
2018-01-30 22:01:27 -06:00
afc163
9f2b4905f0 Fix AutoComplete border color in form 2018-01-31 10:47:25 +08:00
Pyroboomka
99469bd1b1 Syncing forceRender prop with rc-collapse. (#9192) 2018-01-30 20:44:33 -06:00
afc163
80a4ee7731 site: update home button style 2018-01-31 10:14:25 +08:00
Wei Zhu
3b931e97c4 Merge branch 'master' into feature-3.2 2018-01-31 10:08:23 +08:00
Wei Zhu
5c00985fed Add children to AntTreeNodeProps 2018-01-30 16:50:49 +08:00
Wei Zhu
17e26ecb71 Revert "docs: fix DatePicker start end demo"
This reverts commit b9120980fb.
2018-01-30 16:01:11 +08:00
afc163
da9d34281b site: change pro icon 2018-01-30 14:17:25 +08:00
afc163
2dfd4b2cd5 site: update pro icon 2018-01-30 12:06:14 +08:00
afc163
85c7f02ca6 Add sketch template of ant design pro 2018-01-30 11:41:04 +08:00
ryanhoho
b93e33c535 table size padding use @table-padding-vertical & @table-padding-horiz… (#9106) 2018-01-29 21:05:37 -06:00
George Gray
d19fa740c7 use highlight var on vertical menu (#9169) 2018-01-29 20:18:54 +08:00
Wei Zhu
b9120980fb docs: fix DatePicker start end demo
Close #9163
2018-01-29 19:19:36 +08:00
Wei Zhu
4a9277277b Improve coverage 2018-01-29 11:36:56 +08:00
Wei Zhu
eab8b42257 Ignore interface file 2018-01-29 11:27:53 +08:00
Wei Zhu
1c27c28ba9 Fix Turkish locale 2018-01-29 11:13:55 +08:00
Wei Zhu
f60e50a5b8 Upgrade antd-tools 2018-01-29 00:20:43 +08:00
Wei Zhu
21aefd9c06 Bump 3.1.6 2018-01-28 21:56:09 +08:00
Wei Zhu
f3b7e3df67 Add 3.1.6 Changelog 2018-01-28 21:55:20 +08:00
Wei Zhu
fa14765695 Revert "Control Calendar value, fix #8885 (#9141)"
This reverts commit 98387ad819.
2018-01-28 21:49:02 +08:00
nikogu
1329de5ebd fix home page button text overflow 2018-01-27 22:34:44 +08:00
nikogu
3ad71ea36a Merge branch 'master' into feature-3.2 2018-01-27 22:30:34 +08:00
Wei Zhu
5950c09bf8 Update snapshot 2018-01-26 23:00:13 +08:00
Wei Zhu
5afb1a28b6 Merge branch 'master' into feature-3.2 2018-01-26 17:14:44 +08:00
ahalimkara
937f249b38 Kurdish translation (#9064)
* Revert "Merge branch 'master' into feature-3.2"

This reverts commit b7901e541a, reversing
changes made to 7a7933038c.

* Revert "Revert "Merge branch 'master' into feature-3.2""

This reverts commit ebf5e4c4f0.

* Kurdish translation

* Update jest snapshot for ku-iq
2018-01-24 21:40:29 +08:00
Wei Zhu
7cc05d487c Merge branch 'master' into feature-3.2 2018-01-24 10:49:53 +08:00
mgrdevport
cfdb1cab4b Pass id prop to DatePicker input field (#8598) 2018-01-24 10:48:34 +08:00
ddcat1115
b7901e541a Merge branch 'master' into feature-3.2 2018-01-21 19:56:31 +08:00
Minwe LUO
7a7933038c feat: Alert added iconType to support custom icon (#8811) 2018-01-21 00:59:25 +08:00
Wei Zhu
aa4a619f41 Merge branch 'master' into feature-3.2 2018-01-19 19:20:14 +08:00
afc163
49a53bf8df Add successPercent for progress 2018-01-19 15:22:37 +08:00
afc163
3a98fce47c Merge branch 'master' into feature-3.2 2018-01-19 15:06:09 +08:00
afc163
7aa665cc14 Add hasSider to avoid flickering in ssr
close #8937
2018-01-12 20:44:35 +08:00
afc163
9cbe6ca6b3 Merge branch 'master' into feature-3.2 2018-01-12 20:35:24 +08:00
lixiaoyang1992
9c52014585 为Tabs增加gutter 2018-01-08 19:27:43 +08:00
136 changed files with 7947 additions and 2206 deletions

View File

@@ -1,10 +0,0 @@
{
"env": {
"test": {
"presets": ["es2015", "react", "stage-0"],
"plugins": [
"add-module-exports"
]
}
}
}

View File

@@ -37,11 +37,13 @@ module.exports = {
'!components/style/index.tsx',
'!components/*/locale/index.tsx',
'!components/*/__tests__/**/type.tsx',
'!components/**/*/interface.{ts,tsx}',
],
transformIgnorePatterns,
snapshotSerializers: [
'enzyme-to-json/serializer',
],
mapCoverage: true,
globals: {
'ts-jest': {
tsConfigFile: './tsconfig.test.json',

View File

@@ -15,6 +15,76 @@ timeline: true
---
## 3.2.2
`2018-02-24`
- 🌟 Add font-family variable for `Pagination`. [#9351](https://github.com/ant-design/ant-design/issues/9351)
- 🌟 Add font-weight variable for `Badge`. [#9352](https://github.com/ant-design/ant-design/issues/9352)
- 🐞 Fix table custom spin indicator. [#9355](https://github.com/ant-design/ant-design/issues/9355)
- 🐞 Fix `Form.create`. [#9331](https://github.com/ant-design/ant-design/issues/9331)
- 🐞 Revert typescript definition of `column.dataIndex`. [#9393](https://github.com/ant-design/ant-design/issues/9393)
- 🐞 Fix last menu item in Sider could be blocked by collapse trigger. [#9398](https://github.com/ant-design/ant-design/issues/9398) [@MJ111](https://github.com/MJ111)
- 🐞 Fix badge works wrong in dot mode. [#9359](https://github.com/ant-design/ant-design/issues/9359) [@khayalan-mathew](https://github.com/khayalan-mathew)
## 3.2.1
`2018-02-11`
- 🌟 Add icons of some famous products. [c04377e5](https://github.com/ant-design/ant-design/commit/c04377e5413d344b37c34ceac6fee456933fa516)
- Mention
- 🌟 `multiLines` mode will support autosize.
- 🐞 Fix paste not working when `placeholder` is specified. [#9215](https://github.com/ant-design/ant-design/issues/9215)
- Table
- 🐞 Fix padding of middle size table. [#9319](https://github.com/ant-design/ant-design/issues/9319)
- 🐞 Fix border bug of small size table. [#8980](https://github.com/ant-design/ant-design/issues/8980)
- 🐞 Fix overflow issue of sort icon interactive area. [#8979](https://github.com/ant-design/ant-design/issues/8979)
- 🌟 Improve typescript definition of `column.dataIndex`. [#9298](https://github.com/ant-design/ant-design/pull/9298) [@clinyong](https://github.com/clinyong)
- Select
- 🐞 Fix wrong scroll position when navigating active item with keyboard. [#9276](https://github.com/ant-design/ant-design/issues/9276)
- 🐞 Fix arrow position in IE11.
- 🐞 Fix issue that file item showing `uploading` when Upload `beforeUpload` return false. [#8020](https://github.com/ant-design/ant-design/issues/8020)
- 🐞 Fix misplace of feedback icon of `vertical` layout Form. [#9153](https://github.com/ant-design/ant-design/issues/9153)
- 🐞 Fix loading style missing of empty childen Card. [#9258](https://github.com/ant-design/ant-design/issues/9258)
- 🐞 Fix background color of Avatar when image source is not existe. [#9278](https://github.com/ant-design/ant-design/pull/9278) [@andriijas](https://github.com/andriijas)
- 🐞 Fix RangePicker `Cannot read property 'locale' of undefined` error when select end date. [#9267](https://github.com/ant-design/ant-design/issues/9267)
- 🐞 Fix style problem when using disabled button with Tooltip inside ButtonGroup. [#9296](https://github.com/ant-design/ant-design/issues/9296) [#9296](https://github.com/ant-design/ant-design/issues/9296)
- 🐞 Fix z-index of Dropdown's submenu. [#9218](https://github.com/ant-design/ant-design/issues/9218)
## 3.2.0
`2018-02-04`
- 🌟 Add new `tabBarGutter` prop to Tab to allow setting gutter between tabs. [#8644](https://github.com/ant-design/ant-design/pull/8644) [@lixiaoyang1992](https://github.com/lixiaoyang1992)
- 🌟 Add new `hasSider` prop to Layout to avoid render error when server rendering. [#8937](https://github.com/ant-design/ant-design/issues/8937)
- 🌟 Add new `successPercent` to Progress to allow showing two phases. [Demo](https://ant.design/components/progress/#components-progress-demo-segment)
- 🌟 Add new `iconType` prop to Alert to allow settting icon type. [#8811](https://github.com/ant-design/ant-design/pull/8811) [@minwe](https://github.com/ant-design/ant-design/pull/8811)
- 🌟 Add `id` prop to DatePicker. [#8598](https://github.com/ant-design/ant-design/pull/8598) [@mgrdevport](https://github.com/mgrdevport)
- 🌟 Add new `forceRender` prop to Collapse to allow rendering hide panel. [#9192](https://github.com/ant-design/ant-design/pull/9192) [#Pyroboomka](https://github.com/ant-design/ant-design/pull/9192) [@paulcmason](https://github.com/react-component/collapse/pull/82)
- RangePicker
- 🌟 Improve `ranges` prop to allow passing function to it. [#8281](https://github.com/ant-design/ant-design/issues/8281)
- 🐞 Fix issue resulting in can not input start date manually. [#6999](https://github.com/ant-design/ant-design/issues/6999)
- 🐞 Fix issue resulting date panel being closed without animation when click on the preset range. [#6364](https://github.com/ant-design/ant-design/issues/6364)
- 🐞 Fix issue resulting `onOk` is not being trigged, when click on the preset range. [#7747](https://github.com/ant-design/ant-design/issues/7747)
- Select
- 🌟 Improve `onChange``onDeselect`, they will receive selected `Option` as second paramteter.
- 🐞 Fix issue resulting in `onSelect` is not trigged when using automatic tokenization. [#9094](https://github.com/ant-design/ant-design/issues/9094)
- 🐞 Fix the missing scrollbar in Chrome.
- 🌟 Improve Table's `rowSelection[getCheckboxProps]` prop, now the all the properties returned by `getCheckboxProps` will be passed to checkbox. [#9054](https://github.com/ant-design/ant-design/pull/9054) [@mgrdevport](https://github.com/ant-design/ant-design/pull/9054)
- 🐞 Fix issue resulting in Calendar's `mode` not being allowed to be changed from outside. [#9243](https://github.com/ant-design/ant-design/pull/9243) [@mgrdevport](https://github.com/ant-design/ant-design/pull/9243)
- 🐞 Fix issue resulting AutoComplete showing wrong border when showing validattion message.[9f2b490](https://github.com/ant-design/ant-design/commit/9f2b4905f09fca503da7a8bb5f2b8347bea663b7)
- 🐞 Fix issue resulting in DatePicker showing wrong time in the control mode. [#8885](https://github.com/ant-design/ant-design/issues/8885)
- 🐞 Fix issue resulting in TextArea showing wrong height in Edge. [#9108](https://github.com/ant-design/ant-design/pull/9108) [@cuyl](https://github.com/cuyl)
- 🐞 Fix issue resulting in Tabs showing wrong tab style when using `type="card"` combine with `tabPosition="bottom"`. [#9165](https://github.com/ant-design/ant-design/pull/9165) [@ryanhoho](https://github.com/ryanhoho)
- 🌟 Add new Kurdish locale.
## 3.1.6
`2018-01-28`
- 🐞 Revert [#9141](https://github.com/ant-design/ant-design/pull/9141) since it causes year and month can not be selected in DatePicker.
## 3.1.5
`2018-01-27`

View File

@@ -15,6 +15,76 @@ timeline: true
---
## 3.2.2
`2018-02-24`
- 🌟 添加 `Pagination` 字体变量。 [#9351](https://github.com/ant-design/ant-design/issues/9351)
- 🌟 添加 `Badge` 字重变量。 [#9352](https://github.com/ant-design/ant-design/issues/9352)
- 🐞 修复 `Table` 当自定义 `loading.indicator`不显示emptyText。 [#9355](https://github.com/ant-design/ant-design/issues/9355)
- 🐞 修复 `Form.create` 。 [#9331](https://github.com/ant-design/ant-design/issues/9331)
- 🐞 回滚 `Table``column.dataIndex` 的 TypeScript 定义。 [#9393](https://github.com/ant-design/ant-design/issues/9393)
- 🐞 修复 `Layout` 中 sider 高度不足时,最后一个菜单无法显示。 [#9398](https://github.com/ant-design/ant-design/issues/9398) [@MJ111](https://github.com/MJ111)
- 🐞 修复 `Badge` dot 模式问题。 [#9359](https://github.com/ant-design/ant-design/issues/9359) [@khayalan-mathew](https://github.com/khayalan-mathew)
## 3.2.1
`2018-02-11`
- 🌟 新增了部分著名产品的图标。[c04377e5](https://github.com/ant-design/ant-design/commit/c04377e5413d344b37c34ceac6fee456933fa516)
- Mention
- 🌟 现在 `multiLines` 模式的高度将默认自适应内容。
- 🐞 修复指定了 `placeholder` 时无法粘贴内容的问题。[#9215](https://github.com/ant-design/ant-design/issues/9215)
- Table
- 🐞 修复中号表格的 padding。[#9319](https://github.com/ant-design/ant-design/issues/9319)
- 🐞 修复小号表格的边框错位问题。[#8980](https://github.com/ant-design/ant-design/issues/8980)
- 🐞 修复排序图标点击区域溢出表头的问题。[#8979](https://github.com/ant-design/ant-design/issues/8979)
- 🌟 优化了 `column.dataIndex` 的 TypeScript 定义。[#9298](https://github.com/ant-design/ant-design/pull/9298) [@clinyong](https://github.com/clinyong)
- Select
- 🐞 修复使用键盘导航时,滚动条不会自动定位的问题。[#9276](https://github.com/ant-design/ant-design/issues/9276)
- 🐞 修复在 IE11 下的箭头位置。
- 🐞 修复 Upload `beforeUpload` 返回 `false` 时,上传文件仍然显示 `uploading` 以及文件列表被替换的问题。[#8020](https://github.com/ant-design/ant-design/issues/8020)
- 🐞 修复 `vertical` 布局的 Form 下反馈图标错位的问题。[#9153](https://github.com/ant-design/ant-design/issues/9153)
- 🐞 修复 Card 没有子节点时 `loading` 样式不生效的问题。[#9258](https://github.com/ant-design/ant-design/issues/9258)
- 🐞 修复 Avatar 的图片不存在时的背景色。[#9278](https://github.com/ant-design/ant-design/pull/9278) [@andriijas](https://github.com/andriijas)
- 🐞 修复 RangePicker 选择结束时间时报 `Cannot read property 'locale' of undefined` 的问题。[#9267](https://github.com/ant-design/ant-design/issues/9267)
- 🐞 修复 ButtonGroup 内使用了失效按钮和 Tooltip 时样式错位的问题。[#9296](https://github.com/ant-design/ant-design/issues/9296) [#9296](https://github.com/ant-design/ant-design/issues/9296)
- 🐞 修复 Dropdown 的子菜单被遮挡的问题。[#9218](https://github.com/ant-design/ant-design/issues/9218)
## 3.2.0
`2018-02-04`
- 🌟 Tab 新增 `tabBarGutter` 属性,用于设置 tabs 之间的间隙。[#8644](https://github.com/ant-design/ant-design/pull/8644) [@lixiaoyang1992](https://github.com/lixiaoyang1992)
- 🌟 Layout 新增 `hasSider` 属性,用于避免服务端渲染时显示问题。[#8937](https://github.com/ant-design/ant-design/issues/8937)
- 🌟 Progress 新增 `successPercent` 属性,用于显示分段进度条。[例子](https://ant.design/components/progress-cn/#components-progress-demo-segment)
- 🌟 Alert 新增 `iconType` 属性,用于显示自定义图标。[#8811](https://github.com/ant-design/ant-design/pull/8811) [@minwe](https://github.com/ant-design/ant-design/pull/8811)
- 🌟 DatePicker 新增 `id` 属性。[#8598](https://github.com/ant-design/ant-design/pull/8598) [@mgrdevport](https://github.com/mgrdevport)
- 🌟 Collapse 新增 `forceRender` 属性,用于渲染隐藏的内容。[#9192](https://github.com/ant-design/ant-design/pull/9192) [#Pyroboomka](https://github.com/ant-design/ant-design/pull/9192) [@paulcmason](https://github.com/react-component/collapse/pull/82)
- RangePicker
- 🌟 改进 `ranges` 属性,使其支持方法。[#8281](https://github.com/ant-design/ant-design/issues/8281)
- 🐞 修复无法手动输入开始时间的问题。[#6999](https://github.com/ant-design/ant-design/issues/6999)
- 🐞 修复点击预设范围关闭日期面板的时候没有动画的问题。[#6364](https://github.com/ant-design/ant-design/issues/6364)
- 🐞 修复点击预设范围时不触发 `onOk` 的问题。[#7747](https://github.com/ant-design/ant-design/issues/7747)
- Select
- 🌟 改进了 `onChange``onDeselect` 方法,现在他们会接受选中的 `Option` 作为第二个参数。
- 🐞 修复自动分词不触发 `onSelect` 的问题。[#9094](https://github.com/ant-design/ant-design/issues/9094)
- 🐞 修复 Chrome 上下拉框没有滚动条的问题。
- 🌟 改进 Table 的 `rowSelection[getCheckboxProps]` 属性,现在可以传任意属性给 chekbox 了。[#9054](https://github.com/ant-design/ant-design/pull/9054) [@mgrdevport](https://github.com/ant-design/ant-design/pull/9054)
- 🐞 修复 Calendar 的 `mode` 属性不能从外部控制的问题。[#9243](https://github.com/ant-design/ant-design/pull/9243) [@mgrdevport](https://github.com/ant-design/ant-design/pull/9243)
- 🐞 修复 AutoComplete 在 Form 中显示错误信息时的边框颜色。[9f2b490](https://github.com/ant-design/ant-design/commit/9f2b4905f09fca503da7a8bb5f2b8347bea663b7)
- 🐞 修复 DatePicker 在受控模式下时间显示不正确的问题。[#8885](https://github.com/ant-design/ant-design/issues/8885)
- 🐞 修复 TextArea 在 Edge 下高度计算错误的问题。[#9108](https://github.com/ant-design/ant-design/pull/9108) [@cuyl](https://github.com/cuyl)
- 🐞 修复 Tabs 在 card 模式且 tabPosition 是 `bottom` 时的样式问题。[#9165](https://github.com/ant-design/ant-design/pull/9165) [@ryanhoho](https://github.com/ryanhoho)
- 🌟 新增库尔德语。
## 3.1.6
`2018-01-28`
- 🐞 回退了 [#9141](https://github.com/ant-design/ant-design/pull/9141) 的修改,因其导致的 DatePicker 年月无法选择。
## 3.1.5
`2018-01-27`
@@ -321,7 +391,7 @@ timeline: true
```
- Select
- 🌟 默认和多选模式下 Option 的值允许使用 number。
- 🌟 新增 `maxTagCount 和 `maxTagPlaceholder`,用设置最多可显示的选中项。
- 🌟 新增 `maxTagCount 和 `maxTagPlaceholder`,用设置最多可显示的选中项。
- 🌟 新增 `showAction`,用于设置出发下拉框打开的事件。
- 🌟 新增 `onMouseEnter``onMouseLeave` 事件回调。
- LocaleProvider

View File

@@ -92,6 +92,7 @@ See [i18n](http://ant.design/docs/react/i18n).
```bash
$ git clone git@github.com:ant-design/ant-design.git
$ cd ant-design
$ npm install
$ npm start
```

View File

@@ -21,5 +21,6 @@ Alert component for feedback.
| description | Additional content of Alert | string\|ReactNode | - |
| message | Content of Alert | string\|ReactNode | - |
| showIcon | Whether to show icon | boolean | false, in `banner` mode default is true |
| iconType | Icon type, effective when `showIcon` is `true` | string | - |
| type | Type of Alert styles, options: `success`, `info`, `warning`, `error` | string | `info`, in `banner` mode default is `warning` |
| onClose | Callback when Alert is closed | Function | - |

View File

@@ -23,6 +23,7 @@ export interface AlertProps {
onClose?: React.MouseEventHandler<HTMLAnchorElement>;
/** Whether to show icon */
showIcon?: boolean;
iconType?: string;
style?: React.CSSProperties;
prefixCls?: string;
className?: string;
@@ -59,7 +60,7 @@ export default class Alert extends React.Component<AlertProps, any> {
render() {
let {
closable, description, type, prefixCls = 'ant-alert', message, closeText, showIcon, banner,
className = '', style,
className = '', style, iconType,
} = this.props;
// banner模式默认有 Icon
@@ -67,27 +68,28 @@ export default class Alert extends React.Component<AlertProps, any> {
// banner模式默认为警告
type = banner && type === undefined ? 'warning' : type || 'info';
let iconType = '';
switch (type) {
case 'success':
iconType = 'check-circle';
break;
case 'info':
iconType = 'info-circle';
break;
case 'error':
iconType = 'cross-circle';
break;
case 'warning':
iconType = 'exclamation-circle';
break;
default:
iconType = 'default';
}
if (!iconType) {
switch (type) {
case 'success':
iconType = 'check-circle';
break;
case 'info':
iconType = 'info-circle';
break;
case 'error':
iconType = 'cross-circle';
break;
case 'warning':
iconType = 'exclamation-circle';
break;
default:
iconType = 'default';
}
// use outline icon in alert with description
if (!!description) {
iconType += '-o';
// use outline icon in alert with description
if (!!description) {
iconType += '-o';
}
}
let alertCls = classNames(prefixCls, {

View File

@@ -22,5 +22,6 @@ title: Alert
| description | 警告提示的辅助性文字介绍 | string\|ReactNode | 无 |
| message | 警告提示内容 | string\|ReactNode | 无 |
| showIcon | 是否显示辅助图标 | boolean | false`banner` 模式下默认值为 true |
| iconType | 自定义图标类型,`showIcon``true` 时有效 | string | - |
| type | 指定警告提示的样式,有四种选择 `success``info``warning``error` | string | `info``banner` 模式下默认值为 `warning` |
| onClose | 关闭时触发的回调函数 | Function | 无 |

View File

@@ -83,7 +83,7 @@ export default class Avatar extends React.Component<AvatarProps, AvatarState> {
const classString = classNames(prefixCls, className, sizeCls, {
[`${prefixCls}-${shape}`]: shape,
[`${prefixCls}-image`]: src,
[`${prefixCls}-image`]: src && this.state.isImgExist,
[`${prefixCls}-icon`]: icon,
});

View File

@@ -423,6 +423,13 @@ exports[`renders ./components/badge/demo/dot.md correctly 1`] = `
data-show="true"
/>
</span>
<span
class="ant-badge"
>
<i
class="anticon anticon-notification"
/>
</span>
<span
class="ant-badge"
>

View File

@@ -0,0 +1,14 @@
import React from 'react';
import { mount } from 'enzyme';
import Badge from '../index';
describe('Badge', () => {
test('badge dot not scaling count > 9', () => {
const badge = mount(<Badge count={10} dot />);
expect(badge.find('.ant-card-multiple-words').length).toBe(0);
});
test('badge dot not showing count == 0', () => {
const badge = mount(<Badge count={0} dot />);
expect(badge.find('.ant-badge-dot').length).toBe(0);
});
});

View File

@@ -12,6 +12,7 @@ title:
## en-US
This will simply display a red badge, without a specific count.
If count equals 0, it won't display the dot.
````jsx
import { Badge, Icon } from 'antd';
@@ -21,6 +22,9 @@ ReactDOM.render(
<Badge dot>
<Icon type="notification" />
</Badge>
<Badge count={0} dot>
<Icon type="notification" />
</Badge>
<Badge dot>
<a href="#">Link something</a>
</Badge>

View File

@@ -26,7 +26,7 @@ Badge normally appears in proximity to notifications or user avatars with eye-ca
| -------- | ----------- | ---- | ------- |
| count | Number to show in badge | number\|ReactNode | |
| dot | Whether to display a red dot instead of `count` | boolean | `false` |
| offset | set offset of the badge dot, like [x, y] | [number, number] | - |
| offset | set offset of the badge dot, like`[x, y]` | `[number, number]` | - |
| overflowCount | Max count to show | number | 99 |
| showZero | Whether to show badge when `count` is zero | boolean | `false` |
| status | Set Badge as a status dot | `success` \| `processing` \| `default` \| `error` \| `warning` | `''` |

View File

@@ -59,14 +59,13 @@ export default class Badge extends React.Component<BadgeProps, any> {
offset,
...restProps,
} = this.props;
const isDot = dot || status;
let displayCount = (count as number) > (overflowCount as number) ? `${overflowCount}+` : count;
const isZero = displayCount === '0' || displayCount === 0;
const isDot = (dot && !isZero) || status;
// dot mode don't need count
if (isDot) {
displayCount = '';
}
const isZero = displayCount === '0' || displayCount === 0;
const isEmpty = displayCount === null || displayCount === undefined || displayCount === '';
const hidden = (isEmpty || (isZero && !showZero)) && !isDot;
const statusCls = classNames({
@@ -76,7 +75,7 @@ export default class Badge extends React.Component<BadgeProps, any> {
const scrollNumberCls = classNames({
[`${prefixCls}-dot`]: isDot,
[`${prefixCls}-count`]: !isDot,
[`${prefixCls}-multiple-words`]: count && count.toString && count.toString().length > 1,
[`${prefixCls}-multiple-words`]: !isDot && count && count.toString && count.toString().length > 1,
[`${prefixCls}-status-${status}`]: !!status,
});
const badgeCls = classNames(className, prefixCls, {

View File

@@ -27,7 +27,7 @@ title: Badge
| --- | --- | --- | --- |
| count | 展示的数字,大于 overflowCount 时显示为 `${overflowCount}+`,为 0 时隐藏 | number\|ReactNode | |
| dot | 不展示数字,只有一个小红点 | boolean | false |
| offset | 设置状态点的位置偏移,格式为 [x, y] | [number, number] | - |
| offset | 设置状态点的位置偏移,格式为 `[x, y]` | `[number, number]` | - |
| overflowCount | 展示封顶的数字值 | number | 99 |
| showZero | 当数值为 0 时,是否展示 Badge | boolean | false |
| status | 设置 Badge 为状态点 | Enum{ 'success', 'processing, 'default', 'error', 'warning' } | '' |

View File

@@ -24,6 +24,7 @@
text-align: center;
padding: 0 6px;
font-size: @badge-font-size;
font-weight: @badge-font-weight;
white-space: nowrap;
transform-origin: -10% center;
box-shadow: 0 0 0 1px #fff;

View File

@@ -47,6 +47,8 @@ export interface ButtonProps {
onClick?: React.FormEventHandler<any>;
onMouseUp?: React.FormEventHandler<any>;
onMouseDown?: React.FormEventHandler<any>;
onKeyPress?: React.KeyboardEventHandler<any>;
onKeyDown?: React.KeyboardEventHandler<any>;
tabIndex?: number;
loading?: boolean | { delay?: number };
disabled?: boolean;

View File

@@ -36,7 +36,8 @@ To get a customized button, just set `type`/`shape`/`size`/`loading`/`disabled`.
margin-right: 8px;
margin-bottom: 12px;
}
[id^=components-button-demo-] .ant-btn-group > .ant-btn {
[id^=components-button-demo-] .ant-btn-group > .ant-btn,
[id^=components-button-demo-] .ant-btn-group > span > .ant-btn {
margin-right: 0;
}
</style>

View File

@@ -156,7 +156,7 @@
}
&-background-ghost&-primary {
.button-variant-ghost(@primary-color);
.button-variant-ghost(@btn-primary-bg);
}
&-background-ghost&-danger {

View File

@@ -198,7 +198,7 @@
&:focus,
&:active,
&.active {
background: #fff;
background: @btn-default-bg;
}
}
@@ -241,6 +241,8 @@
.@{btnClassName} + .@{btnClassName},
.@{btnClassName} + &,
span + .@{btnClassName},
.@{btnClassName} + span,
& + .@{btnClassName},
& + & {
margin-left: -1px;
@@ -250,15 +252,19 @@
border-radius: 0;
}
> .@{btnClassName}:first-child {
> .@{btnClassName}:first-child,
> span:first-child > .@{btnClassName} {
margin-left: 0;
&:not(:last-child) {
border-bottom-right-radius: 0;
border-top-right-radius: 0;
}
}
> .@{btnClassName}:last-child:not(:first-child) {
> .@{btnClassName}:first-child:not(:last-child),
> span:first-child:not(:last-child) > .@{btnClassName} {
border-bottom-right-radius: 0;
border-top-right-radius: 0;
}
> .@{btnClassName}:last-child:not(:first-child),
> span:last-child:not(:first-child) > .@{btnClassName} {
border-bottom-left-radius: 0;
border-top-left-radius: 0;
}

View File

@@ -14,4 +14,28 @@ describe('Calendar', () => {
const value = onSelect.mock.calls[0][0];
expect(Moment.isMoment(value)).toBe(true);
});
it('Calendar should change mode by prop', () => {
const monthMode = 'month';
const yearMode = 'year';
const wrapper = mount(
<Calendar />
);
expect(wrapper.state().mode).toEqual(monthMode);
wrapper.setProps({ mode: 'year' });
expect(wrapper.state().mode).toEqual(yearMode);
});
it('Calendar should switch mode', () => {
const monthMode = 'month';
const yearMode = 'year';
const onPanelChangeStub = jest.fn();
const wrapper = mount(
<Calendar mode={yearMode} onPanelChange={onPanelChangeStub} />
);
expect(wrapper.state().mode).toEqual(yearMode);
wrapper.instance().setType('date');
expect(wrapper.state().mode).toEqual(monthMode);
expect(onPanelChangeStub).toHaveBeenCalledTimes(1);
});
});

View File

@@ -91,6 +91,11 @@ export default class Calendar extends React.Component<CalendarProps, CalendarSta
value: nextProps.value!,
});
}
if ('mode' in nextProps && nextProps.mode !== this.props.mode) {
this.setState({
mode: nextProps.mode!,
});
}
}
monthCellRender = (value: moment.Moment) => {

View File

@@ -0,0 +1,2 @@
import ku_IQ from '../../date-picker/locale/ku_IQ';
export default ku_IQ;

View File

@@ -30,17 +30,15 @@ exports[`renders ./components/card/demo/basic.md correctly 1`] = `
<div
class="ant-card-body"
>
<div>
<p>
Card content
</p>
<p>
Card content
</p>
<p>
Card content
</p>
</div>
<p>
Card content
</p>
<p>
Card content
</p>
<p>
Card content
</p>
</div>
</div>
`;
@@ -69,17 +67,15 @@ exports[`renders ./components/card/demo/border-less.md correctly 1`] = `
<div
class="ant-card-body"
>
<div>
<p>
Card content
</p>
<p>
Card content
</p>
<p>
Card content
</p>
</div>
<p>
Card content
</p>
<p>
Card content
</p>
<p>
Card content
</p>
</div>
</div>
</div>
@@ -101,23 +97,21 @@ exports[`renders ./components/card/demo/flexible-content.md correctly 1`] = `
<div
class="ant-card-body"
>
<div>
<div
class="ant-card-meta"
>
<div
class="ant-card-meta"
class="ant-card-meta-detail"
>
<div
class="ant-card-meta-detail"
class="ant-card-meta-title"
>
<div
class="ant-card-meta-title"
>
Europe Street beat
</div>
<div
class="ant-card-meta-description"
>
www.instagram.com
</div>
Europe Street beat
</div>
<div
class="ant-card-meta-description"
>
www.instagram.com
</div>
</div>
</div>
@@ -145,49 +139,47 @@ exports[`renders ./components/card/demo/grid-card.md correctly 1`] = `
<div
class="ant-card-body"
>
<div>
<div
class="ant-card-grid"
style="width:25%;text-align:center"
>
Content
</div>
<div
class="ant-card-grid"
style="width:25%;text-align:center"
>
Content
</div>
<div
class="ant-card-grid"
style="width:25%;text-align:center"
>
Content
</div>
<div
class="ant-card-grid"
style="width:25%;text-align:center"
>
Content
</div>
<div
class="ant-card-grid"
style="width:25%;text-align:center"
>
Content
</div>
<div
class="ant-card-grid"
style="width:25%;text-align:center"
>
Content
</div>
<div
class="ant-card-grid"
style="width:25%;text-align:center"
>
Content
</div>
<div
class="ant-card-grid"
style="width:25%;text-align:center"
>
Content
</div>
<div
class="ant-card-grid"
style="width:25%;text-align:center"
>
Content
</div>
<div
class="ant-card-grid"
style="width:25%;text-align:center"
>
Content
</div>
<div
class="ant-card-grid"
style="width:25%;text-align:center"
>
Content
</div>
<div
class="ant-card-grid"
style="width:25%;text-align:center"
>
Content
</div>
<div
class="ant-card-grid"
style="width:25%;text-align:center"
>
Content
</div>
<div
class="ant-card-grid"
style="width:25%;text-align:center"
>
Content
</div>
</div>
</div>
@@ -224,9 +216,7 @@ exports[`renders ./components/card/demo/in-column.md correctly 1`] = `
<div
class="ant-card-body"
>
<div>
Card content
</div>
Card content
</div>
</div>
</div>
@@ -253,9 +243,7 @@ exports[`renders ./components/card/demo/in-column.md correctly 1`] = `
<div
class="ant-card-body"
>
<div>
Card content
</div>
Card content
</div>
</div>
</div>
@@ -282,9 +270,7 @@ exports[`renders ./components/card/demo/in-column.md correctly 1`] = `
<div
class="ant-card-body"
>
<div>
Card content
</div>
Card content
</div>
</div>
</div>
@@ -312,79 +298,73 @@ exports[`renders ./components/card/demo/inner.md correctly 1`] = `
<div
class="ant-card-body"
>
<div>
<p
style="font-size:14px;color:rgba(0, 0, 0, 0.85);margin-bottom:16px;font-weight:500"
>
Group title
</p>
<p
style="font-size:14px;color:rgba(0, 0, 0, 0.85);margin-bottom:16px;font-weight:500"
>
Group title
</p>
<div
class="ant-card ant-card-bordered ant-card-type-inner"
>
<div
class="ant-card ant-card-bordered ant-card-type-inner"
class="ant-card-head"
>
<div
class="ant-card-head"
class="ant-card-head-wrapper"
>
<div
class="ant-card-head-wrapper"
class="ant-card-head-title"
>
<div
class="ant-card-head-title"
>
Inner Card title
</div>
<div
class="ant-card-extra"
>
<a
href="#"
>
More
</a>
</div>
Inner Card title
</div>
</div>
<div
class="ant-card-body"
>
<div>
Inner Card content
<div
class="ant-card-extra"
>
<a
href="#"
>
More
</a>
</div>
</div>
</div>
<div
class="ant-card ant-card-bordered ant-card-type-inner"
style="margin-top:16px"
class="ant-card-body"
>
Inner Card content
</div>
</div>
<div
class="ant-card ant-card-bordered ant-card-type-inner"
style="margin-top:16px"
>
<div
class="ant-card-head"
>
<div
class="ant-card-head"
class="ant-card-head-wrapper"
>
<div
class="ant-card-head-wrapper"
class="ant-card-head-title"
>
<div
class="ant-card-head-title"
Inner Card title
</div>
<div
class="ant-card-extra"
>
<a
href="#"
>
Inner Card title
</div>
<div
class="ant-card-extra"
>
<a
href="#"
>
More
</a>
</div>
</div>
</div>
<div
class="ant-card-body"
>
<div>
Inner Card content
More
</a>
</div>
</div>
</div>
<div
class="ant-card-body"
>
Inner Card content
</div>
</div>
</div>
</div>
@@ -483,34 +463,32 @@ exports[`renders ./components/card/demo/meta.md correctly 1`] = `
<div
class="ant-card-body"
>
<div>
<div
class="ant-card-meta"
>
<div
class="ant-card-meta"
class="ant-card-meta-avatar"
>
<span
class="ant-avatar ant-avatar-circle ant-avatar-image"
>
<img
src="https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png"
/>
</span>
</div>
<div
class="ant-card-meta-detail"
>
<div
class="ant-card-meta-avatar"
class="ant-card-meta-title"
>
<span
class="ant-avatar ant-avatar-circle ant-avatar-image"
>
<img
src="https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png"
/>
</span>
Card title
</div>
<div
class="ant-card-meta-detail"
class="ant-card-meta-description"
>
<div
class="ant-card-meta-title"
>
Card title
</div>
<div
class="ant-card-meta-description"
>
This is the description
</div>
This is the description
</div>
</div>
</div>
@@ -557,17 +535,15 @@ exports[`renders ./components/card/demo/simple.md correctly 1`] = `
<div
class="ant-card-body"
>
<div>
<p>
Card content
</p>
<p>
Card content
</p>
<p>
Card content
</p>
</div>
<p>
Card content
</p>
<p>
Card content
</p>
<p>
Card content
</p>
</div>
</div>
`;
@@ -679,11 +655,9 @@ exports[`renders ./components/card/demo/tabs.md correctly 1`] = `
<div
class="ant-card-body"
>
<div>
<p>
content1
</p>
</div>
<p>
content1
</p>
</div>
</div>
<br />
@@ -791,11 +765,9 @@ exports[`renders ./components/card/demo/tabs.md correctly 1`] = `
<div
class="ant-card-body"
>
<div>
<p>
article content
</p>
</div>
<p>
article content
</p>
</div>
</div>
</div>

View File

@@ -180,7 +180,7 @@ export default class Card extends React.Component<CardProps, {}> {
const coverDom = cover ? <div className={`${prefixCls}-cover`}>{cover}</div> : null;
const body = (
<div className={`${prefixCls}-body`} style={bodyStyle}>
{loading ? loadingBlock : <div>{children}</div>}
{loading ? loadingBlock : children}
</div>
);
const actionDom = actions && actions.length ?
@@ -192,7 +192,7 @@ export default class Card extends React.Component<CardProps, {}> {
<div {...divProps} className={classString} ref={this.saveRef}>
{head}
{coverDom}
{children ? body : null}
{body}
{actionDom}
</div>
);

View File

@@ -69,6 +69,30 @@ exports[`renders ./components/carousel/demo/autoplay.md correctly 1`] = `
1
</h3>
</div>
<div
class="slick-slide slick-cloned"
data-index="5"
>
<h3>
2
</h3>
</div>
<div
class="slick-slide slick-cloned"
data-index="6"
>
<h3>
3
</h3>
</div>
<div
class="slick-slide slick-cloned"
data-index="7"
>
<h3>
4
</h3>
</div>
</div>
</div>
</div>
@@ -144,6 +168,30 @@ exports[`renders ./components/carousel/demo/basic.md correctly 1`] = `
1
</h3>
</div>
<div
class="slick-slide slick-cloned"
data-index="5"
>
<h3>
2
</h3>
</div>
<div
class="slick-slide slick-cloned"
data-index="6"
>
<h3>
3
</h3>
</div>
<div
class="slick-slide slick-cloned"
data-index="7"
>
<h3>
4
</h3>
</div>
</div>
</div>
</div>
@@ -278,6 +326,30 @@ exports[`renders ./components/carousel/demo/vertical.md correctly 1`] = `
1
</h3>
</div>
<div
class="slick-slide slick-cloned"
data-index="5"
>
<h3>
2
</h3>
</div>
<div
class="slick-slide slick-cloned"
data-index="6"
>
<h3>
3
</h3>
</div>
<div
class="slick-slide slick-cloned"
data-index="7"
>
<h3>
4
</h3>
</div>
</div>
</div>
</div>

View File

@@ -15,6 +15,8 @@ export interface AbstractCheckboxProps {
onChange?: React.ChangeEventHandler<HTMLInputElement>;
onMouseEnter?: React.MouseEventHandler<any>;
onMouseLeave?: React.MouseEventHandler<any>;
onKeyPress?: React.KeyboardEventHandler<any>;
onKeyDown?: React.KeyboardEventHandler<any>;
value?: any;
tabIndex?: number;
name?: string;

View File

@@ -10,6 +10,7 @@ export interface CollapsePanelProps {
style?: React.CSSProperties;
showArrow?: boolean;
prefixCls?: string;
forceRender?: boolean;
}
export default class CollapsePanel extends React.Component<CollapsePanelProps, {}> {

View File

@@ -30,3 +30,4 @@ A content area which can be collapsed and expanded.
| header | Title of the panel | string\|ReactNode | - |
| key | Unique key identifying the panel from among its siblings | string | - |
| showArrow | If `false`, panel will not show arrow icon | boolean | `true` |
| forceRender | Forced render of content on panel, instead of lazy rending after clicking on header | boolean | `false` |

View File

@@ -30,3 +30,4 @@ cols: 1
| disabled | 禁用后的面板展开与否将无法通过用户交互改变 | boolean | false |
| header | 面板头内容 | string\|ReactNode | 无 |
| key | 对应 activeKey | string | 无 |
| forceRender | 被隐藏时是否渲染 DOM 结构 | boolean | false |

View File

@@ -7,7 +7,7 @@ import classNames from 'classnames';
import Icon from '../icon';
import warning from '../_util/warning';
import callMoment from '../_util/callMoment';
import { RangePickerValue } from './interface';
import { RangePickerValue, RangePickerPresetRange } from './interface';
export interface RangePickerState {
value?: RangePickerValue;
@@ -150,6 +150,35 @@ export default class RangePicker extends React.Component<any, RangePickerState>
handleHoverChange = (hoverValue: any) => this.setState({ hoverValue });
handleRangeMouseLeave = () => {
if (this.state.open) {
this.clearHoverValue();
}
}
handleCalendarInputSelect = (value: RangePickerValue) => {
if (!value[0]) {
return;
}
this.setState(({ showDate }) => ({
value,
showDate: getShowDateFromValue(value) || showDate,
}));
}
handleRangeClick = (value: RangePickerPresetRange) => {
if (typeof value === 'function') {
value = value();
}
this.setValue(value, true);
const { onOk } = this.props;
if (onOk) {
onOk(value);
}
}
setValue(value: RangePickerValue, hidePanel?: boolean) {
this.handleChange(value);
if ((hidePanel || !this.props.showTime) && !('open' in this.props)) {
@@ -184,9 +213,9 @@ export default class RangePicker extends React.Component<any, RangePickerState>
return (
<a
key={range}
onClick={() => this.setValue(value, true)}
onClick={() => this.handleRangeClick(value)}
onMouseEnter={() => this.setState({ hoverValue: value })}
onMouseLeave={this.clearHoverValue}
onMouseLeave={this.handleRangeMouseLeave}
>
{range}
</a>
@@ -263,6 +292,7 @@ export default class RangePicker extends React.Component<any, RangePickerState>
onHoverChange={this.handleHoverChange}
onPanelChange={props.onPanelChange}
showToday={showToday}
onInputSelect={this.handleCalendarInputSelect}
/>
);
@@ -311,6 +341,7 @@ export default class RangePicker extends React.Component<any, RangePickerState>
return (
<span
ref={this.savePicker}
id={props.id}
className={classNames(props.className, props.pickerClass)}
style={{ ...style, ...pickerStyle }}
tabIndex={props.disabled ? -1 : 0}

View File

@@ -131,7 +131,7 @@ export default class WeekPicker extends React.Component<any, any> {
);
};
return (
<span className={classNames(className, pickerClass)}>
<span className={classNames(className, pickerClass)} id={this.props.id}>
<RcDatePicker
{...this.props}
calendar={calendar}

View File

@@ -3,7 +3,14 @@ import { mount } from 'enzyme';
import moment from 'moment';
import MockDate from 'mockdate';
import DatePicker from '..';
import { selectDate } from './utils';
import {
selectDate,
openPanel,
clearInput,
nextYear,
nextMonth,
hasSelected,
} from './utils';
import focusTest from '../../../tests/shared/focusTest';
describe('DatePicker', () => {
@@ -87,27 +94,48 @@ describe('DatePicker', () => {
render() {
return (
<div>
<DatePicker
showTime
value={this.state.value}
format="YYYY-MM-DD HH:mm:ss"
onChange={this.onChange}
/>
</div>
<DatePicker
showTime
value={this.state.value}
format="YYYY-MM-DD HH:mm:ss"
onChange={this.onChange}
/>
);
}
}
const wrapper = mount(<Test />);
// clear input
wrapper.find('.ant-calendar-picker-clear').hostNodes().simulate('click');
// open panel
wrapper.find('.ant-calendar-picker-input').simulate('click');
// select a date
clearInput(wrapper);
openPanel(wrapper);
selectDate(wrapper, moment('2016-11-13'));
expect(wrapper.find('.ant-calendar-input').getDOMNode().value).toBe('2016-11-13 12:12:12');
selectDate(wrapper, moment('2016-11-14'));
expect(wrapper.find('.ant-calendar-input').getDOMNode().value).toBe('2016-11-14 12:12:12');
});
it('triggers onChange only when date was selected', () => {
const handleChange = jest.fn();
const wrapper = mount(
<DatePicker onChange={handleChange} />
);
openPanel(wrapper);
nextYear(wrapper);
expect(handleChange).not.toBeCalled();
nextMonth(wrapper);
expect(handleChange).not.toBeCalled();
selectDate(wrapper, moment('2017-12-22'));
expect(handleChange).toBeCalled();
});
it('clear input', () => {
const wrapper = mount(
<DatePicker />
);
openPanel(wrapper);
selectDate(wrapper, moment('2016-11-23'));
clearInput(wrapper);
openPanel(wrapper);
expect(hasSelected(wrapper, moment('2016-11-22'))).toBe(true);
});
});

View File

@@ -3,6 +3,7 @@ import { mount, render } from 'enzyme';
import moment from 'moment';
import DatePicker from '../';
import { setMockDate, resetMockDate } from '../../../tests/utils';
import { selectDate } from './utils';
import focusTest from '../../../tests/shared/focusTest';
const { RangePicker } = DatePicker;
@@ -10,6 +11,14 @@ const { RangePicker } = DatePicker;
describe('RangePicker', () => {
focusTest(RangePicker);
beforeEach(() => {
setMockDate();
});
afterEach(() => {
resetMockDate();
});
it('show month panel according to value', () => {
const birthday = moment('2000-01-01', 'YYYY-MM-DD').locale('zh-cn');
const wrapper = mount(
@@ -115,7 +124,6 @@ describe('RangePicker', () => {
});
it('clear hover value after panel close', () => {
setMockDate();
jest.useFakeTimers();
const wrapper = mount(
<div>
@@ -131,6 +139,80 @@ describe('RangePicker', () => {
expect(
wrapper.find('.ant-calendar-cell').at(23).hasClass('ant-calendar-in-range-cell')
).toBe(true);
resetMockDate();
});
describe('preset range', () => {
it('static range', () => {
const range = [moment().subtract(2, 'd'), moment()];
const format = 'YYYY-MM-DD HH:mm:ss';
const wrapper = mount(
<RangePicker
ranges={{ 'recent two days': range }}
format={format}
/>
);
wrapper.find('.ant-calendar-picker-input').simulate('click');
wrapper.find('.ant-calendar-range-quick-selector a').simulate('click');
expect(
wrapper.find('.ant-calendar-range-picker-input').first().getDOMNode().value
).toBe(range[0].format(format));
expect(
wrapper.find('.ant-calendar-range-picker-input').last().getDOMNode().value
).toBe(range[1].format(format));
});
it('function range', () => {
const range = [moment().subtract(2, 'd'), moment()];
const format = 'YYYY-MM-DD HH:mm:ss';
const wrapper = mount(
<RangePicker
ranges={{ 'recent two days': () => range }}
format={format}
/>
);
wrapper.find('.ant-calendar-picker-input').simulate('click');
wrapper.find('.ant-calendar-range-quick-selector a').simulate('click');
expect(
wrapper.find('.ant-calendar-range-picker-input').first().getDOMNode().value
).toBe(range[0].format(format));
expect(
wrapper.find('.ant-calendar-range-picker-input').last().getDOMNode().value
).toBe(range[1].format(format));
});
});
// https://github.com/ant-design/ant-design/issues/6999
it('input date manually', () => {
const wrapper = mount(<RangePicker open />);
const dateString = '2008-12-31';
const input = wrapper.find('.ant-calendar-input').first();
input.simulate('change', { target: { value: dateString } });
expect(input.getDOMNode().value).toBe(dateString);
});
it('triggers onOk when click on preset range', () => {
const handleOk = jest.fn();
const range = [moment().subtract(2, 'd'), moment()];
const wrapper = mount(
<RangePicker
ranges={{ 'recent two days': range }}
onOk={handleOk}
/>
);
wrapper.find('.ant-calendar-picker-input').simulate('click');
wrapper.find('.ant-calendar-range-quick-selector a').simulate('click');
expect(handleOk).toBeCalledWith(range);
});
// https://github.com/ant-design/ant-design/issues/9267
it('invali end date not throw error', () => {
const wrapper = mount(<RangePicker />);
wrapper.find('.ant-calendar-picker-input').simulate('click');
selectDate(wrapper, moment('2017-09-18'), 0);
selectDate(wrapper, moment('2017-10-18'), 1);
wrapper.find('.ant-calendar-picker-input').simulate('click');
expect(() =>
wrapper.find('.ant-calendar-input').at(1).simulate('change', { target: { value: '2016-01-01' } })
).not.toThrow();
});
});

View File

@@ -1,8 +1,28 @@
/* eslint-disable import/prefer-default-export */
export function selectDate(wrapper, date, index) {
let calendar = wrapper;
if (index) {
calendar = wrapper.find('.ant-calendar-range-part')[index];
if (index !== undefined) {
calendar = wrapper.find('.ant-calendar-range-part').at(index);
}
calendar.find({ title: date.format('LL') }).simulate('click');
calendar.find({ title: date.format('LL'), role: 'gridcell' }).simulate('click');
}
export function hasSelected(wrapper, date) {
return wrapper.find({ title: date.format('LL'), role: 'gridcell' }).hasClass('ant-calendar-selected-day');
}
export function openPanel(wrapper) {
wrapper.find('.ant-calendar-picker-input').simulate('click');
}
export function clearInput(wrapper) {
wrapper.find('.ant-calendar-picker-clear').hostNodes().simulate('click');
}
export function nextYear(wrapper) {
wrapper.find('.ant-calendar-next-year-btn').simulate('click');
}
export function nextMonth(wrapper) {
wrapper.find('.ant-calendar-next-month-btn').simulate('click');
}

View File

@@ -34,6 +34,7 @@ export default function createPicker(TheCalendar: React.ComponentClass): any {
}
this.state = {
value,
showDate: value,
};
}
@@ -41,6 +42,7 @@ export default function createPicker(TheCalendar: React.ComponentClass): any {
if ('value' in nextProps) {
this.setState({
value: nextProps.value,
showDate: nextProps.value,
});
}
}
@@ -63,11 +65,18 @@ export default function createPicker(TheCalendar: React.ComponentClass): any {
handleChange = (value: moment.Moment | null) => {
const props = this.props;
if (!('value' in props)) {
this.setState({ value });
this.setState({
value,
showDate: value,
});
}
props.onChange(value, (value && value.format(props.format)) || '');
}
handleCalendarChange = (value: moment.Moment) => {
this.setState({ showDate: value });
}
focus() {
this.input.focus();
}
@@ -81,7 +90,7 @@ export default function createPicker(TheCalendar: React.ComponentClass): any {
}
render() {
const { value } = this.state;
const { value, showDate } = this.state;
const props = omit(this.props, ['onChange']);
const { prefixCls, locale, localeCode } = props;
@@ -134,7 +143,8 @@ export default function createPicker(TheCalendar: React.ComponentClass): any {
monthCellContentRender={props.monthCellContentRender}
renderFooter={this.renderFooter}
onPanelChange={props.onPanelChange}
value={value}
onChange={this.handleCalendarChange}
value={showDate}
/>
);
@@ -163,6 +173,7 @@ export default function createPicker(TheCalendar: React.ComponentClass): any {
return (
<span
id={props.id}
className={classNames(props.className, props.pickerClass)}
style={props.style}
onFocus={props.onFocus}

View File

@@ -101,7 +101,7 @@ The following APIs are shared by DatePicker, MonthPicker, RangePicker, WeekPicke
| defaultValue | to set default date | \[[moment](http://momentjs.com/), [moment](http://momentjs.com/)] | - |
| disabledTime | to specify the time that cannot be selected | function(dates: [moment, moment], partial: `'start'|'end'`) | - |
| format | to set the date format | string | "YYYY-MM-DD HH:mm:ss" |
| ranges | preseted ranges for quick selection | { [range: string]&#x3A; [moment](http://momentjs.com/)\[] } | - |
| ranges | preseted ranges for quick selection | { \[range: string\]&#x3A; [moment](http://momentjs.com/)\[] } \| () => { \[range: string\]&#x3A; [moment](http://momentjs.com/)\[] } | - |
| renderExtraFooter | render extra footer in panel | () => React.ReactNode | - |
| showTime | to provide an additional time selection | object\|boolean | [TimePicker Options](/components/time-picker/#API) |
| showTime.defaultValue | to set default time of selected date, [demo](https://ant.design/components/date-picker/#components-date-picker-demo-disabled-date) | [moment](http://momentjs.com/)\[] | [moment(), moment()] |

View File

@@ -101,7 +101,7 @@ subtitle: 日期选择框
| defaultValue | 默认日期 | [moment](http://momentjs.com/)\[] | 无 |
| disabledTime | 不可选择的时间 | function(dates: [moment, moment], partial: `'start'|'end'`) | 无 |
| format | 展示的日期格式 | string | "YYYY-MM-DD HH:mm:ss" |
| ranges       | 预设时间范围快捷选择 | { [range: string]&#x3A; [moment](http://momentjs.com/)\[] } | 无 |
| ranges       | 预设时间范围快捷选择 | { \[range: string\]&#x3A; [moment](http://momentjs.com/)\[] } \| () => { \[range: string\]&#x3A; [moment](http://momentjs.com/)\[] } | 无 |
| renderExtraFooter | 在面板中添加额外的页脚 | () => React.ReactNode | - |
| showTime | 增加时间选择功能 | Object\|boolean | [TimePicker Options](/components/time-picker/#API) |
| showTime.defaultValue | 设置用户选择日期时默认的时分秒,[例子](https://ant.design/components/date-picker/#components-date-picker-demo-disabled-date) | [moment](http://momentjs.com/)\[] | [moment(), moment()] |

View File

@@ -3,6 +3,7 @@ import * as moment from 'moment';
import { TimePickerProps } from '../time-picker';
export interface PickerProps {
id?: number | string;
prefixCls?: string;
inputPrefixCls?: string;
format?: string;
@@ -53,7 +54,7 @@ export type RangePickerValue =
[moment.Moment] |
[undefined, moment.Moment] |
[moment.Moment, moment.Moment];
export type RangePickerRange = RangePickerValue | (() => RangePickerValue);
export type RangePickerPresetRange = RangePickerValue | (() => RangePickerValue);
export interface RangePickerProps extends PickerProps {
className?: string;
@@ -65,7 +66,7 @@ export interface RangePickerProps extends PickerProps {
onOk?: (selectedTime: moment.Moment) => void;
showTime?: TimePickerProps | boolean;
ranges?: {
[range: string]: RangePickerRange,
[range: string]: RangePickerPresetRange,
};
placeholder?: [string, string];
mode?: string | string[];

View File

@@ -0,0 +1,18 @@
import CalendarLocale from 'rc-calendar/lib/locale/ku_IQ';
import TimePickerLocale from '../../time-picker/locale/ku_IQ';
// Merge into a locale object
const locale = {
lang: {
placeholder: 'Dîrok hilbijêre',
rangePlaceholder: ['Dîroka destpêkê', 'Dîroka dawîn'],
...CalendarLocale,
},
timePickerLocale: {
...TimePickerLocale,
},
};
// All settings at:
// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json
export default locale;

View File

@@ -126,7 +126,6 @@
.@{calendar-prefix-cls}-footer {
position: relative;
height: auto;
line-height: auto;
&-btn {
text-align: right;

View File

@@ -49,16 +49,18 @@ export default class Dropdown extends React.Component<DropDownProps, any> {
}
render() {
const { children, prefixCls, overlay, trigger, disabled } = this.props;
const dropdownTrigger = React.cloneElement(children as any, {
className: classNames((children as any).props.className, `${prefixCls}-trigger`),
const { children, prefixCls, overlay: overlayElements, trigger, disabled } = this.props;
const child = React.Children.only(children);
const overlay = React.Children.only(overlayElements);
const dropdownTrigger = React.cloneElement(child, {
className: classNames(child.props.className, `${prefixCls}-trigger`),
disabled,
});
// menu cannot be selectable in dropdown defaultly
const overlayProps = overlay && (overlay as any).props;
const selectable = (overlayProps && 'selectable' in overlayProps)
? overlayProps.selectable : false;
const fixedModeOverlay = React.cloneElement(overlay as any, {
const selectable = overlay.props.selectable || false;
const fixedModeOverlay = React.cloneElement(overlay, {
mode: 'vertical',
selectable,
});

View File

@@ -54,6 +54,7 @@
&-submenu-popup {
position: absolute;
z-index: @zindex-dropdown;
}
&-item,

View File

@@ -117,10 +117,10 @@ export type Diff<T extends string, U extends string> =
({ [P in T]: P } & { [P in U]: never } & { [x: string]: never })[T];
export type Omit<T, K extends keyof T> = Pick<T, Diff<keyof T, K>>;
export interface ComponentDecorator<TOwnProps> {
export interface ComponentDecorator {
<P extends FormComponentProps>(
component: React.ComponentClass<P> | React.SFC<P>,
): React.ComponentClass<Omit<P, keyof FormComponentProps> & TOwnProps>;
): React.ComponentClass<Omit<P, keyof FormComponentProps>>;
}
export default class Form extends React.Component<FormProps, any> {
@@ -149,7 +149,7 @@ export default class Form extends React.Component<FormProps, any> {
static createFormField = createFormField;
static create = function<TOwnProps>(options: FormCreateOption<TOwnProps> = {}): ComponentDecorator<TOwnProps> {
static create = function<TOwnProps>(options: FormCreateOption<TOwnProps> = {}): ComponentDecorator {
return createDOMForm({
fieldNameProp: 'id',
...options,

View File

@@ -186,7 +186,8 @@ export default class FormItem extends React.Component<FormItemProps, any> {
}
return (
<div className={classes}>
{c1}{c2}{c3}
<span className={`${this.props.prefixCls}-item-children`}>{c1}</span>
{c2}{c3}
</div>
);
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
/* tslint:disable */
import * as React from 'react';
import Form, { FormComponentProps } from '../Form';
import Form, { FormComponentProps, FormCreateOption } from '../Form';
// test Form.create on component without own props
class WithoutOwnProps extends React.Component<any, any> {
@@ -34,3 +34,28 @@ class WithOwnProps extends React.Component<WithOwnPropsProps, any> {
const WithOwnPropsForm = Form.create()(WithOwnProps);
<WithOwnPropsForm name="foo" />;
// test Form.create with options
interface WithCreateOptionsProps extends FormComponentProps {
username: string;
}
class WithCreateOptions extends React.Component<WithCreateOptionsProps, {}> {
render() {
return <div>foo</div>;
}
}
const mapPropsToFields = (props: WithCreateOptionsProps) => {
const { username } = props;
return {
username: Form.createFormField({ value: username })
};
};
const formOptions: FormCreateOption<WithCreateOptionsProps> = { mapPropsToFields };
const WithCreateOptionsForm = Form.create(formOptions)(WithCreateOptions);
<WithCreateOptionsForm username="foo" />

View File

@@ -87,6 +87,10 @@ input[type="checkbox"] {
.clearfix;
}
&-children {
position: relative;
}
&-with-help {
margin-bottom: @form-item-margin-bottom - @font-size-base * @line-height-base - @form-help-margin-top;
transition: none;
@@ -233,8 +237,8 @@ form {
margin-left: 0;
}
.@{ant-prefix}-input-number {
margin-right: 8px;
.@{ant-prefix}-input-number + .@{form-prefix-cls}-text {
margin-left: 8px;
}
.@{ant-prefix}-select,
@@ -396,15 +400,16 @@ form {
.has-warning,
.has-error,
.is-validating {
&.has-feedback:after {
&.has-feedback .@{form-prefix-cls}-item-children:after {
position: absolute;
top: 0;
top: 50%;
right: 0;
visibility: visible;
pointer-events: none;
width: @form-component-height;
height: @form-component-max-height;
line-height: @form-component-max-height;
height: 20px;
line-height: 20px;
margin-top: -10px;
text-align: center;
font-size: @form-feedback-icon-size;
animation: zoomIn .3s @ease-out-back;
@@ -414,7 +419,7 @@ form {
}
.has-success {
&.has-feedback:after {
&.has-feedback .@{form-prefix-cls}-item-children:after {
animation-name: diffZoomIn1 !important;
content: '\e630';
color: @success-color;
@@ -424,7 +429,7 @@ form {
.has-warning {
.form-control-validation(@warning-color; @warning-color;);
&.has-feedback:after {
&.has-feedback .@{form-prefix-cls}-item-children:after {
content: '\e62c';
color: @warning-color;
animation-name: diffZoomIn3 !important;
@@ -471,7 +476,7 @@ form {
.has-error {
.form-control-validation(@error-color; @error-color;);
&.has-feedback:after {
&.has-feedback .@{form-prefix-cls}-item-children:after {
content: '\e62e';
color: @error-color;
animation-name: diffZoomIn2 !important;
@@ -488,6 +493,12 @@ form {
}
}
.@{ant-prefix}-select.@{ant-prefix}-select-auto-complete {
.@{ant-prefix}-input:focus {
border-color: @error-color;
}
}
.@{ant-prefix}-input-group-addon .@{ant-prefix}-select {
&-selection {
border-color: transparent;
@@ -535,7 +546,7 @@ form {
}
.is-validating {
&.has-feedback:after {
&.has-feedback .@{form-prefix-cls}-item-children:after {
display: inline-block;
animation: loadingCircle 1s infinite linear;
content: "\e64d";

View File

@@ -138,7 +138,7 @@ export default function calculateNodeHeight(
if (minRows !== null || maxRows !== null) {
// measure height of a textarea with a single row
hiddenTextarea.value = '';
hiddenTextarea.value = ' ';
let singleRowHeight = hiddenTextarea.scrollHeight - paddingSize;
if (minRows !== null) {
minHeight = singleRowHeight * minRows;

View File

@@ -212,7 +212,7 @@ export default class Sider extends React.Component<SiderProps, SliderState> {
};
const siderCls = classNames(className, prefixCls, {
[`${prefixCls}-collapsed`]: !!this.state.collapsed,
[`${prefixCls}-has-trigger`]: !!trigger,
[`${prefixCls}-has-trigger`]: collapsible && trigger !== null && !zeroWidthTrigger,
[`${prefixCls}-below`]: !!this.state.below,
[`${prefixCls}-zero-width`]: siderWidth === 0 || siderWidth === '0' || siderWidth === '0px',
});

View File

@@ -688,7 +688,7 @@ exports[`renders ./components/layout/demo/side.md correctly 1`] = `
style="min-height:100vh"
>
<div
class="ant-layout-sider"
class="ant-layout-sider ant-layout-sider-has-trigger"
style="flex:0 0 200px;max-width:200px;min-width:200px;width:200px"
>
<div

View File

@@ -24,4 +24,14 @@ describe('Layout', () => {
);
expect(wrapper.find('.ant-layout').hasClass('ant-layout-has-sider')).toBe(true);
});
it('detect ant-layout-sider-has-trigger class in sider when ant-layout-sider-trigger div tag exists', async () => {
const wrapper = mount(
<Layout>
<div><Sider collapsible>Sider</Sider></div>
<Content>Content</Content>
</Layout>
);
expect(wrapper.find('.ant-layout-sider').hasClass('ant-layout-sider-has-trigger')).toBe(true);
});
});

View File

@@ -77,6 +77,7 @@ The wrapper.
| -------- | ----------- | ---- | ------- |
| className | container className | string | - |
| style | to customize the styles | object | - |
| hasSider | whether contain Sider in children, don't have to assign it normally. Useful in ssr avoid style flickering | boolean | - |
> APIs of `Layout.Header` `Layout.Footer` `Layout.Content` are the same as that of `Layout`.

View File

@@ -78,6 +78,7 @@ title: Layout
| --- | --- | --- | --- |
| className | 容器 className | string | - |
| style | 指定样式 | object | - |
| hasSider | 表示子元素里有 Sider一般不用指定。可用于服务端渲染时避免样式闪动 | boolean | - |
> `Layout.Header` `Layout.Footer` `Layout.Content` API 与 `Layout` 相同

View File

@@ -7,6 +7,7 @@ export interface BasicProps {
style?: React.CSSProperties;
prefixCls?: string;
className?: string;
hasSider?: boolean;
}
function generator(props: BasicProps) {
@@ -58,9 +59,9 @@ class BasicLayout extends React.Component<BasicProps, any> {
}
render() {
const { prefixCls, className, children, ...others } = this.props;
const { prefixCls, className, children, hasSider, ...others } = this.props;
const divCls = classNames(className, prefixCls, {
[`${prefixCls}-has-sider`]: this.state.siders.length > 0,
[`${prefixCls}-has-sider`]: hasSider || this.state.siders.length > 0,
});
return (
<div className={divCls} {...others}>{children}</div>

View File

@@ -209,9 +209,7 @@ exports[`renders ./components/list/demo/grid.md correctly 1`] = `
<div
class="ant-card-body"
>
<div>
Card content
</div>
Card content
</div>
</div>
</div>
@@ -246,9 +244,7 @@ exports[`renders ./components/list/demo/grid.md correctly 1`] = `
<div
class="ant-card-body"
>
<div>
Card content
</div>
Card content
</div>
</div>
</div>
@@ -283,9 +279,7 @@ exports[`renders ./components/list/demo/grid.md correctly 1`] = `
<div
class="ant-card-body"
>
<div>
Card content
</div>
Card content
</div>
</div>
</div>
@@ -320,9 +314,7 @@ exports[`renders ./components/list/demo/grid.md correctly 1`] = `
<div
class="ant-card-body"
>
<div>
Card content
</div>
Card content
</div>
</div>
</div>
@@ -372,7 +364,7 @@ exports[`renders ./components/list/demo/infinite-virtualized-load.md correctly 1
class="ant-spin"
>
<span
class="ant-spin-dot"
class="ant-spin-dot ant-spin-dot-spin"
>
<i />
<i />
@@ -397,7 +389,7 @@ exports[`renders ./components/list/demo/loadmore.md correctly 1`] = `
class="ant-spin ant-spin-spinning"
>
<span
class="ant-spin-dot"
class="ant-spin-dot ant-spin-dot-spin"
>
<i />
<i />
@@ -474,9 +466,7 @@ exports[`renders ./components/list/demo/resposive.md correctly 1`] = `
<div
class="ant-card-body"
>
<div>
Card content
</div>
Card content
</div>
</div>
</div>
@@ -511,9 +501,7 @@ exports[`renders ./components/list/demo/resposive.md correctly 1`] = `
<div
class="ant-card-body"
>
<div>
Card content
</div>
Card content
</div>
</div>
</div>
@@ -548,9 +536,7 @@ exports[`renders ./components/list/demo/resposive.md correctly 1`] = `
<div
class="ant-card-body"
>
<div>
Card content
</div>
Card content
</div>
</div>
</div>
@@ -585,9 +571,7 @@ exports[`renders ./components/list/demo/resposive.md correctly 1`] = `
<div
class="ant-card-body"
>
<div>
Card content
</div>
Card content
</div>
</div>
</div>
@@ -622,9 +606,7 @@ exports[`renders ./components/list/demo/resposive.md correctly 1`] = `
<div
class="ant-card-body"
>
<div>
Card content
</div>
Card content
</div>
</div>
</div>
@@ -659,9 +641,7 @@ exports[`renders ./components/list/demo/resposive.md correctly 1`] = `
<div
class="ant-card-body"
>
<div>
Card content
</div>
Card content
</div>
</div>
</div>

View File

@@ -1506,7 +1506,7 @@ exports[`renders ./components/locale-provider/demo/all.md correctly 1`] = `
>
<tr>
<th
class=""
class="ant-table-column-has-filters"
>
<span>
Name

View File

@@ -39,8 +39,9 @@ import isIS from '../is_IS';
import arEG from '../ar_EG';
import ukUA from '../uk_UA';
import zhCN from '../zh_CN';
import kuIQ from '../ku_IQ';
const locales = [enUS, ptBR, ptPT, ruRU, esES, svSE, frBE, deDE, nlNL, caES, csCZ, koKR, etEE, skSK, jaJP, trTR, zhTW, fiFI, plPL, bgBG, enGB, frFR, nlBE, itIT, viVN, thTH, faIR, elGR, nbNO, srRS, isIS, arEG, ukUA, zhCN];
const locales = [enUS, ptBR, ptPT, ruRU, esES, svSE, frBE, deDE, nlNL, caES, csCZ, koKR, etEE, skSK, jaJP, trTR, zhTW, fiFI, plPL, bgBG, enGB, frFR, nlBE, itIT, viVN, thTH, faIR, elGR, nbNO, srRS, isIS, arEG, ukUA, zhCN, kuIQ];
const { Option } = Select;
const { RangePicker } = DatePicker;

View File

@@ -0,0 +1,44 @@
import Pagination from 'rc-pagination/lib/locale/ku_IQ';
import DatePicker from '../date-picker/locale/ku_IQ';
import TimePicker from '../time-picker/locale/ku_IQ';
import Calendar from '../calendar/locale/ku_IQ';
export default {
locale: 'ku-iq',
Pagination,
DatePicker,
TimePicker,
Calendar,
Table: {
filterTitle: 'Menuê peldanka',
filterConfirm: 'Temam',
filterReset: 'Jê bibe',
emptyText: 'Agahî tune',
selectAll: 'Hemî hilbijêre',
selectInvert: 'Hilbijartinan veguhere',
},
Modal: {
okText: 'Temam',
cancelText: 'Betal ke',
justOkText: 'Temam',
},
Popconfirm: {
okText: 'Temam',
cancelText: 'Betal ke',
},
Transfer: {
notFoundContent: 'Peyda Nebû',
searchPlaceholder: 'Lêgerîn',
itemUnit: 'tişt',
itemsUnit: 'tişt',
},
Select: {
notFoundContent: 'Peyda Nebû',
},
Upload: {
uploading: 'Bardike...',
removeFile: 'Pelê rabike',
uploadError: 'Xeta barkirine',
previewFile: 'Pelê pêşbibîne',
},
};

View File

@@ -1,7 +1,7 @@
import Pagination from 'rc-pagination/lib/locale/en_US';
import DatePicker from '../date-picker/locale/tr_TR';
import TimePicker from '../time-picker/locale/tr_TR';
import Calendar from '../calendar/locale/en_US';
import Calendar from '../calendar/locale/tr_TR';
export default {
locale: 'tr',

View File

@@ -13,6 +13,8 @@
.@{mention-prefix-cls}-editor {
.input;
min-height: @input-height-base;
height: auto; // To override height in .input mixin
line-height: @line-height-base;
padding: 0;
display: block;
@@ -29,6 +31,7 @@
}
.public-DraftEditorPlaceholder-root {
position: absolute;
pointer-events: none;
.public-DraftEditorPlaceholder-inner {
color: @input-placeholder-color;
opacity: 1;

View File

@@ -223,7 +223,7 @@
> .@{menu-prefix-cls}-submenu-title:hover .@{menu-prefix-cls}-submenu-arrow {
&:after,
&:before {
background: linear-gradient(to right, @primary-color, @primary-color);
background: linear-gradient(to right, @menu-highlight-color, @menu-highlight-color);
}
}
}

View File

@@ -24,6 +24,7 @@
color: @heading-color;
font-weight: 500;
font-size: @font-size-lg;
line-height: 22px;
}
.@{confirm-prefix-cls}-content {
@@ -36,8 +37,8 @@
> .@{iconfont-css-prefix} {
font-size: 22px;
margin-right: 16px;
margin-top: 1px;
float: left;
min-height: 48px;
}
}

View File

@@ -45,7 +45,7 @@
border: @border-width-base @border-style-base @border-color-base;
background-color: @component-background;
margin-right: 8px;
font-family: Arial;
font-family: @pagination-font-family;
outline: 0;
a {
@@ -134,7 +134,7 @@
&-next,
&-jump-prev,
&-jump-next {
font-family: Arial;
font-family: @pagination-font-family;
cursor: pointer;
color: @text-color;
border-radius: @border-radius-base;

View File

@@ -720,3 +720,33 @@ exports[`renders ./components/progress/demo/line-mini.md correctly 1`] = `
</div>
</div>
`;
exports[`renders ./components/progress/demo/segment.md correctly 1`] = `
<div
class="ant-progress ant-progress-line ant-progress-status-normal ant-progress-show-info ant-progress-default"
>
<div>
<div
class="ant-progress-outer"
>
<div
class="ant-progress-inner"
>
<div
class="ant-progress-bg"
style="width:60%;height:8px"
/>
<div
class="ant-progress-success-bg"
style="width:30%;height:8px"
/>
</div>
</div>
<span
class="ant-progress-text"
>
60%
</span>
</div>
</div>
`;

View File

@@ -0,0 +1,24 @@
---
order: 9
title:
zh-CN: 分段进度条
en-US: Progress bar with success segment
---
## zh-CN
标准的进度条。
## en-US
A standard progress bar.
````jsx
import { Tooltip, Progress } from 'antd';
ReactDOM.render(
<Tooltip title="3 done / 3 in progress / 4 to do">
<Progress percent={60} successPercent={30} />
</Tooltip>
, mountNode);
````

View File

@@ -27,3 +27,4 @@ If it will take a long time to complete an operation, you can use `Progress` to
| strokeWidth `(type=circle)` | to set the width of the circular progress bar, unit: percentage of the canvas width | number | 6 |
| type | to set the type, options: `line` `circle` `dashboard` | string | `line` |
| width `(type=circle)` | to set the canvas width of the circular progress bar, unit: `px` | number | 132 |
| successPercent | segmented success percent, works when `type="line"` | number | 0 |

View File

@@ -28,3 +28,4 @@ title: Progress
| strokeWidth `(type=circle)` | 圆形进度条线的宽度,单位是进度条画布宽度的百分比 | number | 6 |
| type | 类型,可选 `line` `circle` `dashboard` | string | line |
| width `(type=circle)` | 圆形进度条画布宽度,单位 px | number | 132 |
| successPercent | 已完成的分段百分比,`type="line"` 时有效 | number | 0 |

View File

@@ -15,6 +15,7 @@ export interface ProgressProps {
className?: string;
type?: 'line' | 'circle' | 'dashboard';
percent?: number;
successPercent?: number;
format?: (percent: number) => string;
status?: 'success' | 'active' | 'exception';
showInfo?: boolean;
@@ -56,7 +57,7 @@ export default class Progress extends React.Component<ProgressProps, {}> {
render() {
const props = this.props;
const {
prefixCls, className, percent = 0, status, format, trailColor, size,
prefixCls, className, percent = 0, status, format, trailColor, size, successPercent,
type, strokeWidth, width, showInfo, gapDegree = 0, gapPosition, ...restProps,
} = props;
const progressStatus = parseInt(percent.toString(), 10) >= 100 && !('status' in props) ?
@@ -83,11 +84,19 @@ export default class Progress extends React.Component<ProgressProps, {}> {
width: `${percent}%`,
height: strokeWidth || (size === 'small' ? 6 : 8),
};
const successPercentStyle = {
width: `${successPercent}%`,
height: strokeWidth || (size === 'small' ? 6 : 8),
};
const successSegment = successPercent !== undefined
? <div className={`${prefixCls}-success-bg`} style={successPercentStyle} />
: null;
progress = (
<div>
<div className={`${prefixCls}-outer`}>
<div className={`${prefixCls}-inner`}>
<div className={`${prefixCls}-bg`} style={percentStyle} />
{successSegment}
</div>
</div>
{progressInfo}

View File

@@ -35,6 +35,7 @@
background-color: @progress-remaining-color;
border-radius: 100px;
vertical-align: middle;
position: relative;
}
&-circle-trail {
@@ -46,6 +47,7 @@
animation: ~"@{ant-prefix}-progress-appear" .3s;
}
&-success-bg,
&-bg {
border-radius: 100px;
background-color: @progress-default-color;
@@ -53,6 +55,13 @@
position: relative;
}
&-success-bg {
background-color: @success-color;
position: absolute;
top: 0;
left: 0;
}
&-text {
word-break: normal;
width: 2em;

View File

@@ -43,19 +43,20 @@ Select component to select value from options.
| optionLabelProp | Which prop value of option will render as content of select. | string | `children` |
| placeholder | Placeholder of select | string\|ReactNode | - |
| showSearch | Whether show search input in single mode. | boolean | false |
| showArrow | Whether to show the drop-down arrow | boolean | true |
| size | Size of Select input. `default` `large` `small` | string | default |
| tokenSeparators | Separator used to tokenize on tag/multiple mode | string\[] | |
| value | Current selected option. | string\|number\|string\[]\|number\[] | - |
| onBlur | Called when blur | function | - |
| onChange | Called when select an option or input value change, or value of input is changed in combobox mode | function(value, label) | - |
| onDeselect | Called when a option is deselected, the params are option's value (or key) . only called for multiple or tags, effective in multiple or tags mode only. | function(value) | - |
| onChange | Called when select an option or input value change, or value of input is changed in combobox mode | function(value, option:Option/Array<Option\>) | - |
| onDeselect | Called when a option is deselected, the params are option's value (or key) . only called for multiple or tags, effective in multiple or tags mode only. | function(value, option:Option) | - |
| onFocus | Called when focus | function | - |
| onInputKeyDown | Called when key pressed | function | - |
| onMouseEnter | Called when mouse enter | function | - |
| onMouseLeave | Called when mouse leave | function | - |
| onPopupScroll | Called when dropdown scrolls | function | - |
| onSearch | Callback function that is fired when input changed. | function(value: string) | |
| onSelect | Called when a option is selected, the params are option's value (or key) and option instance. | function(value, option) | - |
| onSelect | Called when a option is selected, the params are option's value (or key) and option instance. | function(value, option:Option) | - |
### Select Methods

View File

@@ -38,8 +38,8 @@ export interface SelectProps extends AbstractSelectProps {
defaultValue?: SelectValue;
mode?: 'default' | 'multiple' | 'tags' | 'combobox';
optionLabelProp?: string;
onChange?: (value: SelectValue) => void;
onSelect?: (value: SelectValue, option: Object) => any;
onChange?: (value: SelectValue, option: React.ReactElement<any> | React.ReactElement<any>[]) => void;
onSelect?: (value: SelectValue, option: React.ReactElement<any>) => any;
onDeselect?: (value: SelectValue) => any;
onBlur?: () => any;
onFocus?: () => any;

View File

@@ -46,19 +46,20 @@ title: Select
| optionLabelProp | 回填到选择框的 Option 的属性值,默认是 Option 的子元素。比如在子元素需要高亮效果时,此值可以设为 `value`。 | string | `children` combobox 模式下为 `value` |
| placeholder | 选择框默认文字 | string | - |
| showSearch | 使单选模式可搜索 | boolean | false |
| showArrow | 是否显示下拉小箭头 | boolean | true |
| size | 选择框大小,可选 `large` `small` | string | default |
| tags | 可以把随意输入的条目作为 tag输入项不需要与下拉选项匹配2.9 之后废弃,请使用 `mode` | boolean | false |
| tokenSeparators | 在 tags 和 multiple 模式下自动分词的分隔符 | string\[] | |
| value | 指定当前选中的条目 | string\|string\[]\|number\|number\[] | - |
| onBlur | 失去焦点的时回调 | function | - |
| onChange | 选中 option或 input 的 value 变化combobox 模式下)时,调用此函数 | function(value) | - |
| onDeselect | 取消选中时调用,参数为选中项的 value (或 key) 值,仅在 multiple 或 tags 模式下生效 | function(value) | - |
| onChange | 选中 option或 input 的 value 变化combobox 模式下)时,调用此函数 | function(value, option:Option/Array<Option\>) | - |
| onDeselect | 取消选中时调用,参数为选中项的 value (或 key) 值,仅在 multiple 或 tags 模式下生效 | function(valueoption:Option) | - |
| onFocus | 获得焦点时回调 | function | - |
| onMouseEnter | 鼠标移入时回调 | function | - |
| onMouseLeave | 鼠标移出时回调 | function | - |
| onPopupScroll | 下拉列表滚动时的回调 | function | - |
| onSearch | 文本框值变化时回调 | function(value: string) | |
| onSelect | 被选中时调用,参数为选中项的 value (或 key) 值 | function(value, option) | - |
| onSelect | 被选中时调用,参数为选中项的 value (或 key) 值 | function(value, option:Option) | - |
> 注意,如果发现下拉菜单跟随页面滚动,或者需要在其他弹层中触发 Select请尝试使用 `getPopupContainer={triggerNode => triggerNode.parentNode}` 将下拉弹层渲染节点固定在触发器的父元素中。

View File

@@ -58,10 +58,10 @@
top: 50%;
right: @control-padding-horizontal - 1px;
line-height: 1;
transform: translateY(-50%);
margin-top: -@font-size-sm / 2;
transform-origin: 50% 50%;
color: @disabled-color;
font-size: 12px;
font-size: @font-size-sm;
* {
display: none;
@@ -69,7 +69,7 @@
&:before {
content: '\e61d';
transition: transform 0.2s ease;
transition: transform .3s;
}
}
@@ -376,11 +376,8 @@
}
&-open {
.@{select-prefix-cls}-arrow {
-ms-transform: rotate(180deg);
&:before {
transform: rotate(180deg);
}
.@{select-prefix-cls}-arrow:before {
transform: rotate(180deg);
}
.@{select-prefix-cls}-selection {
.active();
@@ -448,7 +445,6 @@
top: -9999px;
position: absolute;
outline: none;
overflow: hidden;
font-size: @font-size-base;
&-menu {
@@ -457,6 +453,7 @@
padding-left: 0; // Override default ul/ol
list-style: none;
max-height: 250px;
overflow: auto;
&-item-group-list {
margin: 0;

View File

@@ -5,7 +5,7 @@ exports[`renders ./components/spin/demo/basic.md correctly 1`] = `
class="ant-spin ant-spin-spinning"
>
<span
class="ant-spin-dot"
class="ant-spin-dot ant-spin-dot-spin"
>
<i />
<i />
@@ -20,7 +20,7 @@ exports[`renders ./components/spin/demo/custom-indicator.md correctly 1`] = `
class="ant-spin ant-spin-spinning"
>
<i
class="anticon anticon-spin anticon-loading"
class="anticon anticon-spin anticon-loading ant-spin-dot"
style="font-size:24px"
/>
</div>
@@ -75,7 +75,7 @@ exports[`renders ./components/spin/demo/inside.md correctly 1`] = `
class="ant-spin ant-spin-spinning"
>
<span
class="ant-spin-dot"
class="ant-spin-dot ant-spin-dot-spin"
>
<i />
<i />
@@ -133,7 +133,7 @@ exports[`renders ./components/spin/demo/size.md correctly 1`] = `
class="ant-spin ant-spin-sm ant-spin-spinning"
>
<span
class="ant-spin-dot"
class="ant-spin-dot ant-spin-dot-spin"
>
<i />
<i />
@@ -145,7 +145,7 @@ exports[`renders ./components/spin/demo/size.md correctly 1`] = `
class="ant-spin ant-spin-spinning"
>
<span
class="ant-spin-dot"
class="ant-spin-dot ant-spin-dot-spin"
>
<i />
<i />
@@ -157,7 +157,7 @@ exports[`renders ./components/spin/demo/size.md correctly 1`] = `
class="ant-spin ant-spin-lg ant-spin-spinning"
>
<span
class="ant-spin-dot"
class="ant-spin-dot ant-spin-dot-spin"
>
<i />
<i />
@@ -177,7 +177,7 @@ exports[`renders ./components/spin/demo/tip.md correctly 1`] = `
class="ant-spin ant-spin-spinning ant-spin-show-text"
>
<span
class="ant-spin-dot"
class="ant-spin-dot ant-spin-dot-spin"
>
<i />
<i />

View File

@@ -0,0 +1,11 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`Spin should render custom indicator when it's set 1`] = `
<div
class="ant-spin ant-spin-spinning"
>
<div
class="custom-indicator ant-spin-dot"
/>
</div>
`;

View File

@@ -1,5 +1,5 @@
import React from 'react';
import { shallow } from 'enzyme';
import { shallow, render } from 'enzyme';
import Spin from '..';
describe('Spin', () => {
@@ -15,9 +15,9 @@ describe('Spin', () => {
it('should render custom indicator when it\'s set', () => {
const customIndicator = <div className="custom-indicator" />;
const wrapper = shallow(
const wrapper = render(
<Spin indicator={customIndicator} />
);
expect(wrapper.contains(customIndicator)).toEqual(true);
expect(wrapper).toMatchSnapshot();
});
});

View File

@@ -15,7 +15,7 @@ When part of the page is waiting for asynchronous data or during a rendering pro
| Property | Description | Type | Default Value |
| -------- | ----------- | ---- | ------------- |
| delay | specifies a delay in milliseconds for loading state (prevent flush) | number (milliseconds) | - |
| indicator | React node of the spinning indicator | ReactNode | - |
| indicator | React node of the spinning indicator | ReactElement | - |
| size | size of Spin, options: `small`, `default` and `large` | string | `default` |
| spinning | whether Spin is spinning | boolean | true |
| tip | customize description content when Spin has children | string | - |

View File

@@ -5,6 +5,8 @@ import Animate from 'rc-animate';
import isCssAnimationSupported from '../_util/isCssAnimationSupported';
import omit from 'omit.js';
export type SpinIndicator = React.ReactElement<any>;
export interface SpinProps {
prefixCls?: string;
className?: string;
@@ -14,7 +16,7 @@ export interface SpinProps {
tip?: string;
delay?: number;
wrapperClassName?: string;
indicator?: React.ReactNode;
indicator?: SpinIndicator;
}
export interface SpinState {
@@ -96,8 +98,27 @@ export default class Spin extends React.Component<SpinProps, SpinState> {
}
}
}
renderIndicator() {
const { prefixCls, indicator } = this.props;
const dotClassName = `${prefixCls}-dot`;
if (React.isValidElement(indicator)) {
return React.cloneElement((indicator as SpinIndicator), {
className: classNames((indicator as SpinIndicator).props.className, dotClassName),
});
}
return (
<span className={classNames(dotClassName, `${prefixCls}-dot-spin`)}>
<i />
<i />
<i />
<i />
</span>
);
}
render() {
const { className, size, prefixCls, tip, wrapperClassName, indicator, ...restProps } = this.props;
const { className, size, prefixCls, tip, wrapperClassName, ...restProps } = this.props;
const { spinning, notCssAnimationSupported } = this.state;
const spinClassName = classNames(prefixCls, {
@@ -111,20 +132,12 @@ export default class Spin extends React.Component<SpinProps, SpinState> {
const divProps = omit(restProps, [
'spinning',
'delay',
'indicator',
]);
const spinIndicator = indicator ? indicator : (
<span className={`${prefixCls}-dot`}>
<i />
<i />
<i />
<i />
</span>
);
const spinElement = (
<div {...divProps} className={spinClassName} >
{spinIndicator}
{this.renderIndicator()}
{tip ? <div className={`${prefixCls}-text`}>{tip}</div> : null}
</div>
);

View File

@@ -16,7 +16,7 @@ subtitle: 加载中
| 参数 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
| delay | 延迟显示加载效果的时间(防止闪烁) | number (毫秒) | - |
| indicator | 加载指示符 | ReactNode | - |
| indicator | 加载指示符 | ReactElement | - |
| size | 组件大小,可选值为 `small` `default` `large` | string | 'default' |
| spinning | 是否旋转 | boolean | true |
| tip | 当作为包裹元素时,可以自定义描述文案 | string | - |

View File

@@ -115,8 +115,7 @@
position: relative;
display: inline-block;
.square(@spin-dot-size);
transform: rotate(45deg);
animation: antRotate 1.2s infinite linear;
i {
width: 9px;
height: 9px;
@@ -148,6 +147,11 @@
animation-delay: 1.2s;
}
}
&-spin {
transform: rotate(45deg);
animation: antRotate 1.2s infinite linear;
}
}
// Sizes

View File

@@ -328,3 +328,13 @@
.@{iconfont-css-prefix}-alipay:before { content: "\e9b3"; }
.@{iconfont-css-prefix}-ant-design:before { content: "\e9b2"; }
.@{iconfont-css-prefix}-aliyun:before { content: "\e9f4"; }
.@{iconfont-css-prefix}-zhihu:before { content: "\e703"; }
.@{iconfont-css-prefix}-file-markdown:before { content: "\e704"; }
.@{iconfont-css-prefix}-slack:before { content: "\e705"; }
.@{iconfont-css-prefix}-slack-square:before { content: "\e706"; }
.@{iconfont-css-prefix}-behance:before { content: "\e707"; }
.@{iconfont-css-prefix}-behance-square:before { content: "\e708"; }
.@{iconfont-css-prefix}-dribbble:before { content: "\e709"; }
.@{iconfont-css-prefix}-dribbble-square:before { content: "\e70a"; }
.@{iconfont-css-prefix}-instagram:before { content: "\e70b"; }
.@{iconfont-css-prefix}-yuque:before { content: "\e70c"; }

View File

@@ -67,7 +67,7 @@
// ICONFONT
@iconfont-css-prefix : anticon;
@icon-url : "https://at.alicdn.com/t/font_148784_dky7e838xq4obt9";
@icon-url : "https://at.alicdn.com/t/font_148784_v4ggb6wrjmkotj4i";
// LINK
@link-color : @primary-color;
@@ -362,6 +362,7 @@
@badge-height: 20px;
@badge-dot-size: 6px;
@badge-font-size: @font-size-sm;
@badge-font-weight: normal;
@badge-status-size: 6px;
// Rate
@@ -384,7 +385,18 @@
// ---
@tabs-card-head-background: @background-color-light;
@tabs-card-height: 40px;
@tabs-card-active-color: @primary-color;
@tabs-title-font-size: @font-size-base;
@tabs-ink-bar-bg-color: @primary-color;
@tab-bar-margin: 0 0 16px 0;
@tab-horizontal-margin: 0 32px 0 0;
@tab-vertical-margin: 0 0 16px 0;
@tab-horizontal-padding: 12px 16px;
@tab-vertical-padding: 8px 24px;
@tab-scrolling-size: 32px;
@tab-highlight-color: @primary-color;
@tab-hover-color: @primary-5;
@tab-active-color: @primary-7;
// BackTop
// ---
@@ -415,6 +427,7 @@
// ---
@pagination-item-size: 32px;
@pagination-item-size-sm: 24px;
@pagination-font-family: Arial;
// Breadcrumb
// ---

View File

@@ -16,10 +16,11 @@ title: Switch
| 参数 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
| allowClear | 支持清除, 单选模式有效 | boolean | false |
| autoFocus | 组件自动获取焦点 | boolean | false |
| checked | 指定当前是否选中 | boolean | false |
| checkedChildren | 选中时的内容 | string\|ReactNode | |
| defaultChecked | 初始是否选中 | boolean | false |
| disabled | 是否禁用 | boolean | false |
| loading | 加载中的开关 | boolean | false |
| size | 开关大小,可选值:`default` `small` | string | default |
| unCheckedChildren | 非选中时的内容 | string\|ReactNode | |

View File

@@ -56,7 +56,7 @@
font-family: anticon;
animation: loadingCircle 1s infinite linear;
text-align: center;
background: transprent;
background: transparent;
z-index: 1;
display: none;
font-size: 12px;

View File

@@ -45,26 +45,24 @@ export default class SelectionBox extends React.Component<SelectionBoxProps, Sel
}
render() {
const { type, rowIndex, disabled, onChange } = this.props;
const { type, rowIndex, ...rest } = this.props;
const { checked } = this.state;
if (type === 'radio') {
return (
<Radio
disabled={disabled}
onChange={onChange}
value={rowIndex}
checked={checked}
value={rowIndex}
{...rest}
/>
);
} else {
return (
<Checkbox
checked={checked}
{...rest}
/>
);
}
return (
<Checkbox
checked={checked}
disabled={disabled}
onChange={onChange}
/>
);
}
}

View File

@@ -17,6 +17,7 @@ import Column from './Column';
import ColumnGroup from './ColumnGroup';
import createBodyRow from './createBodyRow';
import { flatArray, treeMap, flatFilter, normalizeColumns } from './util';
import { SpinProps } from '../spin';
import {
TableProps,
TableState,
@@ -597,9 +598,9 @@ export default class Table<T> extends React.Component<TableProps<T>, TableState<
type={type}
store={this.store}
rowIndex={rowIndex}
disabled={props.disabled}
onChange={handleChange}
defaultSelection={this.getDefaultSelection()}
{...props}
/>
</span>
);
@@ -749,6 +750,11 @@ export default class Table<T> extends React.Component<TableProps<T>, TableState<
{filterDropdown}
</span>
);
if (sortButton || filterDropdown) {
column.className = classNames(`${prefixCls}-column-has-filters`, column.className);
}
return column;
});
}
@@ -910,9 +916,9 @@ export default class Table<T> extends React.Component<TableProps<T>, TableState<
}
}
renderTable = (contextLocale: TableLocale) => {
renderTable = (contextLocale: TableLocale, loading: SpinProps) => {
const locale = { ...contextLocale, ...this.props.locale };
const { style, loading, className, prefixCls, showHeader, ...restProps } = this.props;
const { style, className, prefixCls, showHeader, ...restProps } = this.props;
const data = this.getCurrentPageData();
const expandIconAsCell = this.props.expandedRowRender && this.props.expandIconAsCell !== false;
@@ -948,7 +954,7 @@ export default class Table<T> extends React.Component<TableProps<T>, TableState<
className={classString}
expandIconColumnIndex={expandIconColumnIndex}
expandIconAsCell={expandIconAsCell}
emptyText={!loading && locale.emptyText}
emptyText={!loading.spinning && locale.emptyText}
/>
);
}
@@ -957,12 +963,19 @@ export default class Table<T> extends React.Component<TableProps<T>, TableState<
const { style, className, prefixCls } = this.props;
const data = this.getCurrentPageData();
let loading = this.props.loading as SpinProps;
if (typeof loading === 'boolean') {
loading = {
spinning: loading,
};
}
const table = (
<LocaleReceiver
componentName="Table"
defaultLocale={defaultLocale.Table}
>
{this.renderTable}
{(locale) => this.renderTable(locale, loading)}
</LocaleReceiver>
);
@@ -971,13 +984,6 @@ export default class Table<T> extends React.Component<TableProps<T>, TableState<
const paginationPatchClass = (this.hasPagination() && data && data.length !== 0)
? `${prefixCls}-with-pagination` : `${prefixCls}-without-pagination`;
let loading = this.props.loading;
if (typeof loading === 'boolean') {
loading = {
spinning: loading,
};
}
return (
<div
className={classNames(`${prefixCls}-wrapper`, className)}
@@ -985,7 +991,7 @@ export default class Table<T> extends React.Component<TableProps<T>, TableState<
>
<Spin
{...loading}
className={loading ? `${paginationPatchClass} ${prefixCls}-spin-holder` : ''}
className={loading.spinning ? `${paginationPatchClass} ${prefixCls}-spin-holder` : ''}
>
{table}
{this.renderPagination()}

View File

@@ -3,16 +3,18 @@ import { mount } from 'enzyme';
import createStore from '../createStore';
import SelectionBox from '../SelectionBox';
const getDefaultStore = (selectedRowKeys) => {
return createStore({
selectedRowKeys: selectedRowKeys || [],
selectionDirty: false,
});
};
describe('SelectionBox', () => {
it('unchecked by selectedRowKeys ', () => {
const store = createStore({
selectedRowKeys: [],
selectionDirty: false,
});
const wrapper = mount(
<SelectionBox
store={store}
store={getDefaultStore()}
rowIndex="1"
disabled={false}
onChange={() => {}}
@@ -24,14 +26,9 @@ describe('SelectionBox', () => {
});
it('checked by selectedRowKeys ', () => {
const store = createStore({
selectedRowKeys: ['1'],
selectionDirty: false,
});
const wrapper = mount(
<SelectionBox
store={store}
store={getDefaultStore(['1'])}
rowIndex="1"
disabled={false}
onChange={() => {}}
@@ -43,14 +40,9 @@ describe('SelectionBox', () => {
});
it('checked by defaultSelection', () => {
const store = createStore({
selectedRowKeys: [],
selectionDirty: false,
});
const wrapper = mount(
<SelectionBox
store={store}
store={getDefaultStore()}
rowIndex="1"
disabled={false}
onChange={() => {}}
@@ -62,11 +54,7 @@ describe('SelectionBox', () => {
});
it('checked when store change', () => {
const store = createStore({
selectedRowKeys: [],
selectionDirty: false,
});
const store = getDefaultStore();
const wrapper = mount(
<SelectionBox
store={store}
@@ -84,4 +72,49 @@ describe('SelectionBox', () => {
expect(wrapper.state()).toEqual({ checked: true });
});
it('passes props to Checkbox', () => {
const checkboxProps = {
name: 'testName',
id: 'testId',
};
const wrapper = mount(
<SelectionBox
store={getDefaultStore()}
rowIndex="1"
disabled={false}
onChange={() => {
}}
defaultSelection={['1']}
{...checkboxProps}
/>
);
wrapper.find('Checkbox').forEach((box) => {
expect(box.props().name).toEqual(checkboxProps.name);
expect(box.props().id).toEqual(checkboxProps.id);
});
});
it('passes props to Radios', () => {
const radioProps = {
name: 'testName',
id: 'testId',
};
const wrapper = mount(
<SelectionBox
store={getDefaultStore()}
rowIndex="1"
disabled={false}
onChange={() => {
}}
defaultSelection={['1']}
type="radio"
{...radioProps}
/>
);
wrapper.find('Radio').forEach((radio) => {
expect(radio.props().name).toEqual(radioProps.name);
expect(radio.props().id).toEqual(radioProps.id);
});
});
});

View File

@@ -77,6 +77,7 @@ describe('Table.rowSelection', () => {
const rowSelection = {
getCheckboxProps: record => ({
disabled: record.name === 'Lucy',
name: record.name,
}),
};
@@ -84,7 +85,9 @@ describe('Table.rowSelection', () => {
const checkboxes = wrapper.find('input');
expect(checkboxes.at(1).props().disabled).toBe(false);
expect(checkboxes.at(1).props().name).toEqual(data[0].name);
expect(checkboxes.at(2).props().disabled).toBe(true);
expect(checkboxes.at(2).props().name).toEqual(data[1].name);
});
it('works with pagination', () => {

View File

@@ -67,6 +67,7 @@ describe('Table', () => {
};
const wrapper = mount(<Table loading={loading} />);
expect(wrapper.find('.ant-spin')).toHaveLength(0);
expect(wrapper.find('.ant-table-placeholder').text()).not.toEqual('');
loading.spinning = true;
wrapper.setProps({ loading });

View File

@@ -46,7 +46,7 @@ exports[`Table.filter renders filter correctly 1`] = `
>
<tr>
<th
class=""
class="ant-table-column-has-filters"
>
<span>
Name
@@ -65,7 +65,7 @@ exports[`Table.filter renders filter correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -78,7 +78,7 @@ exports[`Table.filter renders filter correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -91,7 +91,7 @@ exports[`Table.filter renders filter correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -104,7 +104,7 @@ exports[`Table.filter renders filter correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"

View File

@@ -6,7 +6,7 @@ exports[`Table.sorter renders sorter icon correctly 1`] = `
>
<tr>
<th
class=""
class="ant-table-column-has-filters"
>
<span>
Name

View File

@@ -36,7 +36,7 @@ exports[`renders ./components/table/demo/ajax.md correctly 1`] = `
>
<tr>
<th
class=""
class="ant-table-column-has-filters"
>
<span>
Name
@@ -63,7 +63,7 @@ exports[`renders ./components/table/demo/ajax.md correctly 1`] = `
</span>
</th>
<th
class=""
class="ant-table-column-has-filters"
>
<span>
Gender
@@ -879,7 +879,7 @@ exports[`renders ./components/table/demo/custom-filter-panel.md correctly 1`] =
>
<tr>
<th
class=""
class="ant-table-column-has-filters"
>
<span>
Name
@@ -898,7 +898,7 @@ exports[`renders ./components/table/demo/custom-filter-panel.md correctly 1`] =
</span>
</th>
<th
class=""
class="ant-table-column-has-filters"
>
<span>
Address
@@ -917,7 +917,7 @@ exports[`renders ./components/table/demo/custom-filter-panel.md correctly 1`] =
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -931,7 +931,7 @@ exports[`renders ./components/table/demo/custom-filter-panel.md correctly 1`] =
32
</td>
<td
class=""
class="ant-table-column-has-filters"
>
New York No. 1 Lake Park
</td>
@@ -940,7 +940,7 @@ exports[`renders ./components/table/demo/custom-filter-panel.md correctly 1`] =
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -954,7 +954,7 @@ exports[`renders ./components/table/demo/custom-filter-panel.md correctly 1`] =
42
</td>
<td
class=""
class="ant-table-column-has-filters"
>
London No. 1 Lake Park
</td>
@@ -963,7 +963,7 @@ exports[`renders ./components/table/demo/custom-filter-panel.md correctly 1`] =
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -977,7 +977,7 @@ exports[`renders ./components/table/demo/custom-filter-panel.md correctly 1`] =
32
</td>
<td
class=""
class="ant-table-column-has-filters"
>
Sidney No. 1 Lake Park
</td>
@@ -986,7 +986,7 @@ exports[`renders ./components/table/demo/custom-filter-panel.md correctly 1`] =
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -1000,7 +1000,7 @@ exports[`renders ./components/table/demo/custom-filter-panel.md correctly 1`] =
32
</td>
<td
class=""
class="ant-table-column-has-filters"
>
London No. 2 Lake Park
</td>
@@ -1253,12 +1253,16 @@ exports[`renders ./components/table/demo/dynamic-settings.md correctly 1`] = `
class="ant-form-item-control"
>
<span
class="ant-switch"
tabindex="0"
class="ant-form-item-children"
>
<span
class="ant-switch-inner"
/>
class="ant-switch"
tabindex="0"
>
<span
class="ant-switch-inner"
/>
</span>
</span>
</div>
</div>
@@ -1283,12 +1287,16 @@ exports[`renders ./components/table/demo/dynamic-settings.md correctly 1`] = `
class="ant-form-item-control"
>
<span
class="ant-switch"
tabindex="0"
class="ant-form-item-children"
>
<span
class="ant-switch-inner"
/>
class="ant-switch"
tabindex="0"
>
<span
class="ant-switch-inner"
/>
</span>
</span>
</div>
</div>
@@ -1313,13 +1321,17 @@ exports[`renders ./components/table/demo/dynamic-settings.md correctly 1`] = `
class="ant-form-item-control"
>
<span
checked=""
class="ant-switch ant-switch-checked"
tabindex="0"
class="ant-form-item-children"
>
<span
class="ant-switch-inner"
/>
checked=""
class="ant-switch ant-switch-checked"
tabindex="0"
>
<span
class="ant-switch-inner"
/>
</span>
</span>
</div>
</div>
@@ -1344,13 +1356,17 @@ exports[`renders ./components/table/demo/dynamic-settings.md correctly 1`] = `
class="ant-form-item-control"
>
<span
checked=""
class="ant-switch ant-switch-checked"
tabindex="0"
class="ant-form-item-children"
>
<span
class="ant-switch-inner"
/>
checked=""
class="ant-switch ant-switch-checked"
tabindex="0"
>
<span
class="ant-switch-inner"
/>
</span>
</span>
</div>
</div>
@@ -1375,13 +1391,17 @@ exports[`renders ./components/table/demo/dynamic-settings.md correctly 1`] = `
class="ant-form-item-control"
>
<span
checked=""
class="ant-switch ant-switch-checked"
tabindex="0"
class="ant-form-item-children"
>
<span
class="ant-switch-inner"
/>
checked=""
class="ant-switch ant-switch-checked"
tabindex="0"
>
<span
class="ant-switch-inner"
/>
</span>
</span>
</div>
</div>
@@ -1406,13 +1426,17 @@ exports[`renders ./components/table/demo/dynamic-settings.md correctly 1`] = `
class="ant-form-item-control"
>
<span
checked=""
class="ant-switch ant-switch-checked"
tabindex="0"
class="ant-form-item-children"
>
<span
class="ant-switch-inner"
/>
checked=""
class="ant-switch ant-switch-checked"
tabindex="0"
>
<span
class="ant-switch-inner"
/>
</span>
</span>
</div>
</div>
@@ -1437,13 +1461,17 @@ exports[`renders ./components/table/demo/dynamic-settings.md correctly 1`] = `
class="ant-form-item-control"
>
<span
checked=""
class="ant-switch ant-switch-checked"
tabindex="0"
class="ant-form-item-children"
>
<span
class="ant-switch-inner"
/>
checked=""
class="ant-switch ant-switch-checked"
tabindex="0"
>
<span
class="ant-switch-inner"
/>
</span>
</span>
</div>
</div>
@@ -1468,13 +1496,17 @@ exports[`renders ./components/table/demo/dynamic-settings.md correctly 1`] = `
class="ant-form-item-control"
>
<span
checked=""
class="ant-switch ant-switch-checked"
tabindex="0"
class="ant-form-item-children"
>
<span
class="ant-switch-inner"
/>
checked=""
class="ant-switch ant-switch-checked"
tabindex="0"
>
<span
class="ant-switch-inner"
/>
</span>
</span>
</div>
</div>
@@ -1499,12 +1531,16 @@ exports[`renders ./components/table/demo/dynamic-settings.md correctly 1`] = `
class="ant-form-item-control"
>
<span
class="ant-switch"
tabindex="0"
class="ant-form-item-children"
>
<span
class="ant-switch-inner"
/>
class="ant-switch"
tabindex="0"
>
<span
class="ant-switch-inner"
/>
</span>
</span>
</div>
</div>
@@ -1528,68 +1564,72 @@ exports[`renders ./components/table/demo/dynamic-settings.md correctly 1`] = `
<div
class="ant-form-item-control"
>
<div
class="ant-radio-group ant-radio-group-default"
<span
class="ant-form-item-children"
>
<label
class="ant-radio-button-wrapper ant-radio-button-wrapper-checked"
<div
class="ant-radio-group ant-radio-group-default"
>
<span
class="ant-radio-button ant-radio-button-checked"
<label
class="ant-radio-button-wrapper ant-radio-button-wrapper-checked"
>
<input
checked=""
class="ant-radio-button-input"
type="radio"
value="default"
/>
<span
class="ant-radio-button-inner"
/>
</span>
<span>
Default
</span>
</label>
<label
class="ant-radio-button-wrapper"
>
<span
class="ant-radio-button"
class="ant-radio-button ant-radio-button-checked"
>
<input
checked=""
class="ant-radio-button-input"
type="radio"
value="default"
/>
<span
class="ant-radio-button-inner"
/>
</span>
<span>
Default
</span>
</label>
<label
class="ant-radio-button-wrapper"
>
<input
class="ant-radio-button-input"
type="radio"
value="middle"
/>
<span
class="ant-radio-button-inner"
/>
</span>
<span>
Middle
</span>
</label>
<label
class="ant-radio-button-wrapper"
>
<span
class="ant-radio-button"
class="ant-radio-button"
>
<input
class="ant-radio-button-input"
type="radio"
value="middle"
/>
<span
class="ant-radio-button-inner"
/>
</span>
<span>
Middle
</span>
</label>
<label
class="ant-radio-button-wrapper"
>
<input
class="ant-radio-button-input"
type="radio"
value="small"
/>
<span
class="ant-radio-button-inner"
/>
</span>
<span>
Small
</span>
</label>
</div>
class="ant-radio-button"
>
<input
class="ant-radio-button-input"
type="radio"
value="small"
/>
<span
class="ant-radio-button-inner"
/>
</span>
<span>
Small
</span>
</label>
</div>
</span>
</div>
</div>
</div>
@@ -6983,7 +7023,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
>
<tr>
<th
class=""
class="ant-table-column-has-filters"
rowspan="4"
>
<span>
@@ -7021,7 +7061,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
</tr>
<tr>
<th
class=""
class="ant-table-column-has-filters"
rowspan="3"
>
<span>
@@ -7147,7 +7187,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -7156,7 +7196,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
John Brown
</td>
<td
class=""
class="ant-table-column-has-filters"
>
1
</td>
@@ -7195,7 +7235,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -7204,7 +7244,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
John Brown
</td>
<td
class=""
class="ant-table-column-has-filters"
>
2
</td>
@@ -7243,7 +7283,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -7252,7 +7292,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
John Brown
</td>
<td
class=""
class="ant-table-column-has-filters"
>
3
</td>
@@ -7291,7 +7331,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -7300,7 +7340,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
John Brown
</td>
<td
class=""
class="ant-table-column-has-filters"
>
4
</td>
@@ -7339,7 +7379,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -7348,7 +7388,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
John Brown
</td>
<td
class=""
class="ant-table-column-has-filters"
>
5
</td>
@@ -7387,7 +7427,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -7396,7 +7436,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
John Brown
</td>
<td
class=""
class="ant-table-column-has-filters"
>
6
</td>
@@ -7435,7 +7475,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -7444,7 +7484,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
John Brown
</td>
<td
class=""
class="ant-table-column-has-filters"
>
7
</td>
@@ -7483,7 +7523,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -7492,7 +7532,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
John Brown
</td>
<td
class=""
class="ant-table-column-has-filters"
>
8
</td>
@@ -7531,7 +7571,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -7540,7 +7580,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
John Brown
</td>
<td
class=""
class="ant-table-column-has-filters"
>
9
</td>
@@ -7579,7 +7619,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -7588,7 +7628,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
John Brown
</td>
<td
class=""
class="ant-table-column-has-filters"
>
10
</td>
@@ -7646,7 +7686,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
>
<tr>
<th
class=""
class="ant-table-column-has-filters"
rowspan="4"
>
<span>
@@ -7684,7 +7724,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -7697,7 +7737,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -7710,7 +7750,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -7723,7 +7763,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -7736,7 +7776,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -7749,7 +7789,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -7762,7 +7802,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -7775,7 +7815,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -7788,7 +7828,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -7801,7 +7841,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -8086,7 +8126,7 @@ exports[`renders ./components/table/demo/head.md correctly 1`] = `
>
<tr>
<th
class=""
class="ant-table-column-has-filters"
>
<span>
Name
@@ -8117,7 +8157,7 @@ exports[`renders ./components/table/demo/head.md correctly 1`] = `
</span>
</th>
<th
class="ant-table-column-sort"
class="ant-table-column-has-filters ant-table-column-sort"
>
<span>
Age
@@ -8144,7 +8184,7 @@ exports[`renders ./components/table/demo/head.md correctly 1`] = `
</span>
</th>
<th
class=""
class="ant-table-column-has-filters"
>
<span>
Address
@@ -8183,7 +8223,7 @@ exports[`renders ./components/table/demo/head.md correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -8192,12 +8232,12 @@ exports[`renders ./components/table/demo/head.md correctly 1`] = `
Jim Green
</td>
<td
class="ant-table-column-sort"
class="ant-table-column-has-filters ant-table-column-sort"
>
42
</td>
<td
class=""
class="ant-table-column-has-filters"
>
London No. 1 Lake Park
</td>
@@ -8206,7 +8246,7 @@ exports[`renders ./components/table/demo/head.md correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -8215,12 +8255,12 @@ exports[`renders ./components/table/demo/head.md correctly 1`] = `
John Brown
</td>
<td
class="ant-table-column-sort"
class="ant-table-column-has-filters ant-table-column-sort"
>
32
</td>
<td
class=""
class="ant-table-column-has-filters"
>
New York No. 1 Lake Park
</td>
@@ -8229,7 +8269,7 @@ exports[`renders ./components/table/demo/head.md correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -8238,12 +8278,12 @@ exports[`renders ./components/table/demo/head.md correctly 1`] = `
Joe Black
</td>
<td
class="ant-table-column-sort"
class="ant-table-column-has-filters ant-table-column-sort"
>
32
</td>
<td
class=""
class="ant-table-column-has-filters"
>
Sidney No. 1 Lake Park
</td>
@@ -8252,7 +8292,7 @@ exports[`renders ./components/table/demo/head.md correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -8261,12 +8301,12 @@ exports[`renders ./components/table/demo/head.md correctly 1`] = `
Jim Red
</td>
<td
class="ant-table-column-sort"
class="ant-table-column-has-filters ant-table-column-sort"
>
32
</td>
<td
class=""
class="ant-table-column-has-filters"
>
London No. 2 Lake Park
</td>
@@ -8974,7 +9014,7 @@ exports[`renders ./components/table/demo/reset-filter.md correctly 1`] = `
>
<tr>
<th
class=""
class="ant-table-column-has-filters"
>
<span>
Name
@@ -9005,7 +9045,7 @@ exports[`renders ./components/table/demo/reset-filter.md correctly 1`] = `
</span>
</th>
<th
class=""
class="ant-table-column-has-filters"
>
<span>
Age
@@ -9032,7 +9072,7 @@ exports[`renders ./components/table/demo/reset-filter.md correctly 1`] = `
</span>
</th>
<th
class=""
class="ant-table-column-has-filters"
>
<span>
Address
@@ -9071,7 +9111,7 @@ exports[`renders ./components/table/demo/reset-filter.md correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -9080,12 +9120,12 @@ exports[`renders ./components/table/demo/reset-filter.md correctly 1`] = `
John Brown
</td>
<td
class=""
class="ant-table-column-has-filters"
>
32
</td>
<td
class=""
class="ant-table-column-has-filters"
>
New York No. 1 Lake Park
</td>
@@ -9094,7 +9134,7 @@ exports[`renders ./components/table/demo/reset-filter.md correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -9103,12 +9143,12 @@ exports[`renders ./components/table/demo/reset-filter.md correctly 1`] = `
Jim Green
</td>
<td
class=""
class="ant-table-column-has-filters"
>
42
</td>
<td
class=""
class="ant-table-column-has-filters"
>
London No. 1 Lake Park
</td>
@@ -9117,7 +9157,7 @@ exports[`renders ./components/table/demo/reset-filter.md correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -9126,12 +9166,12 @@ exports[`renders ./components/table/demo/reset-filter.md correctly 1`] = `
Joe Black
</td>
<td
class=""
class="ant-table-column-has-filters"
>
32
</td>
<td
class=""
class="ant-table-column-has-filters"
>
Sidney No. 1 Lake Park
</td>
@@ -9140,7 +9180,7 @@ exports[`renders ./components/table/demo/reset-filter.md correctly 1`] = `
class="ant-table-row ant-table-row-level-0"
>
<td
class=""
class="ant-table-column-has-filters"
>
<span
class="ant-table-row-indent indent-level-0"
@@ -9149,12 +9189,12 @@ exports[`renders ./components/table/demo/reset-filter.md correctly 1`] = `
Jim Red
</td>
<td
class=""
class="ant-table-column-has-filters"
>
32
</td>
<td
class=""
class="ant-table-column-has-filters"
>
London No. 2 Lake Park
</td>
@@ -9302,6 +9342,7 @@ exports[`renders ./components/table/demo/row-selection.md correctly 1`] = `
>
<input
class="ant-checkbox-input"
name="John Brown"
type="checkbox"
/>
<span
@@ -9350,6 +9391,7 @@ exports[`renders ./components/table/demo/row-selection.md correctly 1`] = `
>
<input
class="ant-checkbox-input"
name="Jim Green"
type="checkbox"
/>
<span
@@ -9398,6 +9440,7 @@ exports[`renders ./components/table/demo/row-selection.md correctly 1`] = `
>
<input
class="ant-checkbox-input"
name="Joe Black"
type="checkbox"
/>
<span
@@ -9447,6 +9490,7 @@ exports[`renders ./components/table/demo/row-selection.md correctly 1`] = `
<input
class="ant-checkbox-input"
disabled=""
name="Disabled User"
type="checkbox"
/>
<span

View File

@@ -465,7 +465,7 @@ exports[`Table renders empty table without emptyText when loading 1`] = `
class="ant-spin ant-spin-spinning ant-table-without-pagination ant-table-spin-holder"
>
<span
class="ant-spin-dot"
class="ant-spin-dot ant-spin-dot-spin"
>
<i />
<i />

View File

@@ -48,7 +48,7 @@ let BodyRow = (props) => {
initialClientOffset,
...restProps
} = props;
const style = { cursor: 'move' };
const style = { ...restProps.style, cursor: 'move' };
let className = restProps.className;
if (isOver && initialClientOffset) {

View File

@@ -135,4 +135,8 @@ ReactDOM.render(<NestedTable />, mountNode);
.components-table-demo-nested .table-operation a:not(:last-child) {
margin-right: 24px;
}
.components-table-demo-nested .ant-table-expanded-row:hover > td {
background: #fbfbfb;
}
````

View File

@@ -60,6 +60,7 @@ const rowSelection = {
},
getCheckboxProps: record => ({
disabled: record.name === 'Disabled User', // Column configuration not to be checked
name: record.name,
}),
};

View File

@@ -79,6 +79,27 @@ const columns = [{
| onHeaderRow | Set props on per header row | Function(column, index) | - |
| onRow | Set props on per row | Function(record, index) | - |
#### onRow usage
Same as `onRow` `onHeaderRow` `onCell` `onHeaderCell`
```jsx
<Table
onRow={(record) => {
return {
onClick: () => {}, // click row
onMouseEnter: () => {}, // mouse enter row
onXxxx...
};
)}
onHeaderRow={(column) => {
return {
onClick: () => {}, // click header row
};
)}
/>
```
### Column
One of the Table `columns` prop for describing the table's columns, Column has the same API.

View File

@@ -80,6 +80,28 @@ const columns = [{
| onHeaderRow | 设置头部行属性 | Function(column, index) | - |
| onRow | 设置行属性 | Function(record, index) | - |
#### onRow 用法
适用于 `onRow` `onHeaderRow` `onCell` `onHeaderCell`
```jsx
<Table
onRow={(record) => {
return {
onClick: () => {}, // 点击行
onMouseEnter: () => {}, // 鼠标移入行
onXxxx...
};
)}
onHeaderRow={(column) => {
return {
onClick: () => {}, // 点击表头行
};
)}
/>
```
### Column
列描述数据对象,是 columns 中的一项Column 使用相同的 API。

Some files were not shown because too many files have changed in this diff Show More