Odoo Widgets Reference
212 widgets documented. What each widget does, how to enable it in Studio with no code, and every developer option — verified against the Odoo source.
Core / Web59
Of Odoo's three clipboard widgets, <code>CopyClipboardButton</code> is the only one that hides the value: just a button that puts the field's content on the clipboard, and nothing at all when the field is empty.
Read the guide CopyClipboardCharcharOne of the only CamelCase widget names in Odoo core: <strong>CopyClipboardChar</strong> puts a one-click copy button next to a text value. Small widget, several sharp edges.
Read the guide CopyClipboardURLcharShare links, webhook endpoints, portal URLs: <code>CopyClipboardURL</code> renders a char field as a clickable link with a one-click copy button, and its name is one of the few in Odoo where capitalization matters.
Read the guide account_json_checkboxesjsonThe checkbox rows on Odoo's invoice Send wizard are not boolean fields: <strong>account_json_checkboxes</strong> renders a whole JSON dict as a group of checkboxes, each with its own label, lock and help icon.
Read the guide attachment_imagemany2oneThe picture on a project task's kanban card is not a binary field. It is <code>attachment_image</code>: a tiny display-only widget that turns a <strong>many2one to ir.attachment</strong> into a 300x300 image.
Read the guide badgeselection, many2one, charThe <code>badge</code> widget renders a field's value as a colored pill, and its color comes from <strong>decoration expressions</strong> you write in the view or an integer <strong>color field</strong> on the record.
Read the guide binarybinaryThe default upload and download control for every <strong>binary</strong> field in Odoo. Its behavior is simple; the <code>filename</code> wiring around it is where implementations go wrong.
Read the guide booleanbooleanThe default <strong>Checkbox</strong> for every boolean field in Odoo: what the bare <code>boolean</code> widget does, why it never hides, and when to trade it for a toggle, star, or favorite variant.
Read the guide boolean_favoritebooleanThe clickable star on products, journals and applicants. The <strong>boolean_favorite</strong> widget looks like a toggle and behaves like a save button, which is exactly what teams need to know before adopting it.
Read the guide boolean_iconbooleanA boolean drawn as a single icon rather than a checkbox or a switch. One option changes the glyph, and the label comes from the field's own string.
Read the guide boolean_togglebooleanThe <code>boolean_toggle</code> widget renders a boolean as a switch, and by default a flip <strong>saves the record immediately</strong>. That one behavior is most of what you need to know about it.
Read the guide charchar, textThe default renderer for every text field in Odoo, and the base a dozen other widgets extend. It declares one option and quietly accepts three more.
Read the guide codetext, htmlOne widget, two names: <code>code</code> and <code>ace</code> are the same registered descriptor that swaps a plain textarea for a real Ace editor with syntax highlighting, dark mode, and careful save semantics.
Read the guide colorcharThe <code>color</code> widget turns a plain char field into a native color swatch storing <strong>#RRGGBB</strong>. Its one option, <code>autosave</code>, is already on in list and kanban views, and Odoo 20 removes it.
Read the guide color_pickerintegerThe <code>color_picker</code> widget edits the integer 0 to 11 behind Odoo's standard palette, the same twelve colors tags, badges and kanban cards read.
Read the guide contact_imagebinary, many2oneNew in Odoo 19: the photo frame on contact and user forms is its own widget. <code>contact_image</code> extends the image field with one trick, when the photo is empty it shows the record's <strong>generated avatar</strong> and a centered <strong>Add Photo</strong> button.
Read the guide domainchar, textThe point-and-click filter builder behind automation rules, mailing lists and reordering rules. The <strong>domain</strong> widget turns a char field into Odoo's condition editor, live record count included.
Read the guide emailcharThe <code>email</code> widget makes addresses actionable: a <code>mailto:</code> link in lists, an envelope button on forms. What it deliberately does not do, validate addresses beyond the browser's loose check, is just as important to know.
Read the guide field_selectorcharThe <strong>field selector</strong> puts Odoo's field-path picker on a char field: users browse a model's fields, drill through relations like <code>partner_id.country_id.code</code>, and the dotted path is what gets stored.
Read the guide filterable_selectionselection, many2one (inherited from the selection field)One selection field, different choices per view: <code>filterable_selection</code> filters a selection's dropdown with a whitelist, a blacklist, or a list read live from another field on the record, without touching the model.
Read the guide floatfloat, monetaryEvery decimal number in Odoo passes through the <code>float</code> widget. Its option panel hides a naming trap, and since 19.0 the input quietly evaluates math. Here is the full, source-verified picture.
Read the guide float_timefloatThe <code>float_time</code> widget displays a <strong>float of hours</strong> as clock-style time: 8.5 renders as 08:30. Storage stays a plain float, so sums and reports keep working.
Read the guide google_slide_viewerchar, textPaste a Google Docs link into a text field and get the deck embedded on the form. The URL is rewritten by a regular expression, and the starting page comes from a companion field named by convention.
Read the guide handleintegerThe drag dots on the left of Odoo list rows are the <code>handle</code> widget. It has no options at all; everything that matters happens in the <strong>sequence field</strong> underneath it.
Read the guide htmlhtmlThe <strong>HTML field</strong> is Odoo's rich text editor: checklists, tables, images, slash commands. Under the hood it is two widgets wearing one name, and its options live nowhere in the documentation.
Read the guide iframe_wrappertext, htmlFor HTML that is a whole document rather than a fragment: styles, head metadata, the lot. It writes the value straight into an iframe, and the source explains at length why.
Read the guide imagebinary, many2oneThe <code>image</code> widget displays and uploads pictures on binary fields, with more options than any other display widget, including a WebP pipeline that quietly generates five sizes per upload.
Read the guide image_urlchar<code>image_url</code> renders a plain char field as an image, fetched by the browser straight from the URL it contains. Nothing is downloaded or stored server side, which is exactly its power and its caveat.
Read the guide kanban_color_pickerinteger (color index)The color palette inside a kanban card's dropdown menu is one widget: <code>kanban_color_picker</code>. Zero options, one strong opinion: picking a color <strong>saves immediately</strong>.
Read the guide label_selectionselectionPaid in green, Cancelled in red: <code>label_selection</code> paints a selection value as a colored label using one option, <code>classes</code>, a plain mapping from value to color. It displays; it never edits.
Read the guide many2manymany2many, one2manyThe default face of a many2many field is an embedded table of linked records with an Add line that opens a selection dialog. Less known: writing <code>widget="many2many"</code> on a <strong>one2many</strong> field flips it into link and unlink mode, a trick Odoo core itself uses.
Read the guide many2many_binarymany2manySeveral files on one record, uploaded in one go: the <strong>many2many_binary</strong> widget turns a many2many to <code>ir.attachment</code> into Odoo's multi file upload zone.
Read the guide many2many_checkboxesmany2manyThe <strong>Checkboxes field</strong> lists every record of a relation as a tickbox: no search, no create, the whole choice space visible at once. Ideal for short fixed sets like product routes.
Read the guide many2many_tagsmany2many, one2manyThe Odoo <strong>Tags</strong> field: what it does, how to set it up in Studio without code, and every option it supports.
Read the guide many2many_tags_avatarmany2many, one2manyThe <strong>avatar tags field</strong> renders people-type relations as pills with faces: each tag carries the record's avatar, and kanban cards get a quick-assign popover.
Read the guide many2onemany2oneThe autocomplete dropdown on Customer, Product and every other record link in Odoo is the <code>many2one</code> widget. It is the default for its field type, which is why you rarely type its name, and why its options are worth knowing by heart.
Read the guide many2one_avatarmany2oneThe generic avatar dropdown: a standard many2one with the linked record's picture in front of its name. Same options as <code>many2one</code>, plus one opening rule of its own.
Read the guide many2one_barcodemany2one<code>many2one_barcode</code> is the smallest widget on this site with a real job: it is the standard many2one with the mobile barcode scanner permanently switched on, so warehouse and accounting users fill product fields by pointing a camera at a label.
Read the guide monetarymonetary, float, integerThe <strong>Monetary</strong> widget renders an amount with the record's currency symbol and precision. Most of its behavior comes from the currency, not the field, and that is where teams get surprised.
Read the guide one2manyone2many, many2manyOrder lines, BoM components, task checklists: the <strong>one2many</strong> widget is the embedded table Odoo runs on, and its options can do more than the documentation admits.
Read the guide pdf_viewerbinaryA stored PDF rendered inline instead of offered as a download. It hides the viewer's own download and print buttons, and it declares an option the code never actually reads.
Read the guide percentagefloat, integerThe <code>percentage</code> widget shows a stored <strong>fraction</strong> as percent: 0.15 displays as 15%, and typing 15 stores 0.15. One convention, consistently applied on both directions.
Read the guide percentpiefloat, integerThe little circles on a mailing's statistics, Opened 54%, Clicked 12%, are <code>percentpie</code>: a display-only widget that draws a number as a filled circle using nothing but a CSS conic-gradient.
Read the guide phonecharPhone numbers in Odoo are plain char fields until the <code>phone</code> widget makes them callable: a <code>tel:</code> link in lists, a Call button on forms, and, courtesy of the <code>sms</code> module, an SMS button you can switch off.
Read the guide priorityselectionThe stars on tasks and leads are the <code>priority</code> widget over a plain <strong>selection field</strong>. Clicking a star saves immediately, and clicking the current one clears it, both verified in the source.
Read the guide progressbarinteger, floatOdoo's <strong>Progress Bar</strong> widget: five options in 19, an undocumented numeric trick, and a development branch that quietly deletes most of them for Odoo 20.
Read the guide propertiespropertiesThe <strong>Properties field</strong> lets end users bolt their own fields onto records, per project, per team, per parent, without Studio, without a developer, and without touching the database schema.
Read the guide radioselection, many2oneThe <code>radio</code> widget lays every choice of a <strong>selection or many2one</strong> field out as radio buttons, so users see all options before picking one.
Read the guide remaining_daysdate, datetimeThe widget behind every <strong>Today</strong>, <strong>In 3 days</strong> and <strong>2 days ago</strong> in Odoo. One undocumented option controls the colors, and Odoo 20 renames the whole widget.
Read the guide section_one2manyone2manyWorking schedules in Odoo show Morning and Afternoon as bold rows spanning the whole table. That layout is <code>section_one2many</code>, a resource module one2many whose section rows are ordinary records with <code>display_type = 'line_section'</code> and a hardcoded <code>title</code> field.
Read the guide selectionmany2one, selectionThe default dropdown behind every <strong>Selection</strong> field in Odoo, and the widget that turns a many2one into a closed list. How it works, what it hides, and where it trips teams up.
Read the guide selection_badgeselection, many2oneWhen every option should be visible and one click away, <code>selection_badge</code> replaces the dropdown with a row of pills. It also hides three behaviors nobody expects: a self-clearing click, a text-only readonly mode, and a full reload of many2one options.
Read the guide state_selectionselectionThe small gray, red or green bullet on kanban cards and list rows is the <code>state_selection</code> widget. It turns a three value selection field into a one click status dropdown, and its label behavior is stranger than the docs admit.
Read the guide statinfofloat, integer, monetary, char, one2many, many2oneThe number inside an Odoo smart button, such as <strong>3 Invoices</strong>, is rendered by the <code>statinfo</code> widget. Here is how it works, what it can show, and how to control its label and decimals.
Read the guide statusbarmany2one, selectionThe stage strip at the top of Odoo forms is the <code>statusbar</code> widget. It shows where the record stands, lets users click to move it, and hides two keyboard shortcuts almost nobody uses.
Read the guide texttext, char, htmlOdoo's <strong>Multiline Text</strong> widget: the auto-growing textarea behind every notes box. Two documented options, two undocumented ones, and a quiet type change in Odoo 19.
Read the guide tour_start_widgetchar, textThe <strong>Onboarding</strong> and <strong>Testing</strong> buttons on Odoo's Tours screen are one widget: <code>tour_start_widget</code>, a char field that never shows its value and instead launches the tour in manual or automated mode.
Read the guide upgrade_booleanbooleanThe settings checkboxes that open an upgrade popup on Community are one widget: <code>upgrade_boolean</code>. On Enterprise it is an ordinary checkbox; on Community it can <strong>never stay checked</strong>.
Read the guide urlcharThe <code>url</code> widget turns a char field into a link that opens in a new tab, quietly prefixes <code>http://</code> when the scheme is missing, and hides one of Odoo's least known tricks: a <code>text</code> attribute that replaces the visible URL with friendly link text.
Read the guideWebsite / Marketing12
A copy button for a job posting's link, with a notification confirming the copy rather than a silent state change.
Read the guide EventMailTemplateReferenceFieldreference, charThe template picker on Odoo's event communication lines is a tuned <code>reference</code> widget: <code>EventMailTemplateReferenceField</code> preselects the first template model, marks mail templates with an envelope, and refuses to open records from readonly rows.
Read the guide boolean_phonebooleanNew in Odoo 19, <strong>boolean_phone</strong> is the smallest kind of widget: a boolean that renders a phone icon when true and nothing at all when false, built to show which livechat agents are currently in a call.
Read the guide char_emojischar, textThe <strong>char_emojis</strong> widget is a standard single-line text input with one addition: an emoji button that opens Odoo's full emoji picker and inserts the chosen emoji at the cursor.
Read the guide chatbot_steps_one2manyone2manyThe steps list in Odoo's chatbot builder. Saving the whole script after every step sounds heavy-handed until you try building a script without it.
Read the guide im_livechat.rating_percentageinteger, float (as a pivot/graph measure)Unusual entry in the widget inventory: <code>im_livechat.rating_percentage</code> is not a field widget at all. It is a <strong>formatter</strong> that turns Livechat's 1 to 5 rating scale into a 0 to 100 percentage inside pivot and graph reports.
Read the guide page_urlcharThe address bar for a website page. It hides the leading slash while you type, puts it back when saving, and nudges the server to show you what a rename would break before you commit.
Read the guide text_emojistext, charThe multi-line text field with an emoji button attached. Small feature, and the only reason it exists is that social and marketing copy without emoji reads like a memo.
Read the guide website_publish_buttonbooleanThe <strong>Published</strong> smart button that turns into red <strong>Unpublish</strong> when you hover it is two parts: a server method and this widget. <code>website_publish_button</code> renders the label; it toggles nothing itself.
Read the guide website_redirect_buttonbooleanThe <strong>website redirect button</strong> turns the <code>is_published</code> flag into a header button that reads Published or Unpublished and jumps straight to the record's public page.
Read the guide website_urlscharOne core view asks for <code>widget="website_urls"</code>. Nothing in Odoo registers that name, in any version we checked. The field still renders, and this page explains exactly why.
Read the guide x2_many_media_viewerone2many, many2manyThe <strong>Add Media</strong> gallery on eCommerce products is a one2many wearing a media manager. <code>x2_many_media_viewer</code> swaps the usual Add row for Odoo's image and video dialog, and can transcode every upload to WebP.
Read the guideAccounting / Localization29
The Copy button on a payment link, with one addition: it waits for the record to finish updating before it copies. Without that, a fast click copies the previous link.
Read the guide account-tax-totals-fieldJSON value (no supportedTypes declared; core stores it in a computed binary field)The untaxed, tax and total block at the bottom right of every Odoo invoice is one widget: <code>account-tax-totals-field</code>. It renders a JSON payload, and it quietly lets you type over a computed tax amount.
Read the guide account_batch_sending_summaryjsonBefore Odoo sends fifty invoices, it tells you how each one will go out. This widget is the read-only panel that shows that answer, and it reads the value exactly once.
Read the guide account_document_stateselection, many2oneGovernment e-invoicing replies rarely fit in a status column. <code>account_document_state</code> renders the selection state and, whenever the record carries a <code>message</code>, adds an info icon whose popover shows the full text with a copy button.
Read the guide account_type_selectionselection (many2one also accepted through the base selection widget)The Type dropdown on an Odoo account is not a flat list. The <code>account_type_selection</code> widget buckets every account type under <strong>Balance Sheet</strong> and <strong>Profit & Loss</strong> headings so accountants pick from a structured tree instead of a 15 item flat list.
Read the guide actionable_errorsjsonThe <strong>actionable errors widget</strong> turns a computed JSON field into a stack of ranked alert boxes, each with a button that jumps the user straight to the fix.
Read the guide analytic_distributionjsonThe field that splits a journal item across analytic accounts by percentage is one widget: <code>analytic_distribution</code>. Eight options, a tag-based editor, and a type change in 19 worth knowing about.
Read the guide auto_save_res_partnerone2many, many2manyA child list that saves its parent before letting you add a row. Seven lines of code for a problem that otherwise produces confusing errors on brand new contacts.
Read the guide autosave_many2many_tax_tagsmany2manyTaxes on a journal entry line are not just a value, they generate other lines. This widget saves the whole entry the moment they change, so the tax lines appear immediately instead of at the end.
Read the guide char_with_placeholder_fieldchar, textA char field that never looks empty: <code>char_with_placeholder_field</code> shows the placeholder as a muted value, so users see the default Odoo will apply before it is applied.
Read the guide char_with_placeholder_field_to_checkchar, textThe widget behind Odoo 19's <strong>To review</strong> pill on journal entry lists: a char field that flags posted, unreviewed entries to accountants, and quietly disappears again in Odoo 20.
Read the guide confirm_booleanbooleanA switch that stops and asks before it loses data. It only asks in one direction, and once you confirm it saves straight away rather than waiting for the form.
Read the guide dynamic_selectionselectionA selection field always offers every value it declares, unless you render it with <code>dynamic_selection</code>, the small account-module widget that shows only the options another field on the record allows. Odoo's e-invoicing localizations run on it.
Read the guide grouped_view_widgettext (JSON string)The <strong>grouped_view_widget</strong> renders a read-only, grouped table from a JSON string, and it is how the Accrued Orders wizard shows you the entries it is about to book before you commit.
Read the guide l10n_ro_edi_stock_document_stateselection, many2oneRomania's e-Transport replies can be one error or ten. <code>l10n_ro_edi_stock_document_state</code> takes Odoo's document state widget and reformats the popover: single messages stay plain, multiple errors become a bulleted list.
Read the guide line_open_move_widgetmany2oneA many2one field whose internal-link arrow does not open the record you expect, on purpose: <strong>line_open_move_widget</strong> routes analytic lines to the journal item's real business document.
Read the guide list_activityone2many (always activity_ids)The <strong>Next Activity</strong> column in Odoo list views, the little clock with a summary next to it, is the <code>list_activity</code> widget. It has no options at all; everything it shows comes from six activity fields it loads for you.
Read the guide mail_attachmentsjsonThe attachment list on Odoo's invoice send wizard. It knows the difference between a file you added, a file the system generated, and a file that must not be deleted, and it cleans up after itself when you close the wizard.
Read the guide mail_composer_template_selectormany2one (mail.template; the descriptor declares no supportedTypes)The small three dot Templates button in Odoo's email composer footer is the <code>mail_composer_template_selector</code> widget. It loads your templates first, shared ones second, and quietly hides its management entries when a context key says so.
Read the guide many2many_tags_banksmany2many, one2manyPartner bank accounts rendered as tags, each showing whether outgoing payments are allowed. It also saves the partner behind your back, and there is a good reason for that.
Read the guide many2many_tags_journalsmany2manyThe <strong>many2many_tags_journals</strong> widget is the Tags field with one accounting-specific trick: when a Multi-ledger group belongs to no company, every journal pill spells out which company it comes from.
Read the guide many2many_tax_tagsmany2many, one2many<code>many2many_tax_tags</code> is the tags widget tuned for accounting: identical options, one deliberate change, the dropdown <strong>always offers Search More</strong>, because tax grids are long and picking the wrong one is a filing error.
Read the guide nemhandel_verification_codecharSix single character boxes for the code sent by SMS, with focus that moves as you type and a paste handler that fills the rest from wherever you started.
Read the guide open_move_widgetcharThe <strong>open_move_widget</strong> turns the Journal Entry number in an items list into a link that jumps straight to the entry's best business view, an invoice, a payment or the raw journal entry.
Read the guide paymentbinary (JSON payload)Every <em>Paid on</em> line and every <em>Outstanding credits</em> box on an Odoo invoice is one widget: <strong>payment</strong>, a JSON-driven display with two faces, an info popover, and an Unreconcile button.
Read the guide product_label_section_and_note_fieldmany2oneOn an Odoo invoice line the Product column secretly edits two fields at once: the <code>product_id</code> many2one and the line description. The <code>product_label_section_and_note_field</code> widget is what stitches them together, and it also styles section, subsection and note lines.
Read the guide product_label_section_and_note_field_o2mone2manyThe one2many widget that renders <strong>invoice and bill lines</strong> in Odoo 19: sections, notes, merged product labels, and a column layout that reconfigures itself depending on document type.
Read the guide section_and_note_textchar, text (the description column of order and invoice lines)On sale orders and invoices, one widget decides how the description cell edits: <code>section_and_note_text</code>, a tiny dispatcher that reads the line's <code>display_type</code>. The Odoo 20 branch removes it.
Read the guide x2many_buttonsmany2many, one2manyThe <strong>x2many buttons widget</strong> renders a relation as a short row of clickable record buttons. It powers the "this document might be a duplicate of" banner on invoices.
Read the guideHuman Resources28
Accrual plans are the hardest thing to configure in Odoo Time Off, so Odoo stopped showing them as a list. <code>accrual_levels</code> draws them as a timeline you read like a sentence.
Read the guide activity_exceptionselection (activity_exception_decoration)That small orange or red icon that appears at the end of some list rows is the <code>activity_exception</code> widget: a zero-option renderer for the <code>activity_exception_decoration</code> field that stays invisible until a record needs attention.
Read the guide background_imagebinary, many2one (inherited from the image field)The large employee photo panel in Odoo HR is not the standard image widget: <code>background_image</code> inherits every image option but swaps the template for a bare, display-only <code><img></code> with no upload or delete controls.
Read the guide boolean_radiobooleanNew in Odoo 19: <code>boolean_radio</code> shows a boolean as two radio buttons whose labels are <strong>full translatable sentences harvested from elements in the same view</strong>. Skip either option and the widget refuses to mount.
Read the guide boolean_toggle_loadbooleanA list toggle that writes two fields instead of one. The second is a technical flag telling the server which level triggered the change, which its own comment explains.
Read the guide checkboxbooleanOdoo 19's own views write <code>widget="checkbox"</code>, yet no such widget exists in the registry. This page explains the <strong>Missing widget</strong> console warning, the fallback that renders anyway, and what to use instead.
Read the guide daterangedate, datetimeTime off requests, events and planned tasks all edit two dates in one calendar popover. That is the <code>daterange</code> widget: one field element, a paired date field, and more options than any other date widget in Odoo.
Read the guide datetimedatetimeThe <code>datetime</code> widget renders every Date & Time field in Odoo. It is one of the rare widgets Studio exposes almost completely, and it hides an undocumented range-pairing ability.
Read the guide day_selectionselectionIn time off accrual plans, Odoo lets you say on the 30th of April but never on the 31st. That guard is <code>day_selection</code>, an <code>hr_holidays</code> widget that trims a day dropdown to the days its companion month actually has.
Read the guide float_time_selectionfloatTime off "custom hours" in Odoo use <code>float_time_selection</code>: a float field dressed as a clock time, with an hour and minute dropdown popover and locale-aware display.
Read the guide float_without_trailing_zerosfloat, monetaryOdoo's accrual plans say "1 day", not "1.00 days". <code>float_without_trailing_zeros</code> does that trimming with one regex, and since Odoo 19 the core float widget can nearly replace it.
Read the guide formatted_datedateNew in Odoo 19, <code>formatted_date</code> is a display-only date widget with per-view format control: month names instead of numbers, conditional colors from record data, and the label <strong>Indefinite</strong> when the date is empty.
Read the guide hr_presence_statusselection (the hr_icon_display field)The colored dot next to every employee, green for present, hollow for archived, a plane when on leave, is <code>hr_presence_status</code>. One tiny widget, layered by three modules, with a pill-shaped form variant that is new in Odoo 19.
Read the guide many2many_avatar_employeemany2manyEmployee pickers in Odoo HR render as avatar pills through <code>many2many_avatar_employee</code>, a widget whose defining trick is deciding <em>which employee model</em> you are really looking at.
Read the guide many2many_tags_skillsmany2manySkills rendered as tags that also carry whether the level is the default one. The extra data is injected rather than requested, so the view stays simple.
Read the guide many2one_avatar_employeemany2one (hr.employee / hr.employee.public)The employee picker with a photo: <code>many2one_avatar_employee</code> renders an employee link as an avatar, and quietly enforces HR privacy by <strong>switching the model it reads</strong> based on the user's rights.
Read the guide many2one_tags_skillsone2manyA one-to-many rendered as clickable tags, with its own Select Skills dialog. Its registered name says many2one, its class says one2many, and the class is right.
Read the guide many2one_work_entry_typemany2oneIn payroll's work entry views, every type shows a small colored code chip (ATT, OT, SL) in front of its name. That chip is <code>many2one_work_entry_type</code>, an <code>hr_work_entry</code> widget that fetches and renders the type's short code and calendar color everywhere, dropdown included.
Read the guide project_task_progressbarfloat (a 0 to 1 fraction), integerThe bar that shifts from green to orange to red as a task eats its allocated hours is <code>project_task_progressbar</code>: a fork of the standard progress bar that multiplies by 100 and colors itself by fixed thresholds.
Read the guide radio_followed_by_elementselection, many2oneNew in Odoo 19: <code>radio_followed_by_element</code> physically moves other form elements so they sit inline after a chosen radio option. It powers the accrual plan sentences in Time Off, and it is the most DOM-invasive field widget in core.
Read the guide skill_match_gauge_fieldinteger (core); no supportedTypes declaredNew in Odoo 19 Recruitment: the half doughnut scoring a candidate against a job is <code>skill_match_gauge_field</code>. It reads the job from the <strong>action context</strong>, prints the score inside the arc, and goes green when a candidate beats 100 percent.
Read the guide skills_one2manyone2many, many2manyThe skills block on an Odoo employee form is not a normal one2many list. <code>skills_one2many</code> ships its own renderer with hardcoded grouping, permission checks, and a report shortcut.
Read the guide task_with_hoursmany2one (project.task)On timesheet lines, the task dropdown shows each task's remaining allocated hours while you search, then hides them once you pick. That is the <code>task_with_hours</code> widget from <code>hr_timesheet</code>.
Read the guide timesheet_duration_uomfloatThe same number is 7.5 hours or 0.94 days depending on how your company records time. This widget picks the right renderer, and swaps in an hours-only variant when the setting says time.
Read the guide timesheet_uomfloat<code>timesheet_uom</code> is a dispatcher: it renders every timesheet duration with whichever widget matches your company's <strong>timesheet encoding unit</strong>, hh:mm for hours, a toggle for days.
Read the guide timesheet_uom_no_togglefloatThe quieter sibling of <code>timesheet_uom</code>: same per-company unit handling, minus the clickable toggle. <strong>timesheet_uom_no_toggle</strong> exists for the screens where that button would edit data it should not.
Read the guide versions_timelineone2manyA document's earlier versions, shown as a timeline rather than a table, with each entry restorable or downloadable.
Read the guide work_permit_uploadbinaryThe binary field with a different template, used for an employee's work permit. Nothing else changes, and on the next branch it does not exist at all.
Read the guideDiscuss / Productivity13
Choose a model, then choose a record: the two-step picker on the Schedule Activity wizard. Its cleverest part is protecting the summary you already typed from being wiped by the model change.
Read the guide datetime-pickernone (attaches to an HTML input, not a record field)Despite the name, <code>datetime-picker</code> is not something you put in a <code>widget=</code> attribute on a form view. It is a website side interaction that upgrades any frontend <code><input></code> carrying <code>data-widget="datetime-picker"</code> into Odoo's calendar picker.
Read the guide html_composer_messagehtmlThe rich text area of Odoo's full email composer is its own field widget. <code>html_composer_message</code> tunes the HTML editor for writing messages: mentions, collapsed quotes, batch-only placeholders, and attachment syncing.
Read the guide html_mailhtmlThe editor behind Odoo's email bodies. <strong>html_mail</strong> is the html field retuned for mail clients: styles inlined on save, layouts email clients cannot render stripped out.
Read the guide mail_composer_attachment_listmany2many (ir.attachment)The attachment rows under Odoo's email composer are the <code>mail_composer_attachment_list</code> widget: a stripped-down <a href="/odoo-widgets/many2many_binary/">many2many_binary</a> that lists, opens and deletes, but never uploads.
Read the guide mail_server_configurator_selectionselectionNew in Odoo 19, the <strong>mail_server_configurator_selection</strong> widget turns a plain selection into the per-user outgoing mail server setup: pick Gmail or Outlook, run the OAuth flow, and test the connection, all from user Preferences.
Read the guide many2many_tags_emailmany2many, one2manyThe <strong>email tags field</strong> is the recipient picker behind Odoo's share and invite dialogs: partner pills that show emails, accept <em>Name <email></em> input, and can fix a bad address inline.
Read the guide many2one_avatar_usermany2oneThe assignee field with a face: <code>many2one_avatar_user</code> renders a user link as an avatar with online presence and chat access, and wires up the <strong>Assign to me</strong> command.
Read the guide radio_selection_with_filterselectionRadio buttons that show only the choices this record is actually allowed to make. Small idea, and in Odoo 19 it changed contract in a way that silently breaks Odoo 18 views.
Read the guide selection_badge_iconsmany2oneThe activity scheduling dialog in Odoo 19 picks the activity type from icon-labeled badges. That row of buttons is <code>selection_badge_icons</code>, a many2one-only twist on <a href="/odoo-widgets/selection_badge/">selection_badge</a>.
Read the guide shortcutcharOdoo 19's <code>shortcut</code> widget dresses a plain char field with a fixed <code>::</code> prefix, so the canned response form reads exactly like what users will type in the Discuss composer.
Read the guide sms_widgettext, char, html (inherited from the text field)The message box in Odoo's Send SMS dialog does live math while you type: <code>sms_widget</code> detects the character encoding, counts the characters, and tells you how many SMS segments, and therefore credits, the message will cost.
Read the guide text_scheduled_datechar, textNew in Odoo 19, the <strong>text_scheduled_date</strong> widget renders the composer's Send Later button: a clock that opens a dialog with preset slots and a custom picker, then stores the choice in the wizard's <code>scheduled_date</code> field.
Read the guideSales / CRM12
The <code>badge_rotting</code> widget renders a stage column that carries a red <strong>12d</strong> pill when the record has been sitting in that stage too long. It is the list-view member of Odoo 19's rotting family.
Read the guide loyalty_data_fieldjsonThe loyalty summary on a sale order: points, rewards, whatever the server computed. It is a display with no options at all, and it does not survive into the next version.
Read the guide loyalty_one2manyone2many, many2manyThe Rules and Rewards blocks on an Odoo loyalty program form look custom, but <code>loyalty_one2many</code> is just the standard x2many widget wearing a different template: a heading with the field label and an always present Add button.
Read the guide many2one_avatar_leader_usermany2one (res.users)A user picker that knows who runs the team: <code>many2one_avatar_leader_user</code> renders the standard avatar dropdown and marks the selected sales team's leader with a <strong>(Team Leader)</strong> tag.
Read the guide quotation_document_many2manymany2many, one2manyThe upload area for the PDF pages Odoo wraps around a quotation. It borrows the product document kanban wholesale and changes three things: where uploads go, what they attach to, and that only PDFs are accepted.
Read the guide res_partner_many2onemany2one (to res.partner)Type three letters into a customer field and Odoo suggests real companies with their logo, address and VAT. That is <code>res_partner_many2one</code>: a standard many2one wrapped with Odoo's company autocomplete service. It lives in a module most people have never looked at.
Read the guide rottinginteger (placed on rotting_days)Odoo 19 marks records that sit too long in a pipeline stage as <strong>rotting</strong>. The <code>rotting</code> widget is the red day-count badge that appears on their kanban cards.
Read the guide rotting_statusbar_durationmany2one (stage field)The <code>rotting_statusbar_duration</code> widget is the Odoo 19 form statusbar that shows how long a record spent in each stage and warns, on hover, when the record has gone stale.
Read the guide so_line_create_buttonmany2one (sale.order.line)On a billable project task, the Sales Order Item field carries a small plus button. That is <code>so_line_create_button</code>: a many2one that can spawn a whole sales order in a dialog and wire the task to its first service line automatically.
Read the guide so_line_fieldmany2oneThe <strong>Sales Order Item</strong> column on Odoo timesheets is rendered by <code>so_line_field</code>, a many2one variant that quietly records whether a human picked the item. Here is what it actually does.
Read the guide sol_o2mone2manyThe order lines table on every Odoo quotation. Most of what it adds to the generic sectioned list is one feature: making combo products behave like a single line that happens to have parts.
Read the guide sol_product_many2onemany2oneEvery product you pick on an Odoo quotation goes through <strong>sol_product_many2one</strong>: the widget that decides whether you get a plain product, a variant configurator, a combo picker, or a grid.
Read the guideInventory / Purchase14
Every date field in Odoo renders through the <strong>Date</strong> widget. Here is its full option set as shipped in the source: accepted date limits, future warnings, picker precision, display format, and the range pairing the documentation never mentions.
Read the guide forecast_widgetfloat (inherits the float descriptor; core uses it on forecast_availability)The green <strong>Available</strong>, orange <strong>Exp</strong> date and red <strong>Not Available</strong> pills on Odoo transfer lines are one widget reading five fields you cannot see. Here is exactly how <code>forecast_widget</code> decides which badge you get.
Read the guide many2many_alt_posmany2manyThe list of competing quotations on a purchase order. It marks the one you are looking at, refuses to reopen it, and opens the others in the same window so the breadcrumb keeps growing.
Read the guide many2one_uommany2one (uom.uom)The unit dropdown on order and move lines is <code>many2one_uom</code>: a many2one that knows <strong>which product the line carries</strong> and offers the units that make sense for it.
Read the guide open_match_line_widgetanyA cell whose only job is to open the matching line it sits on. Model and method are both written into the widget, which makes it precise and completely non-portable.
Read the guide package_m2omany2oneThe many2one that Inventory uses for packages. <strong>package_m2o</strong> looks like a plain relation field until you notice the names it displays change with the transfer's state and context.
Read the guide pick_frommany2one (stock.quant)The Pick From column on Odoo's detailed operations tells a warehouse worker exactly which location, lot and package to take stock from. The <code>pick_from</code> widget is a many2one over <code>stock.quant</code> that fakes its display name when the quant is not set.
Read the guide picking_type_dashboard_graphtext (holding a JSON payload)The six little bars on every Odoo Inventory Overview card, late, yesterday, today, the next days, are the <code>picking_type_dashboard_graph</code> widget. Each bar is clickable and filters the transfer list to its exact date bucket.
Read the guide pol_product_many2onemany2oneThe product field on a purchase order line. Pick a product with one variant and it fills in; pick one with several and a grid opens.
Read the guide replenishment_graph_widgetcharThe saw-tooth stock curve on a reordering rule, drawn against its minimum and maximum lines. New in Odoo 19, and it replaced a widget that showed history instead of a forecast.
Read the guide stock.forced_placeholdermany2oneOn Odoo's replenishment screen, an empty Route cell still tells you which route <em>would</em> apply. That is <code>stock.forced_placeholder</code>: a many2one whose placeholder text survives where the standard widget would show nothing.
Read the guide stock_action_fieldfloat, monetaryA quantity or an amount that is also a link. Click the On Hand figure on a product list and it opens the stock view for that product, with context.
Read the guide stock_picking_many2manymany2manyThe transfers list on a wave. Adding one does not link a record directly: it opens a selection, creates a wizard, and lets the server attach them properly.
Read the guide stock_rescheduling_popoverchar (holding JSON)The red triangle next to a transfer's scheduled date is a widget: <code>stock_rescheduling_popover</code> reads a JSON field and lists the late upstream documents that put the date at risk.
Read the guideOther / Misc2
The little clock on every kanban card is <code>kanban_activity</code>: a 32-line widget that quietly fetches six extra fields and color-codes your follow-ups.
Read the guide pavs_one2manyone2manyThe values list on a product attribute. Deleting one asks the server whether anything is using it, and refuses outright if the answer is yes, before any confirmation is offered.
Read the guideProject / Timesheet10
The <strong>Assignees</strong> field on project tasks is this widget: user avatars as pills, an avatar card on click, and a kanban quick-assign popover that <strong>saves the record instantly</strong>.
Read the guide name_with_subtask_countcharThe <em>(2/5 sub-tasks)</em> suffix on task names in Odoo project lists comes from <code>name_with_subtask_count</code>, a char widget with auto-loaded counters and a surprising history.
Read the guide notebook_task_one2manyone2manyA task list rendered inside a notebook tab, with its own renderer and one adjustment: a kanban card opens the task rather than a dialog.
Read the guide priority_switchselectionProject tasks use <code>priority_switch</code>, not the plain <code>priority</code> widget. The stars look identical; the difference lives entirely in the command palette.
Read the guide projectmany2oneOn an Odoo task form the project field is not a plain dropdown: the <code>project</code> widget wraps the standard many2one and shows a gray <strong>Private</strong> placeholder when the task belongs to nobody's project. Small widget, one hardcoded assumption worth knowing.
Read the guide project_is_favoritebooleanThe star on every Odoo project card is not the plain favorite widget. <code>project_is_favorite</code> exists for one reason: letting users star projects they are not allowed to edit.
Read the guide project_task_state_selectionselectionThe <strong>task state selector</strong> is the colored status bubble on every Odoo task: In Progress, Changes Requested, Approved, Done or Canceled, with click behavior that adapts to where you are.
Read the guide status_with_colorselectionThe green On Track and red Off Track bubbles on Odoo project cards come from <code>status_with_color</code>, a project module widget that maps five health values to five fixed bubble colors. Its two knobs are attributes, not options, and Odoo 20 replaces both.
Read the guide subtasks_one2manyone2manyThe sub-tasks list on a project task. Its distinguishing behavior is what it does not pass on: when a sub-task opens, only a filtered set of context keys travels with it.
Read the guide todo_done_checkmarkselectionOdoo's personal to-dos mark completion with a single circled check. <code>todo_done_checkmark</code> is a <code>state_selection</code> in disguise, with two pieces of memory the source docs never mention.
Read the guidePoint of Sale2
The tags widget with one thing changed: a template that shows a placeholder when the cell is empty, so a list column does not go blank.
Read the guide upgrade_selectionselectionA settings dropdown that only works on Enterprise. On Community it opens the upgrade dialog and, when that closes, puts the value back to a hardcoded default.
Read the guideManufacturing / Maintenance5
The remaining days widget with its badge taken off. Same relative dates, plain text, because a manufacturing list already has enough color in it.
Read the guide mrp_should_consumefloatThe component quantity with a second number beside it: what the bill of materials says you should have consumed for the quantity you are actually producing.
Read the guide mrp_timerfloatA duration that counts up while the operator is clocked on. It asks the server for the real elapsed time rather than trusting the stored value, then keeps ticking locally.
Read the guide mrp_workorder_popovercharAn icon on a work order that explains what is holding it up, with a button that replans it on the spot. Built on the inventory popover, and split in two on the next branch.
Read the guide workcenter_dashboard_graphtextThe load chart on a work center card. Three series over the same days: the capacity line, the load bars and, separately, the hours that exceed it.
Read the guideView-level26
The <strong>Upload</strong> action on the Accounting dashboard is a view widget: <code>account_file_uploader</code>. It files whatever you drop as attachments, then asks the journal to turn them into draft invoices or bills.
Read the guide account_onboardingThe accounting onboarding checklist, drawn from a JSON payload already attached to the journal rather than from a separate query.
Read the guide account_pick_currency_dateA date picker beside an invoice's exchange rate. Pick a date, and the rate for that date is fetched from the server and saved.
Read the guide bill_upload_guideThe panel that offers three ways to get a bill into Odoo: upload a file, email it to an alias, or type one in.
Read the guide button_new_contractA button that asks for a start date, checks twice that the date is legitimate, then creates the contract and loads it.
Read the guide calendar_connect_providerOne button that saves the settings, prepares the provider, restarts synchronization and sends you to the consent screen if needed.
Read the guide calendar_week_daysThe seven weekday toggles on a recurring event. The same widget the base framework provides, with a calendar template and a direct write on change.
Read the guide customContentKanbanLikeWidgetThe card grid for building a quotation PDF: pick headers, per-line documents and footers, and fill the form fields inside them.
Read the guide documentation_linkEvery <strong>Documentation</strong> arrow link in Odoo's Settings pages is one view widget: <code>documentation_link</code>. Its best trick is picking the right docs version for your server automatically.
Read the guide form_page_dependenciesThe what-links-here indicator for a website page, resolving the target model from the record before it asks.
Read the guide hr_leave_statsTwo lists on a time off request: what this employee has already taken this year, and who else in their department is away over the same dates.
Read the guide iap_buy_more_creditsnone (view widget)The <strong>Buy Credits</strong> links under Odoo's SMS, lead enrichment and snailmail settings are one reusable view widget: <code>iap_buy_more_credits</code>, driven entirely by two attributes.
Read the guide import_lotsThe button for the other source of numbers: paste the supplier's list rather than generating your own.
Read the guide mail_activity_mixin_list_reschedule_dropdownThe same three-option dropdown, on a list of leads or tasks rather than activities. It moves your next activity on that record.
Read the guide mo_view_list_dropdownA per-row dropdown that acts on the whole selection when there is one, and quietly skips work orders it should not move.
Read the guide pls_tooltip_buttonThe button that explains a lead's win probability: a progress wheel, the three factors helping it and the three hurting it.
Read the guide point_of_sale_test_eposNew in Odoo 19, the <strong>Test</strong> button next to your Epson ePOS settings is a view widget. <code>point_of_sale_test_epos</code> fires a real receipt at the printer and translates Epson's cryptic error codes into readable advice.
Read the guide pos_cashdro_admin_buttonsTwo buttons on the CashDro settings: download the bus worker logs, and open the machine's own diagnostics page.
Read the guide pos_glory_cash_admin_buttonsA live connection status for a Glory cash machine, plus three actions: reset it, download the logs, or open its admin page.
Read the guide pos_payment_provider_cardsA card per payment terminal provider, showing whether its module is installed, with install and setup in the same place.
Read the guide purchase_file_uploaderUpload a bill against one purchase order or a selection of them, with a check that they all belong to the same vendor.
Read the guide signatureThe <strong>Sign</strong> button on Odoo delivery orders is the <code>signature</code> view widget: a button that opens the drawing dialog and writes the image straight into a binary field. Not to be confused with the field widget that shares its name.
Read the guide subtask_kanban_listThe open sub-tasks on a task's kanban card, each with an editable state, plus an inline field for adding another.
Read the guide survey_question_triggerThe icon beside a survey question that says whether its conditional display will actually work, computed live from the list rather than from saved data.
Read the guide todo_chatter_panelThe chatter for a to-do, hidden by default on large screens and shown on small ones, toggled from elsewhere in the interface.
Read the guide web_ribbonThe corner banner on Odoo forms, <strong>Archived</strong>, <strong>Paid</strong>, <strong>Cancelled</strong>, is one reusable view widget: <code>web_ribbon</code>. It takes three attributes, and one undocumented sizing rule.
Read the guideNeed this implemented in your Odoo?
We customize, migrate, and support Odoo for companies worldwide — from a single tricky view to a full implementation.
Book a free consultation