Skip to main content
iVentureTeam

stock_rescheduling_popover

The red triangle next to a transfer's scheduled date is a widget: stock_rescheduling_popover reads a JSON field and lists the late upstream documents that put the date at risk.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 18, 2026Updated August 18, 20266 min read
Technical namestock_rescheduling_popover
Field typeschar (holding JSON)
Viewslist, form (transfers, manufacturing orders, sale order lines)
Modulestock, extended by usages in mrp and sale_stock
Used in core7 occurrences across stock, mrp, sale_stock, on json_popover fields of transfers, manufacturing orders and order lines
VersionsOdoo 20.0, Odoo 19.0, Odoo 18.0, Odoo 17.0, Odoo 16.0
No-code setupNo. The widget is wired to server-computed JSON; there is no Studio path
Alternativespopover_widget, actionable_errors, web_ribbon

What the Rescheduling Popover does

When a chain of operations feeds a delivery, a delay upstream silently endangers the promise downstream. Odoo surfaces that with this widget: a small colored icon next to the scheduled date that appears only when the record's json_popover field carries data, and a popover that explains the problem when clicked.

The popover is titled Planning Issue and lists the late preceding operations by name, each rendered as a link carrying the document's model and id; clicking one opens that document's form view. The delay alert date follows in the same sentence, so a planner sees at a glance which upstream document moved and to when.

Technically it is a thin subclass of the stock module's generic popover_widget: it swaps in a component that can open records, changes the default icon and color to warning red, and refuses to open the popup when there are no late_elements in the JSON.

What this means for your team

This is the widget that lets a warehouse supervisor answer "why is this delivery flagged" in two clicks instead of a phone call. The alternative workflow, digging through chained transfers or the manufacturing order tree to find the late link, is exactly the kind of investigation that eats planner time daily.

Two operational notes from implementations. First, the triangle only tells you a preceding operation is late; it does not reschedule anything. Treat it as a to-do marker: someone decides to expedite, split, or push the customer date. Second, because the data behind it is computed server-side into a JSON field, the same mechanism is reusable for your own warning popovers: compute a JSON with a message and links on any model, drop the base popover_widget or a subclass on a char field, and you have consistent, clickable alerts in any list view without inventing UI.

Supported options in Odoo 19

Verified against stock_rescheduling_popover.js and its base popover_widget.js in the Odoo 19.0 stock module. The widget declares no XML options at all; the entries below are the keys of the JSON payload the widget reads from the field value, which is the actual configuration surface.

OptionTypeWhat it does
late_elements (JSON key)array of {id, name, model}The late upstream documents. Rendered as links that open each document's form view; without this key the popover never opens.
delay_alert_date (JSON key)stringThe date shown after the list of late operations in the Planning Issue sentence.
icon (JSON key)stringIcon class for the trigger. The rescheduling subclass defaults to the warning triangle; the base widget defaults to fa-info-circle.(default: fa-exclamation-triangle)
color (JSON key)stringColor class of the trigger icon. Base widget default is text-primary.(default: text-danger)
position (JSON key)stringPopover placement relative to the icon, passed to the popover service.(default: top)
popoverTemplate (JSON key)stringOwl template rendering the popover body; the rescheduling flow passes stock.PopoverStockRescheduling. All other JSON keys become props of that template.(default: stock.popoverContent)
msg / title (JSON keys)stringBase-widget content keys: title renders as a heading, msg as plain text body when no custom template is given. The rescheduling template does not use msg.

These are JSON keys, not view options. They live in the char field's value, which core computes server-side (json_popover). Anything you pass in options="{...}" on the field element is ignored by this widget. To change what the popover shows, change what the compute writes.

Working examples

How core wires it (transfer list)

<field name="json_popover"
       widget="stock_rescheduling_popover"
       nolabel="1"/>

The field is a char; its value is JSON computed by the server. No options, no attributes beyond layout.

The JSON contract the widget reads

{
    "late_elements": [
        {"id": 42, "name": "WH/MO/00012", "model": "mrp.production"}
    ],
    "delay_alert_date": "08/21/2026 14:00:00",
    "color": "text-danger",
    "icon": "fa-exclamation-triangle",
    "popoverTemplate": "stock.PopoverStockRescheduling"
}

Empty or missing late_elements means the click does nothing; an empty field value means no icon logic beyond the base render. Color and icon are optional overrides on top of the widget's red-triangle defaults.

Reusing the base widget for your own alerts

<field name="my_alert_json" widget="popover_widget"/>

With a computed char writing {"msg": "...", "icon": "fa-info-circle"}, the generic base renders the same pattern with an info style and plain text content.

Who does what: server JSON versus widget

The division of labor is worth understanding before customizing.

The server decides everything about content. Which operations count as late, what date to show, even which Owl template renders the popover body (popoverTemplate): all of it arrives in the JSON. The widget contributes only defaults (red triangle, top position) and the record-opening click handler.

The click handler reads attributes, not state. Each link in the popover carries element-model and element-id attributes, and the component builds an ir.actions.act_window from them at click time. Adding your own elements to a custom template works as long as those two attributes are present.

The gate is late_elements. The subclass overrides showPopup to return early when the parsed JSON has no late_elements. If you feed it JSON with only a msg, the icon renders but clicks are inert; that content shape belongs to the base popover_widget instead.

Version compatibility

VersionStatusNotes
Odoo 20.0Partial / changedNot released. Default icons change to the new icon set (warning / info); logic unchanged. See below.
Odoo 19.0VerifiedVerified against the shipped source and templates.
Odoo 18.0VerifiedByte-identical to 19.0 except the module pragma.
Odoo 17.0VerifiedFile present with the same widget and JSON contract.
Odoo 16.0VerifiedFile present; registered in the pre-descriptor component style.

Upgrade note. The file is stable from 16.0 through 19.0 (the 18 to 19 diff is a module pragma only), so JSON produced by custom computes keeps working across those upgrades. The icon name convention is the thing to watch for Odoo 20, below.

What is changing in Odoo 20

Odoo 20 is expected at Odoo Experience in Brussels, 24 to 26 September 2026. The development branch is unstable until release, and we re-verify this page against the shipped version.

One visible change so far: the default icons move off FontAwesome. The rescheduling widget's fallback becomes warning instead of fa-exclamation-triangle, and the base popover widget's fallback becomes info instead of fa-info-circle, part of the broader icon set migration we have tracked across other widgets. If your server-side computes pass explicit fa-* icon names in the JSON, plan to update them after the release; JSON that omits icon picks up the new defaults automatically.

Common problems and fixes

SymptomCause and fix
The triangle shows but clicking does nothingThe JSON has no late_elements; the subclass gates the popup on that key. Expected for stale or partial data. Recompute the json_popover field, or use the base popover_widget for msg-only content.
No icon appears on a late transferThe json_popover field is not in the view, or the compute produced an empty value because delay alerts are off. Check the field is in the view and that the delay alert propagation applies to the route involved.
Links in the popover open the wrong recordCustom template elements missing or duplicating the element-model and element-id attributes the click handler reads. Carry both attributes on every clickable element in a custom popoverTemplate.
Custom icon disappears after an upgradeExplicit fa-* names in server-computed JSON while the client moved to a new icon set (a change visible on the Odoo 20 development branch). Update the icon names in your computes, or omit the icon key and inherit the defaults.
Popover shows raw JSON or nothing at allThe field value is not valid JSON, so the parse yields an empty object. Ensure the compute json.dumps a dict; the widget parses the char value with JSON.parse.

Rescheduling Popover vs the alternatives

WidgetBest forKey difference
stock_rescheduling_popoverLate-operation warnings on stock, MRP and sale documentsPopover lists late upstream documents as clickable links, gated on late_elements
popover_widgetGeneric informational popovers from JSONInfo styling, plain msg content, no record links
actionable_errorsStructured warnings with action buttonsRenders inline alert blocks with severity levels instead of an icon popover
web_ribbonWhole-record status bannersStatic corner ribbon, no click behavior or per-cause detail

The practical test: if the alert needs clickable links to other records, you need this widget's component or a subclass. For a plain informational bubble, the base popover_widget with a msg key is enough.

Frequently asked questions

What is the red triangle next to dates on Odoo transfers?+
It is the stock_rescheduling_popover widget reading the record's json_popover field. It appears when a preceding operation in the chain is late, and clicking it opens a Planning Issue popover listing those operations as links to their form views.
Why does clicking the warning triangle sometimes do nothing?+
The widget only opens the popup when the JSON contains late_elements. If the field holds other content, or the data is stale, the click is intentionally inert. That gate is explicit in the source.
Does the popover reschedule anything?+
No. It is purely informational: it shows which upstream documents are late and to when. Any actual rescheduling, expediting or date change is a decision the planner takes on the documents it links to.
Can I configure this widget with view options?+
No. It declares zero options; icon, color, position, template and content all come from the JSON in the field value, which Odoo computes server-side. To change the behavior you change the compute, not the view.
Can I reuse this popover pattern for my own warnings?+
Yes. The base popover_widget in the stock module renders any char field holding JSON with keys like msg, icon, color and popoverTemplate. Subclass it, as the rescheduling widget does, if your popover needs custom behavior such as opening records.
Which documents show the rescheduling popover?+
Core wires it 7 times across stock, mrp and sale_stock: transfers, manufacturing orders and sale order lines with delay alerts enabled on their routes.
Does the widget change in Odoo 20?+
The development branch shows one change: default icons move from FontAwesome names to the new icon set, warning for this widget and info for the base. Explicit fa-* names passed in custom JSON will need updating. Not final until the September 2026 release.

Delay alerts firing after the customer already called?

Late-operation warnings are only useful if your routes, lead times and delay alert propagation are set up to fire them early. We configure Odoo supply chains end to end and build custom planning alerts on the same popover machinery core uses.

Book a free consultation

How this page was produced

This page was verified by reading stock_rescheduling_popover.js, the base popover_widget.js, and both templates (stock.PopoverStockRescheduling, stock.popoverContent) in the Odoo 19.0 stock module, then cross-checking the JSON contract against the base widget's documented comment block. Version stability was confirmed by diffing the files across 16.0 through master. The Odoo 20 section reads the unreleased development branch and is marked as such. Corrections welcome via our contact page.