diff --git a/src/components/autocomplete/AutoComplete.d.ts b/src/components/autocomplete/AutoComplete.d.ts
index 9bdbcf180..1dad8d119 100755
--- a/src/components/autocomplete/AutoComplete.d.ts
+++ b/src/components/autocomplete/AutoComplete.d.ts
@@ -4,6 +4,8 @@ interface AutoCompleteProps {
modelValue?: any;
suggestions?: any[];
field?: string|Function;
+ optionGroupLabel?: string;
+ optionGroupChildren?: string;
scrollHeight?: string;
dropdown?: boolean;
dropdownMode?: string;
diff --git a/src/components/autocomplete/AutoComplete.vue b/src/components/autocomplete/AutoComplete.vue
index 20bba80bd..bf1363812 100755
--- a/src/components/autocomplete/AutoComplete.vue
+++ b/src/components/autocomplete/AutoComplete.vue
@@ -16,13 +16,25 @@
+
- -
-
- {{getItemContent(item)}}
-
-
+
+ -
+ {{getItemContent(item)}}
+
+
+
+
+ -
+ {{getOptionGroupLabel(optionGroup)}}
+
+ -
+ {{getItemContent(item)}}
+
+
+
+
@@ -49,6 +61,8 @@ export default {
type: [String,Function],
default: null
},
+ optionGroupLabel: null,
+ optionGroupChildren: null,
scrollHeight: {
type: String,
default: '200px'
@@ -102,7 +116,6 @@ export default {
watch: {
suggestions() {
if (this.searching) {
-
if (this.suggestions && this.suggestions.length)
this.showOverlay();
else
@@ -129,6 +142,15 @@ export default {
}
},
methods: {
+ getOptionGroupRenderKey(optionGroup) {
+ return ObjectUtils.resolveFieldData(optionGroup, this.optionGroupLabel);
+ },
+ getOptionGroupLabel(optionGroup) {
+ return ObjectUtils.resolveFieldData(optionGroup, this.optionGroupLabel);
+ },
+ getOptionGroupChildren(optionGroup) {
+ return ObjectUtils.resolveFieldData(optionGroup, this.optionGroupChildren);
+ },
onOverlayEnter() {
this.overlay.style.zIndex = String(DomHandler.generateZIndex());
this.appendContainer();
@@ -328,7 +350,7 @@ export default {
//down
case 40:
if (highlightItem) {
- let nextElement = highlightItem.nextElementSibling;
+ let nextElement = this.findNextItem(highlightItem);
if (nextElement) {
DomHandler.addClass(nextElement, 'p-highlight');
DomHandler.removeClass(highlightItem, 'p-highlight');
@@ -336,7 +358,14 @@ export default {
}
}
else {
- DomHandler.addClass(this.overlay.firstChild.firstElementChild, 'p-highlight');
+ highlightItem = this.overlay.firstElementChild.firstElementChild;
+ if (DomHandler.hasClass(highlightItem, 'p-autocomplete-item-group')) {
+ highlightItem = this.findNextItem(highlightItem);
+ }
+
+ if (highlightItem) {
+ DomHandler.addClass(highlightItem, 'p-highlight');
+ }
}
event.preventDefault();
@@ -345,7 +374,7 @@ export default {
//up
case 38:
if (highlightItem) {
- let previousElement = highlightItem.previousElementSibling;
+ let previousElement = this.findPrevItem(highlightItem);
if (previousElement) {
DomHandler.addClass(previousElement, 'p-highlight');
DomHandler.removeClass(highlightItem, 'p-highlight');
@@ -407,6 +436,22 @@ export default {
}
}
},
+ findNextItem(item) {
+ let nextItem = item.nextElementSibling;
+
+ if (nextItem)
+ return DomHandler.hasClass(nextItem, 'p-autocomplete-item-group') ? this.findNextItem(nextItem) : nextItem;
+ else
+ return null;
+ },
+ findPrevItem(item) {
+ let prevItem = item.previousElementSibling;
+
+ if (prevItem)
+ return DomHandler.hasClass(prevItem, 'p-autocomplete-item-group') ? this.findPrevItem(prevItem) : prevItem;
+ else
+ return null;
+ },
onChange(event) {
if (this.forceSelection) {
let valid = false;
diff --git a/src/views/autocomplete/AutoCompleteDemo.vue b/src/views/autocomplete/AutoCompleteDemo.vue
index d695f86eb..1a7ec56f5 100755
--- a/src/views/autocomplete/AutoCompleteDemo.vue
+++ b/src/views/autocomplete/AutoCompleteDemo.vue
@@ -13,6 +13,16 @@
Basic
+ Grouped
+
+
+
+
![](../../assets/images/flag_placeholder.png)
+
{{slotProps.item.label}}
+
+
+
+
Dropdown, Templating and Force Selection
@@ -37,6 +47,7 @@