Widget category
Odoo Human Resources widgets
HR widgets render the employee-facing parts of Odoo: org charts, skill and resume lines, attendance and time-off states, appraisal stars and the approval flows HR screens run on.
If you are customizing recruitment, payroll input or employee self-service, these are the renderers you will meet in the shipped views.
38 widgets documented294 uses in Odoo coreVersions 16.0 → 20.0 verified per widget
Every human resources widget, by use in Odoo core
| Widget | What it does | Field types | Uses in core |
|---|---|---|---|
| timesheet_uom | timesheet_uom is a dispatcher: it renders every timesheet duration with whichever widget matches your company's timesheet encoding unit, hh:mm for hours, a toggle for days. | float | 114 |
| many2one_avatar_employee | The employee picker with a photo: many2one_avatar_employee renders an employee link as an avatar, and quietly enforces HR privacy by switching the model it reads based on the user's rights. | many2one | 59 |
| daterange | Time off requests, events and planned tasks all edit two dates in one calendar popover. That is the daterange widget: one field element, a paired date field, and more options than any other date widget in Odoo. | date, datetime | 21 |
| timesheet_uom_no_toggle | The quieter sibling of timesheet_uom: same per-company unit handling, minus the clickable toggle. timesheet_uom_no_toggle exists for the screens where that button would edit data it should not. | float | 12 |
| datetime | The datetime 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. | datetime | 7 |
| background_image | The large employee photo panel in Odoo HR is not the standard image widget: background_image inherits every image option but swaps the template for a bare, display-only <img> with no upload or delete controls. | binary, many2one | 6 |
| float_time_selection | Time off "custom hours" in Odoo use float_time_selection: a float field dressed as a clock time, with an hour and minute dropdown popover and locale-aware display. | float | 6 |
| formatted_date | New in Odoo 19, formatted_date is a display-only date widget with per-view format control: month names instead of numbers, conditional colors from record data, and the label Indefinite when the date is empty. | date | 6 |
| hr_presence_status | The colored dot next to every employee, green for present, hollow for archived, a plane when on leave, is hr_presence_status. One tiny widget, layered by three modules, with a pill-shaped form variant that is new in Odoo 19. | selection | 6 |
| project_task_progressbar | The bar that shifts from green to orange to red as a task eats its allocated hours is project_task_progressbar: a fork of the standard progress bar that multiplies by 100 and colors itself by fixed thresholds. | float, integer | 5 |
| day_selection | In time off accrual plans, Odoo lets you say on the 30th of April but never on the 31st. That guard is day_selection, an hr_holidays widget that trims a day dropdown to the days its companion month actually has. | selection | 4 |
| many2one_work_entry_type | In payroll's work entry views, every type shows a small colored code chip (ATT, OT, SL) in front of its name. That chip is many2one_work_entry_type, an hr_work_entry widget that fetches and renders the type's short code and calendar color everywhere, dropdown included. | many2one | 4 |
| float_without_trailing_zeros | Odoo's accrual plans say "1 day", not "1.00 days". float_without_trailing_zeros does that trimming with one regex, and since Odoo 19 the core float widget can nearly replace it. | float, monetary | 3 |
| many2many_avatar_employee | Employee pickers in Odoo HR render as avatar pills through many2many_avatar_employee, a widget whose defining trick is deciding which employee model you are really looking at. | many2many | 3 |
| radio_followed_by_element | New in Odoo 19: radio_followed_by_element 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. | selection, many2one | 3 |
| skills_one2many | The skills block on an Odoo employee form is not a normal one2many list. skills_one2many ships its own renderer with hardcoded grouping, permission checks, and a report shortcut. | one2many, many2many | 3 |
| task_with_hours | 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 task_with_hours widget from hr_timesheet. | many2one | 3 |
| RecruitmentCopyClipboardChar | New in Odoo 19, RecruitmentCopyClipboardChar is a copy-to-clipboard field with a twist: instead of copying what is stored, it can call a server method at click time and copy whatever that returns, which is how recruitment source aliases are created on demand. | char | 2 |
| boolean_radio | New in Odoo 19: boolean_radio shows a boolean as two radio buttons whose labels are full translatable sentences harvested from elements in the same view. Skip either option and the widget refuses to mount. | boolean | 2 |
| checkbox | Odoo 19's own views write widget="checkbox", yet no such widget exists in the registry. This page explains the Missing widget console warning, the fallback that renders anyway, and what to use instead. | boolean | 2 |
| hr_applicant_state_selection | The colored state bullet on an Odoo recruitment applicant is not the standard state_selection widget. hr_applicant_state_selection exists because hr.applicant carries a fourth kanban state, Waiting, that needed its own color. | selection | 2 |
| hr_homeworking_radio_image | The building, house and map-marker radios on Odoo's work location form are hr_homeworking_radio_image, a radio widget whose template only knows three hardcoded values, ignores its own inherited option, and disappears entirely in the Odoo 20 branch. | selection | 2 |
| hr_org_chart | The organization chart on every Odoo employee form is one field widget: hr_org_chart. It ignores the field it sits on, calls its own controller, and caps the manager chain at five levels because of a one-line source comment. | any | 2 |
| many2many_tags_salary_bank | On the employee form, bank account tags can read (30%) BNP Paribas ...1234. That prefix is many2many_tags_salary_bank, a tags widget that annotates each account with its salary split and quietly saves your whole form when you close a tag's dialog. | many2many | 2 |
| resume_one2many | The Resume block on an Odoo employee form, with its timeline dots, date ranges and grouped experience types, is resume_one2many. It is a heavily customized one2many renderer with a hardcoded grouping and one genuine rendering bug that Odoo 20 fixes. | one2many | 2 |
| accrual_levels | Accrual plans are the hardest thing to configure in Odoo Time Off, so Odoo stopped showing them as a list. accrual_levels draws them as a timeline you read like a sentence. | one2many | 1 |
| applicant_char | A text cell that is also a link. On the attachments list it shows which applicant a CV belongs to and takes you there, without needing the field to be a relation. | char, text | 1 |
| applicant_line_many2many | Applicant tags with the job position in front of the name. On a refusal wizard covering several vacancies, that prefix is the difference between knowing who you are rejecting and guessing. | many2many | 1 |
| boolean_toggle_load | A 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. | boolean | 1 |
| hr_holidays_radio_image | The little row of illustrations on a Time Off type is a radio group in disguise. It builds each image path from the option's own label, and it is gone on the Odoo 20 development branch. | many2one, selection | 1 |
| many2many_avatar_employee_class | Employee avatars with some of them flagged. It exists for one wizard, it takes its list of problem employees from a field you name, and on the development branch both the wizard and the widget are gone. | many2many | 1 |
| many2many_tags_skills | Skills 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. | many2many | 1 |
| many2one_tags_skills | A 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. | one2many | 1 |
| nb_attachment | A number and a paperclip: how many receipts are attached to an expense. Fifteen lines of code, and one detail worth knowing about when the number updates. | integer | 1 |
| skill_match_gauge_field | New in Odoo 19 Recruitment: the half doughnut scoring a candidate against a job is skill_match_gauge_field. It reads the job from the action context, prints the score inside the arc, and goes green when a candidate beats 100 percent. | integer | 1 |
| timesheet_duration_uom | The 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. | float | 1 |
| versions_timeline | A document's earlier versions, shown as a timeline rather than a table, with each entry restorable or downloadable. | one2many | 1 |
| work_permit_upload | The 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. | binary | 1 |
Each widget page has the usage XML, Studio steps, every developer option, and a per-version compatibility table verified against the shipped Odoo source.
Other widget categories
Need these working in your Odoo?
The team that documented every widget also builds with them — custom views, upgrades and performance work by senior Odoo developers.
