OWL
data_display
Select Menu
Odoo 19 OWL component — Select Menu (core)
Live preview
Interactive
Source excerpt
web/static/src/core/select_menu/select_menu.js
import { Component, onWillUpdateProps, useEffect, useRef, useState } from "@odoo/owl";
import { Dropdown } from "@web/core/dropdown/dropdown";
import { DropdownItem } from "@web/core/dropdown/dropdown_item";
import { useDropdownState } from "@web/core/dropdown/dropdown_hooks";
import { TagsList } from "@web/core/tags_list/tags_list";
import { mergeClasses } from "@web/core/utils/classname";
import { useChildRef } from "@web/core/utils/hooks";
import { scrollTo } from "@web/core/utils/scrolling";
import { fuzzyLookup } from "@web/core/utils/search";
import { useDebounced } from "@web/core/utils/timing";
import { hasTouch } from "@web/core/browser/feature_detection";
let selectMenuId = 0;
export const DEBOUNCED_DELAY = 250;
export class SelectMenu extends Component {
static template = "web.SelectMenu";
static choiceItemTemplate = "web.SelectMenu.ChoiceItem";
static components = { Dropdown, DropdownItem, TagsList };
static defaultProps = {
value: undefined,
id: "",
name: "",
class: "",
menuClass: "",
togglerClass: "",
multiSelect: false,
onSelect: () => {},
onNavigated: () => {},
onOpened: () => {},
onClosed: () => {},
required: false,
searchable: true,
autoSort: true,
searchPlaceholder: "",
choices: [],
groups: [],
sections: [],
disabled: false,
};
static props = {
choices: {
optional: true,
type: Array,
element: {
type: Object,
shape: {
value: true,
label: { type: String },
"*": true,
},
},
},
groups: {
type: Array,
optional: true,
element: {
type: Object,
shape: {
label: { type: String, optional: true },
choices: {
type: Array,
element: {
type: Object,
shape: {
value: true,
label: { type: String },
"*": true,
},
},
},
section: {
type: String,
optional: true,
},
},
},
},
sections: {
type: Array,
optional: true,
element: {
label: { type: String },
name: { type: String },
},
},
id: { type: String, optional: true },
name: { type: String, optional: true },
class: { type: String, optional: true },
menuClass: { type: String, optional: true },
togglerClass: { type: String, optional: true },
required: { type: Boolean, optional: true },
searchable: { type: Boolean, optional: true },
autoSort: { type: Boolean, optional: true },
placeholder: { type: String, optional: true },
searchPlaceholder: { type: String, optional: true },
searchClass: { type: String, optional: true },
value: { optional: true },
multiSelect: { type: Boolean, optional: true },
onInput: { type: Function, optional: true },
onSelect: { type: Function, optional: true },
onNavigated: { type: Function, optional: true },
onOpened: { type: Function, optional: true },
onClosed: { type: Function, optional: true },
slots: { type: Object, optional: true },
disabled: { type: Boolean, optional: true },
menuRef: { type: Function, optional: true },
};
static SCROLL_SETTINGS = {
defaultCount: 500,
increaseAmount: 300,
distanceBeforeReload: 500,
};
setup() {
Registry / API
- Registry name
SelectMenu- Category
—- Module
web- Slug
select-menu- Nav group
data_display