Skip to main content
iVentureTeam

text_emojis

The 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.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 27, 2026Updated September 1, 20265 min read
Technical nametext_emojis
Field typestext, char
Viewsform
Modulemail, the Discuss module, present in almost every database
Used in core1 occurrence, the post suggestion on a marketing card campaign in marketing_card
VersionsOdoo 20.0, Odoo 19.0, Odoo 18.0, Odoo 17.0
No-code setupNo. Studio offers a plain text field; this variant is set in view XML
Alternativeschar_emojis, text, html, mass_mailing_html

What the emoji text field does

Most fields in an ERP do not need emoji. A few do: the text somebody will paste into a social post, a message suggestion, a short line of marketing copy. Typing an emoji on a desktop keyboard is awkward enough that people simply do not, and the copy suffers for it.

This widget is the ordinary multi-line text field with a picker button attached. Clicking it opens Odoo's emoji picker, and the chosen emoji is inserted at the cursor rather than appended, so you can place one mid-sentence.

The behavior is shared with the single-line variant through a common mixin, which is why the two behave identically apart from the shape of the input. Nothing else about the field changes: it stores plain text, saves normally, and every option the text field accepts still works.

What this means for your team

This is a small feature with a specific audience. Marketing and social copy written inside an ERP tends to read like an ERP, and the emoji picker is one of the few interface details that changes that. If your team drafts social posts or campaign messages in Odoo, putting this widget on those fields costs one attribute.

Where it does not belong is anywhere the value ends up in a document, a reference or an integration. Emoji are perfectly valid text, but they travel badly through legacy systems, fixed-width reports and some export formats, so the widget's presence is effectively an invitation that should only appear where the invitation is safe to accept.

Supported options in Odoo 19

The widget declares no options of its own. It spreads the text field's descriptor unchanged, so everything below is inherited and behaves normally. Read from emojis_text_field.js and the text field, Odoo 19.0.

OptionTypeWhat it does
placeholder_fieldfieldInherited from the text field and declared there. Shows another field's value as a hint when this one is empty.
dynamic_placeholderboolean<strong>Inherited and undeclared on the base widget too.</strong> Enables the dynamic placeholder machinery.(default: false)
dynamic_placeholder_model_reference_fieldfield<strong>Inherited and undeclared in the same way.</strong> Names the field carrying the model reference for the dynamic placeholder.

The picker is not configurable. There is no option to restrict the emoji set, change the button's position or disable the picker while keeping the widget. If the picker is unwanted, the plain text field is the answer.

Working examples

The core usage

<field name="post_suggestion" widget="text_emojis"
       placeholder="Join me at this event!"/>

The placeholder is inherited from the text field and works normally, since this widget does not touch the extractor.

The single line sibling

<field name="subject" widget="char_emojis"/>

Same picker, same mixin, single line input. Use it where the value is a subject or a title rather than a body.

With a dynamic placeholder

<field name="post_suggestion" widget="text_emojis"
       options="{'placeholder_field': 'default_suggestion'}"/>

Inherited from the text field: shows another field's value as the hint when this one is empty.

A mixin, and the one line that wires it up

The widget itself is a dozen lines. It builds a class by applying a shared emoji mixin to the standard text field, points at its own template, keeps the parent's components, and in setup tells the mixin which element to insert into before calling the mixin's own initialization.

That last step is the whole integration. The mixin needs a reference to the editable element so it can insert at the caret; the multi-line variant hands it the textarea reference, and the single-line variant hands it the input. Everything else, including opening the picker and computing the insertion point, lives in the mixin and is therefore identical between the two.

Because the descriptor is spread unchanged, the widget keeps the text field's supported types, its extractor and its options. That is the difference between this and several other widgets in Odoo that replace the extractor and silently lose the inherited attributes: here nothing is lost.

The registration adds one styling class alongside whatever the text field already contributes, which is what keeps the field looking like a normal text area with a button rather than a custom control.

Version compatibility

VersionStatusNotes
Odoo 20.0In developmentNot released. Byte-identical to Odoo 19 on the development branch.
Odoo 19.0VerifiedVerified against the shipped source. Byte-identical to Odoo 18.
Odoo 18.0VerifiedIdentical behavior.
Odoo 17.0VerifiedFirst version, with the older class syntax.
Odoo 16.0Not availableWidget does not exist under this name.

Upgrade note. Nothing to do. The widget arrived in Odoo 17 and the Odoo 18 and Odoo 19 files are identical; the only change in between was moving the template and component declarations inside the class, which is a syntax modernization rather than a behavior change.

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 and this may still change; we re-verify the page after release.

Byte-identical. The file on the development branch matches Odoo 19 exactly. Because the widget is a thin composition over the text field and a shared mixin, any improvement to either flows through without the file changing.

Common problems and fixes

SymptomCause and fix
No emoji button appearsThe field is not using this widget, or the Discuss module is not installed. Check the widget attribute and that messaging is installed in the database.
Emoji are inserted at the end instead of the cursorThe editable element reference was not wired up, usually because a custom template replaced the textarea. Keep the textarea reference the widget expects, or extend the widget rather than replacing its template.
Emoji do not survive an exportThe destination format or system does not handle them. Do not use this widget on fields that feed exports or integrations.
The placeholder does not showThe attribute is missing, or the field already has content. Set the placeholder; the widget does not touch the extractor, so it works normally.
I want a single line versionThis variant renders a textarea. Use the char emoji widget, which shares the same mixin.
The picker cannot be restrictedThere is no option for that. Use the plain text field if the picker should not be offered.

Emoji text field vs the alternatives

WidgetBest forKey difference
text_emojisMulti-line copy that benefits from emoji, such as social or campaign textThe standard textarea with an emoji picker that inserts at the cursor
char_emojisSingle line values such as subjectsSame picker, same mixin, an input instead of a textarea
textOrdinary multi-line textNo picker at all
htmlContent that needs formattingA rich editor rather than plain text with emoji
mass_mailing_htmlDesigning a mailing bodyA full design surface with themes and snippets

Use the single line sibling for subjects and titles, and the plain text field wherever emoji would be a liability rather than a feature. For anything that needs formatting rather than emoji, the rich text field is the right control, and it has its own emoji handling through the editor.

Frequently asked questions

What does text_emojis add to a text field?+
An emoji picker button. The chosen emoji is inserted at the cursor position in the textarea, and everything else about the field, including its options and supported types, is inherited unchanged.
Is there a single line version?+
Yes, the char emoji widget. Both are built from the same shared mixin and differ only in which element they insert into.
Can I restrict which emoji are offered?+
No. The widget declares no options, and the picker is Odoo's standard one.
Do inherited text field options still work?+
Yes. Unlike some widgets that replace the extractor, this one spreads the text field's descriptor unchanged, so the placeholder and the dynamic placeholder options behave normally.
Where should I not use it?+
On any field whose value feeds a document, an export or an external system that handles emoji badly. The widget is an invitation to use them, so only offer it where they are safe.

Marketing copy that does not read like an ERP

Campaigns, social posts and mailings drafted inside Odoo keep the data connected, but only if the editing experience is good enough that people use it. We set up Odoo Marketing and its content tooling on versions 16 through 19.

Book a free consultation

How this page was produced

The mixin composition, the target element wiring and the unchanged descriptor were read from emojis_text_field.js on the Odoo 19.0 branch, with the inherited option set read from the text field in web. The usage comes from marketing_card/views/card_campaign_views.xml. Version coverage comes from comparing the file across the 17.0 and 18.0 branches and a byte comparison against the public development branch. Spotted an error? Tell us and we will correct the page.