Compare commits

...

206 Commits
3.1.2 ... 3.2.3

Author SHA1 Message Date
愚指导
cdfbb6a3bd Bump 3.2.3 2018-03-02 20:12:06 +08:00
Sam Chen
fd147deb75 Update input group demo (#9482) 2018-03-02 15:26:05 +08:00
afc163
2fe64d429a Fix button group align issue in chrome, close #1019 2018-03-02 15:25:31 +08:00
byuanama
98f938798d Update index.en-US.md (#9479) 2018-03-02 13:18:06 +08:00
afc163
7d3573d471 use more clear function name, close #9465 2018-03-02 12:06:33 +08:00
愚指导
2548a4bcf9 add polyfill for ie (#9444) 2018-03-02 11:49:56 +08:00
twobin
d816879e78 fix: add props of onPopupScroll in Select (#9475) 2018-03-02 10:15:01 +08:00
Chang Wang
c51f041ebc Update downloads badge to point to graph of downloads (#9477) 2018-03-02 10:13:48 +08:00
Karthik K
f24e41806d Minor punctuation correction (#9472) 2018-03-01 22:08:31 +08:00
Wei Zhu
1b3118e1dc Use week year
Fix #9463
2018-03-01 17:24:06 +08:00
Wei Zhu
9634bea391 Complicate with less 3
Fix #7850
2018-02-28 14:35:02 +08:00
afc163
8a6b76acde support less vars for tabs title font size 2018-02-28 11:07:26 +08:00
VTHINKXIE
23e7716137 fix(module:timeline): fix timeline head custom style error in chrome (#9429) 2018-02-27 20:44:28 +08:00
Wei Zhu
755b3e9043 Fix Select dropdown box-radius
refer 82092c15
2018-02-27 18:27:31 +08:00
Wei Zhu
aa9b7a4e4d Update snapshot 2018-02-27 18:07:39 +08:00
Wei Zhu
82092c154a Fix Select dropdown border 2018-02-27 17:21:33 +08:00
Wei Zhu
5df04e6827 Fix lint 2018-02-26 17:24:55 +08:00
Wei Zhu
54242e968f Set Table filter dropdown menu popup container
Fix #9209
2018-02-26 16:45:26 +08:00
afc163
d4a5d2c188 site: fix home button align 2018-02-26 13:54:09 +08:00
afc163
e6a5c9be9e update 2018-02-25 13:20:52 +08:00
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
niko
be11a6d8b1 3.1.5 changelog (#9145) 2018-01-27 21:31:57 +08:00
afc163
70569c6d28 site: improve responsive style 2018-01-27 15:17:43 +08:00
Yury Kozyrev
76c7ce669a add tabIndex to select (#9144) 2018-01-27 14:27:27 +08:00
sallen450
a9562e75fe Fix(Table): Hide emptyType in Table when loading prop is true (#9095)
* fix(Table): Hide text in  when  prop is true

* test(Table): renders empty table without emptyText when loading

* refactor: code style
2018-01-26 09:30:11 -06:00
Wei Zhu
98387ad819 Control Calendar value, fix #8885 (#9141)
If not control Calendar value, the internal value of Calendar will keep a
different date than parent component.
2018-01-26 23:14:40 +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
luyiming
e511c2ac33 fix tree demo drag&drop bug (#9131) 2018-01-26 13:30:44 +08:00
Qingrong Ke
b50ca50bad docs: update head.md of Table (#9133) 2018-01-26 10:39:22 +08:00
潘晓升
e4d7e5e510 Update index.tsx (#9126)
add the “style” property for declare file
2018-01-26 10:38:28 +08:00
afc163
506f97640e Fix font family name, close ant-design/ant-design-pro#813 2018-01-26 10:24:41 +08:00
niko
f2ba99978d upgrade snapshots (#9127) 2018-01-25 18:24:59 +08:00
Wei Zhu
d47325bf51 Convert RangePicker showDate locale
Fix #8970
2018-01-25 18:00:07 +08:00
Vic
7c7125b7fa fix(notifiction): Complement duration missing type definition. (#9120) 2018-01-24 22:29:03 -06:00
George Gray
7d9a93e7ed vars to theme Menu (#9115) 2018-01-25 10:59:49 +08:00
Wei Zhu
bbe95e10e1 docs: remove -cn 2018-01-25 01:26:11 +08:00
Wei Zhu
ef9cf00ad3 docs: fix links 2018-01-25 01:16:51 +08:00
afc163
b3f31216df Fix #9103, ref #7351 2018-01-24 21:54:01 +08:00
Wei Zhu
d54dfdfac2 Update CONTRIBUTING.md 2018-01-24 21:48:41 +08:00
Wei Zhu
c29cb15594 Update CONTRIBUTING.md 2018-01-24 21:48:27 +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
cad2b280e2 docs: Add contribution guide to website (#9075) 2018-01-24 20:59:36 +08:00
afc163
3c9c4077fa Fix missing file-word icon in demo, #9092 #9061 2018-01-24 12:21:43 +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
Wei Zhu
4332613633 Revert "Pass id prop to DatePicker input field (#8598)"
This reverts commit 38bf0be4ab.
2018-01-24 10:48:03 +08:00
mgrdevport
38bf0be4ab Pass id prop to DatePicker input field (#8598) 2018-01-23 20:45:46 -06:00
George Gray
72a5b1fef7 Vars to theme slider (#9065)
* vars to theme slider

* add @slider-margin back
2018-01-23 21:03:22 +08:00
afc163
2759460908 Improve avatar style 2018-01-23 21:02:50 +08:00
afc163
8c442cfaf0 Fix submenu title padding 2018-01-23 21:00:11 +08:00
Reed Sun
024e7c342f Optimize the button tip about expand/hide all code (#9086) 2018-01-23 18:56:31 +08:00
VTHINKXIE
902fa9fea2 fix(doc:grid): fix error in en doc (#9078) 2018-01-23 16:33:07 +08:00
afc163
1502d3604d Fix unexpected select disappearing in IE11, close #7934 2018-01-23 11:31:27 +08:00
Lyndon001
1f70cb9722 Update values.zh-CN.md 2018-01-23 11:18:39 +08:00
Lyndon001
63de7fc154 Update values.zh-CN.md 2018-01-23 11:17:46 +08:00
Jing Ma
dab43f4c7a Removed unnecessary section (#9067) 2018-01-22 09:18:09 -06:00
Wei Zhu
cdb160ae4b site: fix forEach call on IE 11 2018-01-22 12:11:28 +08:00
ddcat1115
b7901e541a Merge branch 'master' into feature-3.2 2018-01-21 19:56:31 +08:00
ddcat1115
2978644ccd bump 3.1.4 2018-01-21 16:20:06 +08:00
रोहन मल्होत्रा
ec16d97086 added subMenuCloseDelay & subMenuOpenDelay props to menu interface (#9049) 2018-01-21 01:13:23 +08:00
Wei Zhu
6ea33da9f8 Don't use ISO week (#9025)
https://en.wikipedia.org/wiki/ISO_week_date

fix #9021
2018-01-21 01:05:19 +08:00
Wei Zhu
a8a4152c65 Clear RangePicker hover value after panel close (#9029)
Fix #8839
2018-01-21 01:03:51 +08:00
niko
a09f531453 add grid xxl to List fixed: #9019 (#9038) 2018-01-21 01:03:00 +08:00
Minwe LUO
7a7933038c feat: Alert added iconType to support custom icon (#8811) 2018-01-21 00:59:25 +08:00
曾凯
d868c5a58e fix Input type error (#9046) 2018-01-20 19:35:14 +08:00
George Gray
aa9e335145 add vars to theme Breadcrumb component (#9022) 2018-01-20 16:04:49 +08:00
ddcat1115
4286131735 fix doc error 2018-01-20 12:46:30 +08:00
Wei Zhu
aa4a619f41 Merge branch 'master' into feature-3.2 2018-01-19 19:20:14 +08:00
Wei Zhu
0bb531aca6 Refactor DatePicker types 2018-01-19 19:07:18 +08:00
jljsj
7b90be6326 update responsive, add home footer style 2018-01-19 18:17:10 +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
32023c24e5 Add aliyun icon 2018-01-19 12:04:50 +08:00
Wei Zhu
81cb1f4288 Update download.zh-CN.md 2018-01-19 10:39:57 +08:00
sallen450
e0fb5b8866 Fix: Dropdown.Button not fully disabled (#9013)
* fix(Dropdown): dropdown won't be fully disabled

* test(Dropdown): check  props pass to Dropdown
2018-01-18 09:39:34 -06:00
Wei Zhu
28c589da18 Update CHANGELOG.en-US.md 2018-01-18 22:56:05 +08:00
Wei Zhu
65a3982f3f Update CHANGELOG.zh-CN.md 2018-01-18 22:55:32 +08:00
DosLin
efa824e514 doc:fix server port (#9012) 2018-01-18 05:03:17 -06:00
afc163
1d9afb6510 Fix button group z-index, close #9014 2018-01-18 17:22:30 +08:00
afc163
200d6cb11a Fix wrong margin of tabs 2018-01-18 13:42:03 +08:00
afc163
9926c3d523 update Tabs API doc 2018-01-18 13:42:02 +08:00
George Gray
a9abe14122 Vars for checkbox and radio (#9003)
* vars for radio component

* add @checkbox-color var
2018-01-18 10:22:03 +08:00
Reed Sun
a2b6d0a23e docs: 修改 Layout 组件文档中 breakpoint width 与代码不一致的问题 (#8995) 2018-01-17 21:54:54 +08:00
超能刚哥
a760c40665 富文本编辑器增加braft-editor (#8994)
富文本编辑器增加braft-editor
2018-01-17 21:19:57 +08:00
afc163
f95cb04585 Add demo for row-click selection 2018-01-15 17:24:40 +08:00
Wei Zhu
a7b939db43 Set moment.locale to en if no locale code provide 2018-01-15 14:59:09 +08:00
Wei Zhu
96c312f8fb Revert "docs: Fix LocelProvider demo"
This reverts commit 6f9c8da502.
2018-01-15 14:59:09 +08:00
Eli White
d9062bdb5c Fixing typo on homepage (#8962) 2018-01-13 23:55:43 -06:00
Wei Zhu
0f0deff479 Bump 3.1.3 2018-01-14 01:37:57 +08:00
Wei Zhu
4f56b4d52d Fix error when locale is null 2018-01-14 01:30:21 +08:00
Wei Zhu
6f9c8da502 docs: Fix LocelProvider demo 2018-01-14 01:09:46 +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
194 changed files with 9704 additions and 2518 deletions

View File

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

View File

@@ -1,66 +1,13 @@
# Contributing to Ant Design
[中文版](./CONTRIBUTING.zh-CN.md)
Want to contribute to Ant Design? There are a few things you need to know.
The following is a set of guidelines for contributing to Ant Design. Please spend several minutes in reading these guidelines before you create an issue or pull request.
We wrote a **[contribution guide](https://ant.design/docs/react/contributing)** to help you get started.
## Code of Conduct
---
We have adopted a [Code of Conduct](../CODE_OF_CONDUCT.md) that we expect project participants to adhere to. Please read the full text so that you can understand what actions will and will not be tolerated.
# 参与共建
## Open Development
想要给 Ant Design 贡献自己的一份力量?
All work on Ant Design happens directly on [GitHub](https://github.com/ant-design). Both core team members and external contributors send pull requests which go through the same review process.
## Branch Organization
According to our [release schedule](../CHANGELOG.md#release-schedule), we'll cut a `feature` branch (e.g. `feature-3.1` for 3.1 release) from `master` every month. If you send a bugfix pull request, please do it against the `master` branch, if it's a feature pull request, please do it against the `feature` branch.
## Bugs
We are using [GitHub Issues](https://github.com/ant-design/ant-design/issues) for bug tracing. The best way to get your bug fixed is using our [issue helper](http://new-issue.ant.design) and provide a reprduction with this [template](https://u.ant.design/codesandbox-repro).
Before you reporting a bug, please make sure you've searched exists issues, and read our [FAQ](https://github.com/ant-design/ant-design/wiki/FAQ).
## Proposing a Change
If you intend to change the public API or introduce new feature, we also recommend use our [issue helper](http://new-issue.ant.design) to create a feature request issue.
## Your First Pull Request
Working on your first Pull Request? You can learn how from this free video series:
[How to Contribute to an Open Source Project on GitHub](https://egghead.io/courses/how-to-contribute-to-an-open-source-project-on-github)
To help you get your feet wet and get you familiar with our contribution process, we have a list of [good first issues](https://github.com/ant-design/ant-design/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) that contain bugs or small features that have a relatively limited scope. This is a great place to get started.
If you decide to fix an issue, please be sure to check the comment thread in case somebody is already working on a fix. If nobody is working on it at the moment, please leave a comment stating that you intend to work on it so other people dont accidentally duplicate your effort.
If somebody claims an issue but doesnt follow up for more than two weeks, its fine to take over it but you should still leave a comment.
## Sending a Pull Request
The core team is monitoring for pull requests. We will review your pull request and either merge it, request changes to it, or close it with an explanation.
**Before submitting a pull request**, please make sure the following is done:
1. Fork the repository and create your branch from [proper branch](./CONTRIBUTING.md#branch-organization).
1. Run `npm install` in the repository root.
1. If youve fixed a bug or added code that should be tested, add tests!
1. Ensure the test suite passes (npm run test). Tip: `npm test -- --watch TestName` is helpful in development.
1. Run `npm test -- -u` to update [jest snapshot](http://facebook.github.io/jest/docs/en/snapshot-testing.html#snapshot-testing-with-jest) and commit these changes as well (if has).
1. Make sure your code lints (npm run lint). Tip: Lint runs automatically when you `git commit`.
Sending a Pull Request to [react-component](https://github.com/react-component/):
Since antd's components are based on react-component, sometimes you may need to send pull request to the corresponding react-component repository. If it's a bugfix pull request, after it's merged, the core team will release a patch release for that component as soon as possible, then you only need to do is reinstalling antd in your project to get the latest patch release. If it's a feature pull request, after it's merged, the core team will release a minor release, then you need raise another pull request to [Ant Design](https://github.com/ant-design/ant-design/) to update dependencies, document and TypeScript interfaces (if needed).
## Development Workflow
After cloning antd, run `npm install` to fetch its dependencies. Then, you can run several commands:
1. `npm start` runs Ant Design website locally.
1. `npm run lint` checks the code style.
1. `npm test` runs the complete test suite.
1. `npm run compile` compiles TypeScript code to the `lib` and `es` directory.
1. `npm run dist` creates UMD build of antd.
我们写了一份 **[贡献指南](https://ant.design/docs/react/contributing-cn)** 来帮助你开始。

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,131 @@ timeline: true
---
## 3.2.3
`2018-03-02`
- 🐞 Fix props `onPopupScroll` ts define in `Select`. [#9475](https://github.com/ant-design/ant-design/pull/9475) [@twobin](https://github.com/twobin)
- 🐞 Fix `Table` filter dropdown menu popup container. [#9209](https://github.com/ant-design/ant-design/issues/9209)
- 🐞 Fix `Timeline` head custom style error in chrome. [#9429](https://github.com/ant-design/ant-design/pull/9429) [@vthinkxie](https://github.com/vthinkxie)
- 🐞 Fix `Select` dropdown border. [82092c1](https://github.com/ant-design/ant-design/commit/82092c154ac1fa7ff2f89e1adbdf0aaf22e3ff53)
- 🐞 Fix compatibility with less 3. [#7850](https://github.com/ant-design/ant-design/issues/7850)
- 🐞 Fix `DatePicker.WeekPicker` year. [#9463](https://github.com/ant-design/ant-design/issues/9463)
- 🐞 Fix `Button.Group` align issue in chrome. [#9457](https://github.com/ant-design/ant-design/issues/9457)
## 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`
- 🐞 Fix Select Options were disappeared when click the scrollbar in IE11. [#7934](https://github.com/ant-design/ant-design/issues/7934) [@tianlang89757](https://github.com/tianlang89757)
- 🐞 Fix Form `getFieldDecorator` referenced item will conflicted when using the same id. [#9103](https://github.com/ant-design/ant-design/issues/9103) [#7351](https://github.com/ant-design/ant-design/issues/7351)
- 🐞 Fix RangePicker i18n issue which will shown the last language when change the language. [#8970](https://github.com/ant-design/ant-design/issues/8970)
- 🐞 Fix DatePicker shown wrong in the control mode. [#8885](https://github.com/ant-design/ant-design/issues/8885)
- 🐞 Fix Table shown emptyText when loading state. [#9095](https://github.com/ant-design/ant-design/pull/9095) [@sallen450](https://github.com/sallen450)
- 🐞 Add Icon `file-word`. [#9092](https://github.com/ant-design/ant-design/issues/9092) [#9061](https://github.com/ant-design/ant-design/issues/9061)
- 🐞 Fix wrong font family. [commit/506f97](https://github.com/ant-design/ant-design/commit/506f97640ec34a6d3d9fdb18e8036e5d34796a5f)
- 📖 Add some TypeScript type definitions
- Add `duration` for Notification. [pull/9120](https://github.com/ant-design/ant-design/pull/9120) [@duhongjun](https://github.com/duhongjun)
- Add `style` for Steps. [pull/9126](https://github.com/ant-design/ant-design/pull/9126) [@wanliyunyan](https://github.com/wanliyunyan)
- 🌟 Optimize Avatar default background color. [commit/275946](https://github.com/ant-design/ant-design/commit/275946090823ab8da90f1871976c671b2c7ac851)
- 🌟 Add the less variable for Slider and Menu. [pull/9065](https://github.com/ant-design/ant-design/pull/9065) [pull/9115](https://github.com/ant-design/ant-design/pull/9115) [@mrgeorgegray](https://github.com/mrgeorgegray)
## 3.1.4
`2018-01-21`
- 🐞 Fix ButtonGroup z-index issue. [#9014](https://github.com/ant-design/ant-design/issues/9014)
- 🐞 Fix Dropdown.Button can not be fully disabled. [#8991](https://github.com/ant-design/ant-design/issues/8991) [@sallen450](https://github.com/sallen450)
- 🐞 Fix Layout error responsive docs. [#8995](https://github.com/ant-design/ant-design/pull/8995) [@ReedSun](https://github.com/ReedSun)
- 🐞 Fix List `grid` do not support xxl. [#9019](https://github.com/ant-design/ant-design/issues/9019)
- 🐞 Fix RangePicker can not cancel selected start date when the panel is closed. [#8839](https://github.com/ant-design/ant-design/issues/8839)
- 🐞 Fix Tabs error margin. [commit/200d6c](https://github.com/ant-design/ant-design/commit/200d6cb11aba12a488510f957353bbd5bd1dcd1b)
- 🐞 Fix WeekPicker shows error weeks. [#9021](https://github.com/ant-design/ant-design/issues/9021)
- 🐞 Fix some TypeScript type definitions.
- Add `subMenuCloseDelay` and `subMenuOpenDelay` for Menu. [#8976](https://github.com/ant-design/ant-design/issues/8976) [@Rohanhacker](https://github.com/Rohanhacker)
- Refactor DatePicker types. [commit/0bb531](https://github.com/ant-design/ant-design/commit/0bb531aca6cb2045d5323196a599c925537a4eb0)
- Fix Input `maxLength` type definitions. [#9046](https://github.com/ant-design/ant-design/pull/9046) [@Riokai](https://github.com/Riokai)
- 🌟 Add some new less variables.
- About Checkbox and Radio: [#9003](https://github.com/ant-design/ant-design/pull/9003) [@mrgeorgegray](https://github.com/mrgeorgegray)
- About Breadcrumb: [#9022](https://github.com/ant-design/ant-design/pull/9022) [@mrgeorgegray](https://github.com/mrgeorgegray)
- 🌟 Add aliyun icon.
## 3.1.3
`2018-01-14`
- 🐞 Fix error when passing `null` `locale` to LocaleProvider.
## 3.1.2
`2018-01-13`

View File

@@ -15,6 +15,131 @@ timeline: true
---
## 3.2.3
`2018-03-02`
- 🐞 修复组件 `Select` 中的 `onPopupScroll` 属性的 ts 定义。 [#9475](https://github.com/ant-design/ant-design/pull/9475) [@twobin](https://github.com/twobin)
- 🐞 修复 `Table` 过滤条件下拉选择框的问题。 [#9209](https://github.com/ant-design/ant-design/issues/9209)
- 🐞 修复 `Timeline` 自定义头部样式在 Chrome 下的显示问题。 [#9429](https://github.com/ant-design/ant-design/pull/9429) [@vthinkxie](https://github.com/vthinkxie)
- 🐞 修复 `Select` 下拉窗口的边框显示问题。 [82092c1](https://github.com/ant-design/ant-design/commit/82092c154ac1fa7ff2f89e1adbdf0aaf22e3ff53)
- 🐞 修复对 less 3 的兼容性问题。 [#7850](https://github.com/ant-design/ant-design/issues/7850)
- 🐞 修复 `DatePicker.WeekPicker` 年份问题。 [#9463](https://github.com/ant-design/ant-design/issues/9463)
- 🐞 修复 `Button.Group` 在 Chrome 下的定位对齐问题。 [#9457](https://github.com/ant-design/ant-design/issues/9457)
## 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`
- 🐞 修复了 Select 下拉选择框在 IE11 点击滚动条会无故消失的问题。[#7934](https://github.com/ant-design/ant-design/issues/7934) [@tianlang89757](https://github.com/tianlang89757)
- 🐞 修复了 Form 中使用 `getFieldDecorator` 当 id 重复时引用冲突的问题。[#9103](https://github.com/ant-design/ant-design/issues/9103) [#7351](https://github.com/ant-design/ant-design/issues/7351)
- 🐞 修复了 RangePicker 在语言切换时会显示上一次的语言的问题。[#8970](https://github.com/ant-design/ant-design/issues/8970)
- 🐞 修复了 DatePicker 在受控模式下时间显示不正确的问题。[#8885](https://github.com/ant-design/ant-design/issues/8885)
- 🐞 修复了 Table 在 `loading` 时显示空提示的问题。[#9095](https://github.com/ant-design/ant-design/pull/9095) [@sallen450](https://github.com/sallen450)
- 🐞 补充 Icon 类型 `file-word`。[#9092](https://github.com/ant-design/ant-design/issues/9092) [#9061](https://github.com/ant-design/ant-design/issues/9061)
- 🐞 修复写错的字体名称,造成浏览器无法正确识别的问题。[commit/506f97](https://github.com/ant-design/ant-design/commit/506f97640ec34a6d3d9fdb18e8036e5d34796a5f)
- 📖 修复了 TypeScript 定义
- 补充 Notification 缺失的 `duration` 定义。[pull/9120](https://github.com/ant-design/ant-design/pull/9120) [@duhongjun](https://github.com/duhongjun)
- 补充 Steps 缺失的 `style` 定义。[pull/9126](https://github.com/ant-design/ant-design/pull/9126) [@wanliyunyan](https://github.com/wanliyunyan)
- 🌟 优化了 Avatar 的默认背景色。[commit/275946](https://github.com/ant-design/ant-design/commit/275946090823ab8da90f1871976c671b2c7ac851)
- 🌟 新增了 Slider 以及 Menu 的 less 变量,更加方便的修改主题。[pull/9065](https://github.com/ant-design/ant-design/pull/9065) [pull/9115](https://github.com/ant-design/ant-design/pull/9115) [@mrgeorgegray](https://github.com/mrgeorgegray)
## 3.1.4
`2018-01-21`
- 🐞 修复 ButtonGroup 错误 z-index 导致的样式问题。[#9014](https://github.com/ant-design/ant-design/issues/9014)
- 🐞 修复 Dropdown.Button 不能被完全禁用的问题。[#8991](https://github.com/ant-design/ant-design/issues/8991) [@sallen450](https://github.com/sallen450)
- 🐞 修复 Layout 错误的响应式相关文档。[#8995](https://github.com/ant-design/ant-design/pull/8995) [@ReedSun](https://github.com/ReedSun)
- 🐞 修复 List `grid` 不支持 xxl 配置的问题。[#9019](https://github.com/ant-design/ant-design/issues/9019)
- 🐞 修复 RangePicker 关闭选择面板之后无法清空已选开始时间的问题。[#8839](https://github.com/ant-design/ant-design/issues/8839)
- 🐞 修复 Tabs 错误外边距导致的样式问题。[commit/200d6c](https://github.com/ant-design/ant-design/commit/200d6cb11aba12a488510f957353bbd5bd1dcd1b)
- 🐞 修复 WeekPicker 显示错误周数的问题。[#9021](https://github.com/ant-design/ant-design/issues/9021)
- 🐞 修复 TypeScript 定义
- 补充 Menu 缺失的 `subMenuCloseDelay``subMenuOpenDelay`。[#8976](https://github.com/ant-design/ant-design/issues/8976) [@Rohanhacker](https://github.com/Rohanhacker)
- 重构了 DatePicker 相关 type 定义。[commit/0bb531](https://github.com/ant-design/ant-design/commit/0bb531aca6cb2045d5323196a599c925537a4eb0)
- 修复了 Input `maxLength` type 定义。[#9046](https://github.com/ant-design/ant-design/pull/9046) [@Riokai](https://github.com/Riokai)
- 🌟 新增 less 变量
- Checkbox 和 Radio 相关:[#9003](https://github.com/ant-design/ant-design/pull/9003) [@mrgeorgegray](https://github.com/mrgeorgegray)
- Breadcrumb 相关:[#9022](https://github.com/ant-design/ant-design/pull/9022) [@mrgeorgegray](https://github.com/mrgeorgegray)
- 🌟 新增 aliyun 图标。
## 3.1.3
`2018-01-14`
- 🐞 修复 `locale``null` 时 LocaleProvider 出错的问题。
## 3.1.2
`2018-01-13`
@@ -278,7 +403,7 @@ timeline: true
```
- Select
- 🌟 默认和多选模式下 Option 的值允许使用 number。
- 🌟 新增 `maxTagCount 和 `maxTagPlaceholder`,用设置最多可显示的选中项。
- 🌟 新增 `maxTagCount 和 `maxTagPlaceholder`,用设置最多可显示的选中项。
- 🌟 新增 `showAction`,用于设置出发下拉框打开的事件。
- 🌟 新增 `onMouseEnter``onMouseLeave` 事件回调。
- LocaleProvider

View File

@@ -35,7 +35,7 @@
## 参与共建 [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)
`antd` 是一个开源项目,我们欢迎社区参与共建。如果你对此项目感兴趣,有 [很多方式](https://opensource.guide/how-to-contribute/) 进行参与。你可以 watch 这个仓库,加入 [issue 中的讨论](https://github.com/ant-design/ant-design/issues?q=is%3Aopen+is%3Aissue+label%3ADiscussion),以及尝试实现一些 [已接受的特性](https://github.com/ant-design/ant-design/issues?q=is%3Aopen+is%3Aissue+label%3A%22PR+welcome%22)。我们会给予有活跃贡献的社区成员 [collaborator 权限](https://github.com/ant-design/ant-design/issues/3222)
请参考[贡献指南](https://ant.design/docs/react/contributing-cn).
## 安装

View File

@@ -11,7 +11,7 @@
[![Dependency Status](https://img.shields.io/gemnasium/react-component/trigger.svg?style=flat-square)](https://gemnasium.com/ant-design/ant-design)
[![npm package](https://img.shields.io/npm/v/antd.svg?style=flat-square)](https://www.npmjs.org/package/antd)
[![NPM downloads](http://img.shields.io/npm/dm/antd.svg?style=flat-square)](https://npmjs.org/package/antd)
[![NPM downloads](http://img.shields.io/npm/dm/antd.svg?style=flat-square)](https://npmcharts.com/compare/antd?minimal=true)
[![Percentage of issues still open](http://isitmaintained.com/badge/open/ant-design/ant-design.svg)](http://isitmaintained.com/project/ant-design/ant-design "Percentage of issues still open")
[![Gitter](https://badges.gitter.im/ant-design/ant-design-english.svg)](https://gitter.im/ant-design/ant-design-english?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) (English)
[![Join the chat at https://gitter.im/ant-design/ant-design](https://img.shields.io/gitter/room/ant-design/ant-design.svg?style=flat-square)](https://gitter.im/ant-design/ant-design?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)(中文)
@@ -39,7 +39,7 @@ An enterprise-class UI design language and React-based implementation.
## Let's build a better antd together [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)
Read our [contributing guide](./.github/CONTRIBUTING.md).
Read our [contributing guide](https://ant.design/docs/react/contributing).
## Install
@@ -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

@@ -12,6 +12,11 @@
white-space: nowrap;
position: relative;
overflow: hidden;
vertical-align: middle;
&-image {
background: transparent;
}
.avatar-size(@avatar-size-base, @avatar-font-size-base);

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

@@ -5,22 +5,23 @@
.@{breadcrumb-prefix-cls} {
.reset-component;
color: @text-color-secondary;
color: @breadcrumb-base-color;
font-size: @breadcrumb-font-size;
.@{iconfont-css-prefix} {
font-size: @font-size-sm;
font-size: @breadcrumb-icon-font-size;
}
a {
color: @text-color-secondary;
color: @breadcrumb-link-color;
transition: color .3s;
&:hover {
color: @primary-5;
color: @breadcrumb-link-color-hover;
}
}
& > span:last-child {
color: @text-color;
color: @breadcrumb-last-item-color;
}
& > span:last-child &-separator {
@@ -28,8 +29,8 @@
}
&-separator {
margin: 0 @padding-xs;
color: @text-color-secondary;
margin: @breadcrumb-separator-margin;
color: @breadcrumb-separator-color;
}
&-link {

View File

@@ -481,6 +481,7 @@ exports[`renders ./components/button/demo/size.md correctly 1`] = `
checked=""
class="ant-radio-button-input"
type="radio"
value="large"
/>
<span
class="ant-radio-button-inner"
@@ -499,6 +500,7 @@ exports[`renders ./components/button/demo/size.md correctly 1`] = `
<input
class="ant-radio-button-input"
type="radio"
value="default"
/>
<span
class="ant-radio-button-inner"
@@ -517,6 +519,7 @@ exports[`renders ./components/button/demo/size.md correctly 1`] = `
<input
class="ant-radio-button-input"
type="radio"
value="small"
/>
<span
class="ant-radio-button-inner"

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

@@ -108,7 +108,7 @@
display: inline-block;
> .@{btnClassName} {
position: relative;
z-index: 1;
line-height: @btn-height-base - 2px;
&:hover,
&:focus,
@@ -125,10 +125,12 @@
// size
&-lg > .@{btnClassName} {
.button-size(@btn-height-lg; @btn-padding-lg; @btn-font-size-lg; @btn-border-radius-base);
line-height: @btn-height-lg - 2px;
}
&-sm > .@{btnClassName} {
.button-size(@btn-height-sm; @btn-padding-sm; @font-size-base; @btn-border-radius-sm);
line-height: @btn-height-sm - 2px;
> .@{iconfont-css-prefix} {
font-size: @font-size-base;
}
@@ -199,7 +201,7 @@
&:focus,
&:active,
&.active {
background: #fff;
background: @btn-default-bg;
}
}
@@ -242,6 +244,8 @@
.@{btnClassName} + .@{btnClassName},
.@{btnClassName} + &,
span + .@{btnClassName},
.@{btnClassName} + span,
& + .@{btnClassName},
& + & {
margin-left: -1px;
@@ -251,15 +255,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

@@ -84,6 +84,7 @@ exports[`renders ./components/calendar/demo/basic.md correctly 1`] = `
checked=""
class="ant-radio-button-input"
type="radio"
value="date"
/>
<span
class="ant-radio-button-inner"
@@ -102,6 +103,7 @@ exports[`renders ./components/calendar/demo/basic.md correctly 1`] = `
<input
class="ant-radio-button-input"
type="radio"
value="month"
/>
<span
class="ant-radio-button-inner"
@@ -1091,6 +1093,7 @@ exports[`renders ./components/calendar/demo/card.md correctly 1`] = `
checked=""
class="ant-radio-button-input"
type="radio"
value="date"
/>
<span
class="ant-radio-button-inner"
@@ -1109,6 +1112,7 @@ exports[`renders ./components/calendar/demo/card.md correctly 1`] = `
<input
class="ant-radio-button-input"
type="radio"
value="month"
/>
<span
class="ant-radio-button-inner"
@@ -2096,6 +2100,7 @@ exports[`renders ./components/calendar/demo/notice-calendar.md correctly 1`] = `
checked=""
class="ant-radio-button-input"
type="radio"
value="date"
/>
<span
class="ant-radio-button-inner"
@@ -2114,6 +2119,7 @@ exports[`renders ./components/calendar/demo/notice-calendar.md correctly 1`] = `
<input
class="ant-radio-button-input"
type="radio"
value="month"
/>
<span
class="ant-radio-button-inner"
@@ -3511,6 +3517,7 @@ exports[`renders ./components/calendar/demo/select.md correctly 1`] = `
checked=""
class="ant-radio-button-input"
type="radio"
value="date"
/>
<span
class="ant-radio-button-inner"
@@ -3529,6 +3536,7 @@ exports[`renders ./components/calendar/demo/select.md correctly 1`] = `
<input
class="ant-radio-button-input"
type="radio"
value="month"
/>
<span
class="ant-radio-button-inner"

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

@@ -59,6 +59,7 @@ exports[`renders ./components/checkbox/demo/check-all.md correctly 1`] = `
checked=""
class="ant-checkbox-input"
type="checkbox"
value="Apple"
/>
<span
class="ant-checkbox-inner"
@@ -77,6 +78,7 @@ exports[`renders ./components/checkbox/demo/check-all.md correctly 1`] = `
<input
class="ant-checkbox-input"
type="checkbox"
value="Pear"
/>
<span
class="ant-checkbox-inner"
@@ -96,6 +98,7 @@ exports[`renders ./components/checkbox/demo/check-all.md correctly 1`] = `
checked=""
class="ant-checkbox-input"
type="checkbox"
value="Orange"
/>
<span
class="ant-checkbox-inner"
@@ -210,6 +213,7 @@ exports[`renders ./components/checkbox/demo/group.md correctly 1`] = `
checked=""
class="ant-checkbox-input"
type="checkbox"
value="Apple"
/>
<span
class="ant-checkbox-inner"
@@ -228,6 +232,7 @@ exports[`renders ./components/checkbox/demo/group.md correctly 1`] = `
<input
class="ant-checkbox-input"
type="checkbox"
value="Pear"
/>
<span
class="ant-checkbox-inner"
@@ -246,6 +251,7 @@ exports[`renders ./components/checkbox/demo/group.md correctly 1`] = `
<input
class="ant-checkbox-input"
type="checkbox"
value="Orange"
/>
<span
class="ant-checkbox-inner"
@@ -270,6 +276,7 @@ exports[`renders ./components/checkbox/demo/group.md correctly 1`] = `
<input
class="ant-checkbox-input"
type="checkbox"
value="Apple"
/>
<span
class="ant-checkbox-inner"
@@ -289,6 +296,7 @@ exports[`renders ./components/checkbox/demo/group.md correctly 1`] = `
checked=""
class="ant-checkbox-input"
type="checkbox"
value="Pear"
/>
<span
class="ant-checkbox-inner"
@@ -307,6 +315,7 @@ exports[`renders ./components/checkbox/demo/group.md correctly 1`] = `
<input
class="ant-checkbox-input"
type="checkbox"
value="Orange"
/>
<span
class="ant-checkbox-inner"
@@ -333,6 +342,7 @@ exports[`renders ./components/checkbox/demo/group.md correctly 1`] = `
class="ant-checkbox-input"
disabled=""
type="checkbox"
value="Apple"
/>
<span
class="ant-checkbox-inner"
@@ -352,6 +362,7 @@ exports[`renders ./components/checkbox/demo/group.md correctly 1`] = `
class="ant-checkbox-input"
disabled=""
type="checkbox"
value="Pear"
/>
<span
class="ant-checkbox-inner"
@@ -371,6 +382,7 @@ exports[`renders ./components/checkbox/demo/group.md correctly 1`] = `
class="ant-checkbox-input"
disabled=""
type="checkbox"
value="Orange"
/>
<span
class="ant-checkbox-inner"
@@ -404,6 +416,7 @@ exports[`renders ./components/checkbox/demo/layout.md correctly 1`] = `
<input
class="ant-checkbox-input"
type="checkbox"
value="A"
/>
<span
class="ant-checkbox-inner"
@@ -426,6 +439,7 @@ exports[`renders ./components/checkbox/demo/layout.md correctly 1`] = `
<input
class="ant-checkbox-input"
type="checkbox"
value="B"
/>
<span
class="ant-checkbox-inner"
@@ -448,6 +462,7 @@ exports[`renders ./components/checkbox/demo/layout.md correctly 1`] = `
<input
class="ant-checkbox-input"
type="checkbox"
value="C"
/>
<span
class="ant-checkbox-inner"
@@ -470,6 +485,7 @@ exports[`renders ./components/checkbox/demo/layout.md correctly 1`] = `
<input
class="ant-checkbox-input"
type="checkbox"
value="D"
/>
<span
class="ant-checkbox-inner"
@@ -492,6 +508,7 @@ exports[`renders ./components/checkbox/demo/layout.md correctly 1`] = `
<input
class="ant-checkbox-input"
type="checkbox"
value="E"
/>
<span
class="ant-checkbox-inner"

View File

@@ -17,7 +17,7 @@
.@{checkbox-prefix-cls}-wrapper:hover &-inner,
&:hover &-inner,
&-input:focus + &-inner {
border-color: @primary-color;
border-color: @checkbox-color;
}
&-checked:after {
@@ -27,7 +27,7 @@
width: 100%;
height: 100%;
border-radius: @border-radius-sm;
border: 1px solid @primary-color;
border: 1px solid @checkbox-color;
content: '';
animation: antCheckboxEffect 0.36s ease-in-out;
animation-fill-mode: both;
@@ -115,8 +115,8 @@
.@{checkbox-prefix-cls}-checked,
.@{checkbox-prefix-cls}-indeterminate {
.@{checkbox-inner-prefix-cls} {
background-color: @primary-color;
border-color: @primary-color;
background-color: @checkbox-color;
border-color: @checkbox-color;
}
}

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,8 +7,7 @@ import classNames from 'classnames';
import Icon from '../icon';
import warning from '../_util/warning';
import callMoment from '../_util/callMoment';
export type RangePickerValue = moment.Moment[];
import { RangePickerValue, RangePickerPresetRange } from './interface';
export interface RangePickerState {
value?: RangePickerValue;
@@ -17,21 +16,21 @@ export interface RangePickerState {
hoverValue?: RangePickerValue;
}
function getShowDateFromValue(value: moment.Moment[]): moment.Moment[] | undefined {
function getShowDateFromValue(value: RangePickerValue) {
const [start, end] = value;
// value could be an empty array, then we should not reset showDate
if (!start && !end) {
return;
}
const newEnd = end && end.isSame(start, 'month') ? end.clone().add(1, 'month') : end;
return [start, newEnd];
return [start, newEnd] as RangePickerValue;
}
function formatValue(value: moment.Moment | undefined, format: string): string {
return (value && value.format(format)) || '';
}
function pickerValueAdapter(value?: moment.Moment | moment.Moment[]): moment.Moment[] | undefined {
function pickerValueAdapter(value?: moment.Moment | RangePickerValue): RangePickerValue | undefined {
if (!value) {
return;
}
@@ -48,6 +47,21 @@ function isEmptyArray(arr: any) {
return false;
}
function fixLocale(value: RangePickerValue | undefined, localeCode: string) {
if (!localeCode) {
return;
}
if (!value || value.length === 0) {
return;
}
if (value[0]) {
value[0]!.locale(localeCode);
}
if (value[1]) {
value[1]!.locale(localeCode);
}
}
export default class RangePicker extends React.Component<any, RangePickerState> {
static defaultProps = {
prefixCls: 'ant-calendar',
@@ -103,7 +117,7 @@ export default class RangePicker extends React.Component<any, RangePickerState>
clearHoverValue = () => this.setState({ hoverValue: [] });
handleChange = (value: moment.Moment[]) => {
handleChange = (value: RangePickerValue) => {
const props = this.props;
if (!('value' in props)) {
this.setState(({ showDate }) => ({
@@ -122,6 +136,10 @@ export default class RangePicker extends React.Component<any, RangePickerState>
this.setState({ open });
}
if (open === false) {
this.clearHoverValue();
}
const { onOpenChange } = this.props;
if (onOpenChange) {
onOpenChange(open);
@@ -132,7 +150,36 @@ export default class RangePicker extends React.Component<any, RangePickerState>
handleHoverChange = (hoverValue: any) => this.setState({ hoverValue });
setValue(value: moment.Moment[], hidePanel?: boolean) {
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)) {
this.setState({ open: false });
@@ -166,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>
@@ -192,14 +239,9 @@ export default class RangePicker extends React.Component<any, RangePickerState>
ranges, onOk, locale, localeCode, format,
dateRender, onCalendarChange,
} = props;
if (value && localeCode) {
if (value[0]) {
value[0].locale(localeCode);
}
if (value[1]) {
value[1].locale(localeCode);
}
}
fixLocale(value, localeCode);
fixLocale(showDate, localeCode);
warning(!('onOK' in props), 'It should be `RangePicker[onOk]`, instead of `onOK`!');
@@ -250,6 +292,7 @@ export default class RangePicker extends React.Component<any, RangePickerState>
onHoverChange={this.handleHoverChange}
onPanelChange={props.onPanelChange}
showToday={showToday}
onInputSelect={this.handleCalendarInputSelect}
/>
);
@@ -298,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

@@ -11,7 +11,7 @@ function formatValue(value: moment.Moment | null, format: string): string {
export default class WeekPicker extends React.Component<any, any> {
static defaultProps = {
format: 'YYYY-Wo',
format: 'gggg-wo',
allowClear: true,
};
@@ -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,11 +3,27 @@ import { mount } from 'enzyme';
import moment from 'moment';
import MockDate from 'mockdate';
import DatePicker from '..';
import {
selectDate,
openPanel,
clearInput,
nextYear,
nextMonth,
hasSelected,
} from './utils';
import focusTest from '../../../tests/shared/focusTest';
describe('DatePicker', () => {
focusTest(DatePicker);
beforeEach(() => {
MockDate.set(new Date('2016-11-22').getTime() + (new Date().getTimezoneOffset() * 60 * 1000));
});
afterEach(() => {
MockDate.reset();
});
it('prop locale should works', () => {
const locale = {
lang: {
@@ -46,12 +62,80 @@ describe('DatePicker', () => {
placeholder: 'Избор на час',
},
};
MockDate.set(new Date('2016-11-22').getTime() + (new Date().getTimezoneOffset() * 60 * 1000));
const birthday = moment('2000-01-01', 'YYYY-MM-DD');
const wrapper = mount(
<DatePicker open locale={locale} value={birthday} />
);
expect(wrapper.render()).toMatchSnapshot();
MockDate.reset();
});
// Fix https://github.com/ant-design/ant-design/issues/8885
it('control value after panel closed', () => {
class Test extends React.Component {
state = {
cleared: false,
value: moment(),
}
onChange = (value) => {
let cleared = this.state.cleared;
if (cleared) {
value = moment(moment(value).format('YYYY-MM-DD 12:12:12'));
cleared = false;
}
if (!value) {
cleared = true;
}
this.setState({ value, cleared });
}
render() {
return (
<DatePicker
showTime
value={this.state.value}
format="YYYY-MM-DD HH:mm:ss"
onChange={this.onChange}
/>
);
}
}
const wrapper = mount(<Test />);
// clear input
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

@@ -2,6 +2,8 @@ import React from 'react';
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;
@@ -9,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(
@@ -112,4 +122,97 @@ describe('RangePicker', () => {
expect(() => rangeCalendarWrapper.find('.ant-calendar-cell').at(15).simulate('click').simulate('click'))
.not.toThrow();
});
it('clear hover value after panel close', () => {
jest.useFakeTimers();
const wrapper = mount(
<div>
<RangePicker value={[moment(), moment().add(2, 'day')]} />
</div>
);
wrapper.find('.ant-calendar-picker-input').simulate('click');
wrapper.find('.ant-calendar-cell').at(25).simulate('click');
wrapper.find('.ant-calendar-cell').at(27).simulate('mouseEnter');
document.dispatchEvent(new MouseEvent('mousedown'));
jest.runAllTimers();
wrapper.find('.ant-calendar-picker-input').simulate('click');
expect(
wrapper.find('.ant-calendar-cell').at(23).hasClass('ant-calendar-in-range-cell')
).toBe(true);
});
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

@@ -601,6 +601,7 @@ exports[`renders ./components/date-picker/demo/size.md correctly 1`] = `
<input
class="ant-radio-button-input"
type="radio"
value="large"
/>
<span
class="ant-radio-button-inner"
@@ -620,6 +621,7 @@ exports[`renders ./components/date-picker/demo/size.md correctly 1`] = `
checked=""
class="ant-radio-button-input"
type="radio"
value="default"
/>
<span
class="ant-radio-button-inner"
@@ -638,6 +640,7 @@ exports[`renders ./components/date-picker/demo/size.md correctly 1`] = `
<input
class="ant-radio-button-input"
type="radio"
value="small"
/>
<span
class="ant-radio-button-inner"

View File

@@ -0,0 +1,28 @@
/* eslint-disable import/prefer-default-export */
export function selectDate(wrapper, date, index) {
let calendar = wrapper;
if (index !== undefined) {
calendar = wrapper.find('.ant-calendar-range-part').at(index);
}
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;
@@ -95,6 +104,10 @@ export default function createPicker(TheCalendar: React.ComponentClass): any {
[`${prefixCls}-month`]: MonthCalendar === TheCalendar,
});
if (value && localeCode) {
value.locale(localeCode);
}
let pickerProps: Object = {};
let calendarProps: any = {};
if (props.showTime) {
@@ -130,6 +143,8 @@ export default function createPicker(TheCalendar: React.ComponentClass): any {
monthCellContentRender={props.monthCellContentRender}
renderFooter={this.renderFooter}
onPanelChange={props.onPanelChange}
onChange={this.handleCalendarChange}
value={showDate}
/>
);
@@ -156,12 +171,9 @@ export default function createPicker(TheCalendar: React.ComponentClass): any {
</div>
);
const pickerValue = value;
if (pickerValue && localeCode) {
pickerValue.locale(localeCode);
}
return (
<span
id={props.id}
className={classNames(props.className, props.pickerClass)}
style={props.style}
onFocus={props.onFocus}
@@ -171,7 +183,7 @@ export default function createPicker(TheCalendar: React.ComponentClass): any {
{...props}
{...pickerProps}
calendar={calendar}
value={pickerValue}
value={value}
prefixCls={`${prefixCls}-picker-container`}
style={props.popupStyle}
>

View File

@@ -90,7 +90,7 @@ The following APIs are shared by DatePicker, MonthPicker, RangePicker, WeekPicke
| Property | Description | Type | Default |
| -------- | ----------- | ---- | ------- |
| defaultValue | to set default date | [moment](http://momentjs.com/) | - |
| format | to set the date format, refer to [moment.js](http://momentjs.com/) | string | "YYYY-Wo" |
| format | to set the date format, refer to [moment.js](http://momentjs.com/) | string | "YYYY-wo" |
| value | to set date | [moment](http://momentjs.com/) | - |
| onChange | a callback function, can be executed when the selected time is changing | function(date: moment, dateString: string) | - |
@@ -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

@@ -1,98 +1,20 @@
import * as React from 'react';
import * as moment from 'moment';
import RcCalendar from 'rc-calendar';
import MonthCalendar from 'rc-calendar/lib/MonthCalendar';
import createPicker from './createPicker';
import wrapPicker from './wrapPicker';
import RangePicker from './RangePicker';
import WeekPicker from './WeekPicker';
import { TimePickerProps } from '../time-picker';
import { DatePickerProps, DatePickerDecorator } from './interface';
export interface PickerProps {
prefixCls?: string;
inputPrefixCls?: string;
format?: string;
disabled?: boolean;
allowClear?: boolean;
className?: string;
style?: React.CSSProperties;
popupStyle?: React.CSSProperties;
locale?: any;
size?: 'large' | 'small' | 'default';
getCalendarContainer?: (triggerNode: Element) => HTMLElement;
open?: boolean;
onOpenChange?: (status: boolean) => void;
disabledDate?: (current: moment.Moment) => boolean;
renderExtraFooter?: () => React.ReactNode;
dateRender?: (current: moment.Moment, today: moment.Moment) => React.ReactNode;
}
export interface SinglePickerProps {
value?: moment.Moment;
defaultValue?: moment.Moment;
defaultPickerValue?: moment.Moment;
onChange?: (date: moment.Moment, dateString: string) => void;
}
export interface DatePickerProps extends PickerProps, SinglePickerProps {
className?: string;
showTime?: TimePickerProps | boolean;
showToday?: boolean;
open?: boolean;
disabledTime?: (current: moment.Moment) => {
disabledHours?: () => number[],
disabledMinutes?: () => number[],
disabledSeconds?: () => number[],
};
onOpenChange?: (status: boolean) => void;
onOk?: (selectedTime: moment.Moment) => void;
placeholder?: string;
}
const DatePicker = wrapPicker(createPicker(RcCalendar)) as React.ClassicComponentClass<DatePickerProps>;
export interface MonthPickerProps extends PickerProps, SinglePickerProps {
className?: string;
placeholder?: string;
}
const MonthPicker = wrapPicker(createPicker(MonthCalendar), 'YYYY-MM');
export interface RangePickerProps extends PickerProps {
className?: string;
value?: [moment.Moment, moment.Moment];
defaultValue?: [moment.Moment, moment.Moment];
defaultPickerValue?: [moment.Moment, moment.Moment];
onChange?: (dates: [moment.Moment, moment.Moment], dateStrings: [string, string]) => void;
onCalendarChange?: (dates: [moment.Moment, moment.Moment], dateStrings: [string, string]) => void;
onOk?: (selectedTime: moment.Moment) => void;
showTime?: TimePickerProps | boolean;
ranges?: {
[range: string]: moment.Moment[],
};
placeholder?: [string, string];
mode?: string | string[];
disabledTime?: (current: moment.Moment, type: string) => {
disabledHours?: () => number[],
disabledMinutes?: () => number[],
disabledSeconds?: () => number[],
};
onPanelChange?: (value?: moment.Moment[], mode?: string | string[]) => void;
}
export interface WeexPickerProps extends PickerProps, SinglePickerProps {
className?: string;
placeholder?: string;
}
Object.assign(DatePicker, {
RangePicker: wrapPicker(RangePicker),
MonthPicker,
WeekPicker: wrapPicker(WeekPicker, 'YYYY-Wo'),
WeekPicker: wrapPicker(WeekPicker, 'gggg-wo'),
});
export interface DatePickerDecorator extends React.ClassicComponentClass<DatePickerProps> {
RangePicker: React.ClassicComponentClass<RangePickerProps>;
MonthPicker: React.ClassicComponentClass<MonthPickerProps>;
WeekPicker: React.ClassicComponentClass<WeexPickerProps>;
}
export default DatePicker as DatePickerDecorator;

View File

@@ -90,7 +90,7 @@ subtitle: 日期选择框
| 参数 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
| defaultValue | 默认日期 | [moment](http://momentjs.com/) | - |
| format | 展示的日期格式,配置参考 [moment.js](http://momentjs.com/) | string | "YYYY-Wo" |
| format | 展示的日期格式,配置参考 [moment.js](http://momentjs.com/) | string | "YYYY-wo" |
| value | 日期 | [moment](http://momentjs.com/) | - |
| onChange | 时间发生变化的回调,发生在用户选择时间时 | function(date: moment, dateString: string) | - |
@@ -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

@@ -0,0 +1,90 @@
import * as React from 'react';
import * as moment from 'moment';
import { TimePickerProps } from '../time-picker';
export interface PickerProps {
id?: number | string;
prefixCls?: string;
inputPrefixCls?: string;
format?: string;
disabled?: boolean;
allowClear?: boolean;
className?: string;
style?: React.CSSProperties;
popupStyle?: React.CSSProperties;
locale?: any;
size?: 'large' | 'small' | 'default';
getCalendarContainer?: (triggerNode: Element) => HTMLElement;
open?: boolean;
onOpenChange?: (status: boolean) => void;
disabledDate?: (current: moment.Moment) => boolean;
renderExtraFooter?: () => React.ReactNode;
dateRender?: (current: moment.Moment, today: moment.Moment) => React.ReactNode;
}
export interface SinglePickerProps {
value?: moment.Moment;
defaultValue?: moment.Moment;
defaultPickerValue?: moment.Moment;
onChange?: (date: moment.Moment, dateString: string) => void;
}
export interface DatePickerProps extends PickerProps, SinglePickerProps {
className?: string;
showTime?: TimePickerProps | boolean;
showToday?: boolean;
open?: boolean;
disabledTime?: (current: moment.Moment) => {
disabledHours?: () => number[],
disabledMinutes?: () => number[],
disabledSeconds?: () => number[],
};
onOpenChange?: (status: boolean) => void;
onOk?: (selectedTime: moment.Moment) => void;
placeholder?: string;
}
export interface MonthPickerProps extends PickerProps, SinglePickerProps {
className?: string;
placeholder?: string;
}
export type RangePickerValue =
undefined[] |
[moment.Moment] |
[undefined, moment.Moment] |
[moment.Moment, moment.Moment];
export type RangePickerPresetRange = RangePickerValue | (() => RangePickerValue);
export interface RangePickerProps extends PickerProps {
className?: string;
value?: RangePickerValue;
defaultValue?: RangePickerValue;
defaultPickerValue?: RangePickerValue;
onChange?: (dates: RangePickerValue, dateStrings: [string, string]) => void;
onCalendarChange?: (dates: RangePickerValue, dateStrings: [string, string]) => void;
onOk?: (selectedTime: moment.Moment) => void;
showTime?: TimePickerProps | boolean;
ranges?: {
[range: string]: RangePickerPresetRange,
};
placeholder?: [string, string];
mode?: string | string[];
disabledTime?: (current: moment.Moment, type: string) => {
disabledHours?: () => number[],
disabledMinutes?: () => number[],
disabledSeconds?: () => number[],
};
onPanelChange?: (value?: RangePickerValue, mode?: string | string[]) => void;
}
export interface WeexPickerProps extends PickerProps, SinglePickerProps {
className?: string;
placeholder?: string;
}
export interface DatePickerDecorator extends React.ClassicComponentClass<DatePickerProps> {
RangePicker: React.ClassicComponentClass<RangePickerProps>;
MonthPicker: React.ClassicComponentClass<MonthPickerProps>;
WeekPicker: React.ClassicComponentClass<WeexPickerProps>;
}

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

@@ -58,6 +58,7 @@ exports[`renders ./components/dropdown/demo/dropdown-button.md correctly 1`] = `
</button>
<button
class="ant-btn ant-dropdown-trigger ant-btn-default"
disabled=""
type="button"
>
<i

View File

@@ -14,6 +14,7 @@ describe('DropdownButton', () => {
<Menu.Item>foo</Menu.Item>
</Menu>
),
disabled: false,
trigger: ['hover'],
visible: true,
onVisibleChange: () => {},

View File

@@ -31,6 +31,7 @@ export default class DropdownButton extends React.Component<DropdownButtonProps,
const dropdownProps = {
align,
overlay,
disabled,
trigger: disabled ? [] : trigger,
onVisibleChange,
placement,
@@ -53,7 +54,7 @@ export default class DropdownButton extends React.Component<DropdownButtonProps,
{children}
</Button>
<Dropdown {...dropdownProps}>
<Button type={type} disabled={disabled}>
<Button type={type}>
<Icon type="down" />
</Button>
</Dropdown>

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>
);
}
@@ -222,13 +223,19 @@ export default class FormItem extends React.Component<FormItemProps, any> {
// Resolve duplicated ids bug between different forms
// https://github.com/ant-design/ant-design/issues/7351
onLabelClick = () => {
onLabelClick = (e: any) => {
const { label } = this.props;
const id = this.props.id || this.getId();
if (!id) {
return;
}
const controls = document.querySelectorAll(`[id="${id}"]`);
if (controls.length !== 1) {
// Only prevent in default situation
// Avoid preventing event in `label={<a href="xx">link</a>}``
if (typeof label === 'string') {
e.preventDefault();
}
const control = ReactDOM.findDOMNode(this).querySelector(`[id="${id}"]`) as HTMLElement;
if (control && control.focus) {
control.focus();

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

@@ -60,7 +60,7 @@ class RegistrationForm extends React.Component {
const value = e.target.value;
this.setState({ confirmDirty: this.state.confirmDirty || !!value });
}
checkPassword = (rule, value, callback) => {
compareToFirstPassword = (rule, value, callback) => {
const form = this.props.form;
if (value && value !== form.getFieldValue('password')) {
callback('Two passwords that you enter is inconsistent!');
@@ -68,14 +68,13 @@ class RegistrationForm extends React.Component {
callback();
}
}
checkConfirm = (rule, value, callback) => {
validateToNextPassword = (rule, value, callback) => {
const form = this.props.form;
if (value && this.state.confirmDirty) {
form.validateFields(['confirm'], { force: true });
}
callback();
}
handleWebsiteChange = (value) => {
let autoCompleteResult;
if (!value) {
@@ -85,7 +84,6 @@ class RegistrationForm extends React.Component {
}
this.setState({ autoCompleteResult });
}
render() {
const { getFieldDecorator } = this.props.form;
const { autoCompleteResult } = this.state;
@@ -149,7 +147,7 @@ class RegistrationForm extends React.Component {
rules: [{
required: true, message: 'Please input your password!',
}, {
validator: this.checkConfirm,
validator: this.validateToNextPassword,
}],
})(
<Input type="password" />
@@ -163,7 +161,7 @@ class RegistrationForm extends React.Component {
rules: [{
required: true, message: 'Please confirm your password!',
}, {
validator: this.checkPassword,
validator: this.compareToFirstPassword,
}],
})(
<Input type="password" onBlur={this.handleConfirmBlur} />

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

@@ -480,7 +480,7 @@ exports[`renders ./components/grid/demo/playground.md correctly 1`] = `
/>
<div
class="ant-slider-track"
style="visibility:visible;left:0%;width:20%"
style="left:0%;width:20%"
/>
<div
class="ant-slider-step"
@@ -578,7 +578,7 @@ exports[`renders ./components/grid/demo/playground.md correctly 1`] = `
/>
<div
class="ant-slider-track"
style="visibility:visible;left:0%;width:40%"
style="left:0%;width:40%"
/>
<div
class="ant-slider-step"

View File

@@ -25,6 +25,7 @@ export interface ColProps {
md?: number | ColSize;
lg?: number | ColSize;
xl?: number | ColSize;
xxl?: number | ColSize;
prefixCls?: string;
style?: React.CSSProperties;
}
@@ -43,6 +44,7 @@ export default class Col extends React.Component<ColProps, {}> {
md: objectOrNumber,
lg: objectOrNumber,
xl: objectOrNumber,
xxl: objectOrNumber,
};
render() {

View File

@@ -15,7 +15,7 @@ title:
From the stack to the horizontal arrangement.
You can create a basic grid system by using a single set of `Row` and` Col` grid assembly, all of the columns (Col) must be placed in `Row`.
You can create a basic grid system by using a single set of `Row` and `Col` grid assembly, all of the columns (Col) must be placed in `Row`.
````jsx
import { Row, Col } from 'antd';

View File

@@ -13,7 +13,7 @@ Flex 布局基础。
## en-US
Use `row-flex` define` flex` layout, its child elements depending on the value of the `start`,` center`, `end`,` space-between`, `space-around`, which are defined in its parent node layout mode.
Use `row-flex` define `flex` layout, its child elements depending on the value of the `start`,` center`, `end`,` space-between`, `space-around`, which are defined in its parent node layout mode.
````jsx
import { Row, Col } from 'antd';

View File

@@ -13,7 +13,7 @@ title:
## en-US
`Span` `pull` `push` `offset` `order` property can be embedded into `xs` `sm` `md` `lg` `xl` properties to use,
`span` `pull` `push` `offset` `order` property can be embedded into `xs` `sm` `md` `lg` `xl` properties to use,
where `xs = {6}` is equivalent to `xs = {{span: 6}}`.
````jsx

View File

@@ -111,4 +111,4 @@ If the Ant Design grid layout component does not meet your needs, you can use th
| xl | `≥1200px`, could be a `span` value or an object containing above props | number\|object | - |
| xxl | `≥1600px`, could be a `span` value or an object containing above props | number\|object | - |
The breakpoints of responsive grid follow [BootStrap 3 media queries rules](https://getbootstrap.com/docs/3.3/css/#responsive-utilities-classes)(not including `occasionally part`).
The breakpoints of responsive grid follow [BootStrap 4 media queries rules](https://getbootstrap.com/docs/4.0/layout/overview/#responsive-breakpoints)(not including `occasionally part`).

View File

@@ -28,7 +28,7 @@ export interface InputProps extends AbstractInputProps {
id?: number | string;
name?: string;
size?: 'large' | 'default' | 'small';
maxLength?: number;
maxLength?: number | string;
disabled?: boolean;
readOnly?: boolean;
addonBefore?: React.ReactNode;
@@ -65,7 +65,10 @@ export default class Input extends React.Component<InputProps, any> {
PropTypes.number,
]),
size: PropTypes.oneOf(['small', 'default', 'large']),
maxLength: PropTypes.string,
maxLength: PropTypes.oneOfType([
PropTypes.string,
PropTypes.number,
]),
disabled: PropTypes.bool,
value: PropTypes.any,
defaultValue: PropTypes.any,

View File

@@ -177,7 +177,7 @@ exports[`renders ./components/input/demo/group.md correctly 1`] = `
class="ant-input-group ant-input-group-lg"
>
<div
class="ant-col-4"
class="ant-col-5"
>
<input
class="ant-input"

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

@@ -63,7 +63,7 @@ class CompactDemo extends React.Component {
return (
<div>
<InputGroup size="large">
<Col span={4}>
<Col span={5}>
<Input defaultValue="0571" />
</Col>
<Col span={8}>

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

@@ -43,7 +43,7 @@ The first level navigation is inclined left near a logo, and the secondary menu
- **Enlarge the size of the font**
`12px``14px` is a standard font size of navigations`14px` is used for the first and the second level of the navigation. You can choose a approprigate font size in terms of the level of your navigation.
`12px``14px` is a standard font size of navigations`14px` is used for the first and the second level of the navigation. You can choose a appropriate font size in terms of the level of your navigation.
## Component Overview
@@ -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`.
@@ -103,9 +104,10 @@ The sidebar.
```js
{
xs: '480px',
sm: '768px',
md: '992px',
lg: '1200px',
xl: '1600px',
sm: '576px',
md: '768px',
lg: '992px',
xl: '1200px',
xxl: '1600px',
}
```

View File

@@ -78,6 +78,7 @@ title: Layout
| --- | --- | --- | --- |
| className | 容器 className | string | - |
| style | 指定样式 | object | - |
| hasSider | 表示子元素里有 Sider一般不用指定。可用于服务端渲染时避免样式闪动 | boolean | - |
> `Layout.Header` `Layout.Footer` `Layout.Content` API 与 `Layout` 相同
@@ -104,9 +105,10 @@ title: Layout
```js
{
xs: '480px',
sm: '768px',
md: '992px',
lg: '1200px',
xl: '1600px',
sm: '576px',
md: '768px',
lg: '992px',
xl: '1200px',
xxl: '1600px',
}
```

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

@@ -67,6 +67,7 @@ export default class Item extends React.Component<ListItemProps, any> {
md: PropTypes.oneOf(GridColumns),
lg: PropTypes.oneOf(GridColumns),
xl: PropTypes.oneOf(GridColumns),
xxl: PropTypes.oneOf(GridColumns),
};
static contextTypes = {
@@ -131,6 +132,7 @@ export default class Item extends React.Component<ListItemProps, any> {
md={getGrid(grid, 'md')}
lg={getGrid(grid, 'lg')}
xl={getGrid(grid, 'xl')}
xxl={getGrid(grid, 'xxl')}
>
<div {...others} className={classString}>
{extra && extraContent}

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 />
@@ -446,7 +438,7 @@ exports[`renders ./components/list/demo/resposive.md correctly 1`] = `
style="margin-left:-8px;margin-right:-8px"
>
<div
class="ant-col-xs-24 ant-col-sm-12 ant-col-md-6 ant-col-lg-6 ant-col-xl-4"
class="ant-col-xs-24 ant-col-sm-12 ant-col-md-6 ant-col-lg-6 ant-col-xl-4 ant-col-xxl-8"
>
<div
class="ant-list-item"
@@ -474,16 +466,14 @@ exports[`renders ./components/list/demo/resposive.md correctly 1`] = `
<div
class="ant-card-body"
>
<div>
Card content
</div>
Card content
</div>
</div>
</div>
</div>
</div>
<div
class="ant-col-xs-24 ant-col-sm-12 ant-col-md-6 ant-col-lg-6 ant-col-xl-4"
class="ant-col-xs-24 ant-col-sm-12 ant-col-md-6 ant-col-lg-6 ant-col-xl-4 ant-col-xxl-8"
>
<div
class="ant-list-item"
@@ -511,16 +501,14 @@ exports[`renders ./components/list/demo/resposive.md correctly 1`] = `
<div
class="ant-card-body"
>
<div>
Card content
</div>
Card content
</div>
</div>
</div>
</div>
</div>
<div
class="ant-col-xs-24 ant-col-sm-12 ant-col-md-6 ant-col-lg-6 ant-col-xl-4"
class="ant-col-xs-24 ant-col-sm-12 ant-col-md-6 ant-col-lg-6 ant-col-xl-4 ant-col-xxl-8"
>
<div
class="ant-list-item"
@@ -548,16 +536,14 @@ exports[`renders ./components/list/demo/resposive.md correctly 1`] = `
<div
class="ant-card-body"
>
<div>
Card content
</div>
Card content
</div>
</div>
</div>
</div>
</div>
<div
class="ant-col-xs-24 ant-col-sm-12 ant-col-md-6 ant-col-lg-6 ant-col-xl-4"
class="ant-col-xs-24 ant-col-sm-12 ant-col-md-6 ant-col-lg-6 ant-col-xl-4 ant-col-xxl-8"
>
<div
class="ant-list-item"
@@ -585,16 +571,14 @@ exports[`renders ./components/list/demo/resposive.md correctly 1`] = `
<div
class="ant-card-body"
>
<div>
Card content
</div>
Card content
</div>
</div>
</div>
</div>
</div>
<div
class="ant-col-xs-24 ant-col-sm-12 ant-col-md-6 ant-col-lg-6 ant-col-xl-4"
class="ant-col-xs-24 ant-col-sm-12 ant-col-md-6 ant-col-lg-6 ant-col-xl-4 ant-col-xxl-8"
>
<div
class="ant-list-item"
@@ -622,16 +606,14 @@ exports[`renders ./components/list/demo/resposive.md correctly 1`] = `
<div
class="ant-card-body"
>
<div>
Card content
</div>
Card content
</div>
</div>
</div>
</div>
</div>
<div
class="ant-col-xs-24 ant-col-sm-12 ant-col-md-6 ant-col-lg-6 ant-col-xl-4"
class="ant-col-xs-24 ant-col-sm-12 ant-col-md-6 ant-col-lg-6 ant-col-xl-4 ant-col-xxl-8"
>
<div
class="ant-list-item"
@@ -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

@@ -39,7 +39,7 @@ const data = [
ReactDOM.render(
<List
grid={{ gutter: 16, xs: 1, sm: 2, md: 4, lg: 4, xl: 6 }}
grid={{ gutter: 16, xs: 1, sm: 2, md: 4, lg: 4, xl: 6, xxl: 3 }}
dataSource={data}
renderItem={item => (
<List.Item>

View File

@@ -15,7 +15,7 @@ export { ListItemProps, ListItemMetaProps } from './Item';
export type ColumnCount = 1 | 2 | 3 | 4 | 6 | 8 | 12 | 24;
export type ColumnType = 'gutter' | 'column' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';
export type ColumnType = 'gutter' | 'column' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';
export interface ListGridType {
gutter?: number;
@@ -25,6 +25,7 @@ export interface ListGridType {
md?: ColumnCount;
lg?: ColumnCount;
xl?: ColumnCount;
xxl?: ColumnCount;
}
export type ListSize = 'small' | 'default' | 'large';

View File

@@ -41,6 +41,7 @@ exports[`renders ./components/locale-provider/demo/all.md correctly 1`] = `
<input
class="ant-radio-button-input"
type="radio"
value="[object Object]"
/>
<span
class="ant-radio-button-inner"
@@ -551,6 +552,7 @@ exports[`renders ./components/locale-provider/demo/all.md correctly 1`] = `
checked=""
class="ant-radio-button-input"
type="radio"
value="date"
/>
<span
class="ant-radio-button-inner"
@@ -569,6 +571,7 @@ exports[`renders ./components/locale-provider/demo/all.md correctly 1`] = `
<input
class="ant-radio-button-input"
type="radio"
value="month"
/>
<span
class="ant-radio-button-inner"
@@ -1503,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;
@@ -153,5 +154,7 @@ describe('Locale Provider', () => {
expect(wrapper.render()).toMatchSnapshot();
wrapper.setState({ locale: frFR });
expect(wrapper.render()).toMatchSnapshot();
wrapper.setState({ locale: null });
expect(wrapper.render()).toMatchSnapshot();
});
});

View File

@@ -25,6 +25,8 @@ export interface LocaleProviderProps {
function setMomentLocale(locale: Locale) {
if (locale && locale.locale) {
moment.locale(locale.locale);
} else {
moment.locale('en');
}
}
@@ -58,7 +60,7 @@ export default class LocaleProvider extends React.Component<LocaleProviderProps,
componentWillReceiveProps(nextProps: LocaleProviderProps) {
const { locale } = this.props;
const nextLocale = nextProps.locale;
if (locale.locale !== nextLocale.locale) {
if (locale !== nextLocale) {
setMomentLocale(nextProps.locale);
}
}

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

@@ -4,7 +4,7 @@ type: Data Entry
title: Mention
---
Mention component
Mention component.
## When To Use

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

@@ -47,6 +47,8 @@ export interface MenuProps {
multiple?: boolean;
inlineIndent?: number;
inlineCollapsed?: boolean;
subMenuCloseDelay?: number;
subMenuOpenDelay?: number;
}
export interface MenuState {

View File

@@ -2,14 +2,14 @@
// dark theme
&-dark,
&-dark &-sub {
color: @text-color-secondary-dark;
color: @menu-dark-color;
background: @menu-dark-bg;
.@{menu-prefix-cls}-submenu-title .@{menu-prefix-cls}-submenu-arrow {
opacity: .45;
transition: all .3s;
&:after,
&:before {
background: #fff;
background: @menu-dark-arrow-color;
}
}
}
@@ -36,7 +36,7 @@
&-dark &-item,
&-dark &-item-group-title,
&-dark &-item > a {
color: @text-color-secondary-dark;
color: @menu-dark-color;
}
&-dark&-inline,
@@ -70,9 +70,9 @@
&-dark &-submenu-selected,
&-dark &-submenu-title:hover {
background-color: transparent;
color: #fff;
color: @menu-dark-highlight-color;
> a {
color: #fff;
color: @menu-dark-highlight-color;
}
> .@{menu-prefix-cls}-submenu-title,
> .@{menu-prefix-cls}-submenu-title:hover {
@@ -80,7 +80,7 @@
opacity: 1;
&:after,
&:before {
background: #fff;
background: @menu-dark-highlight-color;
}
}
}
@@ -88,19 +88,19 @@
&-dark &-item-selected {
border-right: 0;
color: #fff;
color: @menu-dark-highlight-color;
&:after {
border-right: 0;
}
> a,
> a:hover {
color: #fff;
color: @menu-dark-highlight-color;
}
}
&&-dark &-item-selected,
&-submenu-popup&-dark &-item-selected {
background-color: @primary-color;
background-color: @menu-dark-item-selected-bg;
}
// Disabled state sets text to dark gray and nukes hover/tab effects

View File

@@ -2,8 +2,6 @@
@import "../../style/mixins/index";
@menu-prefix-cls: ~"@{ant-prefix}-menu";
@menu-inline-toplevel-item-height: 40px;
@menu-item-height: 40px;
// default theme
.@{menu-prefix-cls} {
@@ -13,7 +11,8 @@
padding-left: 0; // Override default ul/ol
list-style: none;
box-shadow: @box-shadow-base;
background: @component-background;
color: @menu-item-color;
background: @menu-bg;
line-height: 0; // Fix display inline-block gap
transition: background .3s, width .2s;
.clearfix;
@@ -30,7 +29,7 @@
}
&-item-group-title {
color: @text-color-secondary;
color: @menu-item-group-title-color;
font-size: @font-size-base;
line-height: @line-height-base;
padding: 8px 16px;
@@ -44,7 +43,7 @@
&-item:active,
&-submenu-title:active {
background: @item-active-bg;
background: @menu-item-active-bg;
}
&-submenu &-sub {
@@ -54,9 +53,9 @@
&-item > a {
display: block;
color: @text-color;
color: @menu-item-color;
&:hover {
color: @primary-color;
color: @menu-highlight-color;
}
&:focus {
text-decoration: none;
@@ -86,7 +85,7 @@
&:not(&-inline) &-submenu-open,
&-submenu-active,
&-submenu-title:hover {
color: @primary-color;
color: @menu-highlight-color;
}
&-horizontal &-item,
@@ -101,15 +100,15 @@
}
&-item-selected {
color: @primary-color;
color: @menu-highlight-color;
> a,
> a:hover {
color: @primary-color;
color: @menu-highlight-color;
}
}
&:not(&-horizontal) &-item-selected {
background-color: @item-active-bg;
background-color: @menu-item-active-bg;
}
&-inline,
@@ -185,7 +184,7 @@
}
> .@{menu-prefix-cls} {
background-color: @component-background;
background-color: @menu-bg;
border-radius: @border-radius-base;
&-submenu-title:after {
transition: transform .3s @ease-in-out;
@@ -208,7 +207,7 @@
position: absolute;
vertical-align: baseline;
background: #fff;
background-image: linear-gradient(to right, @text-color, @text-color);
background-image: linear-gradient(to right, @menu-item-color, @menu-item-color);
width: 6px;
height: 1.5px;
border-radius: 2px;
@@ -224,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);
}
}
}
@@ -254,9 +253,9 @@
&-vertical &-submenu-selected,
&-vertical-left &-submenu-selected,
&-vertical-right &-submenu-selected {
color: @primary-color;
color: @menu-highlight-color;
> a {
color: @primary-color;
color: @menu-highlight-color;
}
}
@@ -277,15 +276,15 @@
&-active,
&-open,
&-selected {
border-bottom: 2px solid @primary-color;
color: @primary-color;
border-bottom: 2px solid @menu-highlight-color;
color: @menu-highlight-color;
}
> a {
display: block;
color: @text-color;
color: @menu-item-color;
&:hover {
color: @primary-color;
color: @menu-highlight-color;
}
}
}
@@ -310,7 +309,7 @@
right: 0;
top: 0;
bottom: 0;
border-right: 3px solid @primary-color;
border-right: 3px solid @menu-highlight-color;
transform: scaleY(.0001);
opacity: 0;
transition: transform .15s @ease-out, opacity .15s @ease-out;
@@ -360,6 +359,10 @@
.@{menu-prefix-cls}-submenu-title {
width: ~"calc(100% + 1px)";
}
.@{menu-prefix-cls}-submenu-title {
padding-right: 34px;
}
}
&-inline-collapsed {

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

@@ -104,7 +104,7 @@ export interface ArgsProps {
btn?: React.ReactNode;
key?: string;
onClose?: () => void;
duration?: number;
duration?: number | null;
icon?: React.ReactNode;
placement?: NotificationPlacement;
style?: React.CSSProperties;

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 |

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