commonUtils.js 2.9 KB

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