Compare commits

..

138 Commits

Author SHA1 Message Date
诸岳
a1c733ad07 Bump 3.26.9 2020-02-08 21:27:25 +08:00
诸岳
9918140695 docs: Add the changelog of 3.26.9 (#21289) 2020-02-08 21:25:53 +08:00
Chiciuc Nicușor
87cbe0168f Explicitly add children prop to Timeline. (#21265) 2020-02-08 19:16:09 +08:00
偏右
eea0b028c9 🐛 Typography editable should focus at the end (#21268)
close #21261
2020-02-07 13:15:53 +08:00
偏右
88bed67368 🐛 Fix Steps style when size="small" and labelPlacement="vertical" (#21258)
close #21257
2020-02-06 17:28:47 +08:00
Han
f7e7ce9d4f fix: Minor fix on ValidationRule to match AsyncValidator (#21250)
* Minor fix on ValidationRule to match AsyncValidator

* update doc
2020-02-06 10:44:49 +08:00
二货机器人
ae7666f8fa fix badge (#21237) 2020-02-05 14:23:21 +08:00
Jirka-Lhotka
3fb7325a21 Fix wrong event type of AntTreeNodeMouseEvent (#21200) 2020-02-03 20:31:27 +08:00
偏右
59c29a400d release 3.26.8 (#21187) 2020-02-03 12:45:28 +08:00
偏右
d3102bb2db 🐛 fix site menu affix bug (#21188)
close #21128
2020-02-03 12:35:04 +08:00
afc163
e036e4c9a3 site: 📣 promote g2plot 2020-02-03 11:38:44 +08:00
Chiciuc Nicușor
da3540bd59 Replace NativeButtonProps with ButtonProps for okButtonProps and cancelButtonProps. (#21165) 2020-01-31 22:09:49 +08:00
Teng YANG
bba87d4125 update display names for layout components (#21124)
(cherry picked from commit 286e0e97f8)
2020-01-28 15:26:55 +08:00
Teng YANG
6de8522894 fix: card actions font-size issue (#21106)
Fix card component action font-size not controlled by theme variable.
2020-01-26 11:40:06 +08:00
信鑫-King
674074ce93 fix: 3.x deploy site (#20682) 2020-01-17 12:31:56 +08:00
Amumu
c68f4463d3 fix error docs (#20926) 2020-01-16 15:58:24 +08:00
偏右
a96a95ccb8 🐛 Fix List item flex layout (#20897)
close #20648
2020-01-15 10:35:45 +08:00
偏右
b112378de3 🐛 Fix Tooltip title 0 is not shown (#20894)
close #20891
2020-01-14 17:55:40 +08:00
Amumu
db4bec92be version 3.23.0 (#20890) 2020-01-14 15:50:16 +08:00
信鑫-King
b6fc0168db chore: check commit (#20880) 2020-01-14 09:41:57 +08:00
信鑫-King
92fe411961 docs: 3.26.7 changelog (#20873)
* upd: version

* 📝 changelog

* 📝 docs
2020-01-14 07:40:32 +08:00
zefeng
ab29ecb377 fix: better approach to solve not show overflow content when in elastic (#20821) 2020-01-13 20:43:03 +08:00
afc163
23d5a856c0 🎬 improve Tag demo 2020-01-08 15:09:24 +08:00
偏右
6e4fa95d0f 🐛 fix Tree switcherIcon shown in leaf node (#20753)
close #20511
2020-01-08 13:17:49 +08:00
afc163
2753ce91c9 🐛 tweak @zindex-badge for table fixed column
close #20750
close #13930
2020-01-08 11:43:10 +08:00
偏右
057f5b8526 🐛 Fix Cascader search bug when fieldNames existed (#20720)
and label/value have same field name

close #20619
2020-01-08 10:38:36 +08:00
Amumu
d3eea22097 fix: correct the collapse-borderless class variable (#20718) (#20721)
Co-authored-by: Kuitos <kuitos.lau@gmail.com>
2020-01-07 15:39:42 +08:00
骗你是小猫咪
da2f54a18a refactor: improve digital input in tooltip demo (#20702) (#20717)
* refactor: improve digital input in tooltip demo

* fix lint
2020-01-07 12:02:21 +08:00
afc163
e5dd231aaa site: 📣 promote yuque activity 2020-01-06 18:03:04 +08:00
偏右
c6eafe8380 🐛 fix Input.Group 1px bug in vertical layout form (#20685)
close #20616
2020-01-06 14:26:11 +08:00
Googleplex
0520b844d5 docs: Update year in change log (#20670)
* Update year in CHANGELOG.zh-CN.md

Update year in change log of 3.26.6 from 2019 to 2020

* Update year in CHANGELOG.en-US.md

Update year in change log of 3.26.6 from 2019 to 2020
2020-01-05 19:09:51 +08:00
zombiej
8dd91ca648 docs: Update home for antd next link 2020-01-03 21:56:38 +08:00
二货机器人
44c9bcafc9 docs: 3.26.6 changelog (#20647)
* 3.26.6 changelog

* add v3 notify
2020-01-03 17:30:45 +08:00
vagusX
4df1cd3db2 docs: update Modal docs (#20612)
* doc: update Modal docs

* doc: update modal en-US doc
2020-01-02 23:22:54 +08:00
二货机器人
2f7c895675 Revert "Update colors.en-US.md (#20606)" (#20607)
This reverts commit c513296849.
2020-01-02 18:18:39 +08:00
myeunhyuk
c513296849 Update colors.en-US.md (#20606) 2020-01-02 18:17:52 +08:00
jiang
2416f733bf fix: url 404 (#20589)
* fix url 404

* update url
2020-01-02 14:16:05 +08:00
偏右
d102c2bf7a 🆙 upgrade stylelint-order (#20585) 2020-01-02 12:11:26 +08:00
偏右
2adf8ced24 fix: 💄 Remove Input.Password value attribute from dom (#20544)
* 💄 Remove Input.Password value attribute in dom

close #20541
close #7761
close #19959
close #20536
close #12672
close #10952

*  fix test coverage

* 🐛 fix defaultValue create `value` attribute in Input.Password
2019-12-31 14:41:09 +08:00
Yaindrop
528f1df5d6 Fix image misplacing (#20552)
Switched the images of "The keyword of the user query is only displayed in three categories, Topics, Questions and Articles." and "The number of categories the keyword of the user query belongs to is uncertain."
2019-12-31 10:56:28 +08:00
DiamondYuan
4297f33e85 fix: use Object.prototype.toString to check object (#20546)
close #20528
2019-12-30 22:14:17 +08:00
偏右
8ea9356399 💄 Improve Step type="navigation" UI in small screen (#20545)
close #19877
2019-12-30 20:13:24 +08:00
二货机器人
bcb71b8b78 chore: dev mode always show debug default (#20535) 2019-12-30 16:31:30 +08:00
liyuanqiu
121437b666 Remove inconsistant style (#20533)
Remove "line-height: unset;" from ".@{radio-group-prefix-cls}".
It causes inconsistance with Checkbox.Group.
See: https://codesandbox.io/s/antd-radio-line-height-8kt7u
2019-12-30 16:01:29 +08:00
诸岳
8e793c431f Bump 3.26.5 2019-12-29 22:10:08 +08:00
诸岳
89472751a7 docs: Add the changelog of 3.26.5 (#20520) 2019-12-29 22:07:36 +08:00
偏右
df8f34309f revert Table page return 1 after sort (#20507)
close #16978
close #17770
close #17648
close #18099
close #17075
close #19369
2019-12-28 21:52:09 +08:00
afc163
670bd4bf5b update snapshots 2019-12-27 12:27:56 +08:00
偏右
75ed2e0745 📝 Add instruction about disabledDate
#19932
#9008
2019-12-27 12:14:15 +08:00
偏右
2f72e472e5 🐛 Fix Table header text align when colspan=1 (#20463)
https://github.com/ant-design/ant-design/issues/20126#issuecomment-563307001
2019-12-26 16:07:01 +08:00
plainnany
77dc5fa4e7 📝 Update draggable.md (#20458)
close #20455
2019-12-26 14:32:14 +08:00
偏右
9ea5fb3050 🐛 Fix Tree wrong indent (#20456)
close #20441
2019-12-26 12:25:00 +08:00
xrkffgg
847f5fcd31 fix: tab bar animated style (#20417)
* fix: tab-bar animated style

* fix css style
2019-12-25 14:11:57 +08:00
afc163
44a63acf13 📝 update feature 2019-12-25 12:48:49 +08:00
陈帅
1ae09841e9 doc: fix warning date (#20413)
close #20411
2019-12-24 16:33:12 +08:00
陈帅
dc3bf75452 docs: add #20325 in 3.26.4 changelog (#20395)
* docs: add 20325 in 3.26.4 changelog

* fix typo
2019-12-24 13:16:46 +08:00
wwwxy
b826157e73 update TreeSelect docs (#20402) 2019-12-24 11:18:43 +08:00
陈帅
088ca07ff0 docs: 3.26.4 changelog (#20379)
* doc: add 3.26.4 changelog

* up to 3.26.4

* fix review typo

* fix review typo
2019-12-23 11:52:42 +08:00
约修亚
f4fd7cf0da Update index.zh-CN.md (#20382)
API中遗漏了code属性?
2019-12-23 11:13:01 +08:00
Hami Abdi
0a00c5e22a Correct Grammar in Form Component's Documentation (#20381)
In a demo corresponding to the form component, a comment contains a grammatical mistake: an infinitive in this context requires the present instead of past tense.
2019-12-23 09:13:04 +08:00
Rustin
92169c4853 upload: fix upload not support ico file type issue(#20360) (#20375) 2019-12-22 17:23:08 +08:00
骗你是小猫咪
74082defe9 fix(Form): feedback icon with input suffix display not correct (#20363)
* fix(From): feedback icon with input suffix display not correct

* update snapshots

* review change

* revert register.md and improve feedback example
2019-12-20 16:24:55 +08:00
偏右
f98debaeee chore: 📝 improve docs and config json (#20364) 2019-12-20 15:07:18 +08:00
偏右
6e27c62eb3 🐛 fix Tag onClick triggered when close (#20355)
close #20344
2019-12-19 22:12:37 +08:00
xrkffgg
38dab1f725 fix: cascader error color (#20347)
* [fix] cascader error color

* fix: cascader error/warning color
2019-12-19 17:14:12 +08:00
wwwxy
f14f934c3d update TreeSelect docs (#20341) 2019-12-19 14:48:06 +08:00
kailunyao
32744e733c fix: Disallow auto focus input after triggering "onSearch" event in mobile and tablet devices (#20332)
close #20297
2019-12-19 12:52:53 +08:00
He Linming
ea9e9fb410 🐛 (Table): fix filters define in onChange (#20337)
close #20270
2019-12-19 10:42:19 +08:00
偏右
7a2d1f2017 💄 optimize Steps labelPlacement vertical UI (#20325) 2019-12-18 17:46:17 +08:00
afc163
aa0b1c5378 chore: 🗑️ remove unused prop 2019-12-18 14:56:23 +08:00
afc163
ced537df48 docs: 📝 fix site overflow style 2019-12-18 14:34:57 +08:00
偏右
930ad2eb40 docs: 📝 Description List => Descriptions (#20316)
* chore: 📝 Description List => Descriptions

* Update index.en-US.md
2019-12-18 12:09:05 +08:00
afc163
cc8ab225cc fix eslint errors 2019-12-17 18:00:38 +08:00
陈帅
b03e93d061 docs: Add contributors list in each documentation (#20135)
* site: add contributors list

* style: change ContributorsList to end

* style: change spin to Skeleton

* 💄 optimize contributors list UI
2019-12-17 17:58:58 +08:00
afc163
7743c2b326 📝 fix target _blank typo 2019-12-17 17:49:16 +08:00
xiaohuoni
b97e9cb6d4 import/extensions:0 2019-12-17 17:37:26 +08:00
dependabot-preview[bot]
edefe8eb66 chore(deps-dev): bump eslint-plugin-import from 2.18.2 to 2.19.1 (#20237)
Bumps [eslint-plugin-import](https://github.com/benmosher/eslint-plugin-import) from 2.18.2 to 2.19.1.
- [Release notes](https://github.com/benmosher/eslint-plugin-import/releases)
- [Changelog](https://github.com/benmosher/eslint-plugin-import/blob/master/CHANGELOG.md)
- [Commits](https://github.com/benmosher/eslint-plugin-import/compare/v2.18.2...v2.19.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-12-17 17:36:43 +08:00
afc163
15f75e1c55 fix time picker test snapshots 2019-12-17 16:58:41 +08:00
afc163
333f63bd05 📝 improve antd features in README 2019-12-16 22:42:30 +08:00
偏右
f805d2e292 🐛 fix Tabs ink bar missing transition animation (#20283)
close #20239
2019-12-16 22:20:42 +08:00
偏右
9fa72ab74d 🐛 Fix TreeNode without icon white block (#20274) 2019-12-16 21:25:14 +08:00
afc163
6666520243 📝 Add santd to communication implementation 2019-12-16 14:53:23 +08:00
afc163
d7d4beb280 📝 fix update use-with-create-react-app 2019-12-15 22:25:56 +08:00
偏右
9a4a668a05 chore: 🔧 fix gh-pages actions (#20260)
https://github.com/peaceiris/actions-gh-pages#github-actions-for-github-pages
2019-12-15 14:53:32 +08:00
偏右
32cf75cca2 Release 3.26.3 (#20258) 2019-12-14 20:56:40 +08:00
woodsand
7cb4d4b411 Add link of "Install and Initialization" to Getting started (#20251) 2019-12-14 19:09:55 +08:00
骗你是小猫咪
65ea68843e fix: Modal combine Drawer cause overflow invalid (#20242)
* fix: Modal combine Drawer cause overflow invalid

* upgrade rc-drawer

* rc-util use minor version
2019-12-13 22:54:47 +08:00
Guichi Zhao
1958b78ecc docs: copy state to props is a bad practice (#20212)
* Copy state to props is a bad practice 

The original code copy the props the state which is not necessary at all, it will only confuse the reader!
Also, it considered being a bad practice: https://overreacted.io/writing-resilient-components/

* remove console

* fix indentation

* fix lint error

* improve js syntax
2019-12-13 20:00:35 +08:00
Chuck
a90e447758 docs: Update Tree docs (#20208) 2019-12-12 19:24:46 +08:00
afc163
b02d80d60f 🎬 improve Tree showLine demo 2019-12-12 11:18:23 +08:00
afc163
0a5ec6713c 🐛 Fix Tree showLine and showIcon missing icon
close #20192
2019-12-12 11:18:23 +08:00
偏右
f459ae9e63 🔧 Add unpkg field in package.json (#20193)
https://unpkg.com/
2019-12-11 16:56:01 +08:00
TsesamLi
6301c20f6c fix: fix type of OptionProps
rc-select#Option could accept "label" props, but it was lose in type def OptionProps
9ad3b02c82/src/interface/index.ts (L11)
2019-12-11 16:00:29 +08:00
afc163
fdc6070b50 💄 fix home buttons align of Windows Firefox
close https://www.v2ex.com/t/627502
2019-12-10 23:56:05 +08:00
Theo Satloff
721d8cb4a0 improve dropdown/cascader/select customization 2019-12-10 13:21:36 +08:00
Theo Satloff
b0d55c8861 fix icon spacing in forms 2019-12-10 13:14:23 +08:00
afc163
20ef1f199c 🎬 improve Dropdown context menu demo 2019-12-10 11:37:32 +08:00
afc163
62839eb426 bump 3.26.2 2019-12-10 11:23:38 +08:00
Khaled
2f7998cc0c Fix: "disabledTime" property type in date-picker
disabledTime property should not be required in DatePicker component.
2019-12-09 23:38:00 +08:00
afc163
fee211e3c4 📝 Add docs for ConfigProvider getPopupContainer
close #19974
2019-12-09 19:44:33 +08:00
陈杰
8188956193 When using the render property to customize the title, the title property of the datasource is not required 2019-12-09 19:15:41 +08:00
Wei Zhu
57cb4a460b docs: update changelog 2019-12-09 17:42:15 +08:00
chenshuai2144
fd6d1796ed chore: lock eslint-plugin-impor 2019-12-09 17:07:11 +08:00
afc163
e01e545dcd 🆙 upgrade eslint-plugin-import
https://github.com/benmosher/eslint-plugin-import/issues/1557

bc3b034b59
2019-12-09 15:39:59 +08:00
afc163
13fb839032 🆙 fix eslint errors 2019-12-09 15:27:58 +08:00
afc163
85fcf0fe6e 🐛 fix Icon component ts error with cra definition
close #13205
close #19638
2019-12-09 15:27:58 +08:00
Wei Zhu
0b1a5409bd Bump 3.26.1 2019-12-09 15:04:53 +08:00
Wei Zhu
ea1f00d19f Merge pull request #20140 from ant-design/release-3.26.1
add 3.6.1 changelog
2019-12-09 14:55:05 +08:00
Wei Zhu
bef81beba6 add 3.6.1 changelog 2019-12-09 14:09:22 +08:00
depfu[bot]
b875f2ac83 Update react-dnd to version 10.0.2 (#20138) 2019-12-09 10:00:01 +08:00
depfu[bot]
408fbb41e5 Update stylelint-config-prettier to version 8.0.0 (#20129) 2019-12-07 19:58:30 +08:00
Kim, Harim
850a5b4567 Docs: fix table demo typing error (#20115)
* Docs: fix table demo typing error

* test: update snapshots (#20115)

* test: update snapshots (#20115)
2019-12-06 14:22:54 +08:00
afc163
ab36853cb7 📝 improve create-react-app documentation
https://github.com/facebook/create-react-app/releases/tag/v3.3.0
2019-12-06 12:31:47 +08:00
afc163
9b65863512 Add lighthouse-ci action 2019-12-06 12:15:14 +08:00
afc163
adf5288524 💄 Fix Editable Textarea flash in Firefox 2019-12-06 12:03:16 +08:00
afc163
4300c046a0 📝 improve Typography demo description 2019-12-06 12:03:16 +08:00
afc163
fb68fcdc05 💄 use classNames in Editable 2019-12-06 12:03:16 +08:00
偏右
4146efa810 🐛 fix duplicated icons when Tree showLine is true (#20102)
close #20090
2019-12-05 17:48:47 +08:00
骗你是小猫咪
8fda3972fe test: update snapshots (#20104) 2019-12-05 17:26:16 +08:00
偏右
89a6593c44 🐛 Fix Table column align in windows chrome (#19986)
close #19952
2019-12-05 10:55:45 +08:00
afc163
14619bc1d8 📝 fix github url 2019-12-04 21:58:41 +08:00
偏右
5fabb45d9d 📖 fix site scrollbar problem (#20086)
close #20081
may related to #19988
2019-12-04 19:42:49 +08:00
偏右
62d7a2bbb0 restore test coverage (#20071) 2019-12-04 14:09:39 +08:00
偏右
bca69b6e8c 🔧 remove antd/es/form/__tests__ from npm package (#20069) 2019-12-04 12:07:22 +08:00
afc163
fac56ee952 📝 fix home page locale text 2019-12-04 11:42:48 +08:00
Liu Ya
3fed6f02a5 fix: DescriptionItem className error to label (#20067) 2019-12-03 23:59:37 +08:00
偏右
43bf7965de 🐛 Fix Button text not align center in Chrome (#20059)
revert solution of 05181d552e

close #19972
close #20058
2019-12-03 18:06:07 +08:00
偏右
407dfda998 Update package.json (#20057) 2019-12-03 14:25:08 +08:00
afc163
811d562527 update snapshots 2019-12-03 12:19:49 +08:00
afc163
16ac3b31df 🐛 Fix filterIcon Tooltip title is not working
close #20049
2019-12-03 12:19:49 +08:00
afc163
85b6744bf6 🐛 Fix filterIcon render string cause Table broken 2019-12-03 12:19:49 +08:00
偏右
f2cae4361e Merge pull request #20040 from ant-design/fix-small-table-style
fix: 🐛 small table header border issue
2019-12-02 19:20:09 +08:00
afc163
0ab55ce884 🐛 fix footer style in small table 2019-12-02 19:18:53 +08:00
afc163
ecce1e4aba update snapshots 2019-12-02 19:02:33 +08:00
afc163
6096f6e281 🐛 fix small table header border issue
close #20030
close #18762
2019-12-02 18:07:22 +08:00
damon.chen
cba968f9dc chore: fix RangePicker value and onChange definition (#20015) 2019-12-02 17:22:06 +08:00
偏右
be06f53e23 🐛 Fix List pagniation options text align (#20038)
close #20037
2019-12-02 16:12:32 +08:00
叶枫
400ca638b3 feat: add visible debug demo (#20018)
* add debug

* 添加隐藏显示逻辑

* fix demo

* add en

* clean up

* clean up

* you see see

* Update site/theme/zh-CN.js

Co-Authored-By: 偏右 <afc163@gmail.com>

* Update site/theme/zh-CN.js

Co-Authored-By: 偏右 <afc163@gmail.com>

* fix css

* remove css
2019-12-02 15:21:56 +08:00
165 changed files with 3690 additions and 1767 deletions

View File

@@ -1,3 +1,3 @@
{
"sandboxes": ["wk04r016q8"]
"sandboxes": ["antd-reproduction-template-6e93z"]
}

View File

@@ -1,6 +1,5 @@
components/**/*.js
components/**/*.jsx
components/*/__tests__/type.tsx
!components/*/__tests__/**/*.js
!components/*/demo/*
!.*.js

View File

@@ -55,6 +55,7 @@ const eslintrc = {
'jsx-a11y/anchor-has-content': 0,
'jsx-a11y/click-events-have-key-events': 0,
'jsx-a11y/anchor-is-valid': 0,
'jsx-a11y/no-noninteractive-element-interactions': 0,
'comma-dangle': ['error', 'always-multiline'],
'react/jsx-filename-extension': 0,
'react/state-in-constructor': 0,
@@ -86,6 +87,7 @@ const eslintrc = {
'react/static-property-placement': 0,
'jest/no-test-callback': 0,
'jest/expect-expect': 0,
'import/extensions': 0,
},
globals: {
gtag: true,

View File

@@ -3,7 +3,7 @@ on:
release:
types: [published]
branches:
- master
- 3.x-stable
jobs:
build-and-deploy:
@@ -19,9 +19,11 @@ jobs:
run: npm run predeploy
- name: deploy
uses: peaceiris/actions-gh-pages@v2.5.0
uses: peaceiris/actions-gh-pages@v2
env:
ACTIONS_DEPLOY_KEY: ${{ secrets.ACCESS_TOKEN }}
ACTIONS_DEPLOY_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }}
# PERSONAL_TOKEN: ${{ secrets.PERSONAL_TOKEN }}
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PUBLISH_BRANCH: gh-pages
PUBLISH_DIR: ./_site
with:

19
.github/workflows/lighthouse-ci.yml vendored Normal file
View File

@@ -0,0 +1,19 @@
name: Lighthouse
on: push
jobs:
lighthouse:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Audit URLs using Lighthouse
uses: treosh/lighthouse-ci-action@v2
with:
urls: |
https://ant.design
https://ant.design/docs/react/introduce-cn
https://ant.design/components/button-cn
- name: Save results
uses: actions/upload-artifact@v1
with:
name: lighthouse-results
path: '.lighthouseci' # This will save the Lighthouse results as .json files

View File

@@ -31,7 +31,7 @@ module.exports = {
'!components/*/style/index.tsx',
'!components/style/index.tsx',
'!components/*/locale/index.tsx',
'!components/*/__tests__/**/type.tsx',
'!components/*/__tests__/type.test.tsx',
'!components/**/*/interface.{ts,tsx}',
],
transformIgnorePatterns,

View File

@@ -2,17 +2,26 @@
17073025 <17073025@cnsuning.com>
282159468 <282159468@qq.com>
778758944 <778758944@qq.com>
Aaron Cawte <aaron@bbncreative.co>
Aaron Planell López <aaronplanell@gmail.com>
Aditya Padhi <aditya.padhi@outlook.com>
Adrian Dimitrov <dimitrov.adrian@gmail.com>
Ahmad Abdelaziz <ahmad.abdelaziz@robustastudio.com>
Ahmed AlSammany <ahmed.alsammany@incorta.com>
Aidin <aidin.dadashzadeh@gmail.com>
Aiello <770540123@qq.com>
Alan Braithwaite <asbraithwaite@gmail.com>
Albert Zheng <lisong.zheng@gmail.com>
Albert 理斯特 <shuaizhexu@gmail.com>
Alberto Marchetti <cmaster11@gmail.com>
Aleck Landgraf <aleck.landgraf@gmail.com>
Aleksandr Chernokondratenko <etherreals777@gmail.com>
Alex Simons <alexsimons9999@gmail.com>
Alexander <labriko@yandex.ru>
Alexander Anpleenko <vaeum@yandex.com>
Alexander Kachkaev <alexander@kachkaev.ru>
Alexander Suevalov <suevalov.work@gmail.com>
Alexander.Kosov <Alexander.Kosov@nexign-systems.com>
Alexandre Kirszenberg <a.kirszenberg@gmail.com>
Alexey Yakovlev <yallie@yandex.ru>
Alfred Qiu <sc941203@gmail.com>
@@ -28,21 +37,32 @@ Andrew Shearer <andrew@ashearer.com>
Andrey G <plandem@gmail.com>
Andrzej Dybionka <andrzej@arabel.la>
André <mazoni.andre@gmail.com>
Andrés <andresin87@gmail.com>
Ankit Babbar <ankit.babbar@valuebound.com>
Aobo Yang <yangaobo@gmail.com>
Ardo Kusuma <ardo@uber.com>
Arnab Sen <arnabsen@gmail.com>
Arthur Denner Oliveira Santos <arthurdenner7@gmail.com>
Artin <lengthmin@gmail.com>
Arvin Xu <arvinx@foxmail.com>
Ash Kumar <kumar.ashwin@outlook.com>
Ashot Mnatsakanyan <mnatsakanyan.ashot@gmail.com>
Aymen Bouchekoua <bouchekoua.aymen@gmail.com>
BK Heleth <bon.hoo@hotmail.com>
Babajide Fowotade <jide.b.tade@gmail.com>
Barry <barry.yansh@gmail.com>
Bartek <bartek.kozera@gmail.com>
Ben Callaway <me@bencallaway.com>
Benedikt Franke <benedikt@franke.tech>
Benjamin Amelot <bam@activeviam.com>
Benjamin Kniffler <bkniffler@me.com>
Benjy Cui <benjytrys@gmail.com>
Benoît Latinier <benoit@latinier.fr>
Bernie <bernie.wangbj@gmail.com>
Bestie <lucientown@outlook.com>
Bhavesh Chowdhury <bhaveshch20@gmail.com>
Bilal Sirazitdinov <bilalsir@yandex.ru>
Bill Searle <billsearle@gmail.com>
Bill Sheikh <bilawals22@gmail.com>
Bo Chen <bochen2014@yahoo.com>
Bolun Zhang <rzhangbolun@gmail.com>
@@ -61,9 +81,11 @@ Cam Song <neosoyn@gmail.com>
Camol <kwwnjujlc@sina.com>
Cang Ta <hoksilato176@gmail.com>
Canwen Xu <canwenxu@126.com>
Carlos Coves Prieto <carlos.coves@interacso.com>
Carter Feldman <carter@carter.at>
Catalin Miron <mironcatalin@gmail.com>
Cee Cirno <i@cee.moe>
Cemre Mengu <cemremengu@gmail.com>
Chandler Moisen <chandlermoisen@gmail.com>
Chang Wang <cheapsteak@gmail.com>
Charles Covey-Brandt <chazcb@gmail.com>
@@ -75,8 +97,10 @@ Chris Kelly <cjke.7777@gmail.com>
ChrisFan <chris.fan.dev@gmail.com>
Christian <chr.vadala@gmail.com>
Christian Vadalà <chr.vadala@gmail.com>
Christophe Hurpeau <christophe@hurpeau.com>
Christopher Deutsch <cd@cdeutsch.com>
Chuang Yu <cyu9960@gmail.com>
Chuck <wfhtzcf@gmail.com>
Claudio Restifo <claudio.restifo@gmail.com>
Cody Chan <int64ago@gmail.com>
Colton Pierson <colton@coltonpierson.com>
@@ -89,21 +113,32 @@ Daewoong Moon <wiziple@gmail.com>
Damian Green <damian.green@microlease.com>
Damian Green <damian@gcoders.com>
Dan Minshew <ofenixculpa@gmail.com>
Dana Janoskova <dana.janoskova@accenture.com>
Dane David <dndavid102@gmail.com>
Daniel Chang <danielchang2022@u.northwestern.edu>
Daniel Gomez <dgomez@orangeloops.com>
Daniel Harrison <daniel.equiknox@gmail.com>
Danny Hoower Antonio Viasus Avila <danjavia@gmail.com>
Daphne Won <daphne.won@shopee.com>
Daqi Song <dqaria@gmail.com>
Darren Poon <dyhpoon@gmail.com>
David Broder-Rodgers <david.broder-rodgers@softwire.com>
David Hatten <dhatten@covermymeds.com>
David Schneider <davschne@gmail.com>
Dean van Niekerk <deanvniekerk@gmail.com>
DengYun <tdzl2003@gmail.com>
Denis <shumkovdenis@gmail.com>
DiamondYuan <541832074@qq.com>
DiamondYuan <admin@diamondyuan.com>
Dimitri Mitropoulos <dimitrimitropoulos@gmail.com>
Dmitriy <dimusig@gmail.com>
Dmitriy Mironov <dima.dev01@gmail.com>
Dmitry Bolotin <bolotin.dmitriy@gmail.com>
Dmitry Gladkikh <abdurahmanus@gmail.com>
Dmitry Guryev <dmitry.gurjev@gmail.com>
Dmitry Manannikov <email@slonoed.net>
Dmitry Snegirev <rikkitp@gmail.com>
Dmitry Tikhomirov <tikhomirov@element-soft.com>
Dorian <dorian@doma.io>
DosLin <doslino@gmail.com>
Douglas Mason <Demasonjr@gmail.com>
@@ -118,34 +153,44 @@ Eden Wang <yociduo@vip.qq.com>
Eduardo Ludi <eduludi@gmail.com>
Edward <7047924@qq.com>
Egor Yurtaev <yurtaev.egor@gmail.com>
Eldar Mustafaiev <eldar.mustafaiev@gmail.com>
Eli White <github@eli-white.com>
Emerson Laurentino <emersonlaurentino@hotmail.com>
Emma <sima.zhang1990@gmail.com>
Ender Lee <chnliquan@163.com>
Eric <84263800@qq.com>
Eric Celeste <efc@clst.org>
Eric Turriff <eric.turriff@gmail.com>
Erwann Mest <m+github@kud.io>
Eusen <179530591@qq.com>
Evgeny Kuznetsov <jackk@ya.ru>
Eward Song <eward.song@gmail.com>
Federico Marcos <marcosfede@gmail.com>
Ferdi Koomen <info@madebyferdi.com>
Fergus Leung <fergusleung96@gmail.com>
Fernando Giarritiello <fgiarritiello@gmail.com>
Florian Orpelière <florian.orpeliere@gmail.com>
Flynn <li.fulin@foxmail.com>
For177 <mengqiang.q@gmail.com>
Frezc <Frezcw@gmail.com>
Gabe Medrash <gabeme@alleninstitute.org>
Gabriel Nunes <gabriel@multiverso.me>
GalenWong <wonggalen1999@gmail.com>
Gao Jiangmiao <tolbkni@gmail.com>
Gautier <rollingautier2@gmail.com>
Geoff Holden <geoff@brightloudnoise.com>
George Gray <george@ummodesign.com>
Gin-X <xcbwyys@hotmail.com>
Go7hic <gtfx0209@qq.com>
Goh Zhao Yang <austinzy@airasia.com>
Graeme Yeates <gyeates@clearpath.ai>
Graeme Yeates <yeatesgraeme@gmail.com>
Grant Klinsing <gklinsing@gmail.com>
Gray Choi <gray.choi.1988@gmail.com>
Guan Hao <raptium@gmail.com>
Guan Yu Pan (Jacky) <jackypan1989@gmail.com>
Guichi Zhao <zgc910619@gmail.com>
Hami Abdi <abdih@users.noreply.github.com>
HJin.me <hjin.me@gmail.com>
Hai Phan Nguyen <pnghai@gmail.com>
Haibin Yu <haibin.yu@oceanwing.com>
@@ -155,12 +200,18 @@ Hanz Luo <lhz0516@gmail.com>
Harlan <luoxwen@gmail.com>
HarlanLuo <luoxwen@gmail.com>
Haroen Viaene <fingebimus@me.com>
Harry.Hou <harry.hou@ringcentral.com>
Harshit Mehrotra <harshitmehrotra@hotmail.com>
He Linming <hlm52pk@163.com>
Heaven <ne_smalltown@163.com>
Henri Normak <henri.normak@gmail.com>
HeskeyBaozi <hezhiyu233@foxmail.com>
HiddenMan <1196089730@qq.com>
Hieu Ho <hieu.ho.le@lazada.com>
Hieu Pham <phthhieu@gmail.com>
Higor Araújo dos Anjos <higor.araujo.anjos@gmail.com>
Hsuan Lee <HsuanGM@gmail.com>
Hsuan Lee <hsuangm@gmail.com>
Hubert Argasinski <argasinski.hubert@gmail.com>
Hughen <446370503@163.com>
Hugo LEHMANN <shogi31@gmail.com>
@@ -168,12 +219,16 @@ Igor <nemytyshew@yandex.ru>
Igor G <i.gaidai4uk@gmail.com>
Ilan <hasanovtk@gmail.com>
Ilan Hasanov <hasanovtk@gmail.com>
Ilya Bondarenko <bondarenko.ik@gmail.com>
ImJoeHs <865439601@qq.com>
Inclined.Z <zjq0717@163.com>
Infinity <305870677@qq.com>
Inian <inian1234@gmail.com>
Ivan <ivan.pecharitsa@gmail.com>
Ivan Kravets <me@ikravets.com>
Ivan Trofimov <ivan@trofimov.link>
Ivo Stratev <ivo.stratev.tues@gmail.com>
Jack <jacklee82814@gmail.com>
Jack Hsieh <jack@egenware.com>
Jack Lo <jack-lo@foxmail.com>
Jack Works <zjwpeter@gmail.com>
@@ -182,19 +237,30 @@ Jacques Kvam <jwkvam@gmail.com>
JaePil Jung <jjp5023@gmail.com>
Jake Richards <jake.richards@genesys.com>
James <james@schoolshape.com>
James Tsang <wentao_zeng1@163.com>
JamesYin <elantion@gmail.com>
Jaroslav Bereza <github.com@bereza.cz>
Jarvis1010 <travis.mair@gmail.com>
Jason <ceocjy@vip.qq.com>
Jason Chen <ceocjy@vip.qq.com>
Jason Chung <shiningjason1989@gmail.com>
Jason Yin <yinjiangsheng@gmail.com>
Jean-Luc Sorak <jlsorak@icloud.com>
Jeffrey Carl Faden <jeffreyatw@gmail.com>
Jelle de Jong <jelle@hoest.nl>
Jennie <jennie.ji@hotmail.com>
JeromeLin <jerome.lin@zhongan.com>
Jerry Bendy <jerry@icewingcc.com>
Jesper We <jesper@journeyman.se>
Jiabin Peng <png.inside@gmail.com>
Jialei <jialeicui@126.com>
Jiawei Huang <hjiawei@gmail.com>
Jieraaa <842533841@qq.com>
Jin ZHANG <jz.zhangjin@gmail.com>
JinXin <m18508218948@163.com>
Jing Ma <mjingm87@qq.com>
Jingsong Gao <kingsongao1221@gmail.com>
Jinke Li <1359518268@qq.com>
Jinxuan Zhu <zhujinxuan@gmail.com>
Joao Rabelo <jrabelo@tech6.com.br>
Joe <qiaolibo@126.com>
@@ -202,90 +268,124 @@ Joe Hsu <jhsu.x1@gmail.com>
Johannes Loewe <johannes@loewe.pm>
John Johnson III <john@johnjohnson.cc>
John Nguyen <jtnguyen236@gmail.com>
Johnsen <jiajunzhou1994@163.com>
Jonatas Walker <jonataswalker@gmail.com>
Jonathan Lee <1150974628@qq.com>
Jonny Buchanan <jonathan.buchanan@gmail.com>
Jordan Hornblow <jordan@jch254.com>
Josue Peralta <jperal77@gmail.com>
Josué <ujosuegt@outlook.com>
JribiBelhassen <belha9inzaghi@gmail.com>
JuFeng Zhang <zjffun@gmail.com>
Juan Carlos Lloret H <juan.carlos.lloret@lansweeper.com>
Juan Rodrigo Venegas Boesch <jrvboesch@gmail.com>
Julia Passynkova <ipassynk@hotmail.com>
Julien Confetti <julien.confetti@ulg.ac.be>
Junyu Zhan <irrigator@yeah.net>
Juraj Carnogursky <durisvk2@gmail.com>
Justin Reich <reich.justin@gmail.com>
Kaien Liao <liaokaien@gmail.com>
Kamal Mahmudi <kamalmahmudi@yahoo.co.id>
Kasra Bigdeli <kasra85@gmail.com>
Kelvin Chu <chubillkelvin@gmail.com>
Kenaniah Cerny <kenaniah@gmail.com>
Kenneth Luján Rosas <elgenio.03@gmail.com>
Kenneth Truong <kenneth.e.truong@gmail.com>
KentonYu <975853613@qq.com>
Kevin Ivan <info@kevinivan.com>
Kevin Wang <gumtree200@gmail.com>
Kevinaskin <kevinaskin@minus.live>
KgTong <kgtong1992@gmail.com>
Khaled <k.khalil.94@gmail.com>
Khalifa Lame <khalibloo@gmail.com>
Kian <kian@vsu.cc>
Kieren <kierenveerapen94@gmail.com>
Kiho · Cham <monkindey@163.com>
Kim, Harim <harimkims@gmail.com>
Kimmo Saari <kimmo.saari@compile.fi>
Kimmo Saari <kimmo.saari@revolt.fi>
Kirill Alexander Khalitov <voronar@gmail.com>
Kirill Stiopin <kirill.stiopin@hotmail.com>
Knacktus <knacktus@gmail.com>
Kodai Nakamura <kodai.nakamura.215@gmail.com>
Konrad Machlowski <konrad.machlowski@gmail.com>
Kyle Kelley <rgbkrk@gmail.com>
Kyle Rosenberg <kyle.rosenberg@gmail.com>
LLinFan- <catfoursi@qq.com>
LT246-VINHNPH\vinhnph <vinhnph@blockpass.org>
Laith <laith24@gmail.com>
Larry Laski <larry.laski@gmail.com>
LaySent <laysent@gmail.com>
LeeHarlan <709886167@qq.com>
LeezQ <lizhenq2009@gmail.com>
Leo <clinyong@gmail.com>
Leon Koole <leon@koole.io>
Leon Shi <superRaytin@163.com>
Leon Shi <superRaytin@gmail.com>
Li Chao <rftstars@qq.com>
LilyWakana <873435892@qq.com>
Liming Jin <jinlm@knownsec.com>
Liu Ya <liuya54892@gmail.com>
Liu Yang <zation1@gmail.com>
LongYinan <lynweklm@gmail.com>
Lucien Lee <lkiral7903@gmail.com>
Ludwig Bäcklund <ludli839@student.liu.se>
Lyndon001 <lld207@126.com>
M Mitchell <mail@megmitchell.ca>
MG12 <wuzhao.mail@gmail.com>
Ma Tianxiao <matx2215@outlook.com>
Maciej Czekaj <natanielcz@gmail.com>
Madis Väin <madisvain@gmail.com>
Maksym Mosyura <wmornotwm@gmail.com>
Malven <marcusalven@gmail.com>
Manjit Kumar <manjit1727@gmail.com>
Manweill <mic.liangwenwei@foxmail.com>
MaoYiWei <137308365@qq.com>
Marcel Jackwerth <marceljackwerth@gmail.com>
Marcela Bomfim <mbomfim@live.com>
Marcio Pamplona <marciopamplona79@gmail.com>
Marco Afonso <mafonso333@gmail.com>
Marcus Bransbury <marcus.bransbury@gmail.com>
Marius Ileana <visvadw@gmail.com>
Mars Wong <marswong618@gmail.com>
Marshall Chen <Juniors.fei@gmail.com>
Martin Cermak <crudo@crudo.cz>
Martin Litvaj <kamahl19@gmail.com>
Martin Novák <martinnovak@outlook.com>
Mathew <khayaanimations@gmail.com>
Mathieu Anderson <anderson@talon.one>
Matias Orellana <morellan@gmail.com>
Matt Lein <matt.lein@code42.com>
Max <maksym.mosyura@kruschecompany.com>
Maximilian Meyer <Maximilian.Meyer@br.de>
Meck <yesmeck@gmail.com>
Meck Zhu <yesmeck@gmail.com>
MeiLin <postget.me@gmail.com>
Meow-z <372086270@qq.com>
Miaow <i@zfeng.net>
Michael Adams <mtadams007@gmail.com>
Michael Krog <mic@apaq.dk>
Michael Salaverry <barakplasma@gmail.com>
Michael Salaverry <michaels@axonize.com>
Michael Wang <ylzcylx@gmail.com>
Michal Pekar <pekac45@gmail.com>
Michalis Macheras <diodosier@gmail.com>
Michelle Zhang <michelle.chsy@gmail.com>
Mikasa33 <mikasa33@qq.com>
Min <dicklwm@163.com>
MinJeong Kim <min7859@gmail.com>
MinYuan <s1124yy@gmail.com>
Ming Hann <eldy8888@gmail.com>
Minqi Pan <pmq2001@gmail.com>
Minsung Ryu <ryums0227@gmail.com>
Minwei Xu <faceswilliam@gmail.com>
Mitchell Demler <mitchell.demler@harcourts.net>
Mohamed Seada <mohamed.seada.1994@gmail.com>
Mohammad Faisal <faisalhmohd@gmail.com>
Mohan Ban <banmohan@outlook.com>
Mounish Sai <pvsmounish@gmail.com>
Mr.Tone <vector@malubei.com>
MrHeer <hlm52pk@163.com>
MuYu <mr.muzea@gmail.com>
Mário Gonçalves <mario.mc.goncalves@gmail.com>
Nathan Broadbent <git@ndbroadbent.com>
@@ -298,6 +398,8 @@ Nekron <nekron.hyt@gmail.com>
Neverland <chenjiahan@buaa.edu.cn>
Nico <nicolas@freddelacompta.com>
Nidhi Agarwal <nidhi.agarwal@zomato.com>
Nihal Saxena <saxenanihal95@gmail.com>
Nikitenkova <katrin_7nes7@mail.ru>
Niko Autio <niko.autio@fenten.fi>
Nikolay <veseliy07@gmail.com>
Nikolay Solovyov <i@mr-ozio.ru>
@@ -306,8 +408,10 @@ Nimo <nimo.jser@gmail.com>
Nishant Arora <na.nishantarora@gmail.com>
Nokecy <Nokecy@163.com>
OAwan <georgio.wan@gmail.com>
Olaniyi Philip Ojeyinka <olaniyiojeyinka@gmail.com>
Oleg Kuzava <olegkuzava@gmail.com>
Oleksandr Kovalchuk <me.olexandr.kovalchuk@gmail.com>
Olivier Louvignes <olivier@mg-crea.com>
Ooi Yee Wei <ywooi@yahoo.com>
Open Next <opennext@126.com>
Oren Kosto <oren@panda-os.com>
@@ -320,16 +424,20 @@ Peter <usstpeter@gmail.com>
Peter Berg <atticusberg@gmail.com>
Phanupong Janthapoon <panupong.jtp@gmail.com>
Philip Oliver <philipodev@gmail.com>
Phyllis <escapiststupor@gmail.com>
Pierre <pierre@bazoge.com>
Pierre Neter <pierreneter@gmail.com>
Piotr Monwid-Olechnowicz <hasparus@gmail.com>
Piper Chester <piperchester@gmail.com>
Pixy Yuan <pixy.bupt@gmail.com>
Pooya Parsa <pyapar@gmail.com>
Pyiner <lijiuyang1992@gmail.com>
Pyroboomka <qwaarty@mail.ru>
QC-L <github@liqichang.com>
Qhan W <whenhan@foxmail.com>
Qiaosen Huang <joesonw@gmail.com>
Qingrong Ke <keqingrong1992@gmail.com>
Radomir Skrzepij <zyziu10@gmail.com>
Rafael Cosman <rafaelcosman@alumni.stanford.edu>
Rahul Gurung <gurungrahul2@gmail.com>
Rallets <rallet@rallets.com>
@@ -338,47 +446,70 @@ Ran Byron <ranbena@gmail.com>
Randy <randypriv@gmail.com>
RaoHai <surgesoft@gmail.com>
Raphael Chauveau <raph.chauveau@gmail.com>
Ray Booysen <ray.booysen@baikalmkt.com>
Ray Booysen <raybooysen@gmail.com>
Rayron Victor <rayronvictor@gmail.com>
Reed Sun <superreedsun@gmail.com>
Regan Langford <regan.reihana@gmail.com>
Renovate Bot <bot@renovateapp.com>
Rex <zhangzilong.zzl@163.com>
Ricardo Raphael Joson <rrjoson08@gmail.com>
Richard D. Worth <rdworth@gmail.com>
Rick Zhou <rinick@gmail.com>
Robert Wilkinson <wilkinson.robert.a@gmail.com>
Rodrigo Ehlers <rodrigoehlers@outlook.com>
Rohan Malhotra <rohan.root@gmail.com>
Rongjian Zhang <pd4d10@gmail.com>
Rrrandom <emanonhere@gmail.com>
RunningCoderLee <sprint_l@aliyun.com>
Rustin <rustin.liu@gmail.com>
Rustin-Liu <rustin.liu@gmail.com>
RyanHui <ryanhui1996@gmail.com>
SHEN Lin <shenlin192@gmail.com>
Sagar Jain <sagar7993@gmail.com>
Sakol Assawasagool <koobitor@gmail.com>
Salavat Gizatov <100ishundred@gmail.com>
Sam Chen <chenxsan@gmail.com>
Sam Lanning <sam@samlanning.com>
Sam Maxwell <sam@paybase.io>
Samuel Gaus <sam@gaus.co.uk>
Sanghyeon Lee <yongdamsh@gmail.com>
Sangle <whb97@163.com>
Sanjay Kumar <kris.gooner@gmail.com>
Sanjay Kumar <sk@tectusdreamlab.com>
Scott Sturgeon <scott@tugboatlogic.com>
Sean Lin <sean@ejoy.com>
Sean Sun <pinggodstudio@gmail.com>
Sean Willis <sean.willis@incorta.com>
Sebastian Blade <blade254353074@hotmail.com>
Sebastian Busch <mail@sebastian-bus.ch>
Sebastian Busch <s.busch@obg-gruppe.de>
Sebastian Busch <s.busch@qbus-enet.de>
Sergey Levkovich <gosu.87@mail.ru>
Sergey Volynkin <sergey.volynkin@akvelon.com>
Sergio Crisostomo <sergiosbox@gmail.com>
Sevak <shaderzak@gmail.com>
Shawn Sit <xueqingxiao@gmail.com>
ShiCheng <nnecec@outlook.com>
ShiTengFei <shitengfei@goyoo.com>
ShuYu Wang <andelf@gmail.com>
Shuai Chen <wasd2144@hotmail.com>
Shubham Kanodia <shubhamsizzles@gmail.com>
Shun <polytechnics.shun@gmail.com>
Shuvalov Anton <anton@shuvalov.info>
SimaQ <sima.zhang1990@gmail.com>
Simo Aleksandrov <simo3003@me.com>
Sivaraj S <sivaraj@sdev.in>
Sivaraj <contact@sdev.in>
SoraYama <sorayamahou@gmail.com>
Spencer <spjy@hawaii.edu>
Stanley Thijssen <stanley.thijssen@energybox.com>
Stanley Thijssen <stanley.thijssen@gmail.com>
Stephen Esser <Stephen.Esser@gmail.com>
Stevche Radevski <sradevski@live.com>
Subroto <shub1493biswas@gmail.com>
Sven Efftinge <sven.efftinge@typefox.io>
SylvanasGone <397009765@qq.com>
TTC <345866517@qq.com>
Tao <magicdawn@qq.com>
Tao Zhang <windse7en@gmail.com>
Taylor Sabell <taylorsabell@gmail.com>
@@ -387,18 +518,22 @@ Teng YANG <yangteng@me.com>
Tengjiao Cai <caitengjiao1987@gmail.com>
Terence <trence320@163.com>
The Rock <zhoguoxin@126.com>
Theo Satloff <1golfball@gmail.com>
Thibault Derousseaux <tde@activeviam.com>
Thiebaud Thomas <thiebaud.tom@gmail.com>
Thomas <tom@axisj.com>
Thomas Ladd <thomas.ladd@stackpath.com>
Tino D <ginodeis@gmail.com>
Tom Gao <tom@zoomsoft.cc>
Tom Xu <tom.xu@antcosa.com>
Tom Xu <ycxzhkx@gmail.com>
TomIsion <isiontom@gmail.com>
Tomás Francisco <mail@tomasfrancisco.com>
Tomáš Hylský <thylsky@gmail.com>
Tomáš Szabo <tomas.szabo@deftomat.com>
Trotyl Yu <trotyl@qq.com>
Troy Thompson <troynt@gmail.com>
TsesamLi <tsesamli17@gmail.com>
Tyler <chaotyler@gmail.com>
Ubaldo Quintana <blkdr@hotmail.com>
Vadim Macagon <vadim.macagon@gmail.com>
@@ -406,6 +541,8 @@ Valentin Vichnal <valentin@vichnal.com>
Van Nguyen <vnguyen94@gmail.com>
Vemund Santi <vemund@santi.no>
Vic <709147950@qq.com>
Victor Repkow <repkowvictor@gmail.com>
Vijay Thirugnanam <vijayst@gmail.com>
Vincent Zhang <vxzhong@qq.com>
Vitaliy Mazurenko <vitaliymazurenko@gmail.com>
ViviaRui <zr1450995198@163.com>
@@ -420,17 +557,23 @@ Warren Seymour <warren@fountainhead.tech>
Wei Zhu <yesmeck@gmail.com>
Wenchao Hu <zjuhwc@gmail.com>
Wendell <wendzhue@gmail.com>
Wensheng Xu <xws@superid.cn>
Will <will_workhard@163.com>
Will Chen <willchen90@gmail.com>
William Cai <williamcai@easyops.cn>
WingGao <wing.gao@live.com>
Wu Haotian <whtsky@gmail.com>
XBTop1! <xbtop1@gmail.com>
XTY <^@xty.dev>
Xiaoming <yokiming1994@gmail.com>
Xie Guanglei <xieguanglei@hotmail.com>
Xinxing Li <lixinxing.2019@bytedance.com>
Xiping.wang <527409987@qq.com>
XuMM_12 <owiatsq@sina.cn>
Yang <504021398@qq.com>
Yang Bin <yangkghjh@gmail.com>
Yangzhedi <uiryzd@163.com>
Yann Normand <yann.normand@gmail.com>
Yasin Uslu <nepjua@gmail.com>
Yevhen Hryhorevskyi <evgeniygrigorevskiy@gmail.com>
Yiming <ymjrcc@qq.com>
@@ -445,27 +588,36 @@ Yusuke Ito <novi.mad@gmail.com>
Yuwei Ba <i@xiaoba.me>
Yuxuan Huo <yuxuan.huo2011@gmail.com>
YuyingWu <wuyuying1128@gmail.com>
ZYSzys <zyszys98@gmail.com>
Zack Craig <zack@zack6849.com>
Zap <a124116186@qq.com>
Zhang Zhi <fytriht@gmail.com>
Zheeeng <hi@zheeeng.me>
Zhiqiang Gong <elory0513@hotmail.com>
Zhuo Chen <chenzhuo@caicloud.io>
Ziluo <gyfzzu@gmail.com>
Zohaib Ijaz <mzohaib.qc@gmail.com>
Zzzen <843968788@qq.com>
aashutoshrathi <aashutoshrathi@gmail.com>
adam <adamwu1992@163.com>
afc163 <afc163@gmail.com>
agent-z <1607291079@qq.com>
ahalimkara <ahalimkara@gmail.com>
alekslario <aleksandlario@gmail.com>
alex <379118572@qq.com>
alex89lj <379118572@qq.com>
alexchen <alexchen@easyops.cn>
amedora <americandragsterracing@gmail.com>
arifemrecelik <ce.arifemre@gmail.com>
ascoders <576625322@qq.com>
ashishg-qburst <ashishg@qburst.com>
atomoo <yangpein@gmail.com>
bLue <tbdblue@gmail.com>
babycannotsay <335658202@qq.com>
bang <sqibang@gmail.com>
bang88 <sqibang@gmail.com>
baozefeng <727751065@qq.com>
binyellow <571704908@qq.com>
blankzust <450811238@qq.com>
bukas <yhz1219@gmail.com>
byuanama <byuan@ama.com.au>
@@ -477,14 +629,22 @@ cathayandy <wzm_andy@126.com>
cc189 <cc189dev@gmail.com>
chaofeis <408067385@qq.com>
chchen <cc272309126@gmail.com>
chen shuai <qixian.cs@outlook.com>
chen wen jun <731028571@qq.com>
chencheng (云谦) <sorrycc@gmail.com>
chencheng <sorrycc@gmail.com>
chenlong <long.chen@abssqr.com>
chenshuai2144 <qixian.cs@outlook.com>
chisus <chisus@smartstudy.co.kr>
chunlea <ichunlea@me.com>
cjahv <cjahv@qq.com>
clinyong <clinyong@gmail.com>
cnjs <1269075501@qq.com>
codesign <zuishiguang@126.com>
corneyl <cornieljoosse@gmail.com>
damon.chen <chj_0507_dz@sina.com>
david.lv <code4funlnyx@gmail.com>
david.lv <lvdawei1970@gmail.com>
davidhatten <david.r.hatten@gmail.com>
ddcat1115 <ddcat1115@gmail.com>
decade <decadef20@gmail.com>
@@ -493,6 +653,7 @@ denzw <denzw@21cn.com>
dependabot[bot] <support@dependabot.com>
detailyang <detailyang@gmail.com>
devqin <devqin@gmail.com>
dian.li <dian.li@yunzhanghu.com>
digz6666 <digz6666@gmail.com>
djorkaeff <djorkae55@gmail.com>
duzliang <duzliang@gmail.com>
@@ -501,15 +662,21 @@ edgji <j.edgji@gmail.com>
eidonjoe <806488716@qq.com>
elios <elios264@hotmail.com>
elrrrrrrr <elrrrrrrr@gmail.com>
eruca <nickwill1984@126.com>
ezpub <ez.foro@gmail.com>
feng zhi hao <fzhihao@outlook.com>
fengmk2 <m@fengmk2.com>
fkysly <fkysly@gmail.com>
flashback313 <windmark2012@gmail.com>
frezc <504021398@qq.com>
genie <genie88@163.com>
gregahren <grega.hren@gmail.com>
guifu <picodoth@gmail.com>
gxvv <gaoxin18000@gmail.com>
gyh9457 <gyh9457@163.com>
haianweifeng <1531297152@qq.com>
haimrait <haimrait@gmail.com>
handy <lihandi@gmail.com>
handycode <lihandi@gmail.com>
hank <stonehank310@gmail.com>
hanpei <75189218@qq.com>
@@ -522,10 +689,13 @@ hengkx <ycxzhkx@gmail.com>
henryv0 <henryvo94@gmail.com>
hi-caicai <hi@cai-cai.me>
hongxuWei <hongxu.wei@outlook.com>
howard <geograous@126.com>
huangyan.py <huangyan.py@bytedance.com>
huishiyi <zhou1maple@gmail.com>
huzzbuzz <huzzbuzz@outlook.com>
iamcastelli <sowed@cyberdude.com>
iamkun <kunhello@outlook.com>
ikobe <ikobe621@gmail.com>
ilanus <hasanovtk@gmail.com>
imhele <work@imhele.com>
imosapatryk <imosa.patryk@gmail.com>
@@ -539,6 +709,7 @@ jasonslyvia <jasonslyvia@gmail.com>
jasonxia23 <xia.jason23@gmail.com>
jiajiangxu <minesaner@163.com>
jiang <155259966@qq.com>
jiang.an <jarancn@gmail.com>
jim <wasd2144@hotmail.com>
jinouwuque <ee2win@gmail.com>
jinyaqiao1102 <405782493@QQ.com>
@@ -547,13 +718,20 @@ junjing.zhang <zhangjunjing@gmail.com>
kacjay <45483388@qq.com>
kagawagao <kingsongao1221@gmail.com>
kaifei <150641329@qq.com>
kailunyao <kailunyao@163.com>
kanweiwei <475801900@qq.com>
kanweiwei <kwwnjujlc@sina.com>
kapiroska <etherreals777@gmail.com>
kasinooya <kasinooya@gmail.com>
kavin <kavin.huang@alphaliongroup.com>
kayw <kayw@outlook.com>
kdenz <ksnz93@gmail.com>
kdepp <kdepp.cd@gmail.com>
keng <keng@renderinghouse.com>
kenve <zwei.xie@gmail.com>
keqingrong <keqingrong1992@gmail.com>
kermolaev <kermolaev@cloudally.com>
klouskingsley <harry_tse@163.com>
ko <git@yaksok.net>
konakona <lovekonakona@gmail.com>
kossel <lis.yichao@gmail.com>
@@ -565,13 +743,18 @@ leadream <857098475@qq.com>
lehug <zcszuo5811@126.com>
leijingdao <leijingdao@163.com>
leon.shi <superRaytin@163.com>
lewis liu <897473127@qq.com>
lgmcolin <gengmin.lgm@gmail.com>
lgmcolin <lgmcolin@gmail.com>
lhx <liuhongxi0000@163.com>
lhyt <515593899@qq.com>
liangfei <njliangfei@gmail.com>
liekkas <zjq0717@163.com>
lihqi <455711093@qq.com>
lilun <lilun_cd@keruyun.com>
littleLane <857183384@qq.com>
liuchuzhang <liuweiminer@126.com>
liuchuzhang <liuweiminer@hotmail.com>
lixiaochou077 <qi.liqi07@gmail.com>
lixiaoyang <lixiaoyang2345@gmail.com>
lixiaoyang1992 <lixiaoyang2345@gmail.com>
@@ -580,16 +763,21 @@ lizhen <lizhen@youzan.com>
loganpowell <loganp@tepper.cmu.edu>
luyiming <luyimingchn@gmail.com>
lvren <luren6049@qq.com>
lxnxbnq <yuanddmail@163.com>
lyhper <lyhper@gmail.com>
mArker <252133226@qq.com>
maks <pine3ree@gmail.com>
maximest-pierre <me@maximest-pierre.me>
melchior voidwolf <kmno4k2mno4@gmail.com>
memoryza <jincai.wang@foxmail.com>
mgrdevport <mgrdevport@gmail.com>
mingyan.yu <mingyan.yu@wormpex.com>
mitchell.demler <mitchell.demler@harcourts.net>
mkermani144 <mkermani144@gmail.com>
mmmveggies <jakeselig@gmail.com>
mofelee <mofe@me.com>
monkindey <monkindey@163.com>
moonrailgun <moonrailgun@gmail.com>
mraiguo <810158465@qq.com>
mraiguo <mraiguo@gmail.com>
mushan0x0 <mushan0x0@gmail.com>
@@ -597,21 +785,27 @@ muzea <mr.muzea@gmail.com>
muzuiget <muzuiget@gmail.com>
natergj <nater_nater@me.com>
neekey <ni184775761@gmail.com>
ngolin <poodll@163.com>
nick-ChenZe <chenze2168@gmail.com>
niko <644506165@qq.com>
nikogu <644506165@qq.com>
nnecec <nnecec@outlook.com>
nuintun <nuintun@qq.com>
ohhoney1 <1269075501@qq.com>
oldchicken <www.chao3208525@qq.com>
orzorzorzorz <zy410419243@gmail.com>
orzyyyy <zy410419243@gmail.com>
paranoidjk <hust2012jiangkai@gmail.com>
parlop <parlop@gmail.com>
pbrink231 <pbrink231@gmail.com>
pd4d10 <pd4d10@gmail.com>
peiming <hyrijk@gmail.com>
pengtikui <949828390@qq.com>
picodoth <picodoth@gmail.com>
picodoth <pikaleize@gmail.com>
pinggod <pinggodstudio@gmail.com>
pizn <pizner@gmail.com>
plainnany <plainnany@gmail.com>
plandem <plandem@gmail.com>
popomore <sakura9515@gmail.com>
qiaojie <1454763497@qq.com>
@@ -620,14 +814,18 @@ qliu <1403927509@qq.com>
qubaoming <qubaoming@didichuxing.com>
ravirambles <ravirambles@gmail.com>
richardison <richard.ison@carleton.ca>
riho <873435892@qq.com>
ryangun <ryangun@foxmail.com>
ryanhoho <hswacoal@gmail.com>
ryannz <c5e1856@gmail.com>
sadmark <zhoubin@laidian360.com>
sallen450 <jqh101@sina.com>
saxenanihal95 <saxenanihal95@gmail.com>
sdli <1669375803@qq.com>
sfturing <sfturing@gmail.com>
shangyuan.ning <shangyuan.ning@manaowan.com>
shao <darryshaw@gmail.com>
shaodahong <darryshaw@gmail.com>
shawtung <shawtung@qq.com>
shelwin <wxfans@gmail.com>
shenlin192@gmail.com <shenlin192@gmail.com>
@@ -645,9 +843,11 @@ sosohime <theziming@126.com>
spideeee <spideeee@github.com>
stevenyuysy <stevenyuysy@gmail.com>
stickmy <stickmyc@gmail.com>
susiwen <susiwen8@gmail.com>
swindme <swindme@163.com>
sylvanasGone <397009765@qq.com>
syssam <s.y.s.sam.sys@gmail.com>
tangjinzhou <21251118@zju.edu.cn>
tangjinzhou <415800467@qq.com>
tangjinzhou <tangjinzhou@yidian-inc.com>
taoweicn <twchn@live.com>
@@ -655,52 +855,76 @@ thegatheringstorm <tgs@tgs.blue>
thilo-behnke <jan-thilo.behnke@gmx.de>
tianli.zhao <275287902@qq.com>
tom <caolvchong@gmail.com>
tom <gaoqiang19514@163.com>
toshi1127 <toshi.matsumoto.2n@stu.hosei.ac.jp>
twobin <twobin@live.com>
u3u <qwq@qwq.cat>
undefined <undefined>
unknown <chenyizhongx@gmail.com>
ustccjw <317713370@qq.com>
vagusX <vagusxl@gmail.com>
valleykid <valleykiddy@gmail.com>
vaytsel <vaytsel@gmail.com>
veveue <veveue@dingtalk.com>
vgeyi <vgeyiz@126.com>
wadezhan <wadezhan@tencent.com>
wangshantao <605682551@qq.com>
wangshuai <wangshuai@momenta.ai>
wangtao0101 <yuecjn@gmail.com>
wangxiaolei <fatelei@gmail.com>
wangxing <wangxing@nroad.com.cn>
wangxingkang <156148958@qq.com>
wangxingkang <wangxingkang@sensoro.com>
wangxueliang <wangxueliang@yidian-inc.com>
wanli <wanli@qunhemail.com>
warmhug <hualei5280@gmail.com>
wenhong <wenhong.zw@antfin.com>
whinc <whincwu@163.com>
whtang906 <whtang906@gmail.com>
willc001 <will.c001@163.com>
wizawu <wizawu@gmail.com>
wleven <408493323@qq.com>
wonyun <wy393767068@163.com>
woodsand <ballerpk70@gmail.com>
wtzeng1 <wentao_zeng1@163.com>
wwwxy <xiaowangziwxy@gmail.com>
wwwxy80s <xiaowangziwxy@gmail.com>
wx1322 <289758716@qq.com>
xiaofan2406 <xiaofan2406@gmail.com>
xiaohuoni <448627663@qq.com>
xrkffgg <xrkffgg@vip.qq.com>
xuqiang <xuqiang@xiaoshouyi.com>
y-take <y.takey@gmail.com>
yangwukang <yangwukang@boco.com.cn>
yangxiaolin <yangxiao2810279802@gmail.com>
ycjcl868 <45808948@qq.com>
ye4241 <ye4241@gmail.com>
yeliex <yeliex@yeliex.com>
yibu.wang <yibu.wang@orion.co.com>
yiminanci <yiminanci@gmail.com>
yiminghe <yiminghe@gmail.com>
yinjs <yinjiangsheng@gmail.com>
yociduo <yociduo@vip.qq.com>
yoyo837 <yoyo837@hotmail.com>
yubozhao <yubz86@gmail.com>
yuche <i@yuche.me>
yuezk <yuezk001@gmail.com>
z <haig8@msn.com>
zack <zxyah@126.com>
zefeng <zefengbao@outlook.com>
zelongc <nickcong123@gmail.com>
zerob4wl <zerob4wl@gmail.com>
zhangguanyu02 <zhangguanyu02@meituan.com>
zhangpc <zhangpc@tenxcloud.com>
zhangyangxue <383632607@qq.com>
zhangzh <zhangzh@cnlemon.net>
zhaocai <lzc09008@gmail.com>
zhaopeidong <lwindscar@gmail.com>
zhujun24 <zhujun87654321@gmail.com>
zhuyue <fuping.dfp@antfin.com>
zilong <jzlxiaohei@163.com>
zinkey <yaya@uloveit.com.cn>
zjf <zjffun@gmail.com>
zlljqn <zlljqn@gmail.com>
zollero <corona7@163.com>
zombieJ <smith3816@gmail.com>
@@ -708,22 +932,31 @@ zombiej <smith3816@gmail.com>
zongzi531 <zongzi.xy@gmail.com>
ztplz <mysticzt@gmail.com>
zuiidea <zuiiidea@gmail.com>
zx6658 <zx6658@naver.com>
zy410419243 <zy410419243@gmail.com>
zytjs <yitongzhao@163.com>
°))))彡 <fisherspy@live.com>
邦 <sqibang@gmail.com>
爱but的苍蝇 <354788473@qq.com>
Ștefan Filip <stefy.filip@gmail.com>
高力 <3071730@qq.com>
郑旭 <332171564@qq.com>
拷钉 <41830859@qq.com>
蒋璇 <645762213@qq.com>
苏秦 <646382806@qq.com>
陈杰 <810158465@qq.com>
竹尔 <Juelchiang@gmail.com>
偏右 <afc163@gmail.com>
黄斌 <bin.huang02@hand-china.com>
英布 <chaoren1641@gmail.com>
朮厃 <cn.ah.liu@gmail.com>
张聪 <dancerphil1994@gmail.com>
诸岳 <dengfuping_develop@163.com>
诸岳 <dengfuping_private@163.com>
逸达 <dqaria@gmail.com>
诸岳 <fuping.dfp@antfin.com>
啸生 <ikobe621@gmail.com>
迷渡 <justjavac@gmail.com>
二哲 <kodo@forchange.cn>
廖星 <liaoxing.lx@bytedance.com>
刘红 <liuhong1.happy@163.com>
@@ -736,6 +969,7 @@ zy410419243 <zy410419243@gmail.com>
松子 <window.pibarr@gmail.com>
何乐 <work@imhele.com>
付引 <xxxquotes@gmail.com>
萧琚 <yizhi.lyz@antfin.com>
可乐 <zaxlct@foxmail.com>
山客 <zeakhold@gmail.com>
曾凯 <zengkai2009@foxmail.com>
@@ -743,6 +977,8 @@ zy410419243 <zy410419243@gmail.com>
信鑫-King <45808948@qq.com>
广彬-梁 <326741518@qq.com>
小哈husky <951565664@qq.com>
诸葛龙 <158362530@qq.com>
李环冀 <158757774@qq.com>
何志勇 <15988134176@163.com>
徐坤龙 <272992168@qq.com>
黄子毅 <576625322@qq.com>
@@ -750,22 +986,27 @@ zy410419243 <zy410419243@gmail.com>
崔宏森 <948346354@qq.com>
黄文鉴 <concefly@foxmail.com>
董天成 <dongtiangche@outlook.com>
龚方闻 <fangwen.gong@baishancloud.com>
方剑成 <fjc0kb@gmail.com>
陈广亮 <geraldchen890806@gmail.com>
包子熊 <hezhiyu233@foxmail.com>
闲耘™ <hotoo.cn@gmail.com>
一喵呜 <hyb628@gmail.com>
王林涛 <hzwanglintao@corp.netease.com>
黄俊亮 <jayhuang@easyops.cn>
吕立青 <jimmy.jinglv@gmail.com>
隋鑫磊 <joshuasui@gmail.com>
米老朱 <laozhu.me@gmail.com>
刘宏玺 <liuhongxi0000@163.com>
乔奕轩 <qiao_yixuan@163.com>
马斯特 <sd4399340@126.com>
廖应龙 <vigossliao@gmail.com>
王集鹄 <wjhu111@21cn.com>
徐新航 <xuxinhang@bytedance.com>
杨哲迪 <yangzhedi@yidian-inc.com>
柚子男 <yozman@sina.com>
愚指导 <yutingzhao1991@sina.com>
只捱宅 <zy410419243@gmail.com>
郭延豪(708674) <gyh9457@163.com>
愚指导-TZ <yutingzhao1991@sina.com>
杨小事er <Uiryzd@163.com>
@@ -773,5 +1014,8 @@ zy410419243 <zy410419243@gmail.com>
超能刚哥 <margox@foxmail.com>
马金花儿 <o.o@mug.dog>
रोहन मल्होत्रा <rohan.malhotra@adwyze.com>
芝华塔尼欧 <1150974628@qq.com>
白羊座小葛 <abeyuhang@gmail.com>
薛定谔的猫 <hh_2013@foxmail.com>
二货机器人 <smith3816@gmail.com>
骗你是小猫咪 <darryshaw@gmail.com>

View File

@@ -15,6 +15,107 @@ timeline: true
---
## 3.26.9
`2020-02-08`
- 🐞 Fix Badge that count is not align when wrapped by Typography. [#21237](https://github.com/ant-design/ant-design/pull/21237)
- 🐞 Fix Steps that icon is not align when `size="small"` and `labelPlacement="vertical"`. [#21258](https://github.com/ant-design/ant-design/pull/21258)
- 🐞 Fix Typography not focus at the end of textarea when `editable` is true. [#21268](https://github.com/ant-design/ant-design/pull/21268)
- TypeScript
- 💄 Improve type definition of validation rule's type for Form. [#21250](https://github.com/ant-design/ant-design/pull/21250) [@hansololai](https://github.com/hansololai)
- 🐞 Fix type definition of `event` for Tree. [#21200](https://github.com/ant-design/ant-design/pull/21200) [@Jirka-Lhotka](https://github.com/Jirka-Lhotka)
## 3.26.8
`2020-02-03`
- 🐞 Fix Tooltip hidden when `title` is `0`. [#20894](https://github.com/ant-design/ant-design/pull/20894)
- 🐞 Fix List `actions` inconsistent position. [#20897](https://github.com/ant-design/ant-design/pull/20897)
- 🐞 Fix Card `font-size` of `actions` not in less theme variables. [#21106](https://github.com/ant-design/ant-design/pull/21106)
- 🐞 Fix Layout components `displayName`. [#21124](https://github.com/ant-design/ant-design/pull/21124)
- 🐞 Fix Modal.confirm `okButtonProps` and `cancelButtonProps` interface. [#21165](https://github.com/ant-design/ant-design/pull/21165)
## 3.26.7
`2020-01-13`
- 💄 Optimize Table fixed columns blank problem in some case. [#20821](https://github.com/ant-design/ant-design/pull/20821) [@AshoneA](https://github.com/AshoneA)
- 🐞 Fix Tree `switcherIcon` shown in leaf node problem. [#20753](https://github.com/ant-design/ant-design/pull/20753)
- 🐞 Fix Badge `z-index` higher than Table fixed columns. [#20751](https://github.com/ant-design/ant-design/pull/20751)
- 🐞 Fix Cascader search bug when `fieldNames` is existed and label/value share same name. [#20720](https://github.com/ant-design/ant-design/pull/20720)
- 🐞 Fix Collapse background color with wrong less variable. [#20718](https://github.com/ant-design/ant-design/pull/20718) [@kuitos](https://github.com/kuitos)
- 🐞 Fix Input.Group inside `<Form layout="vertical" >` 1px bug. [#20685](https://github.com/ant-design/ant-design/pull/20685)
## 3.26.6
`2020-01-03`
- 📢 v3 branch changes from `master` to `3.x-stable` and v4 merge into `master`.
- 💄 Improve Steps `type="navigation"` UI in small screen. [#20545](https://github.com/ant-design/ant-design/pull/20545)
- 🐞 Fix `message.xxx` pass `null` will failed. [#20546](https://github.com/ant-design/ant-design/pull/20546)
- 🐞 Remove Input.Password `value` attribute from dom. [#20544](https://github.com/ant-design/ant-design/pull/20544)
## 3.26.5
`2019-12-29`
- Table
- 🐞 Revert the logic of return fisrt page by default after sort. [#20507](https://github.com/ant-design/ant-design/pull/20507)
- 🐞 Fix header wrong text align when `colspan=1`. [#20463](https://github.com/ant-design/ant-design/pull/20463)
- 🐞 Fix Tabs ink bar disappearing when `animated` prop is false. [#20417](https://github.com/ant-design/ant-design/pull/20417) [@xrkffgg](https://github.com/xrkffgg)
- 🐞 Fix Tree wrong indent. [#20456](https://github.com/ant-design/ant-design/pull/20456)
## 3.26.4
`2019-12-22`
- 💄 Optimize Steps `subTitle` UI when `labelPlacement="vertical"`. [#20325](https://github.com/ant-design/ant-design/pull/20325)
- 🐞 Fix upload preview not support ico file type issue. [#20375](https://github.com/ant-design/ant-design/pull/20375) [@Rustin-Liu](https://github.com/Rustin-Liu)
- 🐞 Fix Form feedback icon combine Input `suffix` display not correct. [#20363](https://github.com/ant-design/ant-design/pull/20363)
- 🐞 Fix Tag `onClick` been triggered when close it. [#20355](https://github.com/ant-design/ant-design/pull/20355)
- 🐞 Fix Cascader component form check color trigger issue. [#20347](https://github.com/ant-design/ant-design/pull/20347) [@xrkffgg](https://github.com/xrkffgg)
- 🐞 Disallow auto focus input after triggering `onSearch` event in mobile and tablet devices. [#20332](https://github.com/ant-design/ant-design/pull/20332) [@YaoKaiLun](https://github.com/YaoKaiLun)
- 🐞 Fix Tabs ink bar missing transition animation. [#20283](https://github.com/ant-design/ant-design/pull/20283)
- 🐞 Fix TreeNode without `icon` show white block in `showIcon` mode. [#20274](https://github.com/ant-design/ant-design/pull/20274)
- TypeScript
- ⚡️ Update filters define in Table `onChange`. [#20337](https://github.com/ant-design/ant-design/pull/20337) [@MrHeer](https://github.com/MrHeer)
## 3.26.3
`2019-12-14`
- 🛠 support `unpkg` field in `package.json`. [#20193](https://github.com/ant-design/ant-design/pull/20193)
- 🐞 Fix Tree `showLine` and `showIcon` missing icon. [#20196](https://github.com/ant-design/ant-design/pull/20196)
- 🐞 Fix Modal combine Drawer cause invalid scroll problem. [#20242](https://github.com/ant-design/ant-design/pull/20242)
- 🐞 Fix Drawer `switchScrollingEffect prop on a DOM element` warning. [#20175](https://github.com/ant-design/ant-design/pull/20175)
- 🐞 Fix Select Option `label` definition. [#20190](https://github.com/ant-design/ant-design/pull/20190) [@ZhechenLi](https://github.com/ZhechenLi)
- 💄 Optimize Form feedback icon padding. [#20164](https://github.com/ant-design/ant-design/pull/20164) [@Satloff](https://github.com/Satloff)
- 💄 Add less variables for Select/Cascader to optimize dropdown padding and border radius. [#20156](https://github.com/ant-design/ant-design/pull/20156) [@Satloff](https://github.com/Satloff)
## 3.26.2
`2019-12-10`
- 🐞 Fix DatePicker `disabledTime` TypeScript definition to be optional. [#20153](https://github.com/ant-design/ant-design/pull/20153) [@khaledkhalil94](https://github.com/khaledkhalil94)
- 🐞 Fix Transfer's `title` of `dataSource` TypeScript definition to be optional. [#20144](https://github.com/ant-design/ant-design/pull/20144) [@mraiguo](https://github.com/mraiguo)
## 3.26.1
`2019-12-09`
- 🐞 Fix List pagination options text align. [#20037](https://github.com/ant-design/ant-design/issues/20037)
- 🐞 Fix Button text not align well in Chrome. [#20059](https://github.com/ant-design/ant-design/pull/20059)
- 🐞 Fix DescriptionItem `className` error applied to label. [#20067](https://github.com/ant-design/ant-design/pull/20067) [@Liu-Ya](https://github.com/Liu-Ya)
- 🐞 Fix Tree duplicated icons when `showLine` is true. [#20090](https://github.com/ant-design/ant-design/issues/20090)
- 🐞 Fix Editable Typography flush in Firefox. [#20118](https://github.com/ant-design/ant-design/pull/20118)
- 🐞 Improve Icon `component` definition to be compatible with create-react-app svg component. [#20142](https://github.com/ant-design/ant-design/pull/20142)
- Table
- 🐞 Fix small table header border missing. [#20030](https://github.com/ant-design/ant-design/issues/20030)
- 🐞 Fix `filterIcon` throws error when render string or number.
- 🐞 Fix `filterIcon` shows wrong title when returns Tooltip. [#20049](https://github.com/ant-design/ant-design/issues/20049)
- 🐞 Fix columns have 9px align issue in Windows Chrome. [#19952](https://github.com/ant-design/ant-design/issues/19952)
## 3.26.0
`2019-12-01`

View File

@@ -15,6 +15,105 @@ timeline: true
---
`2020-02-08`
- 🐞 修复 Badge 在 Typography 下数字错位的问题。[#21237](https://github.com/ant-design/ant-design/pull/21237)
- 🐞 修复 Steps 在 `size="small"``labelPlacement="vertical"` 时图标没有对齐的问题。[#21258](https://github.com/ant-design/ant-design/pull/21258)
- 🐞 修复 Typography 在可编辑状态时光标没有在输入框末位的问题。[#21268](https://github.com/ant-design/ant-design/pull/21268)
- TypeScript
- 💄 完善 Form 中校验规则类型的类型定义。[#21250](https://github.com/ant-design/ant-design/pull/21250) [@hansololai](https://github.com/hansololai)
- 🐞 修复 Tree 中事件类型定义不正确的问题。[#21200](https://github.com/ant-design/ant-design/pull/21200) [@Jirka-Lhotka](https://github.com/Jirka-Lhotka)
## 3.26.8
`2020-02-03`
- 🐞 修复 Tooltip `title``0` 时没有显示的问题。[#20894](https://github.com/ant-design/ant-design/pull/20894)
- 🐞 修复 List `actions` 位置不在右边的问题。[#20897](https://github.com/ant-design/ant-design/pull/20897)
- 🐞 修复 Card `actions` 字体大小不受 less 变量影响的问题。[#21106](https://github.com/ant-design/ant-design/pull/21106)
- 🐞 修正 Layout 各组件的 `displayName`。[#21124](https://github.com/ant-design/ant-design/pull/21124)
- 🐞 优化 Modal.confirm 的 `okButtonProps``cancelButtonProps` 的 TypeScript 类型。[#21165](https://github.com/ant-design/ant-design/pull/21165)
## 3.26.7
`2020-01-13`
- 💄 优化 Table 固定列在某些情况下出现空白间隔的问题。[#20821](https://github.com/ant-design/ant-design/pull/20821) [@AshoneA](https://github.com/AshoneA)
- 🐞 修复 Tree `switcherIcon` 在叶子节点上展示的问题。[#20753](https://github.com/ant-design/ant-design/pull/20753)
- 🐞 修复 Badge 在 Table 固定列中穿透的问题。[#20751](https://github.com/ant-design/ant-design/pull/20751)
- 🐞 修复 Cascader `fieldNames` 中 label 和 value 共用一个值时搜索功能失效的问题。[#20720](https://github.com/ant-design/ant-design/pull/20720)
- 🐞 修复 Collapse 背景使用错误的 less 变量。[#20718](https://github.com/ant-design/ant-design/pull/20718) [@kuitos](https://github.com/kuitos)
- 🐞 修复 `<Form layout="vertical" >` 内 Input.Group 偏上一像素的问题。[#20685](https://github.com/ant-design/ant-design/pull/20685)
## 3.26.6
`2020-01-03`
- 📢 v3 分支由 `master` 进入 `3.x-stable`v4 合入 `master`
- 💄 优化 Steps `type="navigation"` 在小屏幕下的样式。[#20545](https://github.com/ant-design/ant-design/pull/20545)
- 🐞 修复 `message.xxx` 传入 `null` 会报错的问题。[#20546](https://github.com/ant-design/ant-design/pull/20546)
- 🐞 优化 Input.Password 在 dom 中明文显示 `value` 属性的问题。[#20544](https://github.com/ant-design/ant-design/pull/20544)
## 3.26.5
`2019-12-29`
- Table
- 🐞 回滚排序后默认回到第一页的逻辑。[#20507](https://github.com/ant-design/ant-design/pull/20507)
- 🐞 修复分组列头在 `colspan=1` 时文本没有对齐的问题。[#20463](https://github.com/ant-design/ant-design/pull/20463)
- 🐞 修复 Tabs 的 `animated` 属性为 false 时,高亮条消失的问题。[#20417](https://github.com/ant-design/ant-design/pull/20417) [@xrkffgg](https://github.com/xrkffgg)
- 🐞 修复 Tree 节点缩进不正确的问题。[#20456](https://github.com/ant-design/ant-design/pull/20456)
## 3.26.4
`2019-12-22`
- 💄 优化 Steps `subTitle``labelPlacement="vertical"` 下的展现方式。[#20325](https://github.com/ant-design/ant-design/pull/20325)
- 🐞 修复 Upload 组件预览不支持 `.ico` 文件问题。[#20375](https://github.com/ant-design/ant-design/pull/20375) [@Rustin-Liu](https://github.com/Rustin-Liu)
- 🐞 修复 Form feedback 图标结合 Input `suffix` 显示不正确。[#20363](https://github.com/ant-design/ant-design/pull/20363)
- 🐞 修复 Tag 关闭时 `onClick` 被触发的问题。[#20355](https://github.com/ant-design/ant-design/pull/20355)
- 🐞 修复 Cascader 组件 Form 校验触发时,鼠标悬浮显示颜色问题。[#20347](https://github.com/ant-design/ant-design/pull/20347) [@xrkffgg](https://github.com/xrkffgg)
- 🐞 修复移动端点击搜索后,自动聚焦输入框,导致弹出键盘的问题。[#20332](https://github.com/ant-design/ant-design/pull/20332) [@YaoKaiLun](https://github.com/YaoKaiLun)
- 🐞 修复 Tabs 高亮条宽度的 `transition` 过度动画失效的问题。[#20283](https://github.com/ant-design/ant-design/pull/20283)
- 🐞 修复 TreeNode 不设置 `icon` 时会展示一个空白占位的问题。[#20274](https://github.com/ant-design/ant-design/pull/20274)
- TypeScript
- ⚡️ 更新 Table `onChange``filters` 的定义。[#20337](https://github.com/ant-design/ant-design/pull/20337) [@MrHeer](https://github.com/MrHeer)
## 3.26.3
`2019-12-14`
- 🛠 antd `package.json` 中补充 `unpkg` 字段。[#20193](https://github.com/ant-design/ant-design/pull/20193)
- 🐞 修复 Tree `showLine``showIcon` 同时开启时 `[+]` `[-]` 图标丢失的问题。[#20196](https://github.com/ant-design/ant-design/pull/20196)
- 🐞 修复 Modal 和 Drawer 结合使用时导致滚动失效的问题。[#20242](https://github.com/ant-design/ant-design/pull/20242)
- 🐞 修复 Drawer `switchScrollingEffect prop on a DOM element` 警告。[#20175](https://github.com/ant-design/ant-design/pull/20175)
- 🐞 修复 Select Option 的 `label` 属性定义。[#20190](https://github.com/ant-design/ant-design/pull/20190) [@ZhechenLi](https://github.com/ZhechenLi)
- 💄 优化 Form 反馈图标的间距样式。[#20164](https://github.com/ant-design/ant-design/pull/20164) [@Satloff](https://github.com/Satloff)
- 💄 Select/Cascader 新增和优化边距 padding 和圆角的相关 less 变量。[#20156](https://github.com/ant-design/ant-design/pull/20156) [@Satloff](https://github.com/Satloff)
## 3.26.2
`2019-12-10`
- 🐞 修正 DatePicker `disabledTime` 属性 TypeScript 定义为可选。[#20153](https://github.com/ant-design/ant-design/pull/20153) [@khaledkhalil94](https://github.com/khaledkhalil94)
- 🐞 修正 Transfer `dataSource``title` 属性 TypeScript 定义为可选。[#20144](https://github.com/ant-design/ant-design/pull/20144) [@mraiguo](https://github.com/mraiguo)
## 3.26.1
`2019-12-09`
- 🐞 修复 List 下分页选项文本对齐问题。[#20037](https://github.com/ant-design/ant-design/issues/20037)
- 🐞 修复 Chrome 下 Button 文字没有垂直居中的问题。[#20059](https://github.com/ant-design/ant-design/pull/20059)
- 🐞 修复 DescriptionItem 的 `className` 错误应用于 label。[#20067](https://github.com/ant-design/ant-design/pull/20067) [@Liu-Ya](https://github.com/Liu-Ya)
- 🐞 修复 Tree `showLine` 为 true 时展示多余图标的问题。[#20090](https://github.com/ant-design/ant-design/issues/20090)
- 🐞 修复 Typography 可编辑组件在 Firefox 下闪动的问题。[#20118](https://github.com/ant-design/ant-design/pull/20118)
- 🐞 修复 Icon `component` 的定义,使其兼容于 create-react-app 的 svg 组件定义。[#20142](https://github.com/ant-design/ant-design/pull/20142)
- Table
- 🐞 修复小号 Table 表头边框丢失的问题。[#20030](https://github.com/ant-design/ant-design/issues/20030)
- 🐞 修复 `filterIcon` 返回字符串或数字时报错的问题。
- 🐞 修复 `filterIcon` 返回 Tooltip 时显示了错误的 `title`。[#20049](https://github.com/ant-design/ant-design/issues/20049)
- 🐞 修复在 Windows Chrome 下固定列有 9px 的对齐问题。[#19952](https://github.com/ant-design/ant-design/issues/19952)
## 3.26.0
`2019-12-01`

View File

@@ -24,10 +24,12 @@
## ✨ 特性
- 提炼自企业级中后台产品的交互语言和视觉风格。
- 开箱即用的高质量 React 组件。
- 使用 TypeScript 构建,提供完整的类型定义文件。
- 全链路开发和设计工具体系。
- 🌈 提炼自企业级中后台产品的交互语言和视觉风格。
- 📦 开箱即用的高质量 React 组件。
- 🛡 使用 TypeScript 开发,提供完整的类型定义文件。
- ⚙️ 全链路开发和设计工具体系。
- 🌍 数十个国际化语言支持。
- 🎨 深入每个细节的主题定制能力。
## 🖥 支持环境
@@ -51,20 +53,25 @@ yarn add antd
## 🔨 示例
```jsx
import { DatePicker } from 'antd';
ReactDOM.render(<DatePicker />, mountNode);
```
````jsx
import { Button, DatePicker } from 'antd';
const App = () => (
<>
<Button type="primary">PRESS ME</Button>
<DatePicker />
</>
);
引入样式:
```jsx
import 'antd/dist/antd.css'; // or 'antd/dist/antd.less'
```
````
你也可以 [按需加载组件](https://ant.design/docs/react/getting-started-cn#按需加载)。
你也可以使用 [babel-plugin-import](https://ant.design/docs/react/getting-started-cn#按需加载)。
### TypeScript
### 🛡 TypeScript
参考 [在 TypeScript 中使用](https://ant.design/docs/react/use-in-typescript-cn)
@@ -121,7 +128,7 @@ $ npm start
[![Let's fund issues in this repository](https://issuehunt.io/static/embed/issuehunt-button-v1.svg)](https://issuehunt.io/repos/34526884)
## 社区互助
## 👥 社区互助
如果您在使用的过程中碰到问题,可以通过下面几个途径寻求帮助,同时我们也鼓励资深用户通过下面的途径给新人提供帮助。

View File

@@ -24,10 +24,12 @@ English | [简体中文](./README-zh_CN.md)
## ✨ Features
- An enterprise-class UI design system for web applications.
- A set of high-quality React components out of the box.
- Written in TypeScript with predictable static types.
- The whole package of development and design resources and tools.
- 🌈 Enterprise-class UI designed for web applications.
- 📦 A set of high-quality React components out of the box.
- 🛡 Written in TypeScript with predictable static types.
- ⚙️ Whole package of design resources and development tools.
- 🌍 Internationalization support for dozens of languages.
- 🎨 Powerful theme customization in every detail.
## 🖥 Environment Support
@@ -36,8 +38,8 @@ English | [简体中文](./README-zh_CN.md)
- [Electron](http://electron.atom.io/)
| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt="IE / Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>IE / Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Safari | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/opera/opera_48x48.png" alt="Opera" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Opera | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/electron/electron_48x48.png" alt="Electron" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Electron |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| IE9, IE10, IE11, Edge | last 2 versions | last 2 versions | last 2 versions | last 2 versions | last 2 versions |
| --- | --- | --- | --- | --- | --- |
| IE9, IE10, IE11, Edge | last 2 versions | last 2 versions | last 2 versions | last 2 versions | last 2 versions |
## 📦 Install
@@ -52,17 +54,23 @@ yarn add antd
## 🔨 Usage
```jsx
import { DatePicker } from "antd";
ReactDOM.render(<DatePicker />, mountNode);
import { Button, DatePicker } from 'antd';
const App = () => (
<>
<Button type="primary">PRESS ME</Button>
<DatePicker />
</>
);
```
And import style manually:
```jsx
import "antd/dist/antd.css"; // or 'antd/dist/antd.less'
import 'antd/dist/antd.css'; // or 'antd/dist/antd.less'
```
Or [import components on demand](https://ant.design/docs/react/getting-started#Import-on-Demand).
Or use [babel-plugin-import](https://ant.design/docs/react/getting-started#Import-on-Demand).
### TypeScript

View File

@@ -41,152 +41,152 @@ exports[`renders ./components/avatar/demo/badge.md correctly 1`] = `
style="transition:none;-ms-transform:translateY(-1100%);-webkit-transform:translateY(-1100%);transform:translateY(-1100%)"
>
<p
class=""
class="ant-scroll-number-only-unit"
>
0
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
1
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
2
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
3
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
4
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
5
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
6
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
7
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
8
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
9
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
0
</p>
<p
class="current"
class="ant-scroll-number-only-unit current"
>
1
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
2
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
3
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
4
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
5
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
6
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
7
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
8
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
9
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
0
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
1
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
2
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
3
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
4
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
5
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
6
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
7
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
8
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
9
</p>

View File

@@ -17,12 +17,16 @@ function getNumberArray(num: string | number | undefined | null) {
: [];
}
function renderNumberList(position: number) {
function renderNumberList(position: number, className: string) {
const childrenToReturn: React.ReactElement<any>[] = [];
for (let i = 0; i < 30; i++) {
const currentClassName = position === i ? 'current' : '';
childrenToReturn.push(
<p key={i.toString()} className={currentClassName}>
<p
key={i.toString()}
className={classNames(className, {
current: position === i,
})}
>
{i % 10}
</p>,
);
@@ -138,7 +142,7 @@ class ScrollNumber extends React.Component<ScrollNumberProps, ScrollNumberState>
},
key: i,
},
renderNumberList(position),
renderNumberList(position, `${prefixCls}-only-unit`),
);
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -159,7 +159,7 @@
display: inline-block;
height: @badge-height;
transition: all 0.3s @ease-in-out;
> p {
> p.@{number-prefix-cls}-only-unit {
height: @badge-height;
margin: 0;
}

View File

@@ -12,7 +12,15 @@
// Button styles
// -----------------------------
.@{btn-prefix-cls} {
line-height: @line-height-base;
// Fixing https://github.com/ant-design/ant-design/issues/12978
// Fixing https://github.com/ant-design/ant-design/issues/20058
// Fixing https://github.com/ant-design/ant-design/issues/19972
// Fixing https://github.com/ant-design/ant-design/issues/12978
// Fixing https://github.com/ant-design/ant-design/issues/18107
// Fixing https://github.com/ant-design/ant-design/issues/13214
// It is a render problem of chrome, which is only happened in the codesandbox demo
// 0.001px solution works and I don't why
line-height: @line-height-base - 0.001;
.btn;
.btn-default;
@@ -73,6 +81,10 @@
&-icon-only {
.btn-square(@btn-prefix-cls);
> i {
vertical-align: middle;
}
}
&-round {

View File

@@ -32,7 +32,7 @@ A card can be used to display content related to a single subject. The content c
| hoverable | Lift up when hovering card | boolean | false | |
| loading | Shows a loading indicator while the contents of the card are being fetched | boolean | false | |
| tabList | List of TabPane's head. | Array&lt;{key: string, tab: ReactNode}> | - | |
| tabBarExtraContent | Extra content in tab bar | React.ReactNode | - | |
| tabBarExtraContent | Extra content in tab bar | React.ReactNode | - | 3.23.0 |
| size | Size of card | `default` \| `small` | `default` | 3.12.0 |
| title | Card title | string\|ReactNode | - | |
| type | Card style type, can be set to `inner` or not set | string | - | |

View File

@@ -33,7 +33,7 @@ cols: 1
| hoverable | 鼠标移过时可浮起 | boolean | false | |
| loading | 当卡片内容还在加载中时,可以用 loading 展示一个占位 | boolean | false | |
| tabList | 页签标题列表 | Array&lt;{key: string, tab: ReactNode}> | - | |
| tabBarExtraContent | tab bar 上额外的元素 | React.ReactNode | 无 | |
| tabBarExtraContent | tab bar 上额外的元素 | React.ReactNode | 无 | 3.23.0 |
| size | card 的尺寸 | `default` \| `small` | `default` | 3.12.0 |
| title | 卡片标题 | string\|ReactNode | - | |
| type | 卡片类型,可设置为 `inner` 或 不设置 | string | - | |

View File

@@ -144,7 +144,7 @@
position: relative;
display: block;
min-width: 32px;
font-size: 14px;
font-size: @font-size-base;
line-height: 22px;
cursor: pointer;

View File

@@ -839,6 +839,7 @@ exports[`Cascader should highlight keyword and filter when search in Cascader 1`
Object {
"__IS_FILTERED_OPTION": true,
"disabled": false,
"isEmptyNode": true,
"label": Array [
"Jiangsu",
Array [
@@ -891,6 +892,7 @@ exports[`Cascader should highlight keyword and filter when search in Cascader 1`
Object {
"__IS_FILTERED_OPTION": true,
"disabled": false,
"isEmptyNode": true,
"label": Array [
"Zhejiang",
Array [
@@ -1025,6 +1027,49 @@ exports[`Cascader should highlight keyword and filter when search in Cascader 1`
</Popup>
`;
exports[`Cascader should highlight keyword and filter when search in Cascader with same field name of label and value 1`] = `
<div>
<div
class="ant-cascader-menus ant-cascader-menus-placement-bottomLeft slide-up-appear"
style="left: -999px; top: -995px;"
>
<div>
<ul
class="ant-cascader-menu"
style="width: 0px;"
>
<li
class="ant-cascader-menu-item"
role="menuitem"
title=""
>
Zhejiang / Hang
<span
class="ant-cascader-menu-item-keyword"
>
z
</span>
hou / West Lake
</li>
<li
class="ant-cascader-menu-item ant-cascader-menu-item-disabled"
role="menuitem"
title=""
>
Zhejiang / Hang
<span
class="ant-cascader-menu-item-keyword"
>
z
</span>
hou / Xia Sha
</li>
</ul>
</div>
</div>
</div>
`;
exports[`Cascader should render not found content 1`] = `
<Popup
action={
@@ -1242,6 +1287,7 @@ exports[`Cascader should render not found content 1`] = `
Array [
Object {
"disabled": true,
"isEmptyNode": true,
"label": <Context.Consumer>
[Function]
</Context.Consumer>,
@@ -1569,6 +1615,7 @@ exports[`Cascader should show not found content when options.length is 0 1`] = `
Array [
Object {
"disabled": true,
"isEmptyNode": true,
"label": <Context.Consumer>
[Function]
</Context.Consumer>,

View File

@@ -205,6 +205,52 @@ describe('Cascader', () => {
expect(popupWrapper).toMatchSnapshot();
});
it('should highlight keyword and filter when search in Cascader with same field name of label and value', () => {
const customOptions = [
{
name: 'Zhejiang',
value: 'Zhejiang',
children: [
{
name: 'Hangzhou',
value: 'Hangzhou',
children: [
{
name: 'West Lake',
value: 'West Lake',
},
{
name: 'Xia Sha',
value: 'Xia Sha',
disabled: true,
},
],
},
],
},
];
function customFilter(inputValue, path) {
return path.some(option => option.name.toLowerCase().indexOf(inputValue.toLowerCase()) > -1);
}
const wrapper = mount(
<Cascader
options={customOptions}
fieldNames={{ label: 'name', value: 'name' }}
showSearch={{ filter: customFilter }}
/>,
);
wrapper.find('input').simulate('click');
wrapper.find('input').simulate('change', { target: { value: 'z' } });
expect(wrapper.state('inputValue')).toBe('z');
const popupWrapper = mount(
wrapper
.find('Trigger')
.instance()
.getComponent(),
);
expect(popupWrapper.render()).toMatchSnapshot();
});
it('should render not found content', () => {
const wrapper = mount(<Cascader options={options} showSearch={{ filter }} />);
wrapper.find('input').simulate('click');

View File

@@ -397,17 +397,19 @@ class Cascader extends React.Component<CascaderProps, CascaderState> {
return {
__IS_FILTERED_OPTION: true,
path,
[names.label]: render(inputValue, path, prefixCls, names),
[names.value]: path.map((o: CascaderOptionType) => o[names.value]),
[names.label]: render(inputValue, path, prefixCls, names),
disabled: path.some((o: CascaderOptionType) => !!o.disabled),
isEmptyNode: true,
} as CascaderOptionType;
});
}
return [
{
[names.label]: notFoundContent || renderEmpty('Cascader'),
[names.value]: 'ANT_CASCADER_NOT_FOUND',
[names.label]: notFoundContent || renderEmpty('Cascader'),
disabled: true,
isEmptyNode: true,
},
];
}
@@ -503,9 +505,10 @@ class Cascader extends React.Component<CascaderProps, CascaderState> {
} else {
options = [
{
[names.label]: notFoundContent || renderEmpty('Cascader'),
[names.value]: 'ANT_CASCADER_NOT_FOUND',
[names.label]: notFoundContent || renderEmpty('Cascader'),
disabled: true,
isEmptyNode: true,
},
];
}
@@ -517,8 +520,7 @@ class Cascader extends React.Component<CascaderProps, CascaderState> {
}
const dropdownMenuColumnStyle: { width?: number; height?: string } = {};
const isNotFound =
(options || []).length === 1 && options[0][names.value] === 'ANT_CASCADER_NOT_FOUND';
const isNotFound = (options || []).length === 1 && options[0].isEmptyNode;
if (isNotFound) {
dropdownMenuColumnStyle.height = 'auto'; // Height of one row.
}

View File

@@ -125,7 +125,7 @@
&-menus {
position: absolute;
z-index: @zindex-dropdown;
font-size: @font-size-base;
font-size: @cascader-dropdown-font-size;
white-space: nowrap;
background: @component-background;
border-radius: @border-radius-base;
@@ -134,7 +134,6 @@
ul,
ol {
margin: 0;
padding: 0;
list-style: none;
}
@@ -165,7 +164,7 @@
min-width: 111px;
height: 180px;
margin: 0;
padding: 0;
padding: @cascader-dropdown-edge-child-vertical-padding 0;
overflow: auto;
vertical-align: top;
list-style: none;
@@ -185,8 +184,8 @@
}
}
&-menu-item {
padding: 5px @control-padding-horizontal;
line-height: 22px;
padding: @cascader-dropdown-vertical-padding @control-padding-horizontal;
line-height: @cascader-dropdown-line-height;
white-space: nowrap;
cursor: pointer;
transition: all 0.3s;

View File

@@ -102,7 +102,7 @@
}
&-borderless {
background-color: @component-background;
background-color: @collapse-header-bg;
border: 0;
}

View File

@@ -445,152 +445,152 @@ exports[`ConfigProvider components Badge configProvider 1`] = `
style="transition:none;-ms-transform:translateY(-1500%);-webkit-transform:translateY(-1500%);transform:translateY(-1500%)"
>
<p
class=""
class="config-scroll-number-only-unit"
>
0
</p>
<p
class=""
class="config-scroll-number-only-unit"
>
1
</p>
<p
class=""
class="config-scroll-number-only-unit"
>
2
</p>
<p
class=""
class="config-scroll-number-only-unit"
>
3
</p>
<p
class=""
class="config-scroll-number-only-unit"
>
4
</p>
<p
class=""
class="config-scroll-number-only-unit"
>
5
</p>
<p
class=""
class="config-scroll-number-only-unit"
>
6
</p>
<p
class=""
class="config-scroll-number-only-unit"
>
7
</p>
<p
class=""
class="config-scroll-number-only-unit"
>
8
</p>
<p
class=""
class="config-scroll-number-only-unit"
>
9
</p>
<p
class=""
class="config-scroll-number-only-unit"
>
0
</p>
<p
class=""
class="config-scroll-number-only-unit"
>
1
</p>
<p
class=""
class="config-scroll-number-only-unit"
>
2
</p>
<p
class=""
class="config-scroll-number-only-unit"
>
3
</p>
<p
class=""
class="config-scroll-number-only-unit"
>
4
</p>
<p
class="current"
class="config-scroll-number-only-unit current"
>
5
</p>
<p
class=""
class="config-scroll-number-only-unit"
>
6
</p>
<p
class=""
class="config-scroll-number-only-unit"
>
7
</p>
<p
class=""
class="config-scroll-number-only-unit"
>
8
</p>
<p
class=""
class="config-scroll-number-only-unit"
>
9
</p>
<p
class=""
class="config-scroll-number-only-unit"
>
0
</p>
<p
class=""
class="config-scroll-number-only-unit"
>
1
</p>
<p
class=""
class="config-scroll-number-only-unit"
>
2
</p>
<p
class=""
class="config-scroll-number-only-unit"
>
3
</p>
<p
class=""
class="config-scroll-number-only-unit"
>
4
</p>
<p
class=""
class="config-scroll-number-only-unit"
>
5
</p>
<p
class=""
class="config-scroll-number-only-unit"
>
6
</p>
<p
class=""
class="config-scroll-number-only-unit"
>
7
</p>
<p
class=""
class="config-scroll-number-only-unit"
>
8
</p>
<p
class=""
class="config-scroll-number-only-unit"
>
9
</p>
@@ -625,152 +625,152 @@ exports[`ConfigProvider components Badge normal 1`] = `
style="transition:none;-ms-transform:translateY(-1500%);-webkit-transform:translateY(-1500%);transform:translateY(-1500%)"
>
<p
class=""
class="ant-scroll-number-only-unit"
>
0
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
1
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
2
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
3
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
4
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
5
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
6
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
7
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
8
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
9
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
0
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
1
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
2
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
3
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
4
</p>
<p
class="current"
class="ant-scroll-number-only-unit current"
>
5
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
6
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
7
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
8
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
9
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
0
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
1
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
2
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
3
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
4
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
5
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
6
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
7
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
8
</p>
<p
class=""
class="ant-scroll-number-only-unit"
>
9
</p>
@@ -805,152 +805,152 @@ exports[`ConfigProvider components Badge prefixCls 1`] = `
style="transition:none;-ms-transform:translateY(-1500%);-webkit-transform:translateY(-1500%);transform:translateY(-1500%)"
>
<p
class=""
class="prefix-scroll-number-only-unit"
>
0
</p>
<p
class=""
class="prefix-scroll-number-only-unit"
>
1
</p>
<p
class=""
class="prefix-scroll-number-only-unit"
>
2
</p>
<p
class=""
class="prefix-scroll-number-only-unit"
>
3
</p>
<p
class=""
class="prefix-scroll-number-only-unit"
>
4
</p>
<p
class=""
class="prefix-scroll-number-only-unit"
>
5
</p>
<p
class=""
class="prefix-scroll-number-only-unit"
>
6
</p>
<p
class=""
class="prefix-scroll-number-only-unit"
>
7
</p>
<p
class=""
class="prefix-scroll-number-only-unit"
>
8
</p>
<p
class=""
class="prefix-scroll-number-only-unit"
>
9
</p>
<p
class=""
class="prefix-scroll-number-only-unit"
>
0
</p>
<p
class=""
class="prefix-scroll-number-only-unit"
>
1
</p>
<p
class=""
class="prefix-scroll-number-only-unit"
>
2
</p>
<p
class=""
class="prefix-scroll-number-only-unit"
>
3
</p>
<p
class=""
class="prefix-scroll-number-only-unit"
>
4
</p>
<p
class="current"
class="prefix-scroll-number-only-unit current"
>
5
</p>
<p
class=""
class="prefix-scroll-number-only-unit"
>
6
</p>
<p
class=""
class="prefix-scroll-number-only-unit"
>
7
</p>
<p
class=""
class="prefix-scroll-number-only-unit"
>
8
</p>
<p
class=""
class="prefix-scroll-number-only-unit"
>
9
</p>
<p
class=""
class="prefix-scroll-number-only-unit"
>
0
</p>
<p
class=""
class="prefix-scroll-number-only-unit"
>
1
</p>
<p
class=""
class="prefix-scroll-number-only-unit"
>
2
</p>
<p
class=""
class="prefix-scroll-number-only-unit"
>
3
</p>
<p
class=""
class="prefix-scroll-number-only-unit"
>
4
</p>
<p
class=""
class="prefix-scroll-number-only-unit"
>
5
</p>
<p
class=""
class="prefix-scroll-number-only-unit"
>
6
</p>
<p
class=""
class="prefix-scroll-number-only-unit"
>
7
</p>
<p
class=""
class="prefix-scroll-number-only-unit"
>
8
</p>
<p
class=""
class="prefix-scroll-number-only-unit"
>
9
</p>
@@ -8153,7 +8153,9 @@ exports[`ConfigProvider components Menu prefixCls 1`] = `
exports[`ConfigProvider components Modal configProvider 1`] = `
<div>
<div>
<div
class="config-modal-root"
>
<div
class="config-modal-mask"
/>
@@ -8245,7 +8247,9 @@ exports[`ConfigProvider components Modal configProvider 1`] = `
exports[`ConfigProvider components Modal normal 1`] = `
<div>
<div>
<div
class="ant-modal-root"
>
<div
class="ant-modal-mask"
/>
@@ -8337,7 +8341,9 @@ exports[`ConfigProvider components Modal normal 1`] = `
exports[`ConfigProvider components Modal prefixCls 1`] = `
<div>
<div>
<div
class="prefix-Modal-root"
>
<div
class="prefix-Modal-mask"
/>
@@ -8611,7 +8617,7 @@ exports[`ConfigProvider components Pagination configProvider 1`] = `
<div
class="config-pagination-options-quick-jumper"
>
Goto
Go to
<input
type="text"
value=""
@@ -8747,7 +8753,7 @@ exports[`ConfigProvider components Pagination configProvider 1`] = `
<div
class="config-pagination-options-quick-jumper"
>
Goto
Go to
<input
type="text"
value=""
@@ -8888,7 +8894,7 @@ exports[`ConfigProvider components Pagination normal 1`] = `
<div
class="ant-pagination-options-quick-jumper"
>
Goto
Go to
<input
type="text"
value=""
@@ -9024,7 +9030,7 @@ exports[`ConfigProvider components Pagination normal 1`] = `
<div
class="ant-pagination-options-quick-jumper"
>
Goto
Go to
<input
type="text"
value=""
@@ -9165,7 +9171,7 @@ exports[`ConfigProvider components Pagination prefixCls 1`] = `
<div
class="prefix-Pagination-options-quick-jumper"
>
Goto
Go to
<input
type="text"
value=""
@@ -9301,7 +9307,7 @@ exports[`ConfigProvider components Pagination prefixCls 1`] = `
<div
class="prefix-Pagination-options-quick-jumper"
>
Goto
Go to
<input
type="text"
value=""
@@ -11598,7 +11604,7 @@ exports[`ConfigProvider components Table configProvider 1`] = `
>
<tr>
<th
class="config-table-column-has-actions config-table-column-has-filters config-table-column-has-sorters"
class="config-table-column-has-actions config-table-column-has-filters config-table-column-has-sorters config-table-row-cell-last"
>
<span
class="config-table-header-column"
@@ -11844,7 +11850,7 @@ exports[`ConfigProvider components Table normal 1`] = `
>
<tr>
<th
class="ant-table-column-has-actions ant-table-column-has-filters ant-table-column-has-sorters"
class="ant-table-column-has-actions ant-table-column-has-filters ant-table-column-has-sorters ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -12090,7 +12096,7 @@ exports[`ConfigProvider components Table prefixCls 1`] = `
>
<tr>
<th
class="prefix-Table-column-has-actions prefix-Table-column-has-filters prefix-Table-column-has-sorters"
class="prefix-Table-column-has-actions prefix-Table-column-has-filters prefix-Table-column-has-sorters prefix-Table-row-cell-last"
>
<span
class="prefix-Table-header-column"
@@ -12745,7 +12751,6 @@ Array [
>
<input
class="config-time-picker-input"
id=""
placeholder="Select time"
type="text"
value=""
@@ -13836,7 +13841,6 @@ Array [
>
<input
class="ant-time-picker-input"
id=""
placeholder="Select time"
type="text"
value=""
@@ -14927,7 +14931,6 @@ Array [
>
<input
class="prefix-TimePicker-input"
id=""
placeholder="Select time"
type="text"
value=""

View File

@@ -50,3 +50,23 @@ Some components use dynamic style to support wave effect. You can config `csp` p
#### Does the locale problem still exist in DatePicker even if ConfigProvider `locale` is used?
Please make sure you set moment locale by `moment.locale('zh-cn')` or that you don't have two different versions of moment.
#### Modal throw error when setting `getPopupContainer`?
Related issue: https://github.com/ant-design/ant-design/issues/19974
When you config `getPopupContainer` to parentNode globally, Modal will throw error of `triggerNode is undefined` because it did not have a triggerNode. You can try the [fix](https://github.com/afc163/feedback-antd/commit/3e4d1ad1bc1a38460dc3bf3c56517f737fe7d44a) below.
```diff
<ConfigProvider
- getPopupContainer={triggerNode => triggerNode.parentNode}
+ getPopupContainer={node => {
+ if (node) {
+ return node.parentNode;
+ }
+ return document.body;
+ }}
>
<App />
</ConfigProvider>
```

View File

@@ -51,3 +51,23 @@ return (
#### 为什么我使用了 ConfigProvider `locale`,时间类组件的国际化还有问题?
请检查是否设置了 `moment.locale('zh-cn')`,或者是否有两个版本的 moment 共存。
#### 配置 `getPopupContainer` 导致 Modal 报错?
相关 issuehttps://github.com/ant-design/ant-design/issues/19974
当如下全局设置 `getPopupContainer` 为触发节点的 parentNode 时,由于 Modal 的用法不存在 `triggerNode`,这样会导致 `triggerNode is undefined` 的报错,需要增加一个[判断条件](https://github.com/afc163/feedback-antd/commit/3e4d1ad1bc1a38460dc3bf3c56517f737fe7d44a)。
```diff
<ConfigProvider
- getPopupContainer={triggerNode => triggerNode.parentNode}
+ getPopupContainer={node => {
+ if (node) {
+ return node.parentNode;
+ }
+ return document.body;
+ }}
>
<App />
</ConfigProvider>
```

View File

@@ -31,7 +31,7 @@ function getShowDateFromValue(value: RangePickerValue, mode?: string | string[])
if (mode && mode[0] === 'month') {
return [start, end] as RangePickerValue;
}
const newEnd = end && end.isSame(start, 'month') ? end.clone().add(1, 'month') : end;
const newEnd = end && end.isSame(start!, 'month') ? end.clone().add(1, 'month') : end;
return [start, newEnd] as RangePickerValue;
}
@@ -162,7 +162,7 @@ class RangePicker extends React.Component<RangePickerProps, RangePickerState> {
showDate: getShowDateFromValue(value) || showDate,
}));
}
if (value[0] && value[0].diff(value[1]) > 0) {
if (value[0] && value[1] && value[0].diff(value[1]) > 0) {
value[1] = undefined;
}
const [start, end] = value;

View File

@@ -127,7 +127,7 @@ The following APIs are shared by DatePicker, MonthPicker, RangePicker, WeekPicke
| 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](#components-date-picker-demo-disabled-date) | [moment](http://momentjs.com/)\[] | \[moment(), moment()] | |
| value | to set date | \[[moment](http://momentjs.com/), [moment](http://momentjs.com/)] | - | |
| onCalendarChange | a callback function, can be executed when the start time or the end time of the range is changing | function(dates: \[moment, moment], dateStrings: \[string, string]) | - | 3.10.9 |
| onCalendarChange | a callback function, can be executed when the start time or the end time of the range is changing | function(dates: \[moment, moment]) | - | 3.0.0 |
| onChange | a callback function, can be executed when the selected time is changing | function(dates: \[moment, moment], dateStrings: \[string, string]) | - | |
| onOk | callback when click ok button | function(dates: [moment](http://momentjs.com/)\[]) | - | |

View File

@@ -129,7 +129,7 @@ moment.locale('zh-cn');
| showTime | 增加时间选择功能 | Object\|boolean | [TimePicker Options](/components/time-picker/#API) | |
| showTime.defaultValue | 设置用户选择日期时默认的时分秒,[例子](#components-date-picker-demo-disabled-date) | [moment](http://momentjs.com/)\[] | \[moment(), moment()] | |
| value | 日期 | [moment](http://momentjs.com/)\[] | 无 | |
| onCalendarChange | 待选日期发生变化的回调 | function(dates: \[moment, moment\], dateStrings: \[string, string\]) | 无 | |
| onCalendarChange | 待选日期发生变化的回调 | function(dates: \[moment, moment\]) | 无 | 3.0.0 |
| onChange | 日期范围发生变化的回调 | function(dates: \[moment, moment\], dateStrings: \[string, string\]) | 无 | |
| onOk | 点击确定按钮的回调 | function(dates: [moment](http://momentjs.com/)\[]) | - | |

View File

@@ -23,7 +23,7 @@ export interface PickerProps {
getCalendarContainer?: (triggerNode: Element) => HTMLElement;
open?: boolean;
onOpenChange?: (status: boolean) => void;
disabledDate?: (current: moment.Moment | undefined) => boolean;
disabledDate?: (current: moment.Moment | null) => boolean;
dateRender?: (current: moment.Moment, today: moment.Moment) => React.ReactNode;
autoFocus?: boolean;
onFocus?: React.FocusEventHandler;
@@ -31,9 +31,9 @@ export interface PickerProps {
}
export interface SinglePickerProps {
value?: moment.Moment;
defaultValue?: moment.Moment;
defaultPickerValue?: moment.Moment;
value?: moment.Moment | null;
defaultValue?: moment.Moment | null;
defaultPickerValue?: moment.Moment | null;
placeholder?: string;
renderExtraFooter?: (mode: DatePickerMode) => React.ReactNode;
onChange?: (date: moment.Moment | null, dateString: string) => void;
@@ -47,15 +47,15 @@ export interface DatePickerProps extends PickerProps, SinglePickerProps {
showToday?: boolean;
open?: boolean;
disabledTime?: (
current: moment.Moment | undefined,
current?: moment.Moment | null,
) => {
disabledHours?: () => number[];
disabledMinutes?: () => number[];
disabledSeconds?: () => number[];
};
onOpenChange?: (status: boolean) => void;
onPanelChange?: (value: moment.Moment | undefined, mode: DatePickerMode) => void;
onOk?: (selectedTime: moment.Moment) => void;
onPanelChange?: (value: moment.Moment | null, mode: DatePickerMode) => void;
onOk?: (selectedTime: moment.Moment | null) => void;
mode?: DatePickerMode;
}
@@ -65,9 +65,12 @@ export interface MonthPickerProps extends PickerProps, SinglePickerProps {
export type RangePickerValue =
| undefined[]
| null[]
| [moment.Moment]
| [undefined, moment.Moment]
| [moment.Moment, undefined]
| [null, moment.Moment]
| [moment.Moment, null]
| [moment.Moment, moment.Moment];
export type RangePickerPresetRange = RangePickerValue | (() => RangePickerValue);
@@ -90,7 +93,7 @@ export interface RangePickerProps extends PickerProps {
mode?: string | string[];
separator?: React.ReactNode;
disabledTime?: (
current: moment.Moment | undefined,
current: RangePickerValue,
type: string,
) => {
disabledHours?: () => number[];

View File

@@ -14,7 +14,7 @@ const Col: React.SFC<ColProps> = props => {
const { child, bordered, colon, type, layout } = props;
const { prefixCls, label, className, children, span = 1 } = child.props;
const labelProps: any = {
className: classNames(`${prefixCls}-item-label`, className, {
className: classNames(`${prefixCls}-item-label`, {
[`${prefixCls}-item-colon`]: colon,
[`${prefixCls}-item-no-label`]: !label,
}),

View File

@@ -192,7 +192,7 @@ exports[`Descriptions Descriptions.Item support className 1`] = `
colSpan={1}
>
<span
className="ant-descriptions-item-label my-class ant-descriptions-item-colon"
className="ant-descriptions-item-label ant-descriptions-item-colon"
key="label"
>
Product

View File

@@ -1,7 +1,7 @@
---
category: Components
type: Data Display
title: Description List
title: Descriptions
cols: 1
---

View File

@@ -29,12 +29,12 @@ exports[`renders ./components/dropdown/demo/basic.md correctly 1`] = `
`;
exports[`renders ./components/dropdown/demo/context-menu.md correctly 1`] = `
<span
<div
class="ant-dropdown-trigger"
style="user-select:none"
style="text-align:center;background:#f7f7f7;height:200px;line-height:200px;color:#777"
>
Right Click on Me
</span>
Right Click on here
</div>
`;
exports[`renders ./components/dropdown/demo/dropdown-button.md correctly 1`] = `

View File

@@ -26,7 +26,17 @@ const menu = (
ReactDOM.render(
<Dropdown overlay={menu} trigger={['contextMenu']}>
<span style={{ userSelect: 'none' }}>Right Click on Me</span>
<div
style={{
textAlign: 'center',
background: '#f7f7f7',
height: 200,
lineHeight: '200px',
color: '#777',
}}
>
Right Click on here
</div>
</Dropdown>,
mountNode,
);

View File

@@ -49,7 +49,7 @@
&-menu {
position: relative;
margin: 0;
padding: 4px 0;
padding: @dropdown-edge-child-vertical-padding 0;
text-align: left;
list-style-type: none;
background-color: @component-background;
@@ -113,6 +113,18 @@
transition: all 0.3s;
}
&:first-child {
& when (@dropdown-edge-child-vertical-padding = 0) {
border-radius: @border-radius-base @border-radius-base 0 0;
}
}
&:last-child {
& when (@dropdown-edge-child-vertical-padding = 0) {
border-radius: 0 0 @border-radius-base @border-radius-base;
}
}
&-selected,
&-selected > a {
color: @dropdown-selected-color;

View File

@@ -513,7 +513,7 @@ exports[`renders ./components/empty/demo/config-provider.md correctly 1`] = `
</span>
</th>
<th
class=""
class="ant-table-row-cell-last"
>
<span
class="ant-table-header-column"

View File

@@ -29,7 +29,7 @@ export interface FormCreateOption<T> {
}
const FormLayouts = tuple('horizontal', 'inline', 'vertical');
export type FormLayout = (typeof FormLayouts)[number];
export type FormLayout = typeof FormLayouts[number];
export interface FormProps extends React.FormHTMLAttributes<HTMLFormElement> {
layout?: FormLayout;
@@ -51,11 +51,28 @@ export interface FormProps extends React.FormHTMLAttributes<HTMLFormElement> {
labelAlign?: FormLabelAlign;
}
export type ValidationRuleType =
| 'string'
| 'number'
| 'boolean'
| 'method'
| 'regexp'
| 'integer'
| 'float'
| 'array'
| 'object'
| 'enum'
| 'date'
| 'url'
| 'hex'
| 'email'
| 'any';
export type ValidationRule = {
/** validation error message */
message?: React.ReactNode;
/** built-in validation type, available options: https://github.com/yiminghe/async-validator#type */
type?: string;
type?: ValidationRuleType;
/** indicates whether field is required */
required?: boolean;
/** treat required fields that only contain whitespace as errors */
@@ -67,7 +84,7 @@ export type ValidationRule = {
/** validate the max length of a field */
max?: number;
/** validate the value from a list of possible values */
enum?: string | string[];
enum?: (string | number | boolean)[];
/** validate from a regular expression */
pattern?: RegExp;
/** transform a value before validation */

View File

@@ -4608,7 +4608,6 @@ exports[`renders ./components/form/demo/validate-static.md correctly 1`] = `
>
<input
class="ant-time-picker-input"
id=""
placeholder="Select time"
type="text"
value=""
@@ -5134,6 +5133,242 @@ exports[`renders ./components/form/demo/validate-static.md correctly 1`] = `
</div>
</div>
</div>
<div
class="ant-row ant-form-item"
>
<div
class="ant-col ant-form-item-label ant-col-xs-24 ant-col-sm-5"
>
<label
class=""
title="Success"
>
Success
</label>
</div>
<div
class="ant-col ant-form-item-control-wrapper ant-col-xs-24 ant-col-sm-12"
>
<div
class="ant-form-item-control has-feedback has-success"
>
<span
class="ant-form-item-children"
>
<span
class="ant-input-affix-wrapper"
>
<input
class="ant-input"
placeholder="with allowClear"
type="text"
value=""
/>
<span
class="ant-input-suffix"
/>
</span>
<span
class="ant-form-item-children-icon"
>
<i
aria-label="icon: check-circle"
class="anticon anticon-check-circle"
>
<svg
aria-hidden="true"
class=""
data-icon="check-circle"
fill="currentColor"
focusable="false"
height="1em"
viewBox="64 64 896 896"
width="1em"
>
<path
d="M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm193.5 301.7l-210.6 292a31.8 31.8 0 0 1-51.7 0L318.5 484.9c-3.8-5.3 0-12.7 6.5-12.7h46.9c10.2 0 19.9 4.9 25.9 13.3l71.2 98.8 157.2-218c6-8.3 15.6-13.3 25.9-13.3H699c6.5 0 10.3 7.4 6.5 12.7z"
/>
</svg>
</i>
</span>
</span>
</div>
</div>
</div>
<div
class="ant-row ant-form-item"
>
<div
class="ant-col ant-form-item-label ant-col-xs-24 ant-col-sm-5"
>
<label
class=""
title="Warning"
>
Warning
</label>
</div>
<div
class="ant-col ant-form-item-control-wrapper ant-col-xs-24 ant-col-sm-12"
>
<div
class="ant-form-item-control has-feedback has-warning"
>
<span
class="ant-form-item-children"
>
<span
class="ant-input-password ant-input-affix-wrapper"
>
<input
action="click"
class="ant-input"
placeholder="with input password"
type="password"
value=""
/>
<span
class="ant-input-suffix"
>
<i
aria-label="icon: eye-invisible"
class="anticon anticon-eye-invisible ant-input-password-icon"
tabindex="-1"
>
<svg
aria-hidden="true"
class=""
data-icon="eye-invisible"
fill="currentColor"
focusable="false"
height="1em"
viewBox="64 64 896 896"
width="1em"
>
<path
d="M942.2 486.2Q889.47 375.11 816.7 305l-50.88 50.88C807.31 395.53 843.45 447.4 874.7 512 791.5 684.2 673.4 766 512 766q-72.67 0-133.87-22.38L323 798.75Q408 838 512 838q288.3 0 430.2-300.3a60.29 60.29 0 0 0 0-51.5zm-63.57-320.64L836 122.88a8 8 0 0 0-11.32 0L715.31 232.2Q624.86 186 512 186q-288.3 0-430.2 300.3a60.3 60.3 0 0 0 0 51.5q56.69 119.4 136.5 191.41L112.48 835a8 8 0 0 0 0 11.31L155.17 889a8 8 0 0 0 11.31 0l712.15-712.12a8 8 0 0 0 0-11.32zM149.3 512C232.6 339.8 350.7 258 512 258c54.54 0 104.13 9.36 149.12 28.39l-70.3 70.3a176 176 0 0 0-238.13 238.13l-83.42 83.42C223.1 637.49 183.3 582.28 149.3 512zm246.7 0a112.11 112.11 0 0 1 146.2-106.69L401.31 546.2A112 112 0 0 1 396 512z"
/>
<path
d="M508 624c-3.46 0-6.87-.16-10.25-.47l-52.82 52.82a176.09 176.09 0 0 0 227.42-227.42l-52.82 52.82c.31 3.38.47 6.79.47 10.25a111.94 111.94 0 0 1-112 112z"
/>
</svg>
</i>
</span>
</span>
<span
class="ant-form-item-children-icon"
>
<i
aria-label="icon: exclamation-circle"
class="anticon anticon-exclamation-circle"
>
<svg
aria-hidden="true"
class=""
data-icon="exclamation-circle"
fill="currentColor"
focusable="false"
height="1em"
viewBox="64 64 896 896"
width="1em"
>
<path
d="M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm-32 232c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v272c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V296zm32 440a48.01 48.01 0 0 1 0-96 48.01 48.01 0 0 1 0 96z"
/>
</svg>
</i>
</span>
</span>
</div>
</div>
</div>
<div
class="ant-row ant-form-item"
>
<div
class="ant-col ant-form-item-label ant-col-xs-24 ant-col-sm-5"
>
<label
class=""
title="Error"
>
Error
</label>
</div>
<div
class="ant-col ant-form-item-control-wrapper ant-col-xs-24 ant-col-sm-12"
>
<div
class="ant-form-item-control has-feedback has-error"
>
<span
class="ant-form-item-children"
>
<span
class="ant-input-password ant-input-affix-wrapper"
>
<input
action="click"
class="ant-input"
placeholder="with input password and allowClear"
type="password"
value=""
/>
<span
class="ant-input-suffix"
>
<i
aria-label="icon: eye-invisible"
class="anticon anticon-eye-invisible ant-input-password-icon"
tabindex="-1"
>
<svg
aria-hidden="true"
class=""
data-icon="eye-invisible"
fill="currentColor"
focusable="false"
height="1em"
viewBox="64 64 896 896"
width="1em"
>
<path
d="M942.2 486.2Q889.47 375.11 816.7 305l-50.88 50.88C807.31 395.53 843.45 447.4 874.7 512 791.5 684.2 673.4 766 512 766q-72.67 0-133.87-22.38L323 798.75Q408 838 512 838q288.3 0 430.2-300.3a60.29 60.29 0 0 0 0-51.5zm-63.57-320.64L836 122.88a8 8 0 0 0-11.32 0L715.31 232.2Q624.86 186 512 186q-288.3 0-430.2 300.3a60.3 60.3 0 0 0 0 51.5q56.69 119.4 136.5 191.41L112.48 835a8 8 0 0 0 0 11.31L155.17 889a8 8 0 0 0 11.31 0l712.15-712.12a8 8 0 0 0 0-11.32zM149.3 512C232.6 339.8 350.7 258 512 258c54.54 0 104.13 9.36 149.12 28.39l-70.3 70.3a176 176 0 0 0-238.13 238.13l-83.42 83.42C223.1 637.49 183.3 582.28 149.3 512zm246.7 0a112.11 112.11 0 0 1 146.2-106.69L401.31 546.2A112 112 0 0 1 396 512z"
/>
<path
d="M508 624c-3.46 0-6.87-.16-10.25-.47l-52.82 52.82a176.09 176.09 0 0 0 227.42-227.42l-52.82 52.82c.31 3.38.47 6.79.47 10.25a111.94 111.94 0 0 1-112 112z"
/>
</svg>
</i>
</span>
</span>
<span
class="ant-form-item-children-icon"
>
<i
aria-label="icon: close-circle"
class="anticon anticon-close-circle"
>
<svg
aria-hidden="true"
class=""
data-icon="close-circle"
fill="currentColor"
focusable="false"
height="1em"
viewBox="64 64 896 896"
width="1em"
>
<path
d="M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm165.4 618.2l-66-.3L512 563.4l-99.3 118.4-66.1.3c-4.4 0-8-3.5-8-8 0-1.9.7-3.7 1.9-5.2l130.1-155L340.5 359a8.32 8.32 0 0 1-1.9-5.2c0-4.4 3.6-8 8-8l66.1.3L512 464.6l99.3-118.4 66-.3c4.4 0 8 3.5 8 8 0 1.9-.7 3.7-1.9 5.2L553.5 514l130 155c1.2 1.5 1.9 3.3 1.9 5.2 0 4.4-3.6 8-8 8z"
/>
</svg>
</i>
</span>
</span>
</div>
</div>
</div>
</form>
`;

View File

@@ -3,6 +3,7 @@ import React from 'react';
import { mount, render } from 'enzyme';
import Form from '..';
import mountTest from '../../../tests/shared/mountTest';
import './type.test';
describe('Form', () => {
mountTest(Form);

View File

@@ -1,7 +1,14 @@
/* tslint:disable */
/* eslint-disable */
import * as React from 'react';
import Form, { FormComponentProps, FormCreateOption } from '../Form';
describe('Form TypeScript test', async () => {
it('empty test case placeholder to avoid jest error', () => {
// empty
});
});
// test Form.create on component without own props
class WithoutOwnProps extends React.Component<any, any> {
state = {

View File

@@ -31,69 +31,41 @@ import { Form, Input, Select, Button } from 'antd';
const { Option } = Select;
class PriceInput extends React.Component {
static getDerivedStateFromProps(nextProps) {
// Should be a controlled component.
if ('value' in nextProps) {
return {
...(nextProps.value || {}),
};
}
return null;
}
constructor(props) {
super(props);
const value = props.value || {};
this.state = {
number: value.number || 0,
currency: value.currency || 'rmb',
};
}
handleNumberChange = e => {
const number = parseInt(e.target.value || 0, 10);
if (isNaN(number)) {
return;
}
if (!('value' in this.props)) {
this.setState({ number });
}
this.triggerChange({ number });
};
handleCurrencyChange = currency => {
if (!('value' in this.props)) {
this.setState({ currency });
}
this.triggerChange({ currency });
};
triggerChange = changedValue => {
// Should provide an event to pass value to Form.
const { onChange } = this.props;
const { onChange, value } = this.props;
if (onChange) {
onChange({
...this.state,
...value,
...changedValue,
});
}
};
render() {
const { size } = this.props;
const { currency, number } = this.state;
const { size, value } = this.props;
return (
<span>
<Input
type="text"
size={size}
value={number}
value={value.number}
onChange={this.handleNumberChange}
style={{ width: '65%', marginRight: '3%' }}
/>
<Select
value={currency}
value={value.currency}
size={size}
style={{ width: '32%' }}
onChange={this.handleCurrencyChange}
@@ -118,8 +90,7 @@ class Demo extends React.Component {
checkPrice = (rule, value, callback) => {
if (value.number > 0) {
callback();
return;
return callback();
}
callback('Price must greater than zero!');
};

View File

@@ -22,7 +22,7 @@ function hasErrors(fieldsError) {
class HorizontalLoginForm extends React.Component {
componentDidMount() {
// To disabled submit button at the beginning.
// To disable submit button at the beginning.
this.props.form.validateFields();
}

View File

@@ -119,6 +119,18 @@ ReactDOM.render(
<Form.Item label="Success" hasFeedback validateStatus="success">
<InputNumber style={{ width: '100%' }} />
</Form.Item>
<Form.Item label="Success" hasFeedback validateStatus="success">
<Input allowClear placeholder="with allowClear" />
</Form.Item>
<Form.Item label="Warning" hasFeedback validateStatus="warning">
<Input.Password placeholder="with input password" />
</Form.Item>
<Form.Item label="Error" hasFeedback validateStatus="error">
<Input.Password allowClear placeholder="with input password and allowClear" />
</Form.Item>
</Form>,
mountNode,
);

View File

@@ -210,7 +210,7 @@ Note: if Form.Item has multiple children that had been decorated by `getFieldDec
| Property | Description | Type | Default Value | Version |
| --- | --- | --- | --- | --- |
| enum | validate a value from a list of possible values | string | - | |
| enum | validate a value from a list of possible values | string[] | - | |
| len | validate an exact length of a field | number | - | |
| max | validate a max length of a field | number | - | |
| message | validation error message | string\|ReactNode | - | |

View File

@@ -212,7 +212,7 @@ validateFields(['field1', 'field2'], options, (errors, values) => {
| 参数 | 说明 | 类型 | 默认值 | 版本 |
| --- | --- | --- | --- | --- |
| enum | 枚举类型 | string | - | |
| enum | 枚举类型 | string[] | - | |
| len | 字段长度 | number | - | |
| max | 最大长度 | number | - | |
| message | 校验文案 | string\|ReactNode | - | |

View File

@@ -137,16 +137,22 @@
form {
.has-feedback {
.@{ant-prefix}-input {
padding-right: 24px;
padding-right: @input-padding-horizontal-base + @input-affix-width;
}
// https://github.com/ant-design/ant-design/issues/19884
.@{ant-prefix}-input-affix-wrapper .@{ant-prefix}-input-suffix {
padding-right: 18px;
}
.@{ant-prefix}-input-password-icon {
margin-right: 18px;
.@{ant-prefix}-input-affix-wrapper {
.@{ant-prefix}-input-suffix {
padding-right: 18px;
}
.@{ant-prefix}-input {
padding-right: @input-padding-horizontal-base + @input-affix-width * 2;
}
&.@{ant-prefix}-input-affix-wrapper-input-with-clear-btn {
.@{ant-prefix}-input {
padding-right: @input-padding-horizontal-base + @input-affix-width * 3;
}
}
}
// Fix overlapping between feedback icon and <Select>'s arrow.
@@ -157,7 +163,7 @@ form {
:not(.@{ant-prefix}-input-group-addon)
> .@{ant-prefix}-select
.@{ant-prefix}-select-selection__clear {
right: 28px;
right: (@form-component-height / 2) + @form-feedback-icon-size - 2px;
}
> .@{ant-prefix}-select .@{ant-prefix}-select-selection-selected-value,
:not(.@{ant-prefix}-input-group-addon)
@@ -168,17 +174,17 @@ form {
.@{ant-prefix}-cascader-picker {
&-arrow {
margin-right: 17px;
margin-right: (@form-component-height / 2) + @form-feedback-icon-size - 13px;
}
&-clear {
right: 28px;
right: (@form-component-height / 2) + @form-feedback-icon-size - 2px;
}
}
// Fix issue: https://github.com/ant-design/ant-design/issues/7854
.@{ant-prefix}-input-search:not(.@{ant-prefix}-input-search-enter-button) {
.@{ant-prefix}-input-suffix {
right: 28px;
right: (@form-component-height / 2) + @form-feedback-icon-size - 2px;
}
}
@@ -187,7 +193,7 @@ form {
.@{ant-prefix}-time-picker {
&-icon,
&-clear {
right: 28px;
right: (@form-component-height / 2) + @form-feedback-icon-size - 2px;
}
}
}
@@ -256,11 +262,18 @@ form {
// fix input with addon position. https://github.com/ant-design/ant-design/issues/8243
:not(.@{ant-prefix}-input-group-wrapper) > .@{ant-prefix}-input-group,
.@{ant-prefix}-input-group-wrapper {
position: relative;
top: -1px;
display: inline-block;
vertical-align: middle;
}
// https://github.com/ant-design/ant-design/issues/20616
&:not(.@{form-prefix-cls}-vertical) {
:not(.@{ant-prefix}-input-group-wrapper) > .@{ant-prefix}-input-group,
.@{ant-prefix}-input-group-wrapper {
position: relative;
top: -1px;
}
}
}
// Form layout
@@ -453,8 +466,13 @@ form {
}
}
.@{ant-prefix}-cascader-picker:focus .@{ant-prefix}-cascader-input {
.active(@warning-color);
.@{ant-prefix}-cascader-picker {
&:focus .@{ant-prefix}-cascader-input {
.active(@warning-color);
}
&:hover .@{ant-prefix}-cascader-input {
border-color: @warning-color;
}
}
}
@@ -527,8 +545,13 @@ form {
}
}
.@{ant-prefix}-cascader-picker:focus .@{ant-prefix}-cascader-input {
.active(@error-color);
.@{ant-prefix}-cascader-picker {
&:focus .@{ant-prefix}-cascader-input {
.active(@error-color);
}
&:hover .@{ant-prefix}-cascader-input {
border-color: @error-color;
}
}
// transfer

View File

View File

@@ -0,0 +1,12 @@
/* eslint-disable */
import React from 'react';
import Icon from '..';
import { ReactComponent as logo } from './logo.svg';
describe('Icon TypeScript test', () => {
it('empty test case placeholder to avoid jest error', () => {
// empty
});
});
<Icon component={logo} />;

View File

@@ -67,7 +67,7 @@ export interface IconProps {
title?: string;
onKeyUp?: React.KeyboardEventHandler<HTMLElement>;
onClick?: React.MouseEventHandler<HTMLElement>;
component?: React.ComponentType<CustomIconComponentProps>;
component?: React.ComponentType<CustomIconComponentProps | React.SVGProps<SVGSVGElement>>;
twoToneColor?: string;
viewBox?: string;
spin?: boolean;

View File

@@ -17,7 +17,7 @@ export const InputSizes = tuple('small', 'default', 'large');
export interface InputProps
extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'prefix'> {
prefixCls?: string;
size?: (typeof InputSizes)[number];
size?: typeof InputSizes[number];
onPressEnter?: React.KeyboardEventHandler<HTMLInputElement>;
addonBefore?: React.ReactNode;
addonAfter?: React.ReactNode;
@@ -61,7 +61,7 @@ export function resolveOnChange(
export function getInputClassName(
prefixCls: string,
size?: (typeof InputSizes)[number],
size?: typeof InputSizes[number],
disabled?: boolean,
) {
return classNames(prefixCls, {
@@ -114,6 +114,8 @@ class Input extends React.Component<InputProps, InputState> {
clearableInput: ClearableLabeledInput;
removePasswordTimeout: number;
constructor(props: InputProps) {
super(props);
const value = typeof props.value === 'undefined' ? props.defaultValue : props.value;
@@ -131,6 +133,10 @@ class Input extends React.Component<InputProps, InputState> {
return null;
}
componentDidMount() {
this.clearPasswordValueAttribute();
}
// Since polyfill `getSnapshotBeforeUpdate` need work with `componentDidUpdate`.
// We keep an empty function here.
componentDidUpdate() {}
@@ -146,6 +152,12 @@ class Input extends React.Component<InputProps, InputState> {
return null;
}
componentWillUnmount() {
if (this.removePasswordTimeout) {
clearTimeout(this.removePasswordTimeout);
}
}
focus() {
this.input.focus();
}
@@ -209,8 +221,21 @@ class Input extends React.Component<InputProps, InputState> {
);
};
clearPasswordValueAttribute = () => {
// https://github.com/ant-design/ant-design/issues/20541
this.removePasswordTimeout = setTimeout(() => {
if (
this.input &&
this.input.getAttribute('type') === 'password' &&
this.input.hasAttribute('value')
) {
this.input.removeAttribute('value');
}
});
};
handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
this.setValue(e.target.value);
this.setValue(e.target.value, this.clearPasswordValueAttribute);
resolveOnChange(this.input, e, this.props.onChange);
};

View File

@@ -33,7 +33,7 @@ export default class Password extends React.Component<PasswordProps, PasswordSta
visible: false,
};
onChange = () => {
onVisibleChange = () => {
const { disabled } = this.props;
if (disabled) {
return;
@@ -46,7 +46,7 @@ export default class Password extends React.Component<PasswordProps, PasswordSta
const { prefixCls, action } = this.props;
const iconTrigger = ActionMap[action!] || '';
const iconProps = {
[iconTrigger]: this.onChange,
[iconTrigger]: this.onVisibleChange,
className: `${prefixCls}-icon`,
type: this.state.visible ? 'eye' : 'eye-invisible',
key: 'passwordIcon',

View File

@@ -1,5 +1,6 @@
import * as React from 'react';
import classNames from 'classnames';
import { isMobile } from 'is-mobile';
import Input, { InputProps } from './Input';
import Icon from '../icon';
import Button from '../button';
@@ -47,7 +48,10 @@ export default class Search extends React.Component<SearchProps, any> {
if (onSearch) {
onSearch(this.input.input.value, e);
}
this.input.focus();
if (!isMobile({ tablet: true })) {
this.input.focus();
}
};
focus() {

View File

@@ -4,6 +4,7 @@ import { mount } from 'enzyme';
import Input from '..';
import focusTest from '../../../tests/shared/focusTest';
import mountTest from '../../../tests/shared/mountTest';
import { sleep } from '../../../tests/utils';
describe('Input.Password', () => {
focusTest(Input.Password);
@@ -70,4 +71,46 @@ describe('Input.Password', () => {
.getDOMNode(),
);
});
// https://github.com/ant-design/ant-design/issues/20541
it('should not show value attribute in input element', async () => {
const wrapper = mount(<Input.Password />);
wrapper
.find('input')
.at('0')
.simulate('change', { target: { value: 'value' } });
await sleep();
expect(
wrapper
.find('input')
.at('0')
.getDOMNode()
.getAttribute('value'),
).toBeFalsy();
});
// https://github.com/ant-design/ant-design/issues/20541
it('could be unmount without errors', () => {
expect(() => {
const wrapper = mount(<Input.Password />);
wrapper
.find('input')
.at('0')
.simulate('change', { target: { value: 'value' } });
wrapper.unmount();
}).not.toThrow();
});
// https://github.com/ant-design/ant-design/pull/20544#issuecomment-569861679
it('should not contain value attribute in input element with defautValue', async () => {
const wrapper = mount(<Input.Password defaultValue="value" />);
await sleep();
expect(
wrapper
.find('input')
.at('0')
.getDOMNode()
.getAttribute('value'),
).toBeFalsy();
});
});

View File

@@ -421,7 +421,6 @@ exports[`renders ./components/input/demo/align.md correctly 1`] = `
>
<input
class="ant-time-picker-input"
id=""
placeholder="Select time"
type="text"
value=""

View File

@@ -35,7 +35,7 @@ function formatNumber(value) {
class NumericInput extends React.Component {
onChange = e => {
const { value } = e.target;
const reg = /^-?(0|[1-9][0-9]*)(\.[0-9]*)?$/;
const reg = /^-?[0-9]*(\.[0-9]*)?$/;
if ((!isNaN(value) && reg.test(value)) || value === '' || value === '-') {
this.props.onChange(value);
}
@@ -44,9 +44,11 @@ class NumericInput extends React.Component {
// '.' at the end or only '-' in the input box.
onBlur = () => {
const { value, onBlur, onChange } = this.props;
let valueTemp = value;
if (value.charAt(value.length - 1) === '.' || value === '-') {
onChange(value.slice(0, -1));
valueTemp = value.slice(0, -1);
}
onChange(valueTemp.replace(/0*(\d+)/, '$1'));
if (onBlur) {
onBlur();
}

View File

@@ -7,6 +7,7 @@ import { ConfigConsumer, ConfigConsumerProps } from '../config-provider';
export interface GeneratorProps {
suffixCls: string;
tagName: 'header' | 'footer' | 'main' | 'section';
displayName: string;
}
export interface BasicProps extends React.HTMLAttributes<HTMLDivElement> {
prefixCls?: string;
@@ -30,9 +31,11 @@ interface BasicPropsWithTagName extends BasicProps {
tagName: 'header' | 'footer' | 'main' | 'section';
}
function generator({ suffixCls, tagName }: GeneratorProps) {
function generator({ suffixCls, tagName, displayName }: GeneratorProps) {
return (BasicComponent: any) => {
return class Adapter extends React.Component<BasicProps, any> {
static displayName: string = displayName;
static Header: any;
static Footer: any;
@@ -108,21 +111,25 @@ const Layout: React.ComponentClass<BasicProps> & {
} = generator({
suffixCls: 'layout',
tagName: 'section',
displayName: 'Layout',
})(BasicLayout);
const Header = generator({
suffixCls: 'layout-header',
tagName: 'header',
displayName: 'Header',
})(Basic);
const Footer = generator({
suffixCls: 'layout-footer',
tagName: 'footer',
displayName: 'Footer',
})(Basic);
const Content = generator({
suffixCls: 'layout-content',
tagName: 'main',
displayName: 'Content',
})(Basic);
Layout.Header = Header;

View File

@@ -72,7 +72,7 @@ export default class Item extends React.Component<ListItemProps, any> {
context: any;
isItemContainsTextNode() {
isItemContainsTextNodeAndNotSingular() {
const { children } = this.props;
let result;
React.Children.forEach(children, (element: React.ReactElement<any>) => {
@@ -80,7 +80,7 @@ export default class Item extends React.Component<ListItemProps, any> {
result = true;
}
});
return result;
return result && React.Children.count(children) > 1;
}
isFlexMode() {
@@ -89,7 +89,7 @@ export default class Item extends React.Component<ListItemProps, any> {
if (itemLayout === 'vertical') {
return !!extra;
}
return !this.isItemContainsTextNode();
return !this.isItemContainsTextNodeAndNotSingular();
}
renderItem = ({ getPrefixCls }: ConfigConsumerProps) => {

View File

@@ -763,27 +763,27 @@ exports[`renders ./components/list/demo/simple.md correctly 1`] = `
class="ant-list-items"
>
<li
class="ant-list-item ant-list-item-no-flex"
class="ant-list-item"
>
Racing car sprays burning fuel into crowd.
</li>
<li
class="ant-list-item ant-list-item-no-flex"
class="ant-list-item"
>
Japanese princess to wed commoner.
</li>
<li
class="ant-list-item ant-list-item-no-flex"
class="ant-list-item"
>
Australian walks 100km after outback crash.
</li>
<li
class="ant-list-item ant-list-item-no-flex"
class="ant-list-item"
>
Man charged over missing wedding girl.
</li>
<li
class="ant-list-item ant-list-item-no-flex"
class="ant-list-item"
>
Los Angeles battles huge wildfires.
</li>
@@ -823,27 +823,27 @@ exports[`renders ./components/list/demo/simple.md correctly 1`] = `
class="ant-list-items"
>
<li
class="ant-list-item ant-list-item-no-flex"
class="ant-list-item"
>
Racing car sprays burning fuel into crowd.
</li>
<li
class="ant-list-item ant-list-item-no-flex"
class="ant-list-item"
>
Japanese princess to wed commoner.
</li>
<li
class="ant-list-item ant-list-item-no-flex"
class="ant-list-item"
>
Australian walks 100km after outback crash.
</li>
<li
class="ant-list-item ant-list-item-no-flex"
class="ant-list-item"
>
Man charged over missing wedding girl.
</li>
<li
class="ant-list-item ant-list-item-no-flex"
class="ant-list-item"
>
Los Angeles battles huge wildfires.
</li>

View File

@@ -15,6 +15,11 @@
&-pagination {
margin-top: 24px;
text-align: right;
// https://github.com/ant-design/ant-design/issues/20037
.@{ant-prefix}-pagination-options {
text-align: left;
}
}
&-more {
@@ -47,6 +52,7 @@
&-item {
display: flex;
align-items: center;
justify-content: space-between;
padding: @list-item-padding;
&-content {

View File

@@ -327,7 +327,6 @@ exports[`renders ./components/locale-provider/demo/all.md correctly 1`] = `
>
<input
class="ant-time-picker-input"
id=""
placeholder="Select time"
type="text"
value=""
@@ -1862,7 +1861,7 @@ exports[`renders ./components/locale-provider/demo/all.md correctly 1`] = `
</i>
</th>
<th
class=""
class="ant-table-row-cell-last"
>
<span
class="ant-table-header-column"

View File

@@ -189,4 +189,8 @@ describe('message', () => {
jest.advanceTimersByTime(1500);
expect(document.querySelectorAll('.ant-message-notice').length).toBe(0);
});
it('should not throw error when pass null', () => {
message.error(null);
});
});

View File

@@ -114,7 +114,10 @@ type JointContent = ConfigContent | ArgsProps;
export type ConfigOnClose = () => void;
function isArgsProps(content: JointContent): content is ArgsProps {
return typeof content === 'object' && !!(content as ArgsProps).content;
return (
Object.prototype.toString.call(content) === '[object Object]' &&
!!(content as ArgsProps).content
);
}
export interface ConfigOptions {

View File

@@ -1,14 +1,14 @@
import * as React from 'react';
import * as ReactDOM from 'react-dom';
import Button from '../button';
import { ButtonType, NativeButtonProps } from '../button/button';
import { ButtonType, ButtonProps } from '../button/button';
export interface ActionButtonProps {
type?: ButtonType;
actionFn?: (...args: any[]) => any | PromiseLike<any>;
closeModal: Function;
autoFocus?: boolean;
buttonProps?: NativeButtonProps;
buttonProps?: ButtonProps;
}
export interface ActionButtonState {

View File

@@ -6,7 +6,7 @@ import addEventListener from 'rc-util/lib/Dom/addEventListener';
import { getConfirmLocale } from './locale';
import Icon from '../icon';
import Button from '../button';
import { ButtonType, NativeButtonProps } from '../button/button';
import { ButtonType, ButtonProps } from '../button/button';
import LocaleReceiver from '../locale-provider/LocaleReceiver';
import { ConfigConsumer, ConfigConsumerProps } from '../config-provider';
@@ -60,8 +60,8 @@ export interface ModalProps {
maskClosable?: boolean;
/** 强制渲染 Modal */
forceRender?: boolean;
okButtonProps?: NativeButtonProps;
cancelButtonProps?: NativeButtonProps;
okButtonProps?: ButtonProps;
cancelButtonProps?: ButtonProps;
destroyOnClose?: boolean;
style?: React.CSSProperties;
wrapClassName?: string;
@@ -90,8 +90,8 @@ export interface ModalFuncProps {
// TODO: find out exact types
onOk?: (...args: any[]) => any;
onCancel?: (...args: any[]) => any;
okButtonProps?: NativeButtonProps;
cancelButtonProps?: NativeButtonProps;
okButtonProps?: ButtonProps;
cancelButtonProps?: ButtonProps;
centered?: boolean;
width?: string | number;
iconClassName?: string;

View File

@@ -4,7 +4,9 @@ exports[`Modal render correctly 1`] = `
<div>
<div>
<div>
<div>
<div
class="ant-modal-root"
>
<div
class="ant-modal-mask fade-appear"
/>
@@ -100,7 +102,9 @@ exports[`Modal render without footer 1`] = `
<div>
<div>
<div>
<div>
<div
class="ant-modal-root"
>
<div
class="ant-modal-mask fade-appear"
/>
@@ -171,7 +175,9 @@ exports[`Modal render without footer 1`] = `
`;
exports[`Modal support closeIcon 1`] = `
<div>
<div
class="ant-modal-root"
>
<div
class="ant-modal-mask fade-appear"
/>

View File

@@ -64,7 +64,7 @@ The items listed above are all functions, expecting a settings object as paramet
| centered | Centered Modal | Boolean | `false` | 3.8.0 |
| className | className of container | string | - | 3.1.1 |
| content | Content | string\|ReactNode | - | |
| icon | custom icon (`Added in 3.12.0`) | string\|ReactNode | `<Icon type="question-circle">` | 3.12.0 |
| icon | custom icon (`Added in 3.12.0`) | string\|ReactNode | `<Icon type="question-circle" />` | 3.12.0 |
| iconType | Icon `type` of the Icon component (deprecated after `3.12.0`) | string | `question-circle` | |
| keyboard | Whether support press esc to close | Boolean | true | 3.4.2 |
| mask | Whether show mask or not. | Boolean | true | 3.13.0 |

View File

@@ -68,7 +68,7 @@ title: Modal
| centered | 垂直居中展示 Modal | Boolean | `false` | 3.8.2 |
| className | 容器类名 | string | - | 3.1.1 |
| content | 内容 | string\|ReactNode | 无 | |
| icon | 自定义图标3.12.0 新增) | string\|ReactNode | `<Icon type="question-circle">` | 3.12.0 |
| icon | 自定义图标3.12.0 新增) | string\|ReactNode | `<Icon type="question-circle" />` | 3.12.0 |
| iconType | 图标类型3.12.0 后废弃,请使用 `icon` | string | `question-circle` | |
| mask | 是否展示遮罩 | Boolean | true | 3.13.0 |
| maskClosable | 点击蒙层是否允许关闭 | Boolean | `false` | |

View File

@@ -938,7 +938,7 @@ exports[`renders ./components/pagination/demo/jump.md correctly 1`] = `
<div
class="ant-pagination-options-quick-jumper"
>
Goto
Go to
<input
type="text"
value=""
@@ -1109,7 +1109,7 @@ exports[`renders ./components/pagination/demo/jump.md correctly 1`] = `
<div
class="ant-pagination-options-quick-jumper"
>
Goto
Go to
<input
disabled=""
type="text"
@@ -1397,7 +1397,7 @@ exports[`renders ./components/pagination/demo/mini.md correctly 1`] = `
<div
class="ant-pagination-options-quick-jumper"
>
Goto
Go to
<input
type="text"
value=""

View File

@@ -11,7 +11,6 @@
.reset-component;
display: inline-block;
line-height: unset;
}
// 一般状态

View File

@@ -92,6 +92,7 @@ export interface OptionProps {
disabled?: boolean;
value?: string | number;
title?: string;
label?: React.ReactNode;
children?: React.ReactNode;
className?: string;
style?: React.CSSProperties;

View File

@@ -469,6 +469,7 @@
&-menu {
max-height: 250px;
margin-bottom: 0;
padding: @select-dropdown-edge-child-vertical-padding 0; //Change
padding-left: 0; // Override default ul/ol
overflow: auto;
list-style: none;
@@ -499,11 +500,12 @@
&-item {
position: relative;
display: block;
padding: 5px @control-padding-horizontal;
padding: @select-dropdown-vertical-padding @control-padding-horizontal;
overflow: hidden;
color: @text-color;
font-weight: normal;
line-height: 22px;
font-size: @select-dropdown-font-size;
line-height: @select-dropdown-line-height;
white-space: nowrap;
text-overflow: ellipsis;
cursor: pointer;
@@ -514,11 +516,15 @@
}
&:first-child {
border-radius: @border-radius-base @border-radius-base 0 0;
& when (@select-dropdown-edge-child-vertical-padding = 0) {
border-radius: @border-radius-base @border-radius-base 0 0;
}
}
&:last-child {
border-radius: 0 0 @border-radius-base @border-radius-base;
& when (@select-dropdown-edge-child-vertical-padding = 0) {
border-radius: 0 0 @border-radius-base @border-radius-base;
}
}
&-selected {

View File

@@ -15,7 +15,7 @@ When part of the page is waiting for asynchronous data or during a rendering pro
| Property | Description | Type | Default Value | Version |
| --- | --- | --- | --- | --- |
| delay | specifies a delay in milliseconds for loading state (prevent flush) | number (milliseconds) | - | |
| indicator | React node of the spinning indicator | ReactElement | - | |
| indicator | React node of the spinning indicator | ReactNode | - | |
| size | size of Spin, options: `small`, `default` and `large` | string | `default` | |
| spinning | whether Spin is spinning | boolean | true | |
| tip | customize description content when Spin has children | string | - | |
@@ -23,5 +23,6 @@ When part of the page is waiting for asynchronous data or during a rendering pro
### Static Method
- `Spin.setDefaultIndicator(indicator: ReactElement)`
As `indicator`, you can define the global default spin element
- `Spin.setDefaultIndicator(indicator: ReactNode)`
You can define default spin element globally.

View File

@@ -16,7 +16,7 @@ subtitle: 加载中
| 参数 | 说明 | 类型 | 默认值 | 版本 |
| --- | --- | --- | --- | --- |
| delay | 延迟显示加载效果的时间(防止闪烁) | number (毫秒) | - | |
| indicator | 加载指示符 | ReactElement | - | |
| indicator | 加载指示符 | ReactNode | - | |
| size | 组件大小,可选值为 `small` `default` `large` | string | 'default' | |
| spinning | 是否为加载中状态 | boolean | true | |
| tip | 当作为包裹元素时,可以自定义描述文案 | string | - | |
@@ -24,5 +24,6 @@ subtitle: 加载中
### 静态方法
- `Spin.setDefaultIndicator(indicator: ReactElement)`
同上 `indicator`,你可以自定义全局默认元素
- `Spin.setDefaultIndicator(indicator: ReactNode)`
你可以自定义全局默认 Spin 的元素。

View File

@@ -28,7 +28,7 @@
@steps-dot-size: 8px;
@steps-current-dot-size: 10px;
@steps-desciption-max-width: 140px;
@steps-nav-content-max-width: @steps-desciption-max-width;
@steps-nav-content-max-width: auto;
.@{steps-prefix-cls} {
.reset-component;

View File

@@ -2,19 +2,18 @@
.@{steps-prefix-cls}-item {
overflow: visible;
&-tail {
margin-left: 51px;
margin-left: 58px;
padding: 3.5px 24px;
}
&-content {
display: block;
// icon左边距离+一半icon宽度是content一半的宽度垂直对齐icon
width: (@steps-icon-size / 2 + 36px) * 2;
width: (@steps-icon-size / 2 + 42px) * 2;
margin-top: 8px;
text-align: center;
}
&-icon {
display: inline-block;
margin-left: 36px;
margin-left: 42px;
}
&-title {
padding-right: 0;
@@ -22,11 +21,17 @@
display: none;
}
}
&-subtitle {
display: block;
margin-bottom: 4px;
margin-left: 0;
line-height: @line-height-base;
}
}
&.@{steps-prefix-cls}-small:not(.@{steps-prefix-cls}-dot) {
.@{steps-prefix-cls}-item {
&-icon {
margin-left: 40px;
margin-left: 47px;
}
}
}

View File

@@ -89,3 +89,36 @@
width: 100%;
}
}
@media (max-width: @screen-xs) {
.@{steps-prefix-cls}-navigation {
> .@{steps-prefix-cls}-item {
margin-right: 0 !important;
&::before {
display: none;
}
&.@{steps-prefix-cls}-item-active::before {
top: 0;
right: 0;
left: unset;
display: block;
width: 3px;
height: calc(100% - 24px);
}
&::after {
position: relative;
top: -2px;
left: 50%;
display: block;
width: 8px;
height: 8px;
margin-bottom: 8px;
text-align: center;
transform: rotate(135deg);
}
> .@{steps-prefix-cls}-item-container > .@{steps-prefix-cls}-item-tail {
visibility: hidden;
}
}
}
}

View File

@@ -265,10 +265,10 @@
@layout-trigger-color-light: @text-color;
// z-index list, order by `z-index`
@zindex-badge: auto;
@zindex-table-fixed: auto;
@zindex-affix: 10;
@zindex-back-top: 10;
@zindex-badge: 10;
@zindex-picker-panel: 10;
@zindex-popup-close: 10;
@zindex-modal: 1000;
@@ -290,6 +290,7 @@
//Dropdown
@dropdown-vertical-padding: 5px;
@dropdown-edge-child-vertical-padding: 4px;
@dropdown-font-size: @font-size-base;
@dropdown-line-height: 22px;
@@ -337,10 +338,21 @@
@select-border-color: @border-color-base;
@select-item-selected-font-weight: 600;
@select-dropdown-bg: @component-background;
@select-dropdown-vertical-padding: @dropdown-vertical-padding;
@select-dropdown-edge-child-vertical-padding: @dropdown-edge-child-vertical-padding;
@select-dropdown-font-size: @dropdown-font-size;
@select-dropdown-line-height: @dropdown-line-height;
@select-item-selected-bg: @background-color-light;
@select-item-active-bg: @item-active-bg;
@select-background: @component-background;
// Cascader
// ----
@cascader-dropdown-vertical-padding: @dropdown-vertical-padding;
@cascader-dropdown-edge-child-vertical-padding: @dropdown-edge-child-vertical-padding;
@cascader-dropdown-font-size: @dropdown-font-size;
@cascader-dropdown-line-height: @dropdown-line-height;
// Anchor
// ---
@anchor-border-color: @border-color-split;

View File

@@ -868,7 +868,6 @@ class Table<T> extends React.Component<InternalTableProps<T>, TableState<T>> {
};
toggleSortOrder(column: ColumnProps<T>) {
const pagination = { ...this.state.pagination };
const sortDirections = column.sortDirections || (this.props.sortDirections as SortOrder[]);
const { sortOrder, sortColumn } = this.state;
// 只同时允许一列进行排序,否则会导致排序顺序的逻辑问题
@@ -883,14 +882,7 @@ class Table<T> extends React.Component<InternalTableProps<T>, TableState<T>> {
newSortOrder = sortDirections[0];
}
if (this.props.pagination) {
// Reset current prop
pagination.current = 1;
pagination.onChange!(pagination.current);
}
const newState = {
pagination,
sortOrder: newSortOrder,
sortColumn: newSortOrder ? column : null,
};

View File

@@ -3,6 +3,7 @@ import React from 'react';
import { render, mount } from 'enzyme';
import Table from '..';
import Input from '../../input';
import Tooltip from '../../tooltip';
import Button from '../../button';
import ConfigProvider from '../../config-provider';
@@ -655,6 +656,40 @@ describe('Table.filter', () => {
expect(wrapper.find('.ant-table-filter-icon').render()).toMatchSnapshot();
});
it('renders custom filter icon as string correctly', () => {
const filterIcon = () => 'string';
const wrapper = mount(
createTable({
columns: [
{
...column,
filterIcon,
},
],
}),
);
expect(wrapper.render()).toMatchSnapshot();
});
it('renders custom filter icon with right Tooltip title', () => {
const filterIcon = () => (
<Tooltip title="title" visible>
Tooltip
</Tooltip>
);
const wrapper = mount(
createTable({
columns: [
{
...column,
filterIcon,
},
],
}),
);
expect(wrapper.render()).toMatchSnapshot();
});
// https://github.com/ant-design/ant-design/issues/13028
it('reset dropdown filter correctly', () => {
class Demo extends React.Component {

View File

@@ -613,6 +613,7 @@ describe('Table.sorter', () => {
createTable({
pagination: {
pageSize: 2,
defaultCurrent: 2,
onChange: onPageChange,
},
onChange,
@@ -620,8 +621,8 @@ describe('Table.sorter', () => {
);
wrapper.find('.ant-table-column-sorters').simulate('click');
expect(onChange.mock.calls[0][0].current).toBe(1);
expect(onPageChange.mock.calls[0][0]).toBe(1);
expect(onChange.mock.calls[0][0].current).toBe(2);
expect(onPageChange).not.toHaveBeenCalled();
});
it('should support onHeaderCell in sort column', () => {

View File

@@ -30,7 +30,7 @@ exports[`Table.expand click to expand 1`] = `
>
<tr>
<th
class=""
class="ant-table-row-cell-last"
>
<span
class="ant-table-header-column"

View File

@@ -44,6 +44,113 @@ exports[`Table.filter renders custom content correctly 1`] = `
</div>
`;
exports[`Table.filter renders custom filter icon as string correctly 1`] = `
<div
class="ant-table-wrapper"
>
<div
class="ant-spin-nested-loading"
>
<div
class="ant-spin-container"
>
<div
class="ant-table ant-table-default ant-table-scroll-position-left"
>
<div
class="ant-table-content"
>
<div
class="ant-table-body"
>
<table
class=""
>
<colgroup>
<col />
</colgroup>
<thead
class="ant-table-thead"
>
<tr>
<th
class="ant-table-column-has-actions ant-table-column-has-filters ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
>
<div>
<span
class="ant-table-column-title"
>
Name
</span>
<span
class="ant-table-column-sorter"
/>
</div>
</span>
<span
class="ant-table-filter-icon ant-dropdown-trigger"
>
string
</span>
</th>
</tr>
</thead>
<tbody
class="ant-table-tbody"
>
<tr
class="ant-table-row ant-table-row-level-0"
data-row-key="0"
>
<td
class="ant-table-column-has-actions ant-table-column-has-filters"
>
Jack
</td>
</tr>
<tr
class="ant-table-row ant-table-row-level-0"
data-row-key="1"
>
<td
class="ant-table-column-has-actions ant-table-column-has-filters"
>
Lucy
</td>
</tr>
<tr
class="ant-table-row ant-table-row-level-0"
data-row-key="2"
>
<td
class="ant-table-column-has-actions ant-table-column-has-filters"
>
Tom
</td>
</tr>
<tr
class="ant-table-row ant-table-row-level-0"
data-row-key="3"
>
<td
class="ant-table-column-has-actions ant-table-column-has-filters"
>
Jerry
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
`;
exports[`Table.filter renders custom filter icon correctly 1`] = `
<span
class="ant-table-filter-icon ant-table-filter-selected ant-dropdown-trigger"
@@ -64,6 +171,134 @@ exports[`Table.filter renders custom filter icon correctly 2`] = `
</span>
`;
exports[`Table.filter renders custom filter icon with right Tooltip title 1`] = `
<div
class="ant-table-wrapper"
>
<div
class="ant-spin-nested-loading"
>
<div
class="ant-spin-container"
>
<div
class="ant-table ant-table-default ant-table-scroll-position-left"
>
<div
class="ant-table-content"
>
<div
class="ant-table-body"
>
<table
class=""
>
<colgroup>
<col />
</colgroup>
<thead
class="ant-table-thead"
>
<tr>
<th
class="ant-table-column-has-actions ant-table-column-has-filters ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
>
<div>
<span
class="ant-table-column-title"
>
Name
</span>
<span
class="ant-table-column-sorter"
/>
</div>
</span>
<span
class="ant-tooltip-open ant-table-filter-icon ant-dropdown-trigger"
style=""
>
Tooltip
</span>
<div>
<div
class="ant-tooltip ant-tooltip-placement-top zoom-big-fast-appear"
style="left: -999px; top: -1003px; transform-origin: 50% 4px;"
>
<div
class="ant-tooltip-content"
>
<div
class="ant-tooltip-arrow"
/>
<div
class="ant-tooltip-inner"
role="tooltip"
>
title
</div>
</div>
</div>
</div>
</th>
</tr>
</thead>
<tbody
class="ant-table-tbody"
>
<tr
class="ant-table-row ant-table-row-level-0"
data-row-key="0"
>
<td
class="ant-table-column-has-actions ant-table-column-has-filters"
>
Jack
</td>
</tr>
<tr
class="ant-table-row ant-table-row-level-0"
data-row-key="1"
>
<td
class="ant-table-column-has-actions ant-table-column-has-filters"
>
Lucy
</td>
</tr>
<tr
class="ant-table-row ant-table-row-level-0"
data-row-key="2"
>
<td
class="ant-table-column-has-actions ant-table-column-has-filters"
>
Tom
</td>
</tr>
<tr
class="ant-table-row ant-table-row-level-0"
data-row-key="3"
>
<td
class="ant-table-column-has-actions ant-table-column-has-filters"
>
Jerry
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
`;
exports[`Table.filter renders filter correctly 1`] = `
<div
class="ant-table-wrapper"
@@ -94,7 +329,7 @@ exports[`Table.filter renders filter correctly 1`] = `
>
<tr>
<th
class="ant-table-column-has-actions ant-table-column-has-filters"
class="ant-table-column-has-actions ant-table-column-has-filters ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -407,7 +642,7 @@ exports[`Table.filter should support getPopupContainer 1`] = `
>
<tr>
<th
class="ant-table-column-has-actions ant-table-column-has-filters"
class="ant-table-column-has-actions ant-table-column-has-filters ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -626,7 +861,7 @@ exports[`Table.filter should support getPopupContainer from ConfigProvider 1`] =
>
<tr>
<th
class="ant-table-column-has-actions ant-table-column-has-filters"
class="ant-table-column-has-actions ant-table-column-has-filters ant-table-row-cell-last"
>
<span
class="ant-table-header-column"

View File

@@ -30,7 +30,7 @@ exports[`Table.pagination Accepts pagination as true 1`] = `
>
<tr>
<th
class=""
class="ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -204,7 +204,7 @@ exports[`Table.pagination renders pagination correctly 1`] = `
>
<tr>
<th
class=""
class="ant-table-row-cell-last"
>
<span
class="ant-table-header-column"

View File

@@ -72,7 +72,7 @@ exports[`Table.rowSelection fix selection column on the left 1`] = `
</span>
</th>
<th
class=""
class="ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -245,7 +245,7 @@ exports[`Table.rowSelection fix selection column on the left 1`] = `
>
<tr>
<th
class="ant-table-selection-column"
class="ant-table-selection-column ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -545,7 +545,7 @@ exports[`Table.rowSelection fix selection column on the left when any other colu
</span>
</th>
<th
class="ant-table-fixed-columns-in-body"
class="ant-table-fixed-columns-in-body ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -755,7 +755,7 @@ exports[`Table.rowSelection fix selection column on the left when any other colu
</span>
</th>
<th
class=""
class="ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -1048,7 +1048,7 @@ exports[`Table.rowSelection use column as selection column when key is \`selecti
>
<tr>
<th
class="ant-table-selection-column"
class="ant-table-selection-column ant-table-row-cell-last"
>
<span
class="ant-table-header-column"

View File

@@ -6,7 +6,7 @@ exports[`Table.sorter renders sorter icon correctly 1`] = `
>
<tr>
<th
class="ant-table-column-has-actions ant-table-column-has-sorters"
class="ant-table-column-has-actions ant-table-column-has-sorters ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -103,7 +103,7 @@ exports[`Table.sorter should support defaultOrder in Column 1`] = `
>
<tr>
<th
class="ant-table-column-has-actions ant-table-column-has-sorters ant-table-column-sort"
class="ant-table-column-has-actions ant-table-column-has-sorters ant-table-column-sort ant-table-row-cell-last"
>
<span
class="ant-table-header-column"

View File

@@ -51,7 +51,7 @@ exports[`Table renders JSX correctly 1`] = `
</span>
</th>
<th
class=""
class="ant-table-row-cell-last"
rowspan="2"
>
<span

View File

@@ -139,7 +139,7 @@ exports[`renders ./components/table/demo/ajax.md correctly 1`] = `
</i>
</th>
<th
class=""
class="ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -325,7 +325,7 @@ exports[`renders ./components/table/demo/basic.md correctly 1`] = `
</span>
</th>
<th
class=""
class="ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -659,7 +659,7 @@ exports[`renders ./components/table/demo/bordered.md correctly 1`] = `
</span>
</th>
<th
class=""
class="ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -923,7 +923,7 @@ exports[`renders ./components/table/demo/colspan-rowspan.md correctly 1`] = `
</span>
</th>
<th
class=""
class="ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -1278,7 +1278,7 @@ exports[`renders ./components/table/demo/custom-filter-panel.md correctly 1`] =
</i>
</th>
<th
class="ant-table-column-has-actions ant-table-column-has-filters"
class="ant-table-column-has-actions ant-table-column-has-filters ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -1551,7 +1551,7 @@ exports[`renders ./components/table/demo/drag-sorting.md correctly 1`] = `
</span>
</th>
<th
class=""
class="ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -2489,7 +2489,7 @@ exports[`renders ./components/table/demo/dynamic-settings.md correctly 1`] = `
</span>
</th>
<th
class=""
class="ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -3668,7 +3668,7 @@ exports[`renders ./components/table/demo/edit-cell.md correctly 1`] = `
</span>
</th>
<th
class=""
class="ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -3930,7 +3930,7 @@ exports[`renders ./components/table/demo/edit-row.md correctly 1`] = `
</span>
</th>
<th
class=""
class="ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -4517,7 +4517,7 @@ exports[`renders ./components/table/demo/ellipsis.md correctly 1`] = `
</span>
</th>
<th
class="ant-table-row-cell-ellipsis"
class="ant-table-row-cell-ellipsis ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -4839,7 +4839,7 @@ exports[`renders ./components/table/demo/expand.md correctly 1`] = `
</span>
</th>
<th
class=""
class="ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -5165,7 +5165,7 @@ exports[`renders ./components/table/demo/expand-children.md correctly 1`] = `
</span>
</th>
<th
class="ant-table-row-cell-break-word"
class="ant-table-row-cell-break-word ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -5600,7 +5600,7 @@ exports[`renders ./components/table/demo/fixed-columns.md correctly 1`] = `
</span>
</th>
<th
class="ant-table-fixed-columns-in-body ant-table-row-cell-break-word"
class="ant-table-fixed-columns-in-body ant-table-row-cell-break-word ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -5794,7 +5794,7 @@ exports[`renders ./components/table/demo/fixed-columns.md correctly 1`] = `
</span>
</th>
<th
class="ant-table-row-cell-break-word"
class="ant-table-row-cell-break-word ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -5874,7 +5874,7 @@ exports[`renders ./components/table/demo/fixed-columns.md correctly 1`] = `
>
<tr>
<th
class="ant-table-row-cell-break-word"
class="ant-table-row-cell-break-word ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -6248,7 +6248,7 @@ exports[`renders ./components/table/demo/fixed-columns-header.md correctly 1`] =
</span>
</th>
<th
class="ant-table-fixed-columns-in-body ant-table-row-cell-break-word"
class="ant-table-fixed-columns-in-body ant-table-row-cell-break-word ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -6978,7 +6978,7 @@ exports[`renders ./components/table/demo/fixed-columns-header.md correctly 1`] =
</span>
</th>
<th
class="ant-table-row-cell-break-word"
class="ant-table-row-cell-break-word ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -7195,7 +7195,7 @@ exports[`renders ./components/table/demo/fixed-columns-header.md correctly 1`] =
>
<tr>
<th
class="ant-table-row-cell-break-word"
class="ant-table-row-cell-break-word ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -7598,7 +7598,7 @@ exports[`renders ./components/table/demo/fixed-header.md correctly 1`] = `
</span>
</th>
<th
class=""
class="ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -8865,7 +8865,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
</span>
</th>
<th
class="ant-table-fixed-columns-in-body ant-table-row-cell-break-word"
class="ant-table-fixed-columns-in-body ant-table-row-cell-break-word ant-table-row-cell-last"
rowspan="4"
>
<span
@@ -9598,7 +9598,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
>
<tr>
<th
class="ant-table-column-has-actions ant-table-column-has-filters ant-table-row-cell-break-word"
class="ant-table-column-has-actions ant-table-column-has-filters ant-table-row-cell-break-word ant-table-row-cell-last"
rowspan="4"
>
<span
@@ -9784,7 +9784,7 @@ exports[`renders ./components/table/demo/grouping-columns.md correctly 1`] = `
>
<tr>
<th
class="ant-table-row-cell-break-word"
class="ant-table-row-cell-break-word ant-table-row-cell-last"
rowspan="4"
>
<span
@@ -10255,7 +10255,7 @@ exports[`renders ./components/table/demo/head.md correctly 1`] = `
</span>
</th>
<th
class="ant-table-column-has-actions ant-table-column-has-filters ant-table-column-has-sorters"
class="ant-table-column-has-actions ant-table-column-has-filters ant-table-column-has-sorters ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -10617,7 +10617,7 @@ exports[`renders ./components/table/demo/jsx.md correctly 1`] = `
</span>
</th>
<th
class=""
class="ant-table-row-cell-last"
rowspan="2"
>
<span
@@ -11078,7 +11078,7 @@ exports[`renders ./components/table/demo/nested-table.md correctly 1`] = `
</span>
</th>
<th
class=""
class="ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -11548,7 +11548,7 @@ exports[`renders ./components/table/demo/reset-filter.md correctly 1`] = `
</span>
</th>
<th
class="ant-table-column-has-actions ant-table-column-has-filters ant-table-column-has-sorters ant-table-row-cell-ellipsis"
class="ant-table-column-has-actions ant-table-column-has-filters ant-table-column-has-sorters ant-table-row-cell-ellipsis ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -11938,7 +11938,7 @@ exports[`renders ./components/table/demo/resizable-column.md correctly 1`] = `
/>
</th>
<th
class=""
class="ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -12245,7 +12245,7 @@ exports[`renders ./components/table/demo/row-selection.md correctly 1`] = `
</span>
</th>
<th
class=""
class="ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -12650,7 +12650,7 @@ exports[`renders ./components/table/demo/row-selection-and-operation.md correctl
</span>
</th>
<th
class=""
class="ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -13332,7 +13332,7 @@ exports[`renders ./components/table/demo/row-selection-custom.md correctly 1`] =
</span>
</th>
<th
class=""
class="ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -13955,7 +13955,7 @@ exports[`renders ./components/table/demo/size.md correctly 1`] = `
</span>
</th>
<th
class=""
class="ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -14187,7 +14187,7 @@ exports[`renders ./components/table/demo/size.md correctly 1`] = `
</span>
</th>
<th
class=""
class="ant-table-row-cell-last"
>
<span
class="ant-table-header-column"

View File

@@ -163,7 +163,7 @@ exports[`Table renders empty table 1`] = `
</span>
</th>
<th
class=""
class="ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -406,7 +406,7 @@ exports[`Table renders empty table with custom emptyText 1`] = `
</span>
</th>
<th
class=""
class="ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -671,7 +671,7 @@ exports[`Table renders empty table with fixed columns 1`] = `
</span>
</th>
<th
class="ant-table-fixed-columns-in-body ant-table-row-cell-break-word"
class="ant-table-fixed-columns-in-body ant-table-row-cell-break-word ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -789,7 +789,7 @@ exports[`Table renders empty table with fixed columns 1`] = `
</span>
</th>
<th
class="ant-table-row-cell-break-word"
class="ant-table-row-cell-break-word ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -838,7 +838,7 @@ exports[`Table renders empty table with fixed columns 1`] = `
>
<tr>
<th
class="ant-table-row-cell-break-word"
class="ant-table-row-cell-break-word ant-table-row-cell-last"
>
<span
class="ant-table-header-column"
@@ -1056,7 +1056,7 @@ exports[`Table renders empty table without emptyText when loading 1`] = `
</span>
</th>
<th
class=""
class="ant-table-row-cell-last"
>
<span
class="ant-table-header-column"

View File

@@ -90,24 +90,25 @@ class App extends React.Component {
setTimeout(() => this.searchInput.select());
}
},
render: text => (
(this.state.searchedColumn === dataIndex) ?
<Highlighter
highlightStyle={{ backgroundColor: '#ffc069', padding: 0 }}
searchWords={[this.state.searchText]}
autoEscape
textToHighlight={text.toString()}
/>
: text
),
render: text =>
this.state.searchedColumn === dataIndex ? (
<Highlighter
highlightStyle={{ backgroundColor: '#ffc069', padding: 0 }}
searchWords={[this.state.searchText]}
autoEscape
textToHighlight={text.toString()}
/>
) : (
text
),
});
handleSearch = (selectedKeys, confirm, dataIndex) => {
confirm();
this.setState({
this.setState({
searchText: selectedKeys[0],
searchedColumn: dataIndex,
});
});
};
handleReset = clearFilters => {

View File

@@ -19,7 +19,7 @@ title:
Use `filters` to generate filter menu in columns, `onFilter` to determine filtered result, and `filterMultiple` to indicate whether it's multiple or single selection.
Uses `defaultFilterValues` to make a column filtered by default.
Uses `defaultFilteredValue` to make a column filtered by default.
Use `sorter` to make a column sortable. `sorter` can be a function of the type `function(a, b) { ... }` for sorting data locally.
@@ -60,7 +60,6 @@ const columns = [
],
},
],
defaultFilterValues: ['Jim'],
// specify the condition of filtering result
// here is that finding the name started with `value`
onFilter: (value, record) => record.name.indexOf(value) === 0,

View File

@@ -200,7 +200,7 @@ class FilterMenu<T> extends React.Component<FilterMenuProps<T>, FilterMenuState<
renderFilterIcon = () => {
const { column, locale, prefixCls, selectedKeys } = this.props;
const filtered = selectedKeys && selectedKeys.length > 0;
let filterIcon = column.filterIcon as any;
let filterIcon = column.filterIcon;
if (typeof filterIcon === 'function') {
filterIcon = filterIcon(filtered);
}
@@ -210,21 +210,27 @@ class FilterMenu<T> extends React.Component<FilterMenuProps<T>, FilterMenuState<
[`${prefixCls}-open`]: this.getDropdownVisible(),
});
return filterIcon ? (
React.cloneElement(filterIcon as any, {
title: locale.filterTitle,
if (!filterIcon) {
return (
<Icon
title={locale.filterTitle}
type="filter"
theme="filled"
className={dropdownIconClass}
onClick={stopPropagation}
/>
);
}
if (React.isValidElement(filterIcon)) {
return React.cloneElement(filterIcon, {
title: filterIcon.props.title || locale.filterTitle,
className: classNames(`${prefixCls}-icon`, dropdownIconClass, filterIcon.props.className),
onClick: stopPropagation,
})
) : (
<Icon
title={locale.filterTitle}
type="filter"
theme="filled"
className={dropdownIconClass}
onClick={stopPropagation}
/>
);
});
}
return <span className={classNames(`${prefixCls}-icon`, dropdownIconClass)}>{filterIcon}</span>;
};
renderMenuItem(item: ColumnFilterItem) {

View File

@@ -190,7 +190,7 @@ export interface TableProps<T> {
onExpand?: (expanded: boolean, record: T) => void;
onChange?: (
pagination: PaginationConfig,
filters: Record<keyof T, string[]>,
filters: Partial<Record<keyof T, string[]>>,
sorter: SorterResult<T>,
extra: TableCurrentDataSource<T>,
) => void;

View File

@@ -49,7 +49,7 @@
border-bottom: @border-width-base @border-style-base @border-color-split;
transition: background 0.3s ease;
&[colspan] {
&[colspan]:not([colspan='1']) {
text-align: center;
}
@@ -623,7 +623,10 @@
// https://github.com/ant-design/ant-design/issues/14545
// https://github.com/ant-design/ant-design/issues/19491
.@{table-prefix-cls}-fixed-columns-in-body:not([colspan]) {
visibility: hidden;
color: transparent;
& > * {
visibility: hidden;
}
}
}
}
@@ -660,7 +663,12 @@
// https://stackoverflow.com/a/54101063
// https://github.com/react-component/table/pull/333
scrollbar-color: transparent transparent;
min-width: unset;
&::-webkit-scrollbar {
// set min width to window chrome scrollbar
// https://github.com/ant-design/ant-design/issues/19952#issuecomment-559367149
min-width: inherit;
background-color: transparent;
}
}

View File

@@ -135,7 +135,6 @@
.@{table-prefix-cls}-footer {
border: 0;
border-top: @border-width-base @border-style-base @border-color-split;
border-right: @border-width-base @border-style-base @border-color-split;
&::before {
display: none;
}
@@ -147,7 +146,7 @@
border-left: 0;
}
.@{table-prefix-cls}-thead > tr:only-child > th:last-child,
.@{table-prefix-cls}-thead > tr > th.@{table-prefix-cls}-row-cell-last,
.@{table-prefix-cls}-tbody > tr > td:last-child {
border-right: none;
}

View File

@@ -29,6 +29,7 @@
left: 0;
z-index: 1;
box-sizing: border-box;
width: 0;
height: 2px;
background-color: @tabs-ink-bar-color;
transform-origin: 0 0;
@@ -330,7 +331,7 @@
bottom: auto;
left: auto;
width: 2px;
height: auto;
height: 0;
}
.@{tab-prefix-cls}-tab-next {
@@ -403,12 +404,12 @@
.@{tab-prefix-cls}-top .@{tab-prefix-cls}-ink-bar-animated,
.@{tab-prefix-cls}-bottom .@{tab-prefix-cls}-ink-bar-animated {
transition: transform 0.3s @ease-in-out, width 0.3s @ease-in-out, left 0.3s @ease-in-out;
transition: transform 0.3s @ease-in-out, width 0.2s @ease-in-out, left 0.3s @ease-in-out;
}
.@{tab-prefix-cls}-left .@{tab-prefix-cls}-ink-bar-animated,
.@{tab-prefix-cls}-right .@{tab-prefix-cls}-ink-bar-animated {
transition: transform 0.3s @ease-in-out, height 0.3s @ease-in-out, top 0.3s @ease-in-out;
transition: transform 0.3s @ease-in-out, height 0.2s @ease-in-out, top 0.3s @ease-in-out;
}
// No animation

View File

@@ -442,11 +442,11 @@ exports[`renders ./components/tag/demo/controlled.md correctly 1`] = `
exports[`renders ./components/tag/demo/hot-tags.md correctly 1`] = `
<div>
<h6
style="margin-right:8px;display:inline"
<span
style="margin-right:8px"
>
Categories:
</h6>
</span>
<span
class="ant-tag ant-tag-checkable"
>

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