diff --git a/packages/primeng/src/api/overlayoptions.ts b/packages/primeng/src/api/overlayoptions.ts index f7b74ba633d..ae2dd9b9de7 100644 --- a/packages/primeng/src/api/overlayoptions.ts +++ b/packages/primeng/src/api/overlayoptions.ts @@ -158,6 +158,10 @@ export interface OverlayOptions { * The motion options for the overlay. */ motionOptions?: MotionOptions; + /** + * Indicates whether the overlay should have a max-width based on the target element. + */ + autoMaxWidth?: boolean; /** * Indicates whether the overlay should be hidden when the escape key is pressed. */ diff --git a/packages/primeng/src/multiselect/multiselect.ts b/packages/primeng/src/multiselect/multiselect.ts index 8bf24c5ceda..527463f6ccc 100755 --- a/packages/primeng/src/multiselect/multiselect.ts +++ b/packages/primeng/src/multiselect/multiselect.ts @@ -89,7 +89,7 @@ export const MULTISELECT_VALUE_ACCESSOR: any = { - {{ label ?? 'empty' }} + {{ label ?? 'empty' }} `, encapsulation: ViewEncapsulation.None, @@ -293,7 +293,7 @@ export class MultiSelectItem extends BaseComponent { #overlay [hostAttrSelector]="$attrSelector" [(visible)]="overlayVisible" - [options]="overlayOptions" + [options]="{ ...overlayOptions, autoMaxWidth: autoWidth }" [target]="'@parent'" [appendTo]="$appendTo()" [unstyled]="unstyled()" @@ -740,6 +740,11 @@ export class MultiSelect extends BaseEditableHolder { * @group Props */ @Input({ transform: booleanAttribute }) autofocusFilter: boolean = false; + /** + * Whether the width of the overlay mirrors the width of the component. + * @group Props + */ + @Input({ transform: booleanAttribute }) autoWidth: boolean = true; /** * Defines how the selected items are displayed. * @group Props diff --git a/packages/primeng/src/multiselect/style/multiselectstyle.ts b/packages/primeng/src/multiselect/style/multiselectstyle.ts index 3f71201ce68..984486fb390 100644 --- a/packages/primeng/src/multiselect/style/multiselectstyle.ts +++ b/packages/primeng/src/multiselect/style/multiselectstyle.ts @@ -14,6 +14,18 @@ const style = /*css*/ ` p-multiselect.ng-invalid.ng-dirty .p-multiselect-label.p-placeholder { color: dt('multiselect.invalid.placeholder.color'); } + + .p-multiselect-option-label { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .p-multiselect-label { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } `; const inlineStyles = { @@ -63,6 +75,7 @@ const classes = { 'p-disabled': instance.disabled, 'p-focus': instance.focused }), + optionLabel: 'p-multiselect-option-label', emptyMessage: 'p-multiselect-empty-message', clearIcon: 'p-multiselect-clear-icon' }; @@ -156,6 +169,10 @@ export enum MultiSelectClasses { * Class name of the option element */ option = 'p-multiselect-option', + /** + * Class name of the option label element + */ + optionLabel = 'p-multiselect-option-label', /** * Class name of the empty message element */ diff --git a/packages/primeng/src/overlay/overlay.ts b/packages/primeng/src/overlay/overlay.ts index 04e9eb5973c..f6ae3663cd0 100644 --- a/packages/primeng/src/overlay/overlay.ts +++ b/packages/primeng/src/overlay/overlay.ts @@ -602,7 +602,15 @@ export class Overlay extends BaseComponent { alignOverlay() { if (!this.modal) { if (this.overlayEl && this.targetEl) { - this.overlayEl.style.minWidth = getOuterWidth(this.targetEl) + 'px'; + const targetWidth = getOuterWidth(this.targetEl); + this.overlayEl.style.minWidth = targetWidth + 'px'; + + if (this.overlayOptions.autoMaxWidth) { + this.overlayEl.style.maxWidth = targetWidth + 'px'; + } else { + this.overlayEl.style.maxWidth = ''; + } + if (this.$appendTo() === 'self') { relativePosition(this.overlayEl, this.targetEl); } else { diff --git a/packages/primeng/src/select/select.ts b/packages/primeng/src/select/select.ts index 320c7463e1e..0ce5ace4195 100755 --- a/packages/primeng/src/select/select.ts +++ b/packages/primeng/src/select/select.ts @@ -96,7 +96,7 @@ export const SELECT_VALUE_ACCESSOR: any = { - {{ label ?? 'empty' }} + {{ label ?? 'empty' }} `, @@ -272,7 +272,7 @@ export class SelectItem extends BaseComponent { #overlay [hostAttrSelector]="$attrSelector" [(visible)]="overlayVisible" - [options]="overlayOptions" + [options]="{ ...overlayOptions, autoMaxWidth: autoWidth }" [target]="'@parent'" [appendTo]="$appendTo()" [unstyled]="unstyled()" @@ -680,6 +680,11 @@ export class Select extends BaseInput implements AfterViewIni * @group Props */ @Input({ transform: booleanAttribute }) autofocusFilter: boolean = true; + /** + * Whether the width of the overlay mirrors the width of the component. + * @group Props + */ + @Input({ transform: booleanAttribute }) autoWidth: boolean = true; /** * When specified, filter displays with this value. * @group Props diff --git a/packages/primeng/src/select/style/selectstyle.ts b/packages/primeng/src/select/style/selectstyle.ts index 90c4e39c687..bf5f063cde9 100644 --- a/packages/primeng/src/select/style/selectstyle.ts +++ b/packages/primeng/src/select/style/selectstyle.ts @@ -18,6 +18,18 @@ const style = /*css*/ ` .p-select.ng-invalid.ng-dirty .p-select-label.p-placeholder { color: dt('select.invalid.placeholder.color'); } + + .p-select-option-label { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .p-select-label { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } `; const classes = {