Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
bb1645e
Update with position prop
ElishaSamPeterPrabhu Sep 11, 2024
17f51ad
Update test cases
ElishaSamPeterPrabhu Sep 11, 2024
8604b9d
Update animation for scrolling
ElishaSamPeterPrabhu Sep 12, 2024
91c383e
Update with position prop
ElishaSamPeterPrabhu Sep 11, 2024
fcb33fb
Update test cases
ElishaSamPeterPrabhu Sep 11, 2024
d6ba058
Update animation for scrolling
ElishaSamPeterPrabhu Sep 12, 2024
bb2dc2d
Merge branch '2801-autocomplete-add-position-property-to-control-comp…
ElishaSamPeterPrabhu Sep 13, 2024
ec9a0b4
Update autocomplete logic
ElishaSamPeterPrabhu Sep 16, 2024
62e6c89
Revert "Update autocomplete logic"
ElishaSamPeterPrabhu Sep 16, 2024
5b9d336
Set width
ElishaSamPeterPrabhu Sep 19, 2024
bc511a9
Merge branch 'main' into 2801-autocomplete-add-position-property-to-c…
ElishaSamPeterPrabhu Feb 17, 2025
ba4e2cf
update css
ElishaSamPeterPrabhu Feb 17, 2025
2d012a7
Merge branch 'main' into 2801-autocomplete-add-position-property-to-c…
ElishaSamPeterPrabhu Feb 17, 2025
147f883
Merge branch 'main' into 2801-autocomplete-add-position-property-to-c…
ElishaSamPeterPrabhu Feb 18, 2025
9892954
addressed css
ElishaSamPeterPrabhu Feb 18, 2025
90e48b7
Merge branch '2801-autocomplete-add-position-property-to-control-comp…
ElishaSamPeterPrabhu Feb 18, 2025
c2a14a8
modify stories
ElishaSamPeterPrabhu Feb 19, 2025
cb257b4
Update modus-autocomplete.stories.tsx
ElishaSamPeterPrabhu Feb 19, 2025
e914a2d
Update modus-table-cell-editor.tsx
ElishaSamPeterPrabhu Feb 19, 2025
6f7d93f
Update modus-table-cell-editor.tsx
ElishaSamPeterPrabhu Feb 19, 2025
25174d9
fix position
ElishaSamPeterPrabhu Feb 19, 2025
72d4f97
update resize logic
ElishaSamPeterPrabhu Feb 20, 2025
76e3a29
fix undefined case
ElishaSamPeterPrabhu Feb 20, 2025
451ff3d
Merge branch 'main' into 2801-autocomplete-add-position-property-to-c…
ElishaSamPeterPrabhu Feb 20, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 14 additions & 4 deletions stencil-workspace/src/components.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,14 @@
import { HTMLStencilElement, JSXBase } from "@stencil/core/internal";
import { ModusActionBarOptions } from "./components/modus-action-bar/modus-action-bar";
import { ModusAutocompleteOption } from "./components/modus-autocomplete/modus-autocomplete";
import { Placement } from "@popperjs/core";
import { BadgeProperties } from "./components/modus-badge/modus-badge";
import { Crumb } from "./components/modus-breadcrumb/modus-breadcrumb";
import { ButtonColor, ButtonSize, ButtonStyle, ButtonType } from "./components/modus-button/modus-button.models";
import { ButtonGroupSelectionType } from "./components/modus-button-group/modus-button-group.models";
import { ModusDataTableCellLink, ModusDataTableDisplayOptions, ModusDataTableRowAction, ModusDataTableRowActionClickEvent, ModusDataTableSelectionOptions, ModusDataTableSortEvent, ModusDataTableSortOptions, TCell, TColumn, TRow } from "./components/modus-data-table/modus-data-table.models";
import { ModusDateInputEventDetails, ModusDateInputType } from "./components/modus-date-input/utils/modus-date-input.models";
import { Placement } from "@floating-ui/dom";
import { Placement as Placement1 } from "@floating-ui/dom";
import { ModusIconName } from "./icons/ModusIconUtilities";
import { ModusNavbarApp } from "./components/modus-navbar/apps-menu/modus-navbar-apps-menu";
import { ModusNavbarButton, ModusNavbarDropdownItem, ModusNavbarDropdownOptions, ModusNavbarLogoOptions, ModusNavbarProfileMenuLink, ModusNavbarTooltip, ModusProfileMenuOptions } from "./components/modus-navbar/modus-navbar.models";
Expand All @@ -31,13 +32,14 @@ import { TreeItemSelectionChange, TreeViewItemInfo, TreeViewItemOptions } from "
import { ModusActionBarOptions as ModusActionBarOptions1 } from "./components/modus-action-bar/modus-action-bar";
export { ModusActionBarOptions } from "./components/modus-action-bar/modus-action-bar";
export { ModusAutocompleteOption } from "./components/modus-autocomplete/modus-autocomplete";
export { Placement } from "@popperjs/core";
export { BadgeProperties } from "./components/modus-badge/modus-badge";
export { Crumb } from "./components/modus-breadcrumb/modus-breadcrumb";
export { ButtonColor, ButtonSize, ButtonStyle, ButtonType } from "./components/modus-button/modus-button.models";
export { ButtonGroupSelectionType } from "./components/modus-button-group/modus-button-group.models";
export { ModusDataTableCellLink, ModusDataTableDisplayOptions, ModusDataTableRowAction, ModusDataTableRowActionClickEvent, ModusDataTableSelectionOptions, ModusDataTableSortEvent, ModusDataTableSortOptions, TCell, TColumn, TRow } from "./components/modus-data-table/modus-data-table.models";
export { ModusDateInputEventDetails, ModusDateInputType } from "./components/modus-date-input/utils/modus-date-input.models";
export { Placement } from "@floating-ui/dom";
export { Placement as Placement1 } from "@floating-ui/dom";
export { ModusIconName } from "./icons/ModusIconUtilities";
export { ModusNavbarApp } from "./components/modus-navbar/apps-menu/modus-navbar-apps-menu";
export { ModusNavbarButton, ModusNavbarDropdownItem, ModusNavbarDropdownOptions, ModusNavbarLogoOptions, ModusNavbarProfileMenuLink, ModusNavbarTooltip, ModusProfileMenuOptions } from "./components/modus-navbar/modus-navbar.models";
Expand Down Expand Up @@ -199,6 +201,10 @@ export namespace Components {
* The autocomplete's input placeholder.
*/
"placeholder": string;
/**
* (optional) The placement of the options
*/
"position": Placement;
/**
* Whether the autocomplete is read-only.
*/
Expand Down Expand Up @@ -584,7 +590,7 @@ export namespace Components {
/**
* (optional) The placement of the calendar popup
*/
"position": Placement | 'auto' | 'auto-start' | 'auto-end';
"position": Placement1 | 'auto' | 'auto-start' | 'auto-end';
}
interface ModusDivider {
}
Expand Down Expand Up @@ -3181,6 +3187,10 @@ declare namespace LocalJSX {
* The autocomplete's input placeholder.
*/
"placeholder"?: string;
/**
* (optional) The placement of the options
*/
"position"?: Placement;
/**
* Whether the autocomplete is read-only.
*/
Expand Down Expand Up @@ -3610,7 +3620,7 @@ declare namespace LocalJSX {
/**
* (optional) The placement of the calendar popup
*/
"position"?: Placement | 'auto' | 'auto-start' | 'auto-end';
"position"?: Placement1 | 'auto' | 'auto-start' | 'auto-end';
}
interface ModusDivider {
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,12 @@
margin: 0;
padding: 0;
position: absolute;
width: 100%;
width: auto;

&[data-popper-reference-hidden] {
pointer-events: none;
visibility: hidden;
}

.icon-check {
display: inline-flex;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ describe('modus-autocomplete', () => {
<modus-text-input aria-autocomplete="list" aria-controls="${listId}" class="input" role="combobox" autocomplete="off" size="medium" type="search" value=""></modus-text-input>
</div>
<div class="error"></div>
<div class="options-container" style="max-height: 300px; z-index: 1; overflow-y: auto;">
<div class="options-container" part="options-container" style="max-height: 300px; z-index: 1; overflow-y: auto; position: absolute; left: 0; top: 0; margin: 0;">
<ul aria-label="options" id="${listId}" role="listbox"></ul>
</div>
<div style="display: none;">
Expand Down Expand Up @@ -57,7 +57,7 @@ describe('modus-autocomplete', () => {
<modus-text-input aria-autocomplete="list" aria-controls="${listId}" class="input" role="combobox" autocomplete="off" size="medium" type="search" value=""></modus-text-input>
</div>
<div class="error"></div>
<div class="options-container" style="max-height: 300px; z-index: 1; overflow-y: auto;">
<div class="options-container" part="options-container" style="max-height: 300px; z-index: 1; overflow-y: auto; position: absolute; left: 0; top: 0; margin: 0;">
<ul aria-label="options" id="${listId}" role="listbox"></ul>
</div>
<div style="display: none;">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import {
import { IconSearch } from '../../icons/svgs/icon-search';
import { generateElementId } from '../../utils/utils';
import { IconCheck } from '../../icons/generated-icons/IconCheck';
import { createPopper, Instance, Placement } from '@popperjs/core';
import { IconClose } from '../../icons/svgs/icon-close';

export interface ModusAutocompleteOption {
Expand Down Expand Up @@ -76,6 +77,9 @@ export class ModusAutocomplete {
/** A promise that returns the filtered options. */
@Prop() filterOptions: (search: string) => Promise<ModusAutocompleteOption[] | string[]>;

/** (optional) The placement of the options */
@Prop() position: Placement = 'bottom-start';

/** An array to hold the selected chips. */
@State() selectedChips: ModusAutocompleteOption[] = [];

Expand All @@ -88,6 +92,8 @@ export class ModusAutocomplete {
/** Whether to show autocomplete's options when focus. */
@Prop() showOptionsOnFocus: boolean;

private popperInstance: Instance;

@Watch('options')
watchOptions() {
this.convertOptions();
Expand Down Expand Up @@ -148,6 +154,58 @@ export class ModusAutocomplete {
@State() ShowItemsOnKeyDown = false;
private listId = generateElementId() + '_list';

private resizeObserver: ResizeObserver;

componentDidLoad(): void {
this.convertOptions();
if (this.multiple) {
this.initializeSelectedChips();
}
this.initializePopper();

const chipsContainer = this.el.shadowRoot.querySelector('.chips-container');
if (chipsContainer && typeof ResizeObserver !== 'undefined') {
this.resizeObserver = new ResizeObserver(() => {
if (this.popperInstance) {
this.popperInstance.update();
}
});
this.resizeObserver.observe(chipsContainer);
}
}

disconnectedCallback(): void {
if (this.popperInstance) {
this.popperInstance.destroy();
}
if (this.resizeObserver) {
this.resizeObserver.disconnect();
}
}


initializePopper(): void {
const optionsContainer = this.el.shadowRoot.querySelector(`.options-container`) as HTMLElement;
const referenceElement = this.el.shadowRoot.querySelector(`.chips-container`) as HTMLElement;

this.popperInstance = createPopper(referenceElement, optionsContainer, {
placement: this.position,
strategy: this.position === 'bottom' ? 'fixed' : 'absolute',
modifiers: [
{
name: 'offset',
options: {
offset: [0, 2],
},
},
],
});

if (referenceElement.offsetWidth && optionsContainer) {
optionsContainer.style.width = `${referenceElement.offsetWidth}px`;
}
}

componentWillLoad(): void {
this.convertOptions();
if (this.multiple) {
Expand Down Expand Up @@ -520,7 +578,7 @@ export class ModusAutocomplete {
const selectedOption = optionList.querySelector('li.selected') as HTMLElement;

if (selectedOption) {
selectedOption.scrollIntoView({ behavior: 'smooth', inline: 'nearest' });
selectedOption.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
}
};

Expand Down Expand Up @@ -589,6 +647,7 @@ export class ModusAutocomplete {
<div class={'error'}>{this.errorText ? <label class="sub-text error">{this.errorText}</label> : null}</div>
<div
class="options-container"
part="options-container"
style={{ maxHeight: this.dropdownMaxHeight, zIndex: this.dropdownZIndex, overflowY: 'auto' }}>
<ul id={this.listId} aria-label="options" role="listbox">
{this.displayOptions() &&
Expand Down
Loading
Loading