primereact 10.4.0 → 10.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/calendar/calendar.cjs.js +12 -4
  2. package/calendar/calendar.cjs.min.js +1 -1
  3. package/calendar/calendar.esm.js +12 -4
  4. package/calendar/calendar.esm.min.js +1 -1
  5. package/calendar/calendar.js +12 -4
  6. package/calendar/calendar.min.js +1 -1
  7. package/checkbox/checkbox.cjs.js +2 -0
  8. package/checkbox/checkbox.cjs.min.js +1 -1
  9. package/checkbox/checkbox.esm.js +2 -0
  10. package/checkbox/checkbox.esm.min.js +1 -1
  11. package/checkbox/checkbox.js +2 -0
  12. package/checkbox/checkbox.min.js +1 -1
  13. package/chips/chips.cjs.js +109 -20
  14. package/chips/chips.cjs.min.js +1 -1
  15. package/chips/chips.esm.js +109 -20
  16. package/chips/chips.esm.min.js +1 -1
  17. package/chips/chips.js +109 -20
  18. package/chips/chips.min.js +1 -1
  19. package/core/core.js +643 -465
  20. package/core/core.min.js +4 -4
  21. package/dropdown/dropdown.cjs.js +313 -141
  22. package/dropdown/dropdown.cjs.min.js +1 -1
  23. package/dropdown/dropdown.esm.js +313 -141
  24. package/dropdown/dropdown.esm.min.js +1 -1
  25. package/dropdown/dropdown.js +313 -141
  26. package/dropdown/dropdown.min.js +1 -1
  27. package/inputnumber/inputnumber.cjs.js +21 -17
  28. package/inputnumber/inputnumber.cjs.min.js +1 -1
  29. package/inputnumber/inputnumber.esm.js +21 -17
  30. package/inputnumber/inputnumber.esm.min.js +1 -1
  31. package/inputnumber/inputnumber.js +21 -17
  32. package/inputnumber/inputnumber.min.js +1 -1
  33. package/inputswitch/inputswitch.cjs.js +3 -1
  34. package/inputswitch/inputswitch.cjs.min.js +1 -1
  35. package/inputswitch/inputswitch.esm.js +3 -1
  36. package/inputswitch/inputswitch.esm.min.js +1 -1
  37. package/inputswitch/inputswitch.js +3 -1
  38. package/inputswitch/inputswitch.min.js +1 -1
  39. package/knob/knob.cjs.js +62 -0
  40. package/knob/knob.cjs.min.js +1 -1
  41. package/knob/knob.esm.js +62 -0
  42. package/knob/knob.esm.min.js +1 -1
  43. package/knob/knob.js +62 -0
  44. package/knob/knob.min.js +1 -1
  45. package/listbox/listbox.cjs.js +362 -92
  46. package/listbox/listbox.cjs.min.js +1 -1
  47. package/listbox/listbox.esm.js +363 -93
  48. package/listbox/listbox.esm.min.js +1 -1
  49. package/listbox/listbox.js +362 -92
  50. package/listbox/listbox.min.js +1 -1
  51. package/menu/menu.cjs.js +4 -2
  52. package/menu/menu.cjs.min.js +1 -1
  53. package/menu/menu.esm.js +4 -2
  54. package/menu/menu.esm.min.js +1 -1
  55. package/menu/menu.js +5 -4
  56. package/menu/menu.min.js +1 -1
  57. package/multiselect/multiselect.cjs.js +377 -107
  58. package/multiselect/multiselect.cjs.min.js +1 -1
  59. package/multiselect/multiselect.esm.js +377 -107
  60. package/multiselect/multiselect.esm.min.js +1 -1
  61. package/multiselect/multiselect.js +377 -107
  62. package/multiselect/multiselect.min.js +1 -1
  63. package/package.json +1 -1
  64. package/paginator/paginator.cjs.js +251 -251
  65. package/paginator/paginator.cjs.min.js +1 -1
  66. package/paginator/paginator.esm.js +258 -258
  67. package/paginator/paginator.esm.min.js +1 -1
  68. package/paginator/paginator.js +251 -251
  69. package/paginator/paginator.min.js +1 -1
  70. package/panelmenu/panelmenu.cjs.js +2 -1
  71. package/panelmenu/panelmenu.cjs.min.js +1 -1
  72. package/panelmenu/panelmenu.esm.js +2 -1
  73. package/panelmenu/panelmenu.esm.min.js +1 -1
  74. package/panelmenu/panelmenu.js +3 -3
  75. package/panelmenu/panelmenu.min.js +1 -1
  76. package/passthrough/tailwind/index.cjs.js +3 -2
  77. package/passthrough/tailwind/index.cjs.min.js +1 -1
  78. package/passthrough/tailwind/index.esm.js +3 -2
  79. package/passthrough/tailwind/index.esm.min.js +1 -1
  80. package/passthrough/tailwind/index.js +3 -2
  81. package/passthrough/tailwind/index.min.js +1 -1
  82. package/password/password.cjs.js +22 -20
  83. package/password/password.cjs.min.js +1 -1
  84. package/password/password.esm.js +22 -20
  85. package/password/password.esm.min.js +1 -1
  86. package/password/password.js +22 -20
  87. package/password/password.min.js +1 -1
  88. package/primereact.all.cjs.js +1473 -485
  89. package/primereact.all.cjs.min.js +1 -1
  90. package/primereact.all.esm.js +1473 -485
  91. package/primereact.all.esm.min.js +1 -1
  92. package/primereact.all.js +1473 -485
  93. package/primereact.all.min.js +1 -1
  94. package/radiobutton/radiobutton.cjs.js +1 -0
  95. package/radiobutton/radiobutton.cjs.min.js +1 -1
  96. package/radiobutton/radiobutton.esm.js +1 -0
  97. package/radiobutton/radiobutton.esm.min.js +1 -1
  98. package/radiobutton/radiobutton.js +1 -0
  99. package/radiobutton/radiobutton.min.js +1 -1
  100. package/rating/rating.cjs.js +103 -4
  101. package/rating/rating.cjs.min.js +1 -1
  102. package/rating/rating.esm.js +103 -4
  103. package/rating/rating.esm.min.js +1 -1
  104. package/rating/rating.js +103 -4
  105. package/rating/rating.min.js +1 -1
  106. package/resources/themes/arya-blue/theme.css +328 -67
  107. package/resources/themes/arya-green/theme.css +328 -67
  108. package/resources/themes/arya-orange/theme.css +328 -67
  109. package/resources/themes/arya-purple/theme.css +26 -6
  110. package/resources/themes/bootstrap4-dark-blue/theme.css +328 -67
  111. package/resources/themes/bootstrap4-dark-purple/theme.css +26 -6
  112. package/resources/themes/bootstrap4-light-blue/theme.css +328 -67
  113. package/resources/themes/bootstrap4-light-purple/theme.css +26 -6
  114. package/resources/themes/fluent-light/theme.css +327 -66
  115. package/resources/themes/lara-dark-amber/theme.css +328 -67
  116. package/resources/themes/lara-dark-blue/theme.css +328 -67
  117. package/resources/themes/lara-dark-cyan/theme.css +328 -67
  118. package/resources/themes/lara-dark-green/theme.css +328 -67
  119. package/resources/themes/lara-dark-indigo/theme.css +328 -67
  120. package/resources/themes/lara-dark-pink/theme.css +328 -67
  121. package/resources/themes/lara-dark-purple/theme.css +26 -6
  122. package/resources/themes/lara-dark-teal/theme.css +328 -67
  123. package/resources/themes/lara-light-amber/theme.css +328 -67
  124. package/resources/themes/lara-light-blue/theme.css +328 -67
  125. package/resources/themes/lara-light-cyan/theme.css +328 -67
  126. package/resources/themes/lara-light-green/theme.css +328 -67
  127. package/resources/themes/lara-light-indigo/theme.css +328 -67
  128. package/resources/themes/lara-light-pink/theme.css +328 -67
  129. package/resources/themes/lara-light-purple/theme.css +26 -6
  130. package/resources/themes/lara-light-teal/theme.css +328 -67
  131. package/resources/themes/luna-amber/theme.css +328 -67
  132. package/resources/themes/luna-blue/theme.css +328 -67
  133. package/resources/themes/luna-green/theme.css +328 -67
  134. package/resources/themes/luna-pink/theme.css +328 -67
  135. package/resources/themes/md-dark-deeppurple/theme.css +158 -138
  136. package/resources/themes/md-dark-indigo/theme.css +454 -193
  137. package/resources/themes/md-light-deeppurple/theme.css +26 -6
  138. package/resources/themes/md-light-indigo/theme.css +328 -67
  139. package/resources/themes/mdc-dark-deeppurple/theme.css +158 -138
  140. package/resources/themes/mdc-dark-indigo/theme.css +454 -193
  141. package/resources/themes/mdc-light-deeppurple/theme.css +26 -6
  142. package/resources/themes/mdc-light-indigo/theme.css +328 -67
  143. package/resources/themes/mira/theme.css +328 -67
  144. package/resources/themes/nano/theme.css +328 -67
  145. package/resources/themes/nova/theme.css +328 -67
  146. package/resources/themes/nova-accent/theme.css +328 -67
  147. package/resources/themes/nova-alt/theme.css +328 -67
  148. package/resources/themes/rhea/theme.css +328 -67
  149. package/resources/themes/saga-blue/theme.css +328 -67
  150. package/resources/themes/saga-green/theme.css +328 -67
  151. package/resources/themes/saga-orange/theme.css +328 -67
  152. package/resources/themes/saga-purple/theme.css +26 -6
  153. package/resources/themes/soho-dark/theme.css +353 -92
  154. package/resources/themes/soho-light/theme.css +328 -67
  155. package/resources/themes/tailwind-light/theme.css +329 -71
  156. package/resources/themes/vela-blue/theme.css +328 -67
  157. package/resources/themes/vela-green/theme.css +328 -67
  158. package/resources/themes/vela-orange/theme.css +328 -67
  159. package/resources/themes/vela-purple/theme.css +26 -6
  160. package/resources/themes/viva-dark/theme.css +328 -67
  161. package/resources/themes/viva-light/theme.css +328 -67
  162. package/selectbutton/selectbutton.cjs.js +96 -50
  163. package/selectbutton/selectbutton.cjs.min.js +1 -1
  164. package/selectbutton/selectbutton.esm.js +96 -50
  165. package/selectbutton/selectbutton.esm.min.js +1 -1
  166. package/selectbutton/selectbutton.js +96 -50
  167. package/selectbutton/selectbutton.min.js +1 -1
  168. package/slider/slider.cjs.js +25 -4
  169. package/slider/slider.cjs.min.js +1 -1
  170. package/slider/slider.esm.js +25 -4
  171. package/slider/slider.esm.min.js +1 -1
  172. package/slider/slider.js +25 -4
  173. package/slider/slider.min.js +1 -1
  174. package/splitter/splitter.cjs.js +16 -15
  175. package/splitter/splitter.cjs.min.js +1 -1
  176. package/splitter/splitter.esm.js +16 -15
  177. package/splitter/splitter.esm.min.js +1 -1
  178. package/splitter/splitter.js +16 -15
  179. package/splitter/splitter.min.js +1 -1
  180. package/tabview/tabview.cjs.js +6 -5
  181. package/tabview/tabview.cjs.min.js +1 -1
  182. package/tabview/tabview.d.ts +39 -34
  183. package/tabview/tabview.esm.js +6 -5
  184. package/tabview/tabview.esm.min.js +1 -1
  185. package/tabview/tabview.js +6 -5
  186. package/tabview/tabview.min.js +1 -1
  187. package/togglebutton/togglebutton.cjs.js +15 -14
  188. package/togglebutton/togglebutton.cjs.min.js +1 -1
  189. package/togglebutton/togglebutton.esm.js +14 -13
  190. package/togglebutton/togglebutton.esm.min.js +1 -1
  191. package/togglebutton/togglebutton.js +15 -14
  192. package/togglebutton/togglebutton.min.js +1 -1
  193. package/tristatecheckbox/tristatecheckbox.cjs.js +3 -2
  194. package/tristatecheckbox/tristatecheckbox.cjs.min.js +1 -1
  195. package/tristatecheckbox/tristatecheckbox.esm.js +3 -2
  196. package/tristatecheckbox/tristatecheckbox.esm.min.js +1 -1
  197. package/tristatecheckbox/tristatecheckbox.js +3 -2
  198. package/tristatecheckbox/tristatecheckbox.min.js +1 -1
  199. package/web-types.json +1 -1
@@ -208,10 +208,13 @@ var classes = {
208
208
  item: function item(_ref7) {
209
209
  var selected = _ref7.selected,
210
210
  disabled = _ref7.disabled,
211
- label = _ref7.label;
211
+ label = _ref7.label,
212
+ index = _ref7.index,
213
+ focusedOptionIndex = _ref7.focusedOptionIndex;
212
214
  return utils.classNames('p-dropdown-item', {
213
215
  'p-highlight': selected,
214
216
  'p-disabled': disabled,
217
+ 'p-focus': index === focusedOptionIndex,
215
218
  'p-dropdown-item-empty': !label || label.length === 0
216
219
  });
217
220
  },
@@ -278,6 +281,8 @@ var DropdownBase = componentbase.ComponentBase.extend({
278
281
  onShow: null,
279
282
  optionDisabled: null,
280
283
  optionGroupChildren: 'items',
284
+ selectOnFocus: false,
285
+ autoOptionFocus: false,
281
286
  optionGroupLabel: null,
282
287
  optionGroupTemplate: null,
283
288
  optionLabel: null,
@@ -316,7 +321,9 @@ var DropdownItem = /*#__PURE__*/React__namespace.memo(function (props) {
316
321
  selected = props.selected,
317
322
  disabled = props.disabled,
318
323
  option = props.option,
319
- label = props.label;
324
+ label = props.label,
325
+ index = props.index,
326
+ focusedOptionIndex = props.focusedOptionIndex;
320
327
  var getPTOptions = function getPTOptions(key) {
321
328
  return ptm(key, {
322
329
  context: {
@@ -325,7 +332,7 @@ var DropdownItem = /*#__PURE__*/React__namespace.memo(function (props) {
325
332
  }
326
333
  });
327
334
  };
328
- var _onClick = function onClick(event) {
335
+ var _onClick = function onClick(event, i) {
329
336
  if (props.onClick) {
330
337
  props.onClick({
331
338
  originalEvent: event,
@@ -340,7 +347,9 @@ var DropdownItem = /*#__PURE__*/React__namespace.memo(function (props) {
340
347
  className: utils.classNames(option.className, cx('item', {
341
348
  selected: selected,
342
349
  disabled: disabled,
343
- label: label
350
+ label: label,
351
+ index: index,
352
+ focusedOptionIndex: focusedOptionIndex
344
353
  })),
345
354
  style: props.style,
346
355
  onClick: function onClick(e) {
@@ -349,6 +358,7 @@ var DropdownItem = /*#__PURE__*/React__namespace.memo(function (props) {
349
358
  'aria-label': label,
350
359
  'aria-selected': selected,
351
360
  'data-p-highlight': selected,
361
+ 'data-p-focused': focusedOptionIndex === index,
352
362
  'data-p-disabled': disabled
353
363
  }, getPTOptions('item'));
354
364
  return /*#__PURE__*/React__namespace.createElement("li", itemProps, content, /*#__PURE__*/React__namespace.createElement(ripple.Ripple, null));
@@ -420,6 +430,8 @@ var DropdownPanel = /*#__PURE__*/React__namespace.memo( /*#__PURE__*/React__name
420
430
  var disabled = props.isOptionDisabled(option);
421
431
  return /*#__PURE__*/React__namespace.createElement(DropdownItem, {
422
432
  key: optionKey,
433
+ index: j,
434
+ focusedOptionIndex: props.focusedOptionIndex,
423
435
  label: optionLabel,
424
436
  option: option,
425
437
  style: style,
@@ -467,6 +479,8 @@ var DropdownPanel = /*#__PURE__*/React__namespace.memo( /*#__PURE__*/React__name
467
479
  return /*#__PURE__*/React__namespace.createElement(DropdownItem, {
468
480
  key: optionKey,
469
481
  label: optionLabel,
482
+ index: index,
483
+ focusedOptionIndex: props.focusedOptionIndex,
470
484
  option: option,
471
485
  style: style,
472
486
  template: props.itemTemplate,
@@ -659,20 +673,30 @@ var Dropdown = /*#__PURE__*/React__namespace.memo( /*#__PURE__*/React__namespace
659
673
  setFilterState = _React$useState2[1];
660
674
  var _React$useState3 = React__namespace.useState(false),
661
675
  _React$useState4 = _slicedToArray(_React$useState3, 2),
662
- focusedState = _React$useState4[0],
663
- setFocusedState = _React$useState4[1];
676
+ clicked = _React$useState4[0],
677
+ setClicked = _React$useState4[1];
664
678
  var _React$useState5 = React__namespace.useState(false),
665
679
  _React$useState6 = _slicedToArray(_React$useState5, 2),
666
- overlayVisibleState = _React$useState6[0],
667
- setOverlayVisibleState = _React$useState6[1];
680
+ focusedState = _React$useState6[0],
681
+ setFocusedState = _React$useState6[1];
682
+ var _React$useState7 = React__namespace.useState(null),
683
+ _React$useState8 = _slicedToArray(_React$useState7, 2),
684
+ focusedOptionIndex = _React$useState8[0],
685
+ setFocusedOptionIndex = _React$useState8[1];
686
+ var _React$useState9 = React__namespace.useState(false),
687
+ _React$useState10 = _slicedToArray(_React$useState9, 2),
688
+ overlayVisibleState = _React$useState10[0],
689
+ setOverlayVisibleState = _React$useState10[1];
668
690
  var elementRef = React__namespace.useRef(null);
669
691
  var overlayRef = React__namespace.useRef(null);
692
+ var firstHiddenFocusableElementOnOverlay = React__namespace.useRef(null);
693
+ var lastHiddenFocusableElementOnOverlay = React__namespace.useRef(null);
670
694
  var inputRef = React__namespace.useRef(props.inputRef);
671
695
  var focusInputRef = React__namespace.useRef(props.focusInputRef);
672
696
  var virtualScrollerRef = React__namespace.useRef(null);
673
697
  var searchTimeout = React__namespace.useRef(null);
674
698
  var searchValue = React__namespace.useRef(null);
675
- var currentSearchChar = React__namespace.useRef(null);
699
+ React__namespace.useRef(null);
676
700
  var isLazy = props.virtualScrollerOptions && props.virtualScrollerOptions.lazy;
677
701
  var hasFilter = utils.ObjectUtils.isNotEmpty(filterState);
678
702
  var appendTo = props.appendTo || context && context.appendTo || PrimeReact__default["default"].appendTo;
@@ -736,6 +760,14 @@ var Dropdown = /*#__PURE__*/React__namespace.memo( /*#__PURE__*/React__namespace
736
760
  return props.options;
737
761
  }
738
762
  };
763
+ var onFirstHiddenFocus = function onFirstHiddenFocus(event) {
764
+ var focusableEl = event.relatedTarget === focusInputRef.current ? utils.DomHandler.getFirstFocusableElement(overlayRef.current, ':not([data-p-hidden-focusable="true"])') : focusInputRef.current;
765
+ utils.DomHandler.focus(focusableEl);
766
+ };
767
+ var onLastHiddenFocus = function onLastHiddenFocus(event) {
768
+ var focusableEl = event.relatedTarget === focusInputRef.current ? utils.DomHandler.getLastFocusableElement(overlayRef.current, ':not([data-p-hidden-focusable="true"])') : focusInputRef.current;
769
+ utils.DomHandler.focus(focusableEl);
770
+ };
739
771
  var isClearClicked = function isClearClicked(event) {
740
772
  return utils.DomHandler.isAttributeEquals(event.target, 'data-pc-section', 'clearicon') || utils.DomHandler.isAttributeEquals(event.target.parentElement || event.target, 'data-pc-section', 'filterclearicon');
741
773
  };
@@ -755,6 +787,7 @@ var Dropdown = /*#__PURE__*/React__namespace.memo( /*#__PURE__*/React__namespace
755
787
  utils.DomHandler.focus(focusInputRef.current);
756
788
  overlayVisibleState ? hide() : show();
757
789
  }
790
+ setClicked(true);
758
791
  };
759
792
  var onInputFocus = function onInputFocus(event) {
760
793
  if (props.showOnFocus && !overlayVisibleState) {
@@ -786,6 +819,15 @@ var Dropdown = /*#__PURE__*/React__namespace.memo( /*#__PURE__*/React__namespace
786
819
  }, 200);
787
820
  }
788
821
  };
822
+ var onOptionSelect = function onOptionSelect(event, option) {
823
+ var isHide = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
824
+ var value = getOptionValue(option);
825
+ selectItem({
826
+ originalEvent: event,
827
+ option: value
828
+ });
829
+ isHide && hide();
830
+ };
789
831
  var onPanelClick = function onPanelClick(event) {
790
832
  overlayservice.OverlayService.emit('overlay-click', {
791
833
  originalEvent: event,
@@ -793,189 +835,285 @@ var Dropdown = /*#__PURE__*/React__namespace.memo( /*#__PURE__*/React__namespace
793
835
  });
794
836
  };
795
837
  var onInputKeyDown = function onInputKeyDown(event) {
838
+ if (props.disabled || utils.DomHandler.isAndroid()) {
839
+ event.preventDefault();
840
+ return;
841
+ }
842
+ var metaKey = event.metaKey || event.ctrlKey;
796
843
  switch (event.code) {
797
844
  case 'ArrowDown':
798
- onDownKey(event);
845
+ onArrowDownKey(event);
799
846
  break;
800
847
  case 'ArrowUp':
801
- onUpKey(event);
848
+ onArrowUpKey(event);
849
+ break;
850
+ case 'ArrowLeft':
851
+ case 'ArrowRight':
852
+ onArrowLeftKey(event, props.editable);
853
+ break;
854
+ case 'Home':
855
+ onHomeKey(event);
856
+ break;
857
+ case 'End':
858
+ onEndKey(event);
859
+ break;
860
+ case 'PageDown':
861
+ onPageDownKey(event);
862
+ break;
863
+ case 'PageUp':
864
+ onPageUpKey(event);
802
865
  break;
803
866
  case 'Space':
867
+ onSpaceKey(event, props.editable);
868
+ break;
869
+ case 'NumpadEnter':
804
870
  case 'Enter':
805
- overlayVisibleState ? hide() : show();
806
- event.preventDefault();
871
+ onEnterKey(event);
807
872
  break;
808
873
  case 'Escape':
874
+ onEscapeKey(event);
875
+ break;
809
876
  case 'Tab':
810
- hide();
877
+ onTabKey(event);
878
+ break;
879
+ case 'Backspace':
880
+ onBackspaceKey(event, props.editable);
881
+ break;
882
+ case 'ShiftLeft':
883
+ case 'ShiftRight':
884
+ //NOOP
811
885
  break;
812
886
  default:
813
- search(event);
887
+ if (!metaKey && utils.ObjectUtils.isPrintableCharacter(event.key)) {
888
+ !overlayVisibleState && show();
889
+ !props.editable && searchOptions(event, event.key);
890
+ }
814
891
  break;
815
892
  }
893
+ setClicked(false);
816
894
  };
817
895
  var onFilterInputKeyDown = function onFilterInputKeyDown(event) {
818
896
  switch (event.code) {
819
897
  case 'ArrowDown':
820
- onDownKey(event);
898
+ onArrowDownKey(event);
821
899
  break;
822
900
  case 'ArrowUp':
823
- onUpKey(event);
901
+ onArrowUpKey(event);
902
+ break;
903
+ case 'ArrowLeft':
904
+ case 'ArrowRight':
905
+ onArrowLeftKey(event, true);
824
906
  break;
825
907
  case 'Escape':
826
908
  case 'Enter':
827
- hide();
909
+ onEnterKey(event);
828
910
  event.preventDefault();
829
911
  break;
830
912
  }
831
913
  };
832
- var onUpKey = function onUpKey(event) {
833
- if (visibleOptions) {
834
- var prevOption = findPrevOption(getSelectedOptionIndex());
835
- if (prevOption) {
836
- selectItem({
837
- originalEvent: event,
838
- option: prevOption
839
- });
840
- }
841
- }
842
- event.preventDefault();
914
+ var hasFocusableElements = function hasFocusableElements() {
915
+ return utils.DomHandler.getFocusableElements(overlayRef.current, ':not([data-p-hidden-focusable="true"])').length > 0;
843
916
  };
844
- var onDownKey = function onDownKey(event) {
845
- if (visibleOptions) {
846
- if (!overlayVisibleState && event.altKey) {
847
- show();
848
- } else {
849
- var nextOption = findNextOption(getSelectedOptionIndex());
850
- if (nextOption) {
851
- selectItem({
852
- originalEvent: event,
853
- option: nextOption
854
- });
855
- }
856
- }
857
- }
858
- event.preventDefault();
917
+ var isOptionMatched = function isOptionMatched(option) {
918
+ var _getOptionLabel;
919
+ return isValidOption(option) && ((_getOptionLabel = getOptionLabel(option)) === null || _getOptionLabel === void 0 ? void 0 : _getOptionLabel.toLocaleLowerCase(props.filterLocale).startsWith(searchValue.current.toLocaleLowerCase(props.filterLocale)));
859
920
  };
860
- var findNextOption = function findNextOption(index) {
861
- if (props.optionGroupLabel) {
862
- var groupIndex = index === -1 ? 0 : index.group;
863
- var optionIndex = index === -1 ? -1 : index.option;
864
- var option = findNextOptionInList(getOptionGroupChildren(visibleOptions[groupIndex]), optionIndex);
865
- if (option) return option;else if (groupIndex + 1 !== visibleOptions.length) return findNextOption({
866
- group: groupIndex + 1,
867
- option: -1
868
- });else return null;
869
- }
870
- return findNextOptionInList(visibleOptions, index);
921
+ var isValidOption = function isValidOption(option) {
922
+ return utils.ObjectUtils.isNotEmpty(option) && !(isOptionDisabled(option) || isOptionGroup(option));
871
923
  };
872
- var findNextOptionInList = function findNextOptionInList(list, index) {
873
- var i = index + 1;
874
- if (i === list.length) {
875
- return null;
876
- }
877
- var option = list[i];
878
- return isOptionDisabled(option) ? findNextOptionInList(i) : option;
924
+ var hasSelectedOption = function hasSelectedOption() {
925
+ return utils.ObjectUtils.isNotEmpty(props.value);
879
926
  };
880
- var findPrevOption = function findPrevOption(index) {
881
- if (index === -1) {
882
- return null;
883
- }
884
- if (props.optionGroupLabel) {
885
- var groupIndex = index.group;
886
- var optionIndex = index.option;
887
- var option = findPrevOptionInList(getOptionGroupChildren(visibleOptions[groupIndex]), optionIndex);
888
- if (option) return option;else if (groupIndex > 0) return findPrevOption({
889
- group: groupIndex - 1,
890
- option: getOptionGroupChildren(visibleOptions[groupIndex - 1]).length
891
- });else return null;
892
- }
893
- return findPrevOptionInList(visibleOptions, index);
927
+ var isValidSelectedOption = function isValidSelectedOption(option) {
928
+ return isValidOption(option) && isSelected(option);
894
929
  };
895
- var findPrevOptionInList = function findPrevOptionInList(list, index) {
896
- var i = index - 1;
897
- if (i < 0) {
898
- return null;
899
- }
900
- var option = list[i];
901
- return isOptionDisabled(option) ? findPrevOption(i) : option;
930
+ var findSelectedOptionIndex = function findSelectedOptionIndex() {
931
+ return hasSelectedOption ? visibleOptions.findIndex(function (option) {
932
+ return isValidSelectedOption(option);
933
+ }) : -1;
902
934
  };
903
- var search = function search(event) {
935
+ var findFirstFocusedOptionIndex = function findFirstFocusedOptionIndex() {
936
+ var selectedIndex = findSelectedOptionIndex();
937
+ return selectedIndex < 0 ? findFirstOptionIndex() : selectedIndex;
938
+ };
939
+ var searchOptions = function searchOptions(event, _char) {
940
+ searchValue.current = (searchValue.current || '') + _char;
941
+ var optionIndex = -1;
942
+ var matched = false;
943
+ if (utils.ObjectUtils.isNotEmpty(searchValue.current)) {
944
+ if (focusedOptionIndex !== -1) {
945
+ optionIndex = visibleOptions.slice(focusedOptionIndex).findIndex(function (option) {
946
+ return isOptionMatched(option);
947
+ });
948
+ optionIndex = optionIndex === -1 ? visibleOptions.slice(0, focusedOptionIndex).findIndex(function (option) {
949
+ return isOptionMatched(option);
950
+ }) : optionIndex + focusedOptionIndex;
951
+ } else {
952
+ optionIndex = visibleOptions.findIndex(function (option) {
953
+ return isOptionMatched(option);
954
+ });
955
+ }
956
+ if (optionIndex !== -1) {
957
+ matched = true;
958
+ }
959
+ if (optionIndex === -1 && focusedOptionIndex === -1) {
960
+ optionIndex = findFirstFocusedOptionIndex();
961
+ }
962
+ if (optionIndex !== -1) {
963
+ changeFocusedOptionIndex(event, optionIndex);
964
+ }
965
+ }
904
966
  if (searchTimeout.current) {
905
967
  clearTimeout(searchTimeout.current);
906
968
  }
907
- if (event.ctrlKey || event.metaKey || event.altKey) {
908
- // ignore meta combinations like CTRL+F for browser search
909
- return;
969
+ searchTimeout.current = setTimeout(function () {
970
+ searchValue.current = '';
971
+ searchTimeout.current = null;
972
+ }, 500);
973
+ return matched;
974
+ };
975
+ var findLastFocusedOptionIndex = function findLastFocusedOptionIndex() {
976
+ var selectedIndex = findSelectedOptionIndex();
977
+ return selectedIndex < 0 ? findLastOptionIndex() : selectedIndex;
978
+ };
979
+ var findFirstOptionIndex = function findFirstOptionIndex() {
980
+ return visibleOptions.findIndex(function (option) {
981
+ return isValidOption(option);
982
+ });
983
+ };
984
+ var findLastOptionIndex = function findLastOptionIndex() {
985
+ return utils.ObjectUtils.findLastIndex(visibleOptions, function (option) {
986
+ return isValidOption(option);
987
+ });
988
+ };
989
+ var findNextOptionIndex = function findNextOptionIndex(index) {
990
+ var matchedOptionIndex = index < visibleOptions.length - 1 ? visibleOptions.slice(index + 1).findIndex(function (option) {
991
+ return isValidOption(option);
992
+ }) : -1;
993
+ return matchedOptionIndex > -1 ? matchedOptionIndex + index + 1 : index;
994
+ };
995
+ var findPrevOptionIndex = function findPrevOptionIndex(index) {
996
+ var matchedOptionIndex = index > 0 ? utils.ObjectUtils.findLastIndex(visibleOptions.slice(0, index), function (option) {
997
+ return isValidOption(option);
998
+ }) : -1;
999
+ return matchedOptionIndex > -1 ? matchedOptionIndex : index;
1000
+ };
1001
+ var changeFocusedOptionIndex = function changeFocusedOptionIndex(event, index) {
1002
+ if (focusedOptionIndex !== index) {
1003
+ setFocusedOptionIndex(index);
1004
+ if (props.selectOnFocus) {
1005
+ onOptionSelect(event, visibleOptions[index], false);
1006
+ }
910
1007
  }
911
- var _char = event.key;
912
- if (_char.length !== 1) {
913
- // only single character keys matter for searching
914
- return;
1008
+ };
1009
+ var onArrowDownKey = function onArrowDownKey(event) {
1010
+ if (!overlayVisibleState) {
1011
+ show();
1012
+ props.editable && changeFocusedOptionIndex(event, findSelectedOptionIndex());
1013
+ } else {
1014
+ var optionIndex = focusedOptionIndex !== -1 ? findNextOptionIndex(focusedOptionIndex) : clicked ? findFirstOptionIndex() : findFirstFocusedOptionIndex();
1015
+ changeFocusedOptionIndex(event, optionIndex);
915
1016
  }
916
- if (currentSearchChar.current === _char) searchValue.current = _char;else searchValue.current = searchValue.current ? searchValue.current + _char : _char;
917
- currentSearchChar.current = _char;
918
- if (searchValue.current) {
919
- var searchIndex = getSelectedOptionIndex();
920
- var newOption = props.optionGroupLabel ? searchOptionInGroup(searchIndex) : searchOption(searchIndex + 1);
921
- if (newOption) {
922
- selectItem({
923
- originalEvent: event,
924
- option: newOption
925
- });
1017
+ event.preventDefault();
1018
+ };
1019
+ var onArrowUpKey = function onArrowUpKey(event) {
1020
+ var pressedInInputText = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1021
+ if (event.altKey && !pressedInInputText) {
1022
+ if (focusedOptionIndex !== -1) {
1023
+ onOptionSelect(event, visibleOptions[focusedOptionIndex]);
926
1024
  }
1025
+ state.overlayVisible && hide();
1026
+ event.preventDefault();
1027
+ } else {
1028
+ var optionIndex = focusedOptionIndex !== -1 ? findPrevOptionIndex(focusedOptionIndex) : clicked ? findLastOptionIndex() : findLastFocusedOptionIndex();
1029
+ changeFocusedOptionIndex(event, optionIndex);
1030
+ !overlayVisibleState && show();
1031
+ event.preventDefault();
927
1032
  }
928
- searchTimeout.current = setTimeout(function () {
929
- searchValue.current = null;
930
- }, 250);
931
1033
  };
932
- var searchOption = function searchOption(index) {
933
- if (searchValue.current) {
934
- return searchOptionInRange(index, visibleOptions.length) || searchOptionInRange(0, index);
1034
+ var onArrowLeftKey = function onArrowLeftKey(event) {
1035
+ var pressedInInputText = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1036
+ pressedInInputText && setFocusedOptionIndex(-1);
1037
+ };
1038
+ var onHomeKey = function onHomeKey(event) {
1039
+ var pressedInInputText = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1040
+ if (pressedInInputText) {
1041
+ event.currentTarget.setSelectionRange(0, 0);
1042
+ setFocusedOptionIndex(-1);
1043
+ } else {
1044
+ changeFocusedOptionIndex(event, findFirstOptionIndex());
1045
+ !overlayVisibleState && show();
935
1046
  }
936
- return null;
1047
+ event.preventDefault();
937
1048
  };
938
- var searchOptionInRange = function searchOptionInRange(start, end) {
939
- for (var i = start; i < end; i++) {
940
- var opt = visibleOptions[i];
941
- if (matchesSearchValue(opt)) {
942
- return opt;
943
- }
1049
+ var onEndKey = function onEndKey(event) {
1050
+ var pressedInInputText = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1051
+ if (pressedInInputText) {
1052
+ var target = event.currentTarget;
1053
+ var len = target.value.length;
1054
+ target.setSelectionRange(len, len);
1055
+ setFocusedOptionIndex(-1);
1056
+ } else {
1057
+ changeFocusedOptionIndex(event, findLastOptionIndex());
1058
+ !overlayVisibleState && show();
944
1059
  }
945
- return null;
1060
+ event.preventDefault();
946
1061
  };
947
- var searchOptionInGroup = function searchOptionInGroup(index) {
948
- var searchIndex = index === -1 ? {
949
- group: 0,
950
- option: -1
951
- } : index;
952
- for (var i = searchIndex.group; i < visibleOptions.length; i++) {
953
- var groupOptions = getOptionGroupChildren(visibleOptions[i]);
954
- for (var j = searchIndex.group === i ? searchIndex.option + 1 : 0; j < groupOptions.length; j++) {
955
- if (matchesSearchValue(groupOptions[j])) {
956
- return groupOptions[j];
957
- }
1062
+ var onPageUpKey = function onPageUpKey(event) {
1063
+ event.preventDefault();
1064
+ };
1065
+ var onPageDownKey = function onPageDownKey(event) {
1066
+ event.preventDefault();
1067
+ };
1068
+ var onSpaceKey = function onSpaceKey(event) {
1069
+ var pressedInInputText = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1070
+ !pressedInInputText && onEnterKey(event);
1071
+ };
1072
+ var onEnterKey = function onEnterKey(event) {
1073
+ if (!overlayVisibleState) {
1074
+ setFocusedOptionIndex(-1);
1075
+ onArrowDownKey(event);
1076
+ } else {
1077
+ if (focusedOptionIndex !== -1) {
1078
+ onOptionSelect(event, visibleOptions[focusedOptionIndex]);
958
1079
  }
1080
+ hide();
959
1081
  }
960
- for (var _i = 0; _i <= searchIndex.group; _i++) {
961
- var _groupOptions = getOptionGroupChildren(visibleOptions[_i]);
962
- for (var _j = 0; _j < (searchIndex.group === _i ? searchIndex.option : _groupOptions.length); _j++) {
963
- if (matchesSearchValue(_groupOptions[_j])) {
964
- return _groupOptions[_j];
1082
+ event.preventDefault();
1083
+ };
1084
+ var onEscapeKey = function onEscapeKey(event) {
1085
+ overlayVisibleState && hide();
1086
+ event.preventDefault();
1087
+ };
1088
+ var onTabKey = function onTabKey(event) {
1089
+ var pressedInInputText = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1090
+ if (!pressedInInputText) {
1091
+ if (overlayVisibleState && hasFocusableElements()) {
1092
+ utils.DomHandler.focus($refs.firstHiddenFocusableElementOnOverlay);
1093
+ event.preventDefault();
1094
+ } else {
1095
+ if (focusedOptionIndex !== -1) {
1096
+ onOptionSelect(event, visibleOptions[focusedOptionIndex]);
965
1097
  }
1098
+ overlayVisibleState && hide();
966
1099
  }
967
1100
  }
968
- return null;
969
1101
  };
970
- var matchesSearchValue = function matchesSearchValue(option) {
971
- var label = getOptionLabel(option);
972
- if (!label) {
973
- return false;
1102
+ var onBackspaceKey = function onBackspaceKey(event) {
1103
+ var pressedInInputText = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1104
+ if (pressedInInputText) {
1105
+ !overlayVisibleState && show();
974
1106
  }
975
- label = label.toLocaleLowerCase(props.filterLocale);
976
- return label.startsWith(searchValue.current.toLocaleLowerCase(props.filterLocale));
977
1107
  };
978
1108
  var onEditableInputChange = function onEditableInputChange(event) {
1109
+ !overlayVisibleState && show();
1110
+ var searchIndex = null;
1111
+ if (event.target.value) {
1112
+ searchIndex = visibleOptions.findIndex(function (item) {
1113
+ return item.name.toLocaleLowerCase().startsWith(event.target.value.toLocaleLowerCase());
1114
+ });
1115
+ }
1116
+ setFocusedOptionIndex(searchIndex);
979
1117
  if (props.onChange) {
980
1118
  props.onChange({
981
1119
  originalEvent: event.originalEvent,
@@ -1105,10 +1243,17 @@ var Dropdown = /*#__PURE__*/React__namespace.memo( /*#__PURE__*/React__namespace
1105
1243
  return utils.ObjectUtils.equals(props.value, getOptionValue(option), equalityKey());
1106
1244
  };
1107
1245
  var show = function show() {
1246
+ setFocusedOptionIndex(focusedOptionIndex !== -1 ? focusedOptionIndex : props.autoOptionFocus ? findFirstFocusedOptionIndex() : props.editable ? -1 : findSelectedOptionIndex());
1108
1247
  setOverlayVisibleState(true);
1109
1248
  };
1110
1249
  var hide = function hide() {
1111
1250
  setOverlayVisibleState(false);
1251
+ setClicked(false);
1252
+ };
1253
+ var onFocus = function onFocus() {
1254
+ if (props.editable) {
1255
+ utils.DomHandler.focus(inputRef.current);
1256
+ }
1112
1257
  };
1113
1258
  var onOverlayEnter = function onOverlayEnter(callback) {
1114
1259
  utils.ZIndexUtils.set('overlay', overlayRef.current, context && context.autoZIndex || PrimeReact__default["default"].autoZIndex, context && context.zIndex['overlay'] || PrimeReact__default["default"].zIndex['overlay']);
@@ -1161,6 +1306,9 @@ var Dropdown = /*#__PURE__*/React__namespace.memo( /*#__PURE__*/React__namespace
1161
1306
  var getOptionRenderKey = function getOptionRenderKey(option) {
1162
1307
  return props.dataKey ? utils.ObjectUtils.resolveFieldData(option, props.dataKey) : getOptionLabel(option);
1163
1308
  };
1309
+ var isOptionGroup = function isOptionGroup(option) {
1310
+ return props.optionGroupLabel && option.optionGroup && option.group;
1311
+ };
1164
1312
  var isOptionDisabled = function isOptionDisabled(option) {
1165
1313
  if (props.optionDisabled) {
1166
1314
  return utils.ObjectUtils.isFunction(props.optionDisabled) ? props.optionDisabled(option) : utils.ObjectUtils.resolveFieldData(option, props.optionDisabled);
@@ -1309,8 +1457,9 @@ var Dropdown = /*#__PURE__*/React__namespace.memo( /*#__PURE__*/React__namespace
1309
1457
  maxLength: props.maxLength,
1310
1458
  onInput: onEditableInputChange,
1311
1459
  onFocus: onEditableInputFocus,
1460
+ onKeyDown: onInputKeyDown,
1312
1461
  onBlur: onInputBlur,
1313
- tabIndex: props.tabIndex || 0,
1462
+ tabIndex: !props.disabled ? props.tabIndex : -1,
1314
1463
  'aria-haspopup': 'listbox'
1315
1464
  }, ariaProps), ptm('input'));
1316
1465
  return /*#__PURE__*/React__namespace.createElement("input", inputProps);
@@ -1402,10 +1551,31 @@ var Dropdown = /*#__PURE__*/React__namespace.memo( /*#__PURE__*/React__namespace
1402
1551
  },
1403
1552
  onMouseDown: props.onMouseDown,
1404
1553
  onContextMenu: props.onContextMenu,
1554
+ onFocus: onFocus,
1405
1555
  'data-p-disabled': props.disabled,
1406
1556
  'data-p-focus': focusedState
1407
1557
  }, otherProps, ptm('root'));
1408
- return /*#__PURE__*/React__namespace.createElement(React__namespace.Fragment, null, /*#__PURE__*/React__namespace.createElement("div", rootProps, keyboardHelper, hiddenSelect, labelElement, clearIcon, dropdownIcon, /*#__PURE__*/React__namespace.createElement(DropdownPanel, _extends({
1558
+ var firstHiddenFocusableElementProps = mergeProps({
1559
+ ref: firstHiddenFocusableElementOnOverlay,
1560
+ role: 'presentation',
1561
+ 'aria-hidden': 'true',
1562
+ className: 'p-hidden-accessible p-hidden-focusable',
1563
+ tabIndex: '0',
1564
+ onFocus: onFirstHiddenFocus,
1565
+ 'data-p-hidden-accessible': true,
1566
+ 'data-p-hidden-focusable': true
1567
+ }, ptm('hiddenFirstFocusableEl'));
1568
+ var lastHiddenFocusableElementProps = mergeProps({
1569
+ ref: lastHiddenFocusableElementOnOverlay,
1570
+ role: 'presentation',
1571
+ 'aria-hidden': 'true',
1572
+ className: 'p-hidden-accessible p-hidden-focusable',
1573
+ tabIndex: '0',
1574
+ onFocus: onLastHiddenFocus,
1575
+ 'data-p-hidden-accessible': true,
1576
+ 'data-p-hidden-focusable': true
1577
+ }, ptm('hiddenLastFocusableEl'));
1578
+ return /*#__PURE__*/React__namespace.createElement(React__namespace.Fragment, null, /*#__PURE__*/React__namespace.createElement("div", rootProps, keyboardHelper, hiddenSelect, labelElement, clearIcon, dropdownIcon, /*#__PURE__*/React__namespace.createElement("span", firstHiddenFocusableElementProps), /*#__PURE__*/React__namespace.createElement(DropdownPanel, _extends({
1409
1579
  hostName: "Dropdown",
1410
1580
  ref: overlayRef,
1411
1581
  visibleOptions: visibleOptions,
@@ -1414,6 +1584,8 @@ var Dropdown = /*#__PURE__*/React__namespace.memo( /*#__PURE__*/React__namespace
1414
1584
  appendTo: appendTo,
1415
1585
  onClick: onPanelClick,
1416
1586
  onOptionClick: onOptionClick,
1587
+ focusedOptionIndex: focusedOptionIndex,
1588
+ setFocusedOptionIndex: setFocusedOptionIndex,
1417
1589
  filterValue: filterState,
1418
1590
  hasFilter: hasFilter,
1419
1591
  onFilterClearIconClick: onFilterClearIconClick,
@@ -1436,7 +1608,7 @@ var Dropdown = /*#__PURE__*/React__namespace.memo( /*#__PURE__*/React__namespace
1436
1608
  ptm: ptm,
1437
1609
  cx: cx,
1438
1610
  sx: sx
1439
- }))), hasTooltip && /*#__PURE__*/React__namespace.createElement(tooltip.Tooltip, _extends({
1611
+ })), /*#__PURE__*/React__namespace.createElement("span", lastHiddenFocusableElementProps)), hasTooltip && /*#__PURE__*/React__namespace.createElement(tooltip.Tooltip, _extends({
1440
1612
  target: elementRef,
1441
1613
  content: props.tooltip
1442
1614
  }, props.tooltipOptions, {