commonUtils.js 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. export function hasAddon(props) {
  2. return !!(props.addonBefore || props.addonAfter);
  3. }
  4. export function hasPrefixSuffix(props) {
  5. return !!(props.prefix || props.suffix || props.allowClear);
  6. }
  7. // TODO: It's better to use `Proxy` replace the `element.value`. But we still need support IE11.
  8. function cloneEvent(event, target, value) {
  9. // A bug report filed on WebKit's Bugzilla tracker, dating back to 2009, specifically addresses the issue of cloneNode() not copying files of <input type="file"> elements.
  10. // As of the last update, this bug was still marked as "NEW," indicating that it might not have been resolved yet​​.
  11. // https://bugs.webkit.org/show_bug.cgi?id=28123
  12. var currentTarget = target.cloneNode(true);
  13. // click clear icon
  14. var newEvent = Object.create(event, {
  15. target: {
  16. value: currentTarget
  17. },
  18. currentTarget: {
  19. value: currentTarget
  20. }
  21. });
  22. // Fill data
  23. currentTarget.value = value;
  24. // Fill selection. Some type like `email` not support selection
  25. // https://github.com/ant-design/ant-design/issues/47833
  26. if (typeof target.selectionStart === 'number' && typeof target.selectionEnd === 'number') {
  27. currentTarget.selectionStart = target.selectionStart;
  28. currentTarget.selectionEnd = target.selectionEnd;
  29. }
  30. currentTarget.setSelectionRange = function () {
  31. target.setSelectionRange.apply(target, arguments);
  32. };
  33. return newEvent;
  34. }
  35. export function resolveOnChange(target, e, onChange, targetValue) {
  36. if (!onChange) {
  37. return;
  38. }
  39. var event = e;
  40. if (e.type === 'click') {
  41. // Clone a new target for event.
  42. // Avoid the following usage, the setQuery method gets the original value.
  43. //
  44. // const [query, setQuery] = React.useState('');
  45. // <Input
  46. // allowClear
  47. // value={query}
  48. // onChange={(e)=> {
  49. // setQuery((prevStatus) => e.target.value);
  50. // }}
  51. // />
  52. event = cloneEvent(e, target, '');
  53. onChange(event);
  54. return;
  55. }
  56. // Trigger by composition event, this means we need force change the input value
  57. // https://github.com/ant-design/ant-design/issues/45737
  58. // https://github.com/ant-design/ant-design/issues/46598
  59. if (target.type !== 'file' && targetValue !== undefined) {
  60. event = cloneEvent(e, target, targetValue);
  61. onChange(event);
  62. return;
  63. }
  64. onChange(event);
  65. }
  66. export function triggerFocus(element, option) {
  67. if (!element) return;
  68. element.focus(option);
  69. // Selection content
  70. var _ref = option || {},
  71. cursor = _ref.cursor;
  72. if (cursor) {
  73. var len = element.value.length;
  74. switch (cursor) {
  75. case 'start':
  76. element.setSelectionRange(0, 0);
  77. break;
  78. case 'end':
  79. element.setSelectionRange(len, len);
  80. break;
  81. default:
  82. element.setSelectionRange(0, len);
  83. }
  84. }
  85. }