From e24cd301a119d493fefdc98b617994ecd986cc1c Mon Sep 17 00:00:00 2001 From: KumJungMin Date: Tue, 17 Sep 2024 00:38:41 +0900 Subject: [PATCH 1/2] fix: trigger remove chip event when the chip is visible --- components/lib/multiselect/MultiSelect.js | 26 ++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/components/lib/multiselect/MultiSelect.js b/components/lib/multiselect/MultiSelect.js index 9965f14513..c98f560964 100644 --- a/components/lib/multiselect/MultiSelect.js +++ b/components/lib/multiselect/MultiSelect.js @@ -29,8 +29,9 @@ export const MultiSelect = React.memo( const firstHiddenFocusableElementOnOverlay = React.useRef(null); const lastHiddenFocusableElementOnOverlay = React.useRef(null); const inputRef = React.useRef(props.inputRef); - const labelRef = React.useRef(null); + const labelContainerRef = React.useRef(null); const overlayRef = React.useRef(null); + const labelRef = React.useRef(null); const hasFilter = filterState && filterState.trim().length > 0; const empty = ObjectUtils.isEmpty(props.value); const equalityKey = props.optionValue ? null : props.dataKey; @@ -529,7 +530,7 @@ export const MultiSelect = React.memo( }; const alignOverlay = () => { - DomHandler.alignOverlay(overlayRef.current, labelRef.current.parentElement, props.appendTo || (context && context.appendTo) || PrimeReact.appendTo); + DomHandler.alignOverlay(overlayRef.current, labelContainerRef.current.parentElement, props.appendTo || (context && context.appendTo) || PrimeReact.appendTo); }; const isClearClicked = (event) => { @@ -827,6 +828,8 @@ export const MultiSelect = React.memo( const removeChip = (event, item) => { event.stopPropagation(); + if (!isVisible(event.target)) return; + const value = props.value.filter((val) => !ObjectUtils.equals(val, item, equalityKey)); if (props.onRemove) { @@ -839,6 +842,22 @@ export const MultiSelect = React.memo( updateModel(event, value, item); }; + const isVisible = (element) => { + const parentElement = labelRef.current; + const isOverflow = parentElement.clientWidth < parentElement.scrollWidth; + + if (!isOverflow) return true; + + const target = element.closest('[data-pc-section="token"]'); + const parentStyles = window.getComputedStyle(parentElement); + const targetStyles = window.getComputedStyle(target); + + const parentWidth = parentElement.clientWidth - parseFloat(parentStyles.paddingLeft) - parseFloat(parentStyles.paddingRight); + const targetRight = target.getBoundingClientRect().right + parseFloat(targetStyles.marginRight) - parentElement.getBoundingClientRect().left; + + return targetRight <= parentWidth; + }; + const getSelectedItemsLabel = () => { const pattern = /{(.*?)}/; const selectedItemsLabel = props.selectedItemsLabel || localeOption('selectionMessage'); @@ -1016,7 +1035,7 @@ export const MultiSelect = React.memo( const labelContainerProps = mergeProps( { - ref: labelRef, + ref: labelContainerRef, className: cx('labelContainer') }, ptm('labelContainer') @@ -1024,6 +1043,7 @@ export const MultiSelect = React.memo( const labelProps = mergeProps( { + ref: labelRef, className: cx('label', { empty }) }, ptm('label') From 87d996777fc802ccdbaedb421e7dd8461aa7d42d Mon Sep 17 00:00:00 2001 From: KumJungMin Date: Tue, 17 Sep 2024 00:56:22 +0900 Subject: [PATCH 2/2] refactor: change event target to currentTarget --- components/lib/multiselect/MultiSelect.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/lib/multiselect/MultiSelect.js b/components/lib/multiselect/MultiSelect.js index 8997813472..632e721d82 100644 --- a/components/lib/multiselect/MultiSelect.js +++ b/components/lib/multiselect/MultiSelect.js @@ -813,7 +813,7 @@ export const MultiSelect = React.memo( const removeChip = (event, item) => { event.stopPropagation(); - if (!isVisible(event.target)) return; + if (!isVisible(event.currentTarget)) return; const value = props.value.filter((val) => !ObjectUtils.equals(val, item, equalityKey));