All pages
Powered by GitBook
1 of 34

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

MessageML Basics

MessageML

This article gives an overview of the message workflow and shows how message representations are used throughout the workflow. In its subpages are presented the specifications of messageML.

Introduction of the MessageML

When calling API methods that create messages, the content of the message must be sent using MessageML markup. MessageML is a tag-based language that is a subset of XHTML, with the addition of tags specific to Symphony Messaging for embedding information (e.g. a mention) into a message.

You can find the specifications of the MessageML language in the attached subpages. Even if they are grouped in different categories for documentation clarity purposes, please note you can do your own mix, respecting the specific rules explained at each component specification level.

Also, please note that messages in MessageML markup are enclosed in a <messageML> tag.

MessageML has full unicode support and messages should be sent using UTF-8 character encoding.

When or messages using the API, MessageML shorthand tags are translated into equivalent XHTML tags and returned in .

Note: MessageML is just a subset of PresentationML that makes it easier to construct messages from your bot. The API can ingest either MessageML or PresentationML. However, the API will only deliver messages as PresentationML to a bot.

XML Formatting

MessageML is formatted as XML and should have all tags properly formatted. For example, rather than using <br> you must use <br/>. For string attributes, standard rules for escaping XML special characters apply, i.e. escaping:

  • ' with &apos; (if single quotes are used to quote the value)

  • " with &quot; (if single quotes are used to quote the value)

  • < with &lt;

  • & with &amp; Other XML named entity sequences such as &gt; may be used.

Valid characters for hashtags and cashtags

Keywords may only contain alphanumeric characters, underscore, dot and dash.

Important: when sending numeric $cashtags as signals, add an * after the $ sign, for example, $_122450. <cash tag="$_122450"/>

creating
retrieving
PresentationML

Icon set for Buttons

Please find below the list of icons that can be used with Elements Buttons.

Extensibility UI Actions

With Actions, MessageML allows your bots to send messages containing components that have UI extensibility capabilities, such as opening another chatroom or start a conversation with a specific user for your Symphony users.

These functionalities are gathered in the subpages you can find below.

The UI Actions are represented by the <ui-action> tag, that can be associated with different attributes, such as trigger, action, or other more specific attributes.

MessageML tag

Please note that UI-Actions are not rendered on mobile

Tables

Tags

MessageML supports the following tags to arrange information within a message using tables:

Tags
Description
Optional attributes

<table> <tr> <td>text</td> </tr> </table>

Render "text" in a table format.

Here after you can find an example of a message sent by a bot and containing table tags as well as the structure of the messageML sent:

Date and time

You can display a date, time or datetime to your user taking into account your user's date/time formats, as well as their timezone using the dateTime element.

Tags

Tags
Description
Attributes

<dateTime value="2024-12-31T09:29:47Z" format="date | time | time_secs"/>

Display a date or time to the user, taking into account the user locale timezone.

  • value (required): ISO-8601 or UTC timestamp.

  • format:

    • date_time: date + time format based on user settings and user timezone. Default value if no format is provided

This element is read-only - if you want an interactive element instead, you can use a or in a chat.

Versions and Compatibility

Main features introduced
Agent needed to parse message sent by the bot

Entities

Entities (also called Structured Objects) are rich, inline, interactive components for Symphony messages that allow you to embed information that is more complex than simple text.

To create a message containing a Structured object, construct the message content using MessageML with either a <div> or a <span> element containing the following attributes:

  • class="entity": specifies that the message contains a corresponding structured object.

  • data-entity-id: the unique ID of the corresponding structure object.

This MessageML markup is then passed into the endpoint via the message parameter. The following examples show the use of the attributes in <div> and <span> respectively:

The examples above reference an entity object called entityIdentifier. The JSON corresponding to this object is passed to the create message endpoint via the data parameter. For example:

Please continue below in the subpages if you want to learn more about Structured Objects

Images

MessageML supports the following tags to embed media into messages:

Tags
Description
Attributes

Regular Expressions - Regex

Elements input validation. Available from Symphony v20.6 and above

Input validation is your first line of defense when creating a secure application.

Symphony Elements supports input validation using regular expressions (regex) for the text field and text area elements.

Regular expressions can cause performance issues in the Client if the validation of the regular expression is very complex. Poorly designed regular expressions can even cause denial of service (ReDoS). Please verify that your regular expressions are safe, using the following service: .

For more information, refer to .

date : ddMMyyyy with format based on user settings (DD/MM/YYYY, MM/DD/YYYY, YYYY/MM/DD) and user timezone
  • time : hhmm with format based on user settings (12h / 24h) and user timezone

  • time_secs : hhmmss with format based on user settings (12h / 24h) and user timezone

  • Initial release

    Agent 25.6

    Date Picker
    Time Picker
    The following code snippets assumes that both <text-field> and <textarea> elements are placed within the right messageML context : <messageML> + <form> including an action <button>.
    <!-- Validates a login -->
    <text-field name="login" pattern="^[a-zA-Z]{3,}$" pattern-error-message="Login must contain at least 3 letters."></text-field>
    
    <!-- Validates a decimal value, hint is not defined -->
    <text-field name="price" pattern="^\d+,\d+$" pattern-error-message="This is an incorrect value."></text-field>
    
    <!-- Validates a password -->
    <text-field name="password" masked="true" pattern="^[a-zA-Z]\w{3,14}$" pattern-error-message="Your password is not strong enough."></text-field>

    The regular expression pattern is validated on the front end by the Client. It is therefore critical to also validate the input in your code as well.

    Regular expression Denial of Service - ReDoS

    To prevent performance issues on the Client, a validation mechanism checks regular expressions to ensure they are safe. If the regular expression is unsafe, it is automatically disabled. In that situation, the user input will not be validated.

    Validation examples

    https://redos-checker.surge.sh/
    Regular expression Denial of Service - ReDoS

    Note that the content of the regex has to be checked again on the bot side.

    Text field

    Text area

    <div class="entity" data-entity-id="entityIdentifier">An object</div>
    <span class="entity" data-entity-id="entityIdentifier">An inline object</span>
    <!-- Validates that a line does not contain the word "badword" -->
    <textarea name="justification" pattern="^((?!badword).)*$" pattern-error-message="Justification text must not contain the word 'badword'"></textarea>
    Data:
    {
      "entityIdentifier": {
        "type": "org.symphonyoss.fin.security",
        "version": "0.1",
        "id": [{
          "type": "org.symphonyoss.fin.security.id.isin",
          "value": "US0378"
        },
          {
            "type": "org.symphonyoss.fin.security.id.cusip",
            "value": "037"
          },
          {
            "type": "org.symphonyoss.fin.security.id.openfigi",
            "value": "BBG000"
          }
        ]
      }
    }

    For the following examples, we are sending an SVG image along with the message.

    Note that an admin user might have to enable the sending of some specific file types. To do that, go to AC Portal >> Company Settings >> Edit Entitlements >> File Types.

    • Sending an image via the Create Message API using the image URL

    Sending an image via Create Message API using Data URL (base64 encoding). Note that it is necessary to include data:image/imageType+xml;base64 before the data string, as shown in the following example:

    Here after you can find an example of a message sent by a bot and containing an inline image as well as the structure of the messageML sent:

    <messageML>
        <h1>Images</h1>
        <p>This is an image: <img src="https://play-lh.googleusercontent.com/-lTkJjeUtCj3Mf4FLLNKnCyQC0Amur3wxeKxkwbDZl0hjO60H1_VodAuBDKJmYWOvlfG=s180-rw" /></p>
    </messageML>

    <img src="url"/>

    Image. Images have a max height of 256px; otherwise, the default size is the size of the image. For more information on how to send images through API call, refer to Sending images.

    • src • class

    Tags

    Rules and Limitations via an example

    $ curl -X POST https://yourpod.com/agent/v4/stream/:sid/message/create \
    -H 'content-type: multipart/form-data' \
    -H 'keyManagerToken: 01008e3fc538...5d82870985576' \
    -H 'sessionToken: eyJhbGciOiJSU...6YmlWyim0peFkMA' \
    -F 'message=<messageML>Sending attachment via API<img src="https://yourimg.com/test/myimage.svg"></img></messageML>'
    $ curl -X POST https://yourpod.com/agent/v4/stream/:sid/message/create \
    -H 'content-type: multipart/form-data' \
    -H 'keyManagerToken: 01008e3fc538...5d82870985576' \
    -H 'sessionToken: eyJhbGciOiJSU...6YmlWyim0peFkMA' \
    -F 'message=<messageML>Sending attachment via API<img src="data:image/svg+xml;base64,PHN2ZyBpZD0i...DcuMjcsMTYuN="></img></messageML>'

    This feature is intended to be used for small images, such as custom emoji. Our recommendation is that the total size of base64 encoded embedded images do not exceed 25KB per message.

    Examples

    • class • rowspan • colspan

    <thead>, <tbody>, <tfoot>

    Table sections.

    • class

    Examples

    <messageML>
        <h1>Tables</h1>
        <p>This is table:</p>
        <table>
            <thead>
                <tr>
                    <td>Header column 1</td>
                    <td>Header column 2</td>
                    <td>Header column 2</td>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>Cell row 1 column 1</td>
                    <td>Cell row 1 column 2</td>
                    <td>Cell row 1 column 3</td>
                </tr>
                <tr>
                    <td>Cell row 2 column 1</td>
                    <td>Cell row 2 column 2</td>
                    <td>Cell row 2 column 3</td>
                </tr>
            </tbody>
            <tfoot>
                <tr>
                    <td>Footer column 1</td>
                    <td>Footer column 2</td>
                    <td>Footer column 2</td>
                </tr>
            </tfoot>
        </table>
    </messageML>

    Limit on Image size for Data URL (base64)

    Text formatting and semantics

    Tags

    MessageML supports the following tags for formatting content within a message:

    Tag
    Description
    Optional attributes

    <br/>

    Insert a line break.

    Here after you can find an example of a message sent by a bot and containing these formatting and semantics tags as well as the structure of the messageML sent:

    Main features introduced
    Agent needed to parse message sent by the bot
    Client 2.0 release
    Backward client-compatibility behavior (e.g. external rooms)
    Client 1.5 release

    Special Characters

    Tags

    The Apache Freemarker uses the HTML output format by default. In some cases, special characters placed within the MessageML must be HTML-escaped, otherwise, the request sending the MessageML will receive a 400 error response. The following are examples of valid HTML-escaping:

    Character

    HTML escaping

    Required escaping

    messageML example

    Here after you can find an example of a message sent by a bot and containing these special characters as well as the structure of the messageML sent:

    Room Selector

    The Room Selector is an element that allows users to find and select both rooms or persons. It behaves the same way as the chat selector you see when you forward a message and select where the message should be forwarded.

    When a user starts typing in the field, a list of conversations and people will be displayed for selection. Only the chats that the user has access to will be displayed.

    Attributes

    Attribute

    Type

    • The Room Selector element supports multi selection which means that you can search for more than one chat or person.

    • The Room Selector is not yet available on Symphony Mobile. Mobile will be supported in a future release.

    Example of a room selector with both a room and a user pre-selected. Please note that pre-selected streamIds must follow

    Resulting payload when a user submitted the form afer having selected two chats and one user in the Room Selector.

    Content Grouping

    MessageML supports the following tags for grouping information within a message:

    Tag
    Description
    Optional attributes

    Style Attributes

    Tags support the following style attributes where applicable:

    To learn more about Symphony's built in styles, continue here:

    Required?

    Description

    name

    String

    Yes

    Identifies the room selector.

    placeholder

    String

    No

    Specifies a short hint that describes the expected value of the field.

    required

    Boolean

    No

    If true, at least one chat or person must be selected to be able to submit the form.

    label

    String

    No

    Label displayed on top of the Room Selector.

    value

    Array of

    string

    No

    Default values that will be preselected in the Room Selector. The array can contain both streamIds, as well as userIds. Please note that if the user does not have access to these users or conversations, they will not be displayed.

    Main features introduced

    Agent needed to parse message sent by the bot

    Client 2.0 release

    Backward client-compatibility behavior (e.g. external rooms)

    Feature introduced

    23.11

    C2 24.4 (April 2024)

    Not available yet. Room Selector is not displayed.

    Rules and Limitations

    Example

    Versions and Compatibility

    URL Safe Base64 encoded StreamID.

    Attributes supported in messageML tags

    Go further...

    UI Style Guide
    <messageML>
         <form id="test"> 
            <room-selector name="room-selector" 
                label="Select the chats where the alert will be sent." 
                value="['rsxB51ieSYfPLQ0jgFKg93___nUqhvz4dA','9139691037944']"  
                placeholder="Select rooms"/>
            <button name="submit_button" type="action">Create Alert</button>    
        </form>
    </messageML>
    "payload": {
        "symphonyElementsAction": {
            "stream": {
                "streamId": "9vwxSTElsJDEqmRt2CWQpn___nRRfCVgdA",
                "streamType": "IM"
            },
            "formMessageId": "t2AFSQooaBvh_OrDrNDR53___nGF6NqybQ",
            "formId": "test",
            "formValues": {
                "action": "submit_button",
                "room-selector": {
                    "userIds": [
                        "9139691037944"
                    ],
                    "streamIds": [
                        "fy0RUFUt6pkiiV3nPZVr5X///nJeKqjMdA==",
                        "5fXylrRrqEb1vH4bvBMWNn///nWQegjtdA=="
                    ]
                }
            }
        }
    }
    align-content
    align-items
    align-self
    background
    background-attachment
    background-blend-mode
    background-clip
    background-color
    background-image
    background-position
    background-repeat
    background-size
    border
    border-bottom
    border-bottom-color
    border-bottom-left-radius
    border-bottom-right-radius
    border-bottom-style
    border-bottom-width
    border-collapse
    border-color
    border-image
    border-image-outset
    border-image-repeat
    border-image-slice
    border-image-source
    border-image-width
    border-left
    border-left-color
    border-left-style
    border-left-width
    border-radius
    border-right
    border-right-color
    border-right-style
    border-right-width
    border-spacing
    border-style
    border-top
    border-top-color
    border-top-left-radius
    border-top-right-radius
    border-top-style
    border-top-width
    border-width
    box-shadow
    box-sizing
    caption-side
    clear
    color
    content
    counter-increment
    counter-reset
    display
    empty-cells
    flex
    flex-basis
    flex-direction
    flex-flow
    flex-grow
    flex-shrink
    flex-wrap
    font
    font-family
    font-kerning
    font-size
    font-size-adjust
    font-stretch
    font-style
    font-variant
    font-weight
    gap
    grid
    grid-area
    grid-auto-columns
    grid-auto-flow
    grid-auto-rows
    grid-column
    grid-column-end
    grid-column-gap
    grid-column-start
    grid-gap
    grid-row
    grid-row-end
    grid-row-gap
    grid-row-start
    grid-template
    grid-template-areas
    grid-template-columns
    grid-template-rows
    height
    justify-content
    justify-items
    justify-self
    letter-spacing
    line-height
    list-style
    list-style-image
    list-style-position
    list-style-type
    margin
    margin-bottom
    margin-left
    margin-right
    margin-top
    max-height
    max-width
    min-height
    min-width
    opacity
    outline
    outline-color
    outline-offset
    outline-style
    outline-width
    overflow
    overflow-x
    overflow-y
    padding
    padding-bottom
    padding-left
    padding-right
    padding-top
    place-content
    place-items
    place-self
    table-layout
    text-align
    text-align-last
    text-decoration
    text-decoration-color
    text-decoration-line
    text-decoration-style
    text-indent
    text-justify
    text-overflow
    text-shadow
    text-transform
    visibility
    white-space
    width
    word-break
    word-spacing
    word-wrap

    Since the first version

    Closing <b> and <i> without line breaks*

    Since the first version

    Since the first version

    -

    1.53

    Support of the language attribute on <code> blocks.

    Agent 20.14

    Since the first version

    -

    None.

    <a href="url"> Link Text </a>

    Insert a hyperlink that will be displayed in the message.

    • href: the URL of the link • class: color options.

    <b>text</b>

    Bold formatting. Note: when receiving a message from an Agent that contains whitespace between the last character in a bolded section and the closing </b> tag, the bold section will be returned in Markdown (i.e. surrounded by double '*' characters) instead of XHTML tags.

    • class: color options.

    <i>text</i>

    Italics formatting. Note: when receiving a message from an Agent that contains whitespace between the last character in an italics-formatted section and the closing </i> tag, the italics section will be returned in Markdown (i.e. surrounded by single '*' characters) instead of XHTML tags.

    • class: color options.

    <pre> preformatted text </pre>

    Preformatted text.

    • class: color options. • Non-HTML MessageML are not supported inside <pre>.

    <span>text</span>

    No formatting. • This tag can be used to specify visual styles, by adding a class attribute. • This tag is used to create Structured objects.

    • class: color options. • data-entity-id • See below for list of translated PresentationML attributes.

    <code>code sample</code>

    Format the text as a block of code.

    • language: Use the language attribute to benefit from language specific code highlighting. The following languages are available: c, cpp, csharp, css, html, java, js, jsx, php, python, r, typescript, tsx, plaintext, yaml, scala, json, shell, markdown

    • Note: language attribute is only available with Agent 20.14+.

    • Note: please see escaping rules for when using code tag

    Initial release

    Since the first version

    Since the first version

    Examples

    <messageML>
        <h1>Formatting and semantics</h1>
        <p>This is a <a href="https://docs.developers.symphony.com/">Link</a> to our developer documentation.</p>
        <p>Part 1 of the paragraph separated from part 2 with a line break.<br/>Part 2 of the paragraph.</p>
        <p>This text can be either <b>bold</b> or <i>italic</i> or <span style="color:red;">red</span>, or even combine <b><i style="color:red;">several</i></b> formatting tags.</p>
        <pre>This is a preformatted text.</pre>
        <code language="html">&lt;h1&gt;Code sample&lt;/h1&gt;
    &lt;p&gt;This is some html&lt;/p&gt;</code>
    </messageML>

    Versions and Compatibility

    -

    <p>paragraph</p>

    Paragraph formatting.

    • class

    <hr />

    Horizontal rule.

    None.

    <ul> <li>list item</li> </ul>

    Unordered or bullet list. Cannot be empty, must contain at least one child <li> item.

    • class

    <ol> <li>list item</li> </ol>

    Numbered list. Cannot be empty, must contain at least one child <li> item.

    • class

    <div>paragraph</div>

    Block of text. • This tag can be used to specify visual styles, by adding a class attribute. • This tag is used to create . • This tag is also the root of any message read through the API.

    • class: • data-entity-id • data-icon-src • data-accent-color • See below for list of translated PresentationML attributes.

    <card> (see example below)

    Inserts a card. It contains two different sections: • the <header> (always visible) • the <body> (hidden)

    • iconSrc: image will be resized to 28 pixels by 28 pixels, use spacious mode. (.jpg, .png and .gif) • accent: use to select the accent color of the card.

    <expandable-card> (see example below)

    Inserts a card with new styles and multiple levels of display within the card

    • state (mandatory) in <expandable-card> can take 3 values: - "collapsed": only header is visible - "cropped": card expanded but the body is cropped - "expanded": card fully expanded • variant (optional) in <body>: defines the style of the card. It can be either "default" for the default blue style, or "error" for the red error style

    Here after you can find an example of a message sent by a bot and containing these content grouping tags as well as the structure of the messageML sent:

    <messageML>
        <h1>Heading texts</h1>
            <h1>This is a h1 heading text</h1>
            <h2>This is a h2 heading text</h2>
            <h3>This is a h3 heading text</h3>
            <h4>This is a h4 heading text</h4>
            <h5>This is a h5 heading text</h5>
            <h6>This is a h6 heading text</h6><br/>
        <h1>Paragraphs</h1>
            <p>This is a paragraph.</p>
    
    

    Please note that you can use content grouping tags mixed with other messageML tags such as Interactive Elements Forms. See the following example including forms in expandable-cards.

    <messageML>
      <form id="form_id">
        <h1>expandable-cards</h1>
          <h2>1st expandable-card</h2>
          <expandable-card state="collapsed">
            <header><h3>Header Content (always visible)</h3>This is a <b>collapsed</b> expandable-card with the <b>default</b> variant</header>
            <body>
              <h3>Body Content</h3>
              It is possible to use Elements in the body as you can see below:
              <text-field name="id1" placeholder="Enter your name..."/>
              <text-field name="id2" placeholder="Enter your age..."/>
              <button type="reset">Reset</button>
            </body>
          </expandable-card><br/>
          <h2>2nd expandable-card</h2>
          <expandable-card state="expanded">
            <header><h3>Header Content (always visible)</h3><text-field name="id_header" label="Text-field in the header" placeholder="Type your input..."/>This is an <b>expanded</b> expandable-card with the <b>default</b> variant and with a <b>Symphony Element</b> in the header</header>
            <body>
              <h3>Body Content</h3>
              When expanded, the whole body content is displayed in the expandable-card.
              <text-field name="id3" placeholder="Enter your name..."/>
              <text-field name="id4" placeholder="Enter your age..."/>
            </body>
          </expandable-card><br/>
          <h2>3rd expandable-card</h2>
          <expandable-card state="cropped">
            <header><h3>Header Content (always visible)</h3>This is a <b>cropped</b> expandable-card with the <b>error</b> variant</header>
            <body variant="error">
              <h3>Body Content</h3>
              When cropped, the body content is displayed in the expandable-card until a certain limit. A show more button allows to expand the card and display the rest of the body.
            </body>
          </expandable-card>
        <button name="form_id_submit">Submit</button>
      </form>
    </messageML>

    <h1>, <h2>, <h3>, <h4>, <h5>, <h6>

    Heading text. 6 levels.

    Tags

    • class

    Examples

    <

    &lt;

    Yes

    <messageML>&lt;</messageML>

    &

    &#38;

    Yes

    <messageML>&#38; </messageML>

    $

    &#36;

    Yes The $ character only needs to be escaped if it comes before the { character.

    <messageML>&#36;{}</messageML>

    #

    &#35;

    Yes The # character only needs to be escaped if it comes before the { character.

    <messageML>&#35;{}</messageML>

    >

    &gt;

    No

    <messageML>&gt;</messageML>

    "

    &quot;

    No

    <messageML>&quot;</messageML>

    '

    &#39;

    No

    <messageML>&#39;</messageML>

    *

    &#42;

    No

    <messageML>&#42;</messageML>

    %

    &#37;

    No

    <messageML>&#37;</messageML>

    Examples

    <messageML>
        These are special characters:
        <ul>
            <li>&lt;;</li>
            <li>&#38;;</li>
            <li>$ or &#36;;</li>
            <li># or &#35;;</li>
            <li>> or &gt;;</li>
            <li>" or &quot;;</li>
            <li>' or &#39;;</li>
            <li>* or &#42;;</li>
            <li>% or &#37;.</li>
        </ul>
    </messageML>

    Tags and mentions

    Tags

    MessageML supports the following tags to embed additional information into messages:

    Tag

    Description

    Optional attributes

    <mention uid="123456789"/>

    Insert a mention for the user whose Symphony userid is 123456789.

    Here after you can find an example of a message sent by a bot and containing these tags specific to Symphony Messaging as well as the structure of the messageML sent:

    Below several examples of financial instruments, using different types of identifiers and filters.

    When identifiers and filters are not sufficient to identify a unique match, or when an instrument is not found in our reference database, an error is returned, except if a fallback-ticker is specified.

    Enhanced tags notice

    This page describes the changes introduced by the new enhanced tags for Symphony developers

    Introduction to the enhanced tags

    Symphony users can now tag financial instruments using the Enhanced Tag feature.

    Instrument lookup type-ahead by ticker, name, ISIN, etc.

    It displays a typeahead when the user presses # in a chat conversation. The upper section of the typeahead shows regular hashtags previously exchanged with that user and the lower section, under INSTRUMENTS shows Stocks, ADRs, ETFs and Indices.

    By hovering over the Enhanced Tag, users can see essential reference data like company name, identifiers, exchange and currency.

    New hovercard for the enhanced tags

    The enhanced tags replace the existing $cashtags. This means that moving forward your apps and bots will need to handle enhanced tags instead of $cashtags.

    Understanding the impact of the new tags

    The impact of the enhanced tags on existing bots & apps has been carefully reviewed to ensure that there is no backward compatibility issue. However, we strongly recommend that you conduct some tests to validate the change.

    Please read below to understand the changes introduced with the new enhanced tags.

    • Existing bots can still produce legacy $cashtags both using the short tag notation (<tag cash="AAPL"/>), and using a Standard Entity ("type": "org.symphonyoss.fin.security")

    • Existing bots can easily include enhanced tags in messageML now. To do so, you will need to cuse the <tag> and provide one or several identifiers for that instrument. The instrument will then be resolved against our reference database, and properly formatted in the message. More information is available .

    • Bots consuming existing $cashtags in received messages are not impacted if they rely on the structured object (entityJSON). When they receive an enhanced tag, the exact same structure and properties will be present. There will be additional properties though, and the version field will be set to "2.0" instead of "1.0".

    • Bots that rely on the text representation of the tags (message field instead of the entityJSON field) will also not be impacted. However, this is not a recommended practice as this text representation may change to match the enhanced tag displayed symbol instead of the existing ticker in the future (e.g., text would change from "$TSLA" to "TSLA US"). If you rely on the text representation of the $cashtag instead of the structured data, you should consider updating the bot to rely on the structured data included in the entityJSON instead.

    • Existing signals will continue to work with the new enhanced tags. Messages containing the new tags will still match with the existing signals, meaning a signal matching "cash: AAPL" will match messages containing both "AAPL" and "AAPL US" for example.

    • For now, it is not yet possible to create signals based on the newly introduced properties of the enhanced tags, but this will change in the coming months. For example, it is not yet possible to create a signal that will match only on "TSLA US", but if you create a signal that matches on "TSLA", it will match messages containing "TSLA US" as well.

    • Existing apps that register a UI extension on $cashtag hovercards continue to receive the existing object for new enhanced tags.

    • However, whenever your app is notified of a user click on the hovercard, the app will receive in addition to the existing object a new structure containing the new enhanced tags properties.

    • If you decide to upgrade your app to leverage the new properties of the enhanced tags, please consider that you may still encounter legacy $cashtags for a long period of time, so should build around that. To detect if you are receiving a legacy tag or an enhanced one, you can rely on the version field included in the structure (org.symphonyoss.fin.security.version). It is set to "2.0" for the new enhanced tags.

    Please note below the differences between the structures of the enhanced tags and the legacy $cashtags.

    Radio Button

    Radio buttons are shown as small circles, which are filled or highlighted when selected. Only one radio button in a given group can be selected at the same time.

    Frequently, a set of radio buttons represents a single question which the user can answer by selecting a possible answer.

    Note: If you want the user to be able to select more than one option, use the Checkbox element.

    Attributes

    Attribute

    • The text node of the MessageML will be converted to the <label> tag. This will preserve the formatting tags <i> and <b>, if present.

    • Radio buttons are presented in radio groups (a collection of radio buttons describing a set of related options). Only one radio button in a group can be selected at the same time. Note: The radio group must share the same name (the value of the name attribute) to be treated as a group. Once the radio group is created, selecting any radio button in that group automatically deselects any other selected radio button in the same group.

    The following example shows radio buttons being used. It shows how developers can use the checked parameter with the value01 preselected when the form is sent. It also shows how users can select another radio button and how it automatically unselect any other value checked, as the 3 radio buttons have the same name and therefore are part of the same group "groupId".

    OpenChat

    Chat bots can add buttons in chat messages that on click will open an existing chat room or start a chat with a specific user or group of users.

    This can be useful to help Symphony users easily navigate from one chat to another, or to reference another discussion happening in a different chat.

    The new chat can either replace the current chat, or open on the side instead.

    MessageML tag

    OpenChat is represented in MessageML as a <ui-action action='open-im'> tag and wraps a single button.

    The <ui-action> tag for OpenChat supports the following attributes:

    Symphony users can interact with the OpenChat functionality via their keyboard using either "Enter" of "Space" to trigger the click action, once the UI component used for the OpenChat (i.e. button element) is in focus. Symphony users can move from one Element to another using "Tab".

    The following examples show the OpenChat functionality being used as follows:

    • The first open-im shows how the Symphony user may interact with a primary button that is empowered with the OpenChat functionality that opens a specific stream on the side of the current chat. Note that the trigger and side-by-side attributes are not mentioned, as they are not mandatory: they are then defined by their default behaviour.

    • The second open-im shows how the Symphony user may interact with a secondary button that is empowered with the OpenChat functionality that opens an IM with a specific user on the side of the current chat.

    • The max length of any ui-action attribute is 256 except user-ids attribute which max length is set to a list 15 ids.

    • The OpenChat functionality is not supported in forms (see ).

    • Please note that the attribute type

    Checkbox

    The checkbox is an interactive box that can be toggled by the user to indicate an affirmative or negative choice.

    When clicked, a checkmark (✓) appears inside the box, to indicate an affirmative choice (yes). When clicked again, the checkmark disappears, indicating a negative choice (no).

    Checkboxes are used to let a user select one or more options from a limited number of choices. Frequently, a set of checkboxes represents a single question which the user can answer by selecting any number of possible answers.

    Note: If you want the user to only be able to pick a single option, use the or the element.

    Attributes

    Attribute

    • The text node of the MessageML will be converted to the <label> tag. This will preserve the formatting tags <i> and <b>, if present.

    • A form can have a maximum of 50 checkboxes within it. Note: The limit in previous versions was set to 20, so this limit may still apply when sending messages to customers with an earlier version of Symphony (before 20.10).

    The following example shows checkboxes being used. It shows how developers can use the checked parameter with the value01 preselected when the form is sent. It also shows how users can select or unselect one or several checkboxes before submitting the form, as well as how to reset it to its initial values.

    Custom Entities

    Definition

    Structured Objects are rich, inline, interactive components of Symphony messages. Objects allow you to build innovative workflows that go beyond working with normal text or attached files.

    • Unlike normal message text, these objects are structured and do not need to be parsed to have business logic.

    • Unlike attachments, end-users can view and interact with objects directly from their Symphony client, without having to change context.

    • Structured Objects can be "injected" into Symphony by sending messages using Symphony's REST API.

    • Structured Objects can be rendered richly using .

    To inject messages containing structured objects:

    • Your pod must be configured for Symphony's REST API, and you must have the Agent, the component used for handling encryption and decryption of messages and content, set up.

    • Your Agent must be version 1.51 or later.

    • You must have an X.509 identity certificate for your bot service user for REST API authentication, where the common name on the certificate matches your service user's username.

    To build renderer applications for displaying your structured object:

    • You need to have an extension application created and enabled on your pod.

    Structured Objects are placed into Symphony messages and have two components:

    • Object Presentation, in format.

    • Object Data, a JSON object.

    Any message in Symphony can contain zero or more Structured Objects.

    • A message will always contain message presentation, in MessageML v2 format, with the optional object presentation of the Structured Objects it may contain.

    • If the message contains any structured objects, it will contain JSON data with all object data of the structured objects it may contain.

    You can create an object by invoking the endpoint. You need to include:

    • The message parameter, which contains the message presentation, with the object presentation for each Structured Object.

    • The data parameter, which contains JSON data with the object presentation for each structured object.

    These parameters also support using with Structured Objects.

    Message presentation is represented in MessageML format. For example:HTML

    To add an object to a message, include a div or a span tag with a unique data-entity-id attribute:HTML

    The data-entity-id tag refers to a specific object in the JSON data, which needs to include:

    • The data type.

    • The data version of that type. Both are needed to build renderer applications which can render this type of that version.

    This data can be used by applications in the web client to provide a rich display or end-user interactivity. In case no specific renderer application is available, you must provide a default presentation in the div or a span tags.HTML

    You can read objects using any of the endpoints designed to read messages, for example, the endpoint. This endpoint will let you read both the message presentation and object data fields.

    Renderer Applications leverage the Extension API to dynamically replace the presentation of a structured object. To create a renderer application:

    • Create an

    • Your application needs to use the , which will allow you to:

      • Register your application as being able to render a specific type, using the .

    To learn more about building Extension Applications that leverage structured objects, continue here:

    Render the object itself, by implementing the render function.

    Prerequisites

    Sending Structured Objects in Messages

    Message and Object Presentation

    Reading objects

    Note:

    As described in Message Format - MessageML v2, messages with Structured Objects can be created using the shorthand tags or the full tags. When they are read, the message presentation always contain the full tags, which are a subset of HTML tags.

    Renderer Applications

    Go further...

    Symphony's Extension API
    MessageML v2
    Create Message
    Apache FreeMarker templates
    Read Message
    Extension application
    entity service
    registerRenderer function
    <messageML>
      Hello <mention email="user@music.org" />. Here is an important message
    </messageML>
    <messageML>
      Hello <mention email="user@music.org" />. Here is an important message with an
      <div class="entity" data-entity-id="object001" /> 
      included.
    </messageML>
    {
        "object001":
        {
            "type":     "org.symphonyoss.fin.security",
            "version":  "1.0",
            "id":
            [
                {
                    "type":     "org.symphonyoss.fin.security.id.ticker",
                    "value":    "IBM"
                },
                {
                    "type":     "org.symphonyoss.fin.security.id.isin",
                    "value":    "US0378331005"
                },
                {
                    "type":     "org.symphonyoss.fin.security.id.cusip",
                    "value":    "037833100"
                }
            ]
        }
    }
    <messageML>
      Hello <mention email="user@music.org" />. Here is an important message with an 
      <div class="entity" data-entity-id="object001">object</div> 
      included.
    </messageML>

    If you plan to upgrade your bot to leverage the new properties of the enhanced tags, please consider that you may still encounter legacy $cashtags for a long period of time, so should build around that. To detect if you are receiving a legacy tag or an enhanced one, you can rely on the version field included in the structure (org.symphonyoss.fin.security.version). It is set to "2.0" for the new enhanced tags.

    The Signal API has not changed. In the coming months the API may change to adapt to the new tags and in that case this change will be introduced following a notice period provided that there is an impact on the API contract.
    // Presentation ML content of the message
    <div data-format="PresentationML" data-version="2.0" class="wysiwyg">
      <p><span class="entity" data-entity-id="0">$SAN</span></p>
    </div>
    
    // Entities (entityJSON field in the message):
    {
      "0": {
        "id": [
          {
            "type": "org.symphonyoss.fin.security.id.ticker",
            "value": "SAN"
          }
        ],
        "type": "org.symphonyoss.fin.security",
        "version": "1.0"
      }
    }
    // Presentation ML content of the message
    <div data-format="PresentationML" data-version="2.0" class="wysiwyg">
      <p><span class="entity" data-entity-id="0">$SAN</span></p>
    </div>
    
    // Entities (entityJSON field in the message):
    {
      "0": {
        "id": [
          {
            "type": "org.symphonyoss.fin.security.id.ticker",
            "value": "SAN"
          },
          {
            "type": "org.symphonyoss.fin.security.id.uniqueId",
            "value": "91e3e37d-da68-42e8-ba05-94aa51aebb4e"
          },
          {
            "type": "org.symphonyoss.fin.security.id.fullBbgTicker",
            "value": "SAN FP Equity"
          },
          {
            "type": "org.symphonyoss.fin.security.id.isin",
            "value": "FR0000120578"
          },
          {
            "type": "org.symphonyoss.fin.security.id.figi",
            "value": "BBG000BWBBP2"
          },
          {
            "type": "org.symphonyoss.fin.security.id.localCode",
            "value": "SAN"
          },
          {
            "type": "org.symphonyoss.fin.security.id.operationalMic",
            "value": "XPAR"
          },
          {
            "type": "org.symphonyoss.fin.security.exchangeName",
            "value": "Euronext Paris"
          },
          {
            "type": "org.symphonyoss.fin.security.country",
            "value": "France"
          },
          {
            "type": "org.symphonyoss.fin.security.displayName",
            "value": "Sanofi"
          },
          {
            "type": "org.symphonyoss.fin.security.currency",
            "value": "EUR"
          },
          {
            "type": "org.symphonyoss.fin.security.instrumentTypeCode",
            "value": "EQS"
          },
          {
            "type": "org.symphonyoss.fin.security.instrumentTypeName",
            "value": "Equity Shares"
          },
          {
            "type": "org.symphonyoss.fin.security.rootBbgCompTicker",
            "value": "SAN"
          },
          {
            "type": "org.symphonyoss.fin.security.bbgcompticker",
            "value": "SAN FP"
          }
        ],
        "type": "org.symphonyoss.fin.security",
        "version": "2.0"
      }
    } 

    Bots producing legacy $cashtags

    Bots consuming legacy $cashtags

    Signals

    Extension apps

    Message format

    Structure of legacy $cashtags

    Structure of enhanced tags

    here

    A form can have a maximum of 50 radio buttons. Note: The limit in previous versions was set to 20, so this limit may still apply when sending messages to customers with an earlier version of Symphony (before 20.10).

  • Once the user has selected a radio option, it can be deselected only by clicking on another radio option. The only way to deselect all the radio options is by clicking the reset button.

  • Type

    Required?

    Description

    name

    String

    Yes

    Identifies the radio button.

    value

    String

    No

    The value is the string that will be sent to the server. If the value is not specified, the string on will be sent by default.

    checked

    Boolean

    No

    If true, it specifies that the <radio> element should be pre-selected (checked) when the page loads. Accepted values: true and false.

    <messageML>
      <form id="form_id">
        <h2>radio buttons</h2>
          <radio name="groupId" value="value01" checked="true">red</radio>
          <radio name="groupId" value="value02">green</radio>
          <radio name="groupId" value="value03">blue</radio>
          <button type="reset">Reset</button>
          <button name="radio" type="action">Submit</button>
      </form>
    </messageML>
    [
        {
            "id": "chxhFk",
            "messageId": "BwcQN6Y7RcKxwpWDfcjL2n___pQD2WPebQ",
            "timestamp": 1563303517217,
            "type": "SYMPHONYELEMENTSACTION",
            "initiator": {
                "user": {
                    "userId": 7078106482890,
                    "firstName": "User",
                    "lastName": "Bot",
                    "displayName": "User",
                    "email": "user_bot@symphony.com",
                    "username": "user_bot"
                }
            },
    
            "payload": {
                "symphonyElementsAction": {
                    "stream": {
                      "streamId": "0YeiA-neZa1PrdHy1L82jX___pQjntU-dA",
                      "streamType": "ROOM"
                    },
                    "formMessageId": "qXF5jpNbJtlulAmjKjn0Pn///pQD2mc/dA==5935",
                    "formId": "form_id",
                    "formValues": {
                        "action": "radio",
                        "groupId": "value03"
                    }
                }
            }
        }
    ]

    Main features introduced

    Agent needed to parse message sent by the bot

    Client 2.0 release

    Backward client-compatibility behavior (e.g. external rooms)

    Initial release

    2.55.9

    Since first version

    Not working

    Rules and Limitations

    Examples

    Versions and Compatibility

    List of Integers

    Exclusive with stream-id

    List of ids of the users with whom the MIM must be opened when the Symphony user triggers the OpenChat functionality.

    stream-id

    String

    Exclusive with user-ids

    The id of the room/IM that must be opened when the Symphony user triggers the OpenChat functionality.

    NB: Please note that the stream-id is the exact Conversation ID that you can find in the UI, and not the URLSafe64 converted id (see more details in )

    side-by-side

    Boolean

    No.

    Default to true

    If set to false, the current chat will be replaced by the new chat to be opened when the Symphony user triggers the OpenChat functionality.

    The third open-im shows how the Symphony user may interact with a tertiary button that is empowered with the OpenChat functionality that opens a chat with a specific list of users on the side of the current chat.
  • The fourth open-im shows how the Symphony user may interact with a destructive button that is empowered with the OpenChat functionality that opens a specific stream that replaces the current chat.

  • of the button is not supported when wrapped by a
    <ui-action>
    tag.
  • When using user-ids attribute with 2 or more ids in the list, the functionality will always create a new chat between the considered users; it will not reopen an existing chat between these same users. This is a known limitation that might change in the future.

  • In case the side-by-side attribute is set to true, when the Symphony user interacts with the OpenChat component, the IM/Chatroom appears on the side of current module in focus. In case the current module is not part of a workspace, then clicking on the button automatically creates workspace and focuses automatically to the desired IM/chat.

  • The OpenChat feature is supported in popped-out mode with the following behaviour:

    • Current chat/IM on focus is popped-out independently from a workspace:

      • In case the side-by-side attribute is set to false, the popped-out module is replaced by the desired one

      • In case the side-by-side attribute is set to true, the popped-out module remains in place and the desired one opens in the main Symphony client

    • Current chat/IM on focus is part of a popped-out workspace (Capital Markets view only): same behaviour as if the workspace was not popped out: if the specific chat to be opened is not part of the workspace, it is automatically added, and then opened either on the side or in the place of the previous focused chat depending on the side-by-side attribute.

  • When opening a specific chatroom where the user is not part of, then:

    • If it is a private room, a modal dialog will appear informing the user he cannot perform the action

    • If it is a public room, then the user is automatically added to the room and the considered stream is opened

  • The side-by-side attribute set to false is meaningful only for users in Client 2.0

  • Attribute

    Type

    Required?

    Description

    action

    String

    Yes

    For OpenChat, always set to action='open-im'

    <messageML>
      <ui-action action='open-im' stream-id='rKiuGRoGDTrPtpHSIgmUgH///oVFs7kzdA=='><button>Stream</button></ui-action>
      <ui-action action='open-im' trigger='click' user-ids='[13056700583037]'><button class='secondary'>User A</button></ui-action>
      <ui-action action='open-im' trigger='click' user-ids='[13056700583037,13056700583039]'><button class='tertiary'>List of Users</button></ui-action>
      <ui-action action='open-im' trigger='click' stream-id='rKiuGRoGDTrPtpHSIgmUgH///oVFs7kzdA==' side-by-side='false'><button class='destructive'>Replace current chat</button></ui-action>
    </messageML>

    Main features introduced

    Agent needed to parse message sent by the bot

    Client 2.0 release

    Client 1.5 release

    Backward client-compatibility behavior (e.g. external rooms)

    Initial release

    20.12.2

    21.7

    20.13

    Accessibility

    Examples

    Rules and Limitations

    Versions and Compatibility

    Symphony Elements

    user-ids

    Not working

    Once selected, checkboxes can be deselected by clicking them.
  • Click the reset button to return the checkboxes to their original status (checked or unchecked).

  • If a checkbox is sent without at least one checked option, it will not be displayed in the datafeed payload.

  • Type

    Required?

    Description

    name

    String

    Yes

    Identifies the checkbox.

    value

    String

    No

    The value is the string that will be sent to the server. If the value is not specified, the string on will be sent by default.

    checked

    Boolean

    No

    If true, it specifies that the <checkbox> element should be pre-selected (checked) when the page loads. Accepted values: true and false.

    <messageML>
      <form id="form_id">
        <checkbox name="id1" value="value01" checked="true">Red</checkbox>
        <checkbox name="id2" value="value02" checked="false">Green</checkbox>
        <checkbox name="id3" value="value03" checked="false">Blue</checkbox>
        <button type="reset">Reset</button>
        <button name="example-button" type="action">Submit</button>    
      </form>
    </messageML>
    [
        {
            "id": "CfVa3O",
            "messageId": "TwSQ5mOSHJHaqABxRBYmmn___pQD5znvbQ",
            "timestamp": 1563302610448,
            "type": "SYMPHONYELEMENTSACTION",
            "initiator": {
                "user": {
                    "userId": 7078106482890,
                    "firstName": "User",
                    "lastName": "Bot",
                    "displayName": "User",
                    "email": "user_bot@symphony.com",
                    "username": "user_bot"
                }
            },
            "payload": {
                "symphonyElementsAction": {
                    "stream": {
                      "streamId": "0YeiA-neZa1PrdHy1L82jX___pQjntU-dA",
                      "streamType": "ROOM"
                    },
                    "formMessageId": "en1LFlhkWTwdXyYvyMsna3///pQD6JE4dA==5856",
                    "formId": "form_id",
                    "formValues": {
                        "action": "checkbox",
                        "id3": "value03"
                    }
                }
            }
        }
    ]

    Main features introduced

    Agent needed to parse message sent by the bot

    Client 2.0 release

    Backward client-compatibility behavior (e.g. external rooms)

    Initial release

    2.55.9

    Since first version

    Not working

    Rules and Limitations

    Examples

    Versions and Compatibility

    Radio Button
    Dropdown Menu
    <div style="color:red;">
    <p>This is a paragraph enclosed in a div that allows its text to be red.</p>
    </div><br/>
    <h1>Horizontal Rule</h1>
    Below you can see an horizontal rule<hr /><br/>
    <h1>Lists</h1>
    This is an unordered/bullet list:
    <ul>
    <li>Item 1</li>
    <li>Item 2</li>
    </ul>
    This is a numbered list:
    <ol>
    <li>Item 1</li>
    <li>Item 2</li>
    </ol><br/>
    <h1>Cards</h1>
    <card accent="tempo-bg-color--blue">
    <header>This is the header of a card</header>
    <body>This is the body of a card</body>
    </card>
    <expandable-card state="expanded">
    <header>This is the header of an expanded expandabled-card</header>
    <body variant="error">This is an error variant of the body of an expanded expandable-card</body>
    </expandable-card>
    </messageML>
    Structured objects
    color options
    background color values

    <mention email="user@music.org"/>

    Insert a mention for the user whose email address is user@music.org.

    • strict=true, the API will throw an error if no user of that email address exists. (default) • strict=false . Message is accepted even if the user cannot be resolved.

    <hash tag="label"/>

    Insert "label" as a free-text hashtag.

    <cash tag="ticker"/>

    Insert "ticker" as a free-text cashtag. Important: when sending numeric cashtags as signals, add a * after the $ sign, for example, $_122450. <messageML> `<cash tag="$_122450"/> `\

    Note: Cashtags are deprecated. Please use the <tag /> notation for financial instruments.

    <tag />

    Insert a financial instrument (enhanced tag) in your message, coming from our reference database.

    The following instruments are supported: Stocks, ETFs, Indices and currency pairs. To identify an instrument, you'll need to provide at least one identifier (e.g. an ISIN), and optionally some filters if your identifier is not specific enough. You can also specify a fallback-ticker that will act as a free-text tag (workaround) if we are not able to find the instrument referenced.

    More information on the new tags is available in the Enhanced tags notice.

    Identifiers:

    • fullbbgcompticker

    • figi

    • bbgcompticker

    • us-code

    • isin

    • local-code

    Filters:

    • instrument-class

    • bbgmarket-sector

    • return-main-listing

    Others:

    • fallback-ticker

    <chime />

    Send a chime alert.

    Note: No other content (even line breaks) is permitted with a <chime/> tag. Please see an example of the messageML to send a chime below.

    <messageML>
      <br/><span>Mention with an email: </span>
      <mention email="pierre.neu@symphony.com"/>
      <br/><span>Mention with a user Id: </span>
      <mention uid="71811853190567"/>
    </messageML>
    <messageML>
      <br/>
      <p>Hashtags: <hash tag="important"/><hash tag="stockmarket"/></p>
      <p>Legacy cashtags:	<cash tag="AAPL US"/> <cash tag="TSLA US"/></p>
    </messageML>
    <messageML>
      <table class="pasted-table">
        <thead>
          <tr>
            <th>Identifiers and filters</th>
            <th>Tag</th>
            <th>Comment</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td>FullBBGCompTicker</td>
            <td><tag fullbbgcompticker="TSLA US Equity"/></td>
            <td># unique if found</td>
          </tr>
          <tr>
            <td>Figi</td>
            <td><tag figi="BBG000N9P426" fallback-ticker="TSLA"/></td>
            <td># unique if found</td>
          </tr>
          <tr>
            <td>BBG Comp ticker on Market sector</td>
            <td><tag bbgcompticker="TSLA US" bbgmarket-sector="Equity" fallback-ticker="TSLA"/></td>
            <td># unique if found</td>
          </tr>
          <tr>
            <td>Figi ticker</td>
            <td><tag figi-ticker="TSLA UW" fallback-ticker="TSLA"/></td>
            <td># likely unique, may need filters</td>
          </tr>
          <tr>
            <td>BBG Comp ticker</td>
            <td><tag bbgcompticker="TSLA US" fallback-ticker="TSLA"/></td>
            <td># likely unique, may need filters</td>
          </tr>
          <tr>
            <td>US Code</td>
            <td><tag us-code="88160R101" fallback-ticker="TSLA"/></td>
            <td># likely NOT unique listing for stocks, need filters.</td>
          </tr>
          <tr>
            <td>US Code on Main listing</td>
            <td><tag us-code="88160R101" return-main-listing="true" fallback-ticker="TSLA"/></td>
            <td># ask SYM to return the instrument listed on primary exchange</td>
          </tr>
          <tr>
            <td>ISIN</td>
            <td><tag isin="US88160R1014" fallback-ticker="TSLA"/></td>
            <td># likely NOT unique listing for stocks, need filters.</td>
          </tr>
          <tr>
            <td>ISIN on Main listing</td>
            <td><tag isin="US88160R1014" return-main-listing="true" fallback-ticker="TSLA"/></td>
            <td># ask SYM to return the instrument listed on primary exchange</td>
          </tr>
          <tr>
            <td>Local code</td>
            <td><tag local-code="TSLA" fallback-ticker="TSLA"/></td>
            <td># likely NOT unique listing for stocks, need filters.</td>
          </tr>
          <tr>
            <td>Local code with Country</td>
            <td><tag local-code="TSLA" country-code="US" fallback-ticker="TSLA"/></td>
            <td># likely unique listing for US stocks</td>
          </tr>
          <tr>
            <td>Local code with MIC</td>
            <td><tag local-code="TSLA" operational-mic="XNAS" fallback-ticker="TSLA"/></td>
            <td># likely unique listing</td>
          </tr>
          <tr>
            <td>Local code with MIC and instrument class</td>
            <td><tag local-code="TSLA" operational-mic="XNAS" instrument-class="equity" fallback-ticker="TSLA"/></td>
            <td># likely unique listing</td>
          </tr>
          <tr>
            <td>Fallback ticker</td>
            <td><tag fallback-ticker="TSLA"/></td>
            <td>Always include a fall back to ensure the message will be accepted.</td>
          </tr>
        </tbody>
      </table>
    </messageML>
    
    <messageML><chime/></messageML>

    Examples

    Mentions

    Free-text Tags

    Enhanced tags (Financial instruments)

    Chime

    shorthand tags
    Special Characters

    Buttons

    Buttons are the Symphony elements responsible for submitting a form to the bot. As a result, all Symphony form elements are required to have at least one button where `type=action`. When an end-user clicks this button, the form and the value of each of the elements inside will be submitted to the bot via the datafeed and presented as a JSON payload.

    In addition, some forms can contain reset buttons. These buttons are used to reset a form back to its original state.

    Buttons support six different styles: primary, primary-link, secondary, tertiary, destructive and destructive-link. Each of those has different colors to suit different actions (to convey meaning). Use the class attribute to specify the style.

    • Primary: use the Primary button when there is a clear primary action on a message. You can use it for the submit button, for example.

    • Secondary: use the Secondary button when there are multiple actions of the same importance or some actions with less importance than a single primary action.

    • Destructive: use the Destructive button when an action results in the removal of an item or if it can result in a potentially serious negative consequence.

    • If class is not defined, the action button assumes the primary class by default. Action buttons should be used for affirmation or confirmation actions.

    • Reset buttons have the secondary class set by default. Reset buttons should be used when the content of the fields need to return to their original state.

    The following example shows the use of the Reset and the Submit button when sending a text inserted in a .

    Main features introduced
    Agent needed to parse message sent by the bot
    Client 2.0 release
    Mobile

    country-code

  • operational-mic

  • Overview of Streams

    Primary-link, Tertiary and Destructive-link: These styles are variations respectively of the Primary, Secondary and Destructive buttons but without borders. They are low prominence options that can be used alongside a Primary or as standalone buttons with the ability to read more information.

    type

    String

    No. Default:action

    Indicates whether the button is an action button or a reset button. When clicked, the action button sends the form information to the datafeed. On the other hand, the reset button resets the form-data to its initial values. Accepted values: action and reset.

    class

    String

    No. Default: primary

    Toggle between new palette of colors: primary, secondary, destructive, primary-link, tertiary and destructive-link.

    icon

    String

    No

    Adds an icon before the button name. Only icons from our are supported. Each icon is identified by its name.

    formnovalidate

    Boolean

    No. Default: False

    Indicates if this submit button bypasses the form validation (required fields and regular expressions). This can be useful in some situations such as "Cancel" buttons that user should still be able to click even if other form is not in a valid state.

    Reset features behaviour is to show back the initial value of the form

    2.55.9

    Since first version

    Since first version

    New styles: • New designs for the buttons • Styles primary destructive and secondary destructive are deprecated • Styles tertiary and destructive are introduced

    20.6

    Since first version

    Since first version

    New styles: primary-link and destructive-link Support for icons.

    23.11

    23.12

    Supported

    formnovalidate

    25.6

    25.9

    Not supported yet.

    Attribute

    Type

    Required?

    Description

    name

    String

    Yes

    Identifies the clicked button.

    <messageML>
      <form id="form_id">
        <text-field name="text-field" placeholder="Add your comment here" required="true">Initial value</text-field>
        <button type="reset">Reset</button>
        <button name="submit_button" type="action">Submit</button>    
      </form>
    </messageML>
    <button name="send-primary" type="action" class="primary">Primary Button</button>
    <button name="send-secondary" type="action" class="secondary">Secondary Button</button>
    <button name="send-tertiary" type="action" class="tertiary">Tertiary Button</button>
    <button name="send-destructive" type="action" class="destructive">Destructive Button</button>
    {
            "id": "UW2p27",
            "messageId": "4KrVjUU4gnGziWnlqMmD2n___oxo916XbQ",
            "timestamp": 1595966792040,
            "type": "SYMPHONYELEMENTSACTION",
            "initiator": {
                "user": {
                    "userId": 7078106482890,
                    "firstName": "User",
                    "lastName": "Bot",
                    "displayName": "User",
                    "email": "user_bot@symphony.com",
                    "username": "user_bot"
                }
            },
            "payload": {
                "symphonyElementsAction": {
                    "stream": {
                        "streamId": "iMft6PLA4lHrEA9icKJobX___oyCKdVVdA",
                        "streamType": "ROOM"
                    },
                    "formMessageId": "zGeog3OqoYqVI2lwcX2o1X___oxo-A_ubQ",
                    "formId": "form_id",
                    "formValues": {
                        "action": "submit_button",
                        "init": "hello, my name is John Smith"
                    }
                }
            }
        },

    Initial release

    2.55.9

    Since first version

    Since first version

    Attributes

    Rules and Limitations

    Examples

    Versions

    Text Field

    Text Area

    The textarea element is a field for multi-line text input, allowing users to edit multiple lines of plain text. Text areas are useful to collect or edit runs of text like messages, opinions, reviews, articles, etc.

    Attributes

    Attribute

    Type

    Required?

    Description

    With Symphony v20.6, bot developers can use Regex to validate text fields and text areas using the pattern and pattern-error-message attributes. For more information and examples, refer to Regular .

    • The text field must be a self-closing tag or have no children.

    • You can add a default text in your text area by including it between the <textarea></textarea> tags. Note that unlike the placeholder text, the default text will be sent with the form if not edited by the user. Refer to Examples for more information.

    The following example shows two textareas being used as follows:

    • The first textarea (id1) shows how to display a default text ("With initial value"). Note that the default text would have been sent to the payload if it had not been deleted before submitting the form.

    • The second text-field (req) shows how a placeholder text ("Required, with a placeholder, a regex, a label, and a tooltip") is displayed in the UI. Please note the placeholder text is not sent in the payload if no text has been entered in the field by the enduser. It shows as well the behaviour of a required textarea in a form, which cannot be submitted in case it is not filled; an error is displayed under the textarea in case the user submits the form with this empty field. The textarea presents how a label text ("My Label") as well as a title text ("My Tooltip/n With a second line") are displayed in the UI. Finally, it shows how users can interact with a regex pattern which does not allow the form to be submitted if the input does not follow the pattern required by the bot developer.

    Masked Text Field

    see Text Field for more information

    The masked text input is a single-line plain text editor control in which the text is masked by replacing each character with a dot (•) symbol, providing a way for the user to enter data without people over their shoulder being able to see what they are entering.

    Use the maxlength and minlength attributes to specify the maximum and minimum length of the value that can be entered.

    Attributes

    With Symphony v20.6, bot developers can use Regex to validate text fields and text areas using the pattern and pattern-error-message attributes. For more information and examples, refer to .

    • The masked text field has a max number of 128 characters.

    • The masked text field must be a self-closing tag or have no children.

    • The masked text field is a feature that only hides the content in the UI. Even though it is masked in the UI, the text will be submitted in clear and processed & encrypted the same way as any other text entered in Symphony.

    The following examples show masked text-fields being used as follows:

    • The first masked text-field (init) shows how to display a default text ("With initial value"). Note that the default text would have been sent to the payload if it had not been deleted before submitting the form.

    • The second masked text-field (placeholder) shows how a placeholder text ("Only Placeholder") is displayed in the UI. Please note the placeholder text is not masked nor sent in the payload if no text has been entered in the field by the enduser.

    • The third masked text-field (

    Person Selector

    The Person Selector is an element used for finding and selecting people. Person Selectors are used in many places within Symphony, so you should be familiar with how they work.

    When a user types the person's name, a drop-down will be displayed with the results found for the data the user entered. The following example shows how three people with the same name (Vincent) have been found.

    Attributes

    Attribute

    Type

    • The Person Selector element supports multi-user selection which means that you can search for more than one person using the same selector.

    The following examples show person selectors being used as follows:

    • The first person-selector (placeholder) shows how a placeholder text ("My Placeholder") is displayed in the UI. Please note the placeholder text is not sent in the payload if no option from the dropdown menu has been selected by the enduser.

    • The second person-selector (placeholder) shows how the bot can introduce a default value in the person selector. It shows as well how a Symphony user can interact with the clear all functionality.

    • The third person-selector (

    Regex

    20.6

    Since first version

    Regex validation not enforced but field can be submitted

    Label

    20.7

    Since first version

    Label displayed and form can still be submitted

    Tooltip (title)

    20.7

    Since first version

    Tooltip not displayed but form can still be submitted

    row and col

    23.11

    24.1

    Not supported.

    name

    String

    Yes

    Identifies the text area.

    placeholder

    String

    No

    Specifies a short hint that describes the expected value of the text area.

    required

    Boolean

    No

    If true, it specifies that the text area must be filled out before submitting the form. Accepted values; true and false.

    pattern

    String

    No

    Regex String to match for input validation

    pattern-error-message

    String

    No

    Error message returned to user if pattern parameter matches user input

    title

    It accepts a simple text and \n for line breaks

    No

    The description that will be displayed when clicking the tooltip icon located on top of the Masked Text Field Element. Max length: 256 characters. Available from Symphony v20.8 and above.

    label

    String

    Not required but it is recommended if title is defined

    Definition of the label that will be displayed on top of the Masked Text Field Element. Available from Symphony v20.8 and above.

    rows

    Number

    No

    Specify the number of rows (height) of the text area that will be displayed by default.

    cols

    Number

    No

    Specify the number of columns (width) of the text area that will be displayed by default.

    <messageML>
      <form id="form_id">
        <h2>textareas</h2>
          <textarea name="id1" >With initial value</textarea>
          <textarea name="req" required="true" label="My label" title="My title\nWith second line" pattern="^[a-zA-Z]{3,3}$" pattern-error-message="My error message - must contain exactly 3 letters" placeholder="Required, with a placeholder, a regex, a label, and a tooltip"></textarea>
          <button name="textarea">Submit</button>
      </form>
    </messageML>
    [
        {
            "id": "wPptaz",
            "messageId": "LI4WgwZSDcstpKjyeKvCH3___pQEQvHfbQ",
            "timestamp": 1563296599584,
            "type": "SYMPHONYELEMENTSACTION",
            "initiator": {
                "user": {
                    "userId": 7078106482890,
                    "firstName": "User",
                    "lastName": "Bot",
                    "displayName": "User",
                    "email": "userbot@symphony.com",
                    "username": "user_bot"
                }
            },
            "payload": {
                "symphonyElementsAction": {
                    "actionStream": {
                        "streamId": "0YeiA-neZa1PrdHy1L82jX___pQjntU-dA"
                    },
                    "formStream": {
                        "streamId": "YuK1c2y2yuie6+UfQnjSPX///pQEn69idA=="
                    },
                    "formMessageId": "1P6z5kI6OzkxTKEoKOgWZ3///pQERpkYdA==5338",
                    "formId": "form_id",
                    "formValues": {
                        "action": "textarea",
                        "id1": "",
                        "req": "abc"
                    }
                }
            }
        }
    ]

    Main features introduced

    Agent needed to parse message sent by the bot

    Client 2.0 release

    Backward client-compatibility behavior (e.g. external rooms)

    Initial release

    2.55.9

    Since first version

    Not working

    Using Input Validation

    Rules and Limitations

    Examples

    Versions and Compatibility

    Expressions - Regex

    Compliance Officers have access to the content of the masked text field.

    noreq
    ) shows how a user can interact with a
    non-required
    field. Even if the field is empty (only a placeholder text is present but does not count as a value), it does not prevent the enduser from submitting the form.
  • The fourth masked text-field (req) shows the behaviour of the unique required field of the form, which cannot be submitted in case it is not filled; an error is displayed under the field in case the user submits the form with this empty field.

  • The fifth masked text-field (regex) shows the behaviour of the field when a regex pattern is entered. You can note that the pattern-error-message is displayed under the field if the input does not follow the pattern required by the bot developer.

  • The sixth masked text-field (min) shows how to force users to enter an input with a minimum number of characters, and how an error message is displayed under the field if the input does not respect the minlength required.

  • The seventh masked text-field (label) shows how a label text ("My Label") is displayed.

  • The eighth masked text-field (tooltip) shows how a title text ("My Tooltip/n With a second line") is inserted in the UI under the (i) icon, and how the text entered in the title parameter is displayed when the enduser clicks on the icon.

  • Attribute

    Type

    Required?

    Description

    name

    String

    Yes

    Identifies the input content.

    placeholder

    String

    No

    Specifies a short hint that describes the expected value of the input field.

    required

    Boolean

    No

    If true, it specifies that the input field must be filled out before submitting the form. Accepted values; true and false.

    masked

    Boolean

    Yes

    In case you want to include a text field with masked characters [hidden by asterisk (*) symbols] , you must set maskedas true. If true, it creates a masked text field with hide/show options.

    maxlength

    Integer

    No

    The maxlength attribute allows you to specify a maximum number of characters that the user can input.

    minlength

    Integer

    No

    The minlength attribute allows you to specify a minimum number of characters that the user can input.

    pattern

    String

    No

    Regex String to match for input validation

    pattern-error-message

    String

    No

    Error message returned to user if pattern parameter matches user input

    title

    It accepts a simple text and \n for line breaks

    No

    The description that will be displayed when clicking the tooltip icon located on top of the Masked Text Field Element. Max length: 256 characters. Available from Symphony v20.8 and above.

    label

    String

    Not required but it is recommended if title is defined

    Definition of the label that will be displayed on top of the Masked Text Field Element. Available from Symphony v20.8 and above.

    <messageML>
      <form id="form_id">
        <h2>masked text-fields</h2>
          <text-field masked="true" name="init">With initial value</text-field>
          <text-field masked="true" name="placeholder" placeholder="Only Placeholder"></text-field>
          <text-field masked="true" name="noreq" placeholder="Not required"></text-field>
          <text-field masked="true" name="req" required="true" placeholder="Required"></text-field>
          <text-field masked="true" name="regex" pattern="^[a-zA-Z]{3,3}$" pattern-error-message="My error message - must contain exactly 3 letters">Regex</text-field>
          <text-field masked="true" name="min" placeholder="With min length" minlength="3"></text-field>
          <text-field masked="true" name="label" label="My Label">With Label</text-field>
          <text-field masked="true" name="tooltip" title="My Tooltip\n With a second line">With Tooltip</text-field>
          <button name="maskedtext-field">Submit</button>
      </form>
    </messageML>
    [
        {
            "id": "q6eUgG",
            "messageId": "NowSKCnJJBdPOXQyoPQg8X___pQDVWaBbQ",
            "timestamp": 1563312167294,
            "type": "SYMPHONYELEMENTSACTION",
            "initiator": {
                "user": {
                    "userId": 7078106482890,
                    "firstName": "User",
                    "lastName": "Bot",
                    "displayName": "User",
                    "email": "user_bot@symphony.com",
                    "username": "user_bot"
                }
            },
            "payload": {
                "symphonyElementsAction": {
                    "actionStream": {
                        "streamId": "0YeiA-neZa1PrdHy1L82jX___pQjntU-dA"
                    },
                    "formStream": {
                        "streamId": "YuK1c2y2yuie6+UfQnjSPX///pQEn69idA=="
                    },
                    "formMessageId": "5iSJ+faXx/23Jkehx3lpSn///pQDVedXdA==5587",
                    "formId": "form_id",
                    "formValues": {
                        "action": "maskedtext-field",
                        "init": "",
                        "placeholder": "",
                        "noreq": "",
                        "req": "test",
                        "regex": "Reg",
                        "min6": "abc",
                        "label": "With Label",
                        "tooltip": "With Tooltip"
                    }
                }
            }
        }
    ]

    Using Input Validation

    Rules and Limitations

    Examples

    Regular Expressions - Regex
    noreq
    ) shows how a user can interact with a
    non-required
    field. Even if nobody is selected by the user, it does not prevent the enduser from submitting the form.
  • The fourth person-selector (req) shows the behaviour of the unique required field of the form, which cannot be submitted in case nobody from the person selector is selected by the user; an error is displayed under the field in case the user submits the form with this empty field. An auto-filtering behaviour allows the user to see less options as he digits some input. Also, it shows how Symphony users can remove some of the selected users with the cross associated to that specific user.

  • The fifth person-selector (label) shows how a label text ("My Label") is displayed.

  • The sixth person-selector (tooltip) shows how a title text ("My Tooltip/n With a second line") is inserted in the UI under the (i) icon, and how the text entered in the title parameter is displayed when the enduser clicks on the icon.

  • Label

    20.7

    Since first version

    Label displayed and form can still be submitted

    Tooltip (title)

    20.7

    Since first version

    Tooltip not displayed but form can still be submitted

    Value

    20.12

    21.7

    For client 1.5, it displays the person-selector as if there was no default value

    Required?

    Description

    name

    String

    Yes

    Identifies the person selector

    placeholder

    String

    No

    Specifies a short hint that describes the expected value of the input field.

    required

    Boolean

    No

    If true, it specifies that the person selector must be filled out before submitting the form, which means that at least one person must be "selected" Accepted values; true and false.

    title

    It accepts a simple text and \n for line breaks

    No

    The description that will be displayed when clicking the tooltip icon located on top of the Element. Max length: 256 characters.

    label

    String

    Not required but it is recommended if title is defined

    Definition of the label that will be displayed on top of the Masked Text Field Element.

    value

    Array of

    long

    No

    Default value that will be preselected in the person-selector when the user receive the form from the bot.

    <messageML>
      <form id="form_id">
        <h2>person-selectors</h2>
          <person-selector name="withplaceholder" placeholder="My Placeholder"/>
          <person-selector name="withdefaultvalues" label="With default values" value='[12987981109743,12987981109741]' />
          <person-selector name="noreq" placeholder="Not required"/>
          <person-selector name="req" required="true" placeholder="Required"/>
          <person-selector name="withlabel" label="My Label" placeholder="With Label"/>
          <person-selector name="withtooltip" title="My Tooltip\n With a second line" placeholder="With Tooltip"/>
          <button name="person-selector">Submit</button>
      </form>
    </messageML>
    [
        {
            "id": "RJ4MqQ",
            "messageId": "BnjUz2Q26tKI_kQiplv0IX___pP-I0xXbQ",
            "timestamp": 1563399336872,
            "type": "SYMPHONYELEMENTSACTION",
            "initiator": {
                "user": {
                    "userId": 7078106482890, 
                    "firstName": "User",
                    "lastName": "Bot",
                    "displayName": "User",
                    "email": "user_bot@symphony.com",
                    "username": "user_bot"
                }
            },
            "payload": {
                "symphonyElementsAction": {
                    "actionStream": {
                        "streamId": "0YeiA-neZa1PrdHy1L82jX___pQjntU-dA"
                    },
                    "formStream": {
                        "streamId": "YuK1c2y2yuie6+UfQnjSPX///pQEn69idA=="
                    },
                    "formMessageId": "ojfA0Eei0kSymzDpX72ysX///pP+I7LjdA==5615",
                    "formId": "form_id",
                    "formValues": {
                        "action": "person-selectors",
                        "withplaceholder": [],
                        "withdefaultvalues": [
                            12987981109743
                        ],
                        "noreq": [],
                        "req": [
                            7078106482890
                        ],
                        "withlabel": [],
                        "withtooltip": []
                    }
                }
            }
        }
    ]

    Main features introduced

    Agent needed to parse message sent by the bot

    Client 2.0 release

    Backward client-compatibility behavior (e.g. external rooms)

    Initial release

    2.55.9

    Since first version

    Not working

    Rules and Limitations

    Examples

    User ID

    The result returned by the datafeed for the selected users is an array of user Ids, which is an array of long.

    Versions and Compatibility

    UI Toolkit list

    Elements Interactive Forms

    Symphony Messaging Elements Forms enable bots to send messages that contain interactive forms with pre-designed text fields, dropdown menus, person selectors, buttons and more. This allows bots to interact with users in a very easy and guided way.

    By reusing our pre-designed standard UX component libraries, Elements provide developers with out-of-the-box tools to easily create interactive bot messages that look and feel like they belong in Symphony Messaging. To use the Elements, you just need to call the Create Message endpoint with your bot, using the MessageML format.

    Here after, you will find a brief introduction of how to send Elements, then an update of the message flow for Elements, and finally the form specifications.

    Sending Elements

    To start using Symphony Messaging Elements, you first need to create a form element using the <form> MessageML tag. The form element can be considered the "frame" of a message, containing elements that will be sent by the bot and subsequently read by the datafeed.

    You can see below an example of how a user can interact with a form that was sent by a bot, as well as the messageML structure of the message that was sent by the bot, and the payload that is generated and therefore delivered to the bot via the datafeed, containing the information completed and submitted by the user. Please use the tabs to navigate between these 3 documents.

    To begin leveraging Symphony Messaging Elements in your bot workflows continue onto our Available Elements that you can find in the subpages.

    Every message exists as part of a flow, in a continuum of events that results in user interaction.

    Here is that flow in colorful diagram form, for you to know more about each stage of the message:

    1. A Bot sends a message with Symphony Messaging Elements in a form

    2. The message/from is visible to users. Users interact with the elements

    3. Once submitted, the data is submitted to the bot

    Forms are represented by the <form> tag, as you can see in the examples above.

    • The form element can be considered the "frame" of a message, containing elements that will be sent by the bot and subsequently read by the datafeed.

    • To be considered valid, the form tag must contain at least one action type "Button" as a child. For more information, refer to .

    • All of the data within a form element will be sent to a bot via the datafeed when a user clicks one of the action buttons in that form. The name attribute of the button will be the value of the

    The following example shows three forms being used as follows:

    • The first form (default) shows how Symphony Messaging users interact with a form, and how the Elements are disabled once the form is submitted.

    • The second form (multi-submit-reset) shows how to create a form that can be submitted several times and which resets all its Elements to their default value once the user submits it. You note the Elements are first disabled while loading, then the button shows the user the form has been submitted, before the form is enabled back to its default value for the user to submit it again.

    Table Select

    The Table Select is not an Element itself but an example of what can be achieved by using Elements with the Apache FreeMarker templates. This way, it is possible to build tables which contain a special column that allows users to select one or more rows, either with the Checkbox or the Button Element.

    The following image shows three different tables. The first table shows the use of checkboxes to select rows, positioned to the right side of the table. The second example also shows checkboxes, but they are positioned to the left side. The last table shows buttons positioned to the right.

    Building a Table Select with Apache FreeMarker

    The following example shows how to create a Table Select structure using the FreeMarker template and a JSON file.

    In the JSON data, you can configure the type of the Element that will be added to the Table Select and its position:

    In this example, the table type is set as button and the position is set as left.

    Note that the template is being used to create the messageML that is rendering the Table.

    • The table can be generated without header or footer.

    • If the table type is equal to "checkbox", then checkboxes will be added to the rows of the table.

    • A checkbox can also be added in the header. Please note, clicking the checkbox in the header will not check all rows' checkboxes.

    Text Field

    Symphony provides two types of elements for text input fields: are for a single-line input; and is for multi-line input.

    Timezone Picker

    Do you need users to pick a timezone as part of an interactive flow? With the Timezone Picker, Symphony users can easily select a timezone from a selection of possible values. It recognises both cities and countries so the user can quickly filter and find the right timezone.

    The Timezone Picker is represented by the <timezone-picker> tag, as you can see in the examples at the bottom of the page.

    You can see below the designs of the timezone picker.

    For a list of all the available elements, refer to .

    Bots can access the data, by reading the datafeed.

    multi-submit

    String

    No

    Specifies that the form can be submitted several times by the user and the reset behavior. See the possible values and behaviors in Rules and Limitations below.

    action
    field within the datafeed payload. That way the bot manager can know which button triggered the submission of that form. Starting with Agent 23.11, the auto-submit feature allows to submit the form with a TextField, or with a DropDown Menu.
  • If there is more than one element in the form having the same name attribute, the value is converted to an array. Every index of the array is related to a specific element value. The index order is not guaranteed, so the developer needs to iterate through this array and collect the values.

  • When a form is submitted and multi-submit attribute is not specified, all the elements within it will be disabled, not being possible to edit or resend the same form. However, if the page is refreshed, the user can fill out the form again and submit it as a new form.

  • The attribute multi-submit allows the us to submit the form several times even without needing to refresh the page. It can take 2 different string values:

    • reset which resets the form to the default value when enabling it again for the user,

    • no-reset which keeps the values that were submitted by the user when enabling it again for the user.

  • When designing forms, it is important to consider the message size limit. For more information refer to Message size limits.

  • The third form (multi-submit-no-reset) shows how to create a form that can be submitted several times and which keeps last submitted values once the user submits it. You note the Elements are first disabled while loading, then the button shows the user the form has been submitted, before the form is enabled back to its last submitted value for the user to submit it again.

    Not working

    Multi-submit attribute

    20.13

    21.8

    -

    -

    [
        {
            "id": "Y6OwLV",
            "messageId": "N0DEie_ig1_1MwfGQq0df3___oNnFeTobQ",
            "timestamp": 1634653051671,
            "type": "SYMPHONYELEMENTSACTION",
            "initiator": {
                "user": {
                    "userId": 11338713661667,
                    "firstName": "Thibault",
                    "lastName": "Chays",
                    "displayName": "Internal User",
                    "email": "thibault.chays@symphony.com",
                    "username": "thibault.chays"
                }
            },
            "payload": {
                "symphonyElementsAction": {
                    "stream": {
                        "streamId": "usnBKBkH_BVrGOiVpaupEH___okFfE7QdA",
                        "streamType": "IM"
                    },
                    "formMessageId": "L87DKjjrGhjH3_WN8_rqYn___oNnJZ9AbQ",
                    "formId": "form_id",
                    "formValues": {
                        "action": "submit_button",
                        "name": "John",
                        "email": "john@email.com",
                        "country": "opt1",
                        "example_radio": "option_01",
                        "checkbox_1": "value01",
                        "checkbox_2": "value02",
                        "comment": "test"
                    }
                }
            }
        }
    ]

    Attribute

    Type

    Required?

    Description

    id

    String

    Yes

    Identifies the form.

    <messageML>
      <form id="default">
        <text-field name="test"> This form becomes disabled once submitted</text-field>
        <button name="default">Submit</button>
      </form>
      <hr/>
      <form id="multi-submit-reset" multi-submit="reset">
        <text-field name="test" label="Resets values to default"> This form can be submitted more than once</text-field>
        <button name="multi-submit-reset">Submit</button>
      </form>
      <hr/>
      <form id="multi-submit-no-reset" multi-submit="no-reset">
        <text-field name="test" label="Keeps last submitted values"> This form  can be submitted more than once</text-field>
        <button name="multi-submit-no-reset">Submit</button>
      </form>
    </messageML>

    Main features introduced

    Agent needed to parse message sent by the bot

    Client 2.0 release

    Client 1.5 release

    Backward client-compatibility behavior (e.g. external rooms)

    Initial release

    2.55.9

    Since first version

    Known Limitations

    • Once the user has submitted the form, it becomes disabled. However, if the conversation is reloaded, the form resets and the user is able to send a new reply. If your workflow requires a single reply per user, please implement this control on the Bot side.

    Message Flow (for Forms)

    Form specification

    MessageML Tag

    Attributes

    Rules and Limitations

    Examples

    Versions and Compatibility

    Buttons
    <messageML> 
        <form id="form_id"> 
            <h4>Personal Information</h4>
            <text-field name="name" required="true" placeholder="Name"
            <text-field name="email" required="true" placeholder="email"
    
            <h4>Select your country</h4>
            <select name="country">
                <option value="opt1">Australia</option>
                <option value="opt2">Brazil</option>
                <option value="opt3">China</option>
                <option value="opt4">Denmark</option>
                <option value="opt5">Ecuador</option>
                <option value="opt6">France</option>
                <option value="opt7">Germany</option>
                <option value="opt8">Italy</option>
                <option value="opt9">Japan</option>
            </select>
    
            <h4>Choose your option</h4>            
            <radio name="example_radio" value="option_01" checked="true"
            <radio name="example_radio" value="option_02">Unmarked</radio>
    
            <h4>Choose your option</h4> 
            <checkbox name="checkbox_1" value="value01" checked="true"
            <checkbox name="checkbox_2" value="value02">Unchecked</checkbox>
    
            <h4>Send a comment</h4> 
            <textarea name="comment" placeholder="Add your comment here" required="true"
    
            <button type="reset">Reset</button>
            <button name="submit_button" type="action">Submit</button>
    
        </form>
    </messageML>

    1.55

    position

    String

    Yes

    This attribute indicates how the buttons and checkboxes must be aligned inside the column. Accepted values: left or right. For more information, refer to the JSON example below.

    If the table type is equal to "button", then buttons will be added to select a specific row of the table.

  • When creating a MessageML using a Freemarker template, you must send a JSON file with it.

  • Attribute

    Type

    Required?

    Description

    type

    String

    Yes

    The typeattribute determines if a table will display a special column with Buttons or Checkboxes within it. Note that a table can have only one of the two possible types, being button or checkbox. For more information, see the Example below.

    <#macro createSelectHeader>
        <#if data.select.type=='checkbox'>
            <td>
                <input type="checkbox" name="tablesel-header" />
            </td>
            <#elseif data.select.type='button'>
                <td>Select</td>
        </#if>
    </#macro>
    <#macro createSelectBody index>
        <#if data.select.type=='checkbox'>
            <td>
                <input type="checkbox" name="tablesel-row-${index}" />
            </td>
            <#elseif data.select.type='button'>
                <td>
                    <button name="tablesel-row-${index}">SELECT</button>
                </td>
        </#if>
    </#macro>
    <#macro createSelectFooter>
        <#if data.select.type=='checkbox'>
            <td>
                <input type="checkbox" name="tablesel-footer" />
            </td>
            <#elseif data.select.type='button'>
                <td>
                    <button name="tablesel-footer">SELECT</button>
                </td>
        </#if>
    </#macro>
    <messageML>
        <form id="example">
            <table>
                <#if data.header?has_content>
                    <thead>
                        <tr>
                            <#if data.select.position=='left'>
                                <@createSelectHeader/>
                            </#if>
                            <#list data.header as row>
                                <#list row as cell>
                                    <td>${cell}</td>
                                </#list>
                            </#list>
                            <#if data.select.position=='right'>
                                <@createSelectHeader/>
                            </#if>
                        </tr>
                    </thead>
                </#if>
                <#list data.body>
                    <tbody>
                        <#items as row>
                            <tr>
                                <#if data.select.position=='left'>
                                    <@createSelectBody index="${row?counter}" />
                                </#if>
                                <#list row as cell>
                                    <td>${cell}</td>
                                </#list>
                                <#if data.select.position=='right'>
                                    <@createSelectBody index="${row?counter}" />
                                </#if>
                            </tr>
                        </#items>
                    </tbody>
                </#list>
                <#if data.footer?has_content>
                    <tfoot>
                        <tr>
                            <#if data.select.position=='left'>
                                <@createSelectFooter/>
                            </#if>
                            <#list data.footer as row>
                                <#list row as cell>
                                    <td>${cell}</td>
                                </#list>
                            </#list>
                            <#if data.select.position=='right'>
                                <@createSelectFooter/>
                            </#if>
                        </tr>
                    </tfoot>
                </#if>
            </table>
        </form>
    </messageML>
    {
      "select": {
        "position": "left",
        "type": "button"
      },
      "header": [
        ["H1","H2","H3"]
      ],
      "body": [
        ["A1", "B1", "C1"],
        ["A2", "B2", "C2"],
        ["A3", "B3", "C3"]
      ],
      "footer": [
        ["F1","F2","F3"]
      ]
    }
    <messageML>
        <form id="example">
            <table>
                <thead>
                    <tr>
                        <td>Select</td>
                        <td>H1</td>
                        <td>H2</td>
                        <td>H3</td>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td>
                            <button type="action" name="tablesel-row-1">SELECT</button>
                        </td>
                        <td>A1</td>
                        <td>B1</td>
                        <td>C1</td>
                    </tr>
                    <tr>
                        <td>
                            <button type="action" name="tablesel-row-2">SELECT</button>
                        </td>
                        <td>A2</td>
                        <td>B2</td>
                        <td>C2</td>
                    </tr>
                    <tr>
                        <td>
                            <button type="action" name="tablesel-row-3">SELECT</button>
                        </td>
                        <td>A3</td>
                        <td>B3</td>
                        <td>C3</td>
                    </tr>
                </tbody>
                <tfoot>
                    <tr>
                        <td>
                            <button type="action" name="tablesel-footer">SELECT</button>
                        </td>
                        <td>F1</td>
                        <td>F2</td>
                        <td>F3</td>
                    </tr>
                </tfoot>
            </table>
        </form>
    </messageML>
    {
        "id": "3dtVXF",
        "messageId": "amKuCXE9wjfEFX7qQPzanX___oyR5rbWbQ",
        "timestamp": 1595280017705,
        "type": "SYMPHONYELEMENTSACTION",
        "initiator": {
            "user": {
                "userId": 344147139494862,
                "firstName": "Reed",
                "lastName": "Feldman",
                "displayName": "Reed Feldman (SUP)",
                "email": "reed.feldman@symphony.com",
                "username": "reedUAT"
            }
        },
        "payload": {
            "symphonyElementsAction": {
                "stream": {
                    "streamId": "IEj12WoWsfTkiqOBkATdUn___pFXhN9OdA",
                    "streamType": "IM"
                },
                "formMessageId": "BFawdKkxmV0ZQmSuIzgfTX___oyR5yO2bQ",
                "formId": "form_id",
                 "formValues": {
                        "action": "tablesel-row-1"
                    }
            }
        }
    }

    Rules and Limitations

    FreeMarker

    String

    Required

    Identifies the text field.

    placeholder

    String

    Optional

    Specifies a short hint that describes the expected value of the input field.

    required

    Boolean

    Optional

    If true, it specifies that the input field must be filled out before submitting the form.

    masked

    Boolean

    Optional

    If true, it creates a masked text field with hide/show options when its value is "true". For more information, refer to .

    maxlength

    Integer

    Optional

    The maxlength attribute allows you to specify a maximum number of characters that the user can input.

    minlength

    Integer

    Optional

    The minlength attribute allows you to specify a minimum number of characters that the user can input.

    pattern

    String

    Optional

    Regex String to match for input validation. For more information, refer to .

    pattern-error-message

    String

    Optional but if pattern is defined, the pattern-error-message attribute is mandatory.

    Error message returned to user if pattern parameter matches user input

    title

    It accepts a simple text and \n for line breaks

    Optional

    The description that will be displayed when clicking the tooltip icon located on top of the Text Field Element. Max length: 256 characters. Available from Symphony v20.8 and above.

    label

    String

    Not required but it is recommended if title is defined

    Definition of the label that will be displayed on top of the Text Field Element. Available from Symphony v20.8 and above.

    auto-submit

    Boolean

    Optional.

    Default false.

    When enabled, typing <enter> key in the field will submit the form.

    formnovalidate

    Boolean

    Optional. Default false.

    Only valid when auto-submit is true. When set to true, this submit field bypasses the form validation (required fields and regular expressions), meaning that the user can submit this field even if the form validation is in error.

    With Symphony v20.6, bot developers can use Regex to validate text fields and text areas using the pattern and pattern-error-message attributes. For more information and examples, refer to Regular Expressions - Regex.

    • The text field has a max number of 128 characters. For larger texts, use Text Area.

    • The text field cannot have children tags but it can have a default text (initial value) between the <text-field></text-field> tags. See Examples below for more details.

    • Text fields are grouped at a max of 4 per row, depending on the screen size. For more information, refer to .

    • You can add a default text in your text field by including it between the <text-field></text-field> tags. Note that unlike the placeholder text, the default text will be sent with the form if not edited by the user.

    • Input Validation - Pattern: the max length for all attributes is set to 256.

    The following examples show text fields being used as follows:

    • The first text-field (init) shows how to display a default text ("With initial value"). Note that the default text would have been sent to the payload if it had not been deleted before submitting the form.

    • The second text-field (placeholder) shows how a placeholder text ("Only Placeholder") is displayed in the UI. Please note the placeholder text is not sent in the payload if no text has been entered in the field by the enduser.

    • The third text-field (noreq) shows how a user can interact with a non-required field. Even if the field is empty (only a placeholder text is present but does not count as a value), it does not prevent the enduser from submitting the form.

    • The fourth text-field (req) shows the behaviour of the unique required field of the form, which cannot be submitted in case it is not filled; an error is displayed under the field in case the user submits the form with this empty field.

    • The fifth text-field (regex) shows the behaviour of the field when a regex pattern is entered. You can note that the pattern-error-message is displayed under the field if the input does not follow the pattern required by the bot developer.

    • The sixth text-field (min) shows how to force users to enter an input with a minimum number of characters, and how an error message is displayed under the field if the input does not respect the minlength required.

    • The seventh text-field (label) shows how a label text ("My Label") is displayed.

    • The eighth text-field (tooltip) shows how a title text ("My Tooltip/n With a second line") is inserted in the UI under the (i) icon, and how the text entered in the title parameter is displayed when the enduser clicks on the icon.

    <messageML>
      <form id="form_id">
        <h2>text-fields</h2>
          <text-field name="init">With initial value</text-field>
          <text-field name="placeholder" placeholder="Only Placeholder"></text-field>
          <text-field name="noreq" placeholder="Not required"></text-field>
          <text-field name="req" required="true" placeholder="Required"></text-field>
          <text-field name="regex" pattern="^[a-zA-Z]{3,3}$" pattern-error-message="My error message - must contain exactly 3 letters">Regex</text-field>
          <text-field name="min" placeholder="With min length" minlength="3"></text-field>
          <text-field name="label" label="My Label">With Label</text-field>
          <text-field name="tooltip" title="My Tooltip\n With a second line">With Tooltip</text-field>
          <button name="text-field">Submit</button>
      </form>
    </messageML>
    [
        {
            "id": "q6eUgG",
            "messageId": "NowSKCnJJBdPOXQyoPQg8X___pQDVWaBbQ",
            "timestamp": 1563312167294,
            "type": "SYMPHONYELEMENTSACTION",
            "initiator": {
                "user": {
                    "userId": 7078106482890,
                    "firstName": "User",
                    "lastName": "Bot",
                    "displayName": "User",
                    "email": "user_bot@symphony.com",
                    "username": "user_bot"
                }
            },
            "payload": {
                "symphonyElementsAction": {
                    "actionStream": {
                        "streamId": "0YeiA-neZa1PrdHy1L82jX___pQjntU-dA"
                    },
                    "formStream": {
                        "streamId": "YuK1c2y2yuie6+UfQnjSPX///pQEn69idA=="
                    },
                    "formMessageId": "5iSJ+faXx/23Jkehx3lpSn///pQDVedXdA==5587",
                    "formId": "form_id",
                    "formValues": {
                        "action": "text-field",
                        "init": "",
                        "placeholder": "",
                        "noreq": "",
                        "req": "test",
                        "regex": "Reg",
                        "min6": "abc",
                        "label": "With Label",
                        "tooltip": "With Tooltip"
                    }
                }
            }
        }
    ]

    Please note that several text-fields are aligned next to another. Note also that this behaviour is reactive to the screen size, the number of text-fields on the same line decreasing until one per row, as the screen gets smaller (see in the example below).

    Main features introduced
    Agent needed to parse message sent by the bot
    Client 2.0 release
    Mobile

    Initial release

    2.55.9

    Since first version

    Since first version

    Attribute

    Type

    Required?

    Description

    Attributes

    Text fields
    Text area

    name

    Using Input Validation

    Rules and Limitations

    Examples

    Alignment of text-fields

    Versions and Compatibility

    Attribute

    Type

    Required?

    Description

    name

    String

    Yes

    Identifies the timezone picker.

    value

    String

    Restricted to the timezones + empty string

    No

    Timezone displayed by default when the user receives or resets the form.

    Please note that if it is not defined by the developer, the value will be based on the user's browser setting. You need to enter value="" to enforce the timezone to be empty.

    title

    String (accepting \n for line break)

    No

    The description that will be displayed when clicking the tooltip icon located on top of the timezone picker Element.

    label

    String

    Not required but it is recommended if title is defined

    Definition of the label that will be displayed on top of the timezone picker Element.

    required

    Boolean (true or false)

    No

    If true, it specifies that a timezone must be picked by the user before submitting the form.

    placeholder

    String

    No

    Specifies a short hint in the timezone picker input. Accepts any string value but is overridden by the value if a value is defined: it will show only if value attribute is enforced to empty.

    Please note that a default placeholder is displayed as: "Choose a timezone".

    disabled-timezone

    Array of Strings

    No

    Items can be disabled from the timezone picker list so that the user cannot pick them. See the examples below for more details.

    Important: single quote ' should wrap the array of strings

    Please note that if you want to propose only a list of a few timezones to the users, then a simple might be more adequate.

    For the purpose of accessibility, Symphony users can interact with the timezone picker via their keyboard:

    • First, using "Tab" to enter the component

    • Using "Enter", "Arrow-up", or "Arrow-down" to open the timezone list

    • Using "Arrow-up" and "Arrow-down" to navigate in the list

    • Using any key to erase the field and write in it

    • Using "Enter" to set the selected timezone and close the list

    • Using "Escape" to keep pre-selected value and close the list

    • Finally using "Tab" to exit the component

    • The max length of any timezone picker attribute is 256 characters except disabled-timezone attribute which max length is set to 1024 characters.

    • All timezone values are displayed in English only.

    • You can add a default timezone in your text field by including it in the value parameter. Please note that unlike the placeholder text, the default timezone will be sent in the formReply when the form is submitted if not edited by the user.

    • Please note that if the default timezone (value attribute) matches a value from the disabled-timezone array, then the value is left empty.

    • The timezone-picker will be supported on the following versions of clients:

      • 20.14 for Client 2.0

      • 20.13 for Client 1.5 (a beta version is released in Client 20.12 for Client 1.5)

    The following examples show the timezone picker being used as follows:

    • The first timezone-picker (init) shows how to display an empty timezone-picker ("With empty default value"). Note in the messageML sent the value was enforced to empty with value="".

    • The second timezone-picker (specific_value) shows how to display, by default, a value specifically chosen by the developer. Note that the default value would have been sent to the payload if it had not been deleted before submitting the form. You can see how users can remove a pre-selected value from the timezone-picker, thanks to the cross on the right side of the input.

    • The third timezone-picker (default_value) shows how to display, by default, the user browser timezone value. Note that the default value is sent to the payload when submitting the form.

    • The fourth timezone-picker (placeholder) shows how a placeholder text ("Only Placeholder") is displayed in the timezone-picker. Please note the placeholder text is not sent in the payload if no value has been chosen by the enduser.

    • The fifth timezone-picker (label) shows how a label text ("My Label") is displayed.

    • The sixth timezone-picker (tooltip) shows how a title text ("My Tooltip/n With a second line") is inserted in the UI under the (i) icon, and how the text entered in the title parameter is displayed when the enduser clicks on the icon.

    • The seventh timezone-picker (noreq) shows how a user can interact with a non-required field. Even if the field is empty (only a placeholder text is present but does not count as a value), it does not prevent the user from submitting the form.

    • The eighth timezone-picker (req) shows the behavior of the unique required field of the form, which cannot be submitted in case it is not filled; an error is displayed under the field in case the user submits the form with this field as empty.

    • The ninth timezone-picker (disabled) shows how users interact with disabled values from the timezone-picker.

    <messageML>
      <form id="form_id">
        <h2>timezone-pickers</h2>
          <timezone-picker name="init" value="" label="With empty default value" />
          <timezone-picker name="specific_value" value="America/Fortaleza" label="With specific default value" />
          <timezone-picker name="default_value" label="With default value from the user browser"/>
          <timezone-picker name="placeholder" placeholder="Only Placeholder..." value="" />
          <timezone-picker name="label" label="My Label" />
          <timezone-picker name="tooltip" label="With Tooltip" title="My Tooltip\n With a second line" />
          <timezone-picker name="noreq" placeholder="Not required" value="" />
          <timezone-picker name="req" required="true" placeholder="Required" value="" />
          <timezone-picker name="disabled" label="With Disabled values" value="America/Indiana/Vincennes" disabled-timezone='["America/Detroit", "America/Indiana/Marengo", "America/Indiana/Petersburg"]' />
          <button name="timezone-picker">Submit</button>
      </form>
    </messageML>
    [
        {
            "id": "0taiHA",
            "messageId": "6nZt52ETzcAeuTJKukhrxH___ofZ7Yl-bQ",
            "timestamp": 1615546447489,
            "type": "SYMPHONYELEMENTSACTION",
            "initiator": {
                "user": {
                    "userId": 7078106482890,
                    "firstName": "User",
                    "lastName": "Bot",
                    "displayName": "User",
                    "email": "userbot@symphony.com",
                    "username": "user_bot"
                }
            },
            "payload": {
                "symphonyElementsAction": {
                    "stream": {
                        "streamId": "tp3eVYR3ZTyW7K7vmsmgYX___oq6-yN5dA",
                        "streamType": "ROOM"
                    },
                    "formMessageId": "Lj_jvoJ-UFtR3yHS2T3lPn___ofZ9beJbQ",
                    "formId": "form_id",
                    "formValues": {
                        "action": "timezone-picker",
                        "init": "",
                        "specific_value": "",
                        "default_value": "Europe/Paris",
                        "placeholder": "",
                        "label": "Europe/Paris",
                        "tooltip": "Europe/Paris",
                        "noreq": "",
                        "req": "Europe/London",
                        "disabled": "America/Indiana/Vincennes"
                    }
                }
            }
        }
    ]

    Main features introduced

    Agent needed to parse message sent by the bot

    Client 2.0 release

    Backward client-compatibility behavior (e.g. external rooms)

    Beta version

    20.12

    Not supported

    The possible values of the timezone-picker are restricted to the Canonical values of the tz database.

    Please note in the examples above that the values are displayed to users according to the following rules:

    • The country name only is displayed if it has a single timezone (see Israel)

    • A list of cities are displayed under their country title if this country has multiple timezones (see United States of America)

    MessageML tag

    Designs

    Attributes

    Timezone Picker designs

    Accessibility

    Rules and Limitations

    When the value attribute is not defined by the developer, please note that the default value will be based on the user's browser setting.

    If you want however to force the default value to be displayed as empty for the user when sending the form, please enforce value="" in the messageML.

    Examples

    Versions and Compatibility

    Annex: list of timezone values

    Elements

    Date Picker

    Do you need users to pick a date as part of an interactive flow? With the Date Picker element, Symphony users can easily select a date from a calendar-style UI component.

    The Date Picker offers to Symphony users the possibility to enter the date in two different ways:

    • Populating the field directly with the keyboard, following the appropriate format

    • Clicking on the wished day from the calendar UI in a monthly display

    MessageML tag

    The Date Picker is represented by the <date-picker> tag, as you can see in the examples at the bottom of the page.

    You can see below the designs of the date picker. The main points to be highlighted are the following:

    • A dot is displayed under the today date

    • A disabled date is displayed in grey and stroke through

    • An highlighted date is displayed in blue

    For a list of all the available elements, refer to .

    For the purpose of accessibility, Symphony users can interact with the calendar UI with their keyboard:

    • Using "Enter" to open/close the calendar UI

    • Then using "Tab" to navigate in the different functionalities of the calendar: day selection; then "today" button; then "previous year" button; then "previous month" button; then "next month" button; then "next year" button; and finally going back to the day selection panel

    • Once in the day selection area, using the arrows from the keyboard allows navigating in the month to select the right day

    In the day selection area, some more keyboard controls are available in the date picker:

    • "Home" key: Moves focus to the first day (e.g. Sunday) of the current week

    • "End" key: Moves focus to the last day (e.g. Saturday) of the current week

    • "Page Up" key: Moves to the previous month, with focus on the same day of the same week (or either previous or next week if it does not exist)

    • The max length of any date picker attribute is 256 except disabled-date and highlighted-date attributes which max length is set to 1024 characters.

    • The date picker is displayed differently to the end user depending on the language chosen in the settings specific of each user. Please note that if a format is specified, then the format overrides the default format chosen based on the settings.

    The following examples show the date picker being used as follows:

    • The first date-picker (init) shows how to display a default date, as an initial value is entered as parameter. Note that the default text will be sent to the payload given that it was not deleted before submitting the form.

    • The second date-picker (placeholder) shows how a placeholder is displayed in the UI. Please note that any text is accepted as input. However, if you compare with the next date-pickers present in the form, you can notice that a default placeholder is generated (with a hint of the correct format to accepted by the date-picker field) in case no placeholder is mentioned in parameter.

    Time Picker

    Do you need users to pick a time as part of an interactive flow? With the Time Picker element, Symphony users can easily select a time from a list of possible values.

    The Time Picker offers to Symphony users the possibility to enter the time in two different ways:

    • Populating the field directly with the keyboard, following the appropriate format and the list of possible values (see attributes strict, min, max, and disabled-time)

    • Clicking on the wished time from the dropdown displayed

    MessageML tag

    The Time Picker is represented by the <time-picker> tag, as you can see in the examples at the bottom of the page.

    You can see below the designs of the time picker.

    For the purpose of accessibility, Symphony users can interact with the time picker via their keyboard:

    • First, using "Tab" to enter the component

    • Using "Enter" or "Space" to open the dropdown when focus is on the icon, or just "Enter" when focus is on the input

    • Using "Arrow up" or "Arrow down" to navigate within the dropdown list and using "Enter" to select the preselected value

    • The max length of any time picker attribute is 256 except disabled-time attribute which max length is set to 1024 characters.

    • If the format entered by the user is not correct or if the time entered is a disabled time, then an error message is displayed to the user. Note that it is not possible for the user to submit the form with an invalid format or disabled time.

    • You can add a default time

    The following examples show the time picker being used as follows:

    • The first time-picker (init) shows how to display a default time, as an initial value is entered as parameter. Note that the default value is present in the user reply as it has not been deleted before submitting the form.

    • The second time-picker (placeholder) shows how a placeholder is displayed in the UI. Please note that any text is accepted as input. However, if you compare with the next time-pickers present in the form, you can notice that a default placeholder is generated (with a hint of the correct format to accepted by the time-picker field) in case no placeholder is set.

    Dropdown Menu

    Allows the user to select an option among a static list of items.

    The dropdown menu is represented as a set <options> items nested into a <select> tag. Each <option> element have a value attribute containing the data value to submit in the form when that option is selected; You can also include a selected attribute on an <option> element to make it selected by default when the page first loads.

    Attributes

    The <select> tag:

    • Select tags only accept <option> tags as children. The <select> tag must contain at least one <option> tag.

    • By default, a user can select only one option from the dropdown menu. However, using the attribute multiple set to true together with min and max attributes, users will be able to select several options from the dropdown. Please see below the examples to know how to use these attributes.

    The <option> tag:

    • The <option> tag contains a required text node, which specifies the text that will be displayed for that option inside the dropdown menu.

    • The only valid attributes of the <option> tag are value and selected.

    If neither the selected or data-placeholder attributes are set, the default text (title) of the dropdown menu will be "Dropdown".

    The following examples show dropdown menus being used as follows:

    • The first dropdown (init) shows how to display a default preselected option ("opt2": "With selected option"). Note that the preselected option is sent to the payload when submitting the form.

    • The second dropdown (data-placeholder) shows how a placeholder text ("Only data-placeholder") is displayed in the UI. Please note the placeholder text is not sent in the payload if no option from the dropdown menu has been selected by the enduser.

    • The third dropdown (

    Features introduced
    Agent needed to parse message sent by the bot
    Client 2.0 release
    Mobile

    Dialog

    Chat bots can embed dialog buttons in chat messages. When the dialog button is clicked, a dialog opens and displays the content that has been predefined. This can be useful to make long messages much more concise, or progressively disclose a form only if it is relevant to the user for example.

    The Dialog component is structured in two sections:

    • <ui-action action='open-dialog'> tag. This tag defines where and how the will be displayed, and it references the dialog that will open using the target-id attribute;

    />
    />
    >
    Marked
    </
    radio
    >
    >
    Checked
    </
    checkbox
    >
    /
    >

    value

    String "yyy-MM-dd"

    No

    Date with ISO_8601 format to be displayed by default by the date picker when rendered for the Symphony user. Overrides the placeholder value.

    title

    String (accepting \n for line break)

    No

    The description that will be displayed when clicking the tooltip icon located on top of the date picker Element.

    label

    String

    Not required but it is recommend if title is defined

    Definition of the label that will be displayed on top of the date picker Element.

    required

    Boolean (true or false)

    No

    If true, it specifies that a date must be picked before submitting the form.

    placeholder

    String

    No

    Specifies a short hint that describes the expected format of the date picker. Accepts any string value but is overridden by the value if a value is entered. If not set, the accepted format will be displayed. Note: be careful as adding a placeholder might bring confusion to the end user. Therefore we recommend to use the default one as much as possible, to use the label if context is needed, or the title if instructions are needed.

    min

    String "yyy-MM-dd"

    No

    Specifies the earliest acceptable date with ISO_8601 format.

    max

    String "yyy-MM-dd"

    No

    Specifies the latest acceptable date with ISO_8601 format.

    disabled-date

    Json array (in a String format)

    No

    Dates or ranges of dates that cannot be selected by the Symphony user. Maximum length of 1024 characters. There are 3 different patterns: 1. range of date: {"from": "yyyy-MM-dd", "to": "yyyy-MM-dd"}, 2. date: {"day": "yyyy-MM-dd"}, 3. recurring day in the week: {"daysOfWeek": [0, 1, 6]}, Important: single quote ' should wrap the xml parameter. See the examples below for more details. Note: for the daysOfWeek: 0 always corresponds to Sunday, 6 to Saturday. See the examples below for more details.

    highlighted-date

    Json array (in a String format)

    No

    Dates or ranges of dates that are highlighted to the Symphony user. Maximum length of 1024 characters. There are 3 different patterns: 1. range of date: {"from": "yyyy-MM-dd", "to": "yyyy-MM-dd"}, 2. date: {"day": "yyyy-MM-dd"}, 3. recurring day in the week: {"daysOfWeek": [0, 1, 6]}, Important: single quote ' should wrap the xml parameter. See the examples below for more details. Note: for the daysOfWeek: 0 always corresponds to Sunday, 6 to Saturday. See the examples below for more details.

    format

    String

    No

    Format in which the date will be displayed to or should be entered by the Symphony user. Only accepts the letters 'y', 'M', and 'd'. • 'd' defines the day of the month. It can be either 'd' or 'dd' to define the minimum of digits displayed (i.e. corresponding to "3" or "03" for the third day) • 'M' defines the month. Use one or two ('M' or 'MM') for the numerical month; three 'MMM' for the abbreviation (i.e. "Sep"); four 'MMMM' for the full name (i.e. "September"); or five 'MMMMM' for the narrow name (i.e. "S") • 'y' defines the year. Use n of it to define n minimum of digits displayed (i.e. use 'yyyyy' to display the year 2020 as 02020) Note: be careful as many combinations may be possible, may have a weird display for the Symphony user, and are not restricted in the messageML. Therefore, we strongly recommend to use the default value as much as possible. Note 2: The format only impacts what the end user will see. It does not affect how you have to specify the value, disabled-date, highlighted-date, or the format of the response.

    Finally, using "Enter" allows to close the panel with the day selected or to trigger one of the functionalities selected (buttons)

    "Page Down" key: Moves to the next month, with focus on the same day of the same week (or either previous or next week if it does not exist)
  • "Shift" + "Page Up" key: Moves to the previous year, with focus on the same day of the same week (or either previous or next week if it does not exist)

  • "Shift" + "Page Down" key: Moves to the next year, with focus on the same day of the same week (or either previous or next week if it does not exist)

  • English: the calendar-UI is in English, the weeks start on Sunday, the default format is MM-dd-yyyy, and the date picker accepts value to be entered with the keyboard in English only (i.e. August)
  • French: the calendar-UI is in French, the weeks start on Monday, the default format is dd/MM/yyyy, and the date picker accepts value to be entered with the keyboard in French only (i.e. Août)

  • Japanese: the calendar-UI is in Japanese, the weeks start on Monday, the default format is yyyy日MM月dd年, and the date picker accepts value to be entered with the keyboard in Japanese only

  • If the user enters the value of a valid day and month combination with his keyboard, then the current year is preselected. If he continues entering another year, then this last one will be selected.

  • If the format entered by the user is not correct or if the date entered is a disabled date, then an error message is displayed to the user. Note that it is not possible for the user to submit the form with an invalid format or disabled date.

  • You can add a default date in your text field by including it in the value parameter. Please note that unlike the placeholder text, the default date will be sent in the formReply when the form is submitted if not edited by the user.

  • The third date-picker (label) shows how a label is displayed. In the GIF below, it shows also the interaction with the form when the user directly writes an input with an incorrect format: an error message is displayed and the form cannot be sent.
  • The fourth date-picker (tooltip) shows how the title attribute is displayed. Note that when a user enters the month and the date in the correct format, the current year is automatically preselected. It can be modified if the user continues writing the year in the input field.

  • The fifth date-picker (req) shows the behaviour of the unique required field of the form, which cannot be submitted in case it is not filled. Also note the use of the "today" button.

  • The sixth date-picker (format) shows the way the placeholder evolves to adapt to a new format transmitted thanks to the format parameter. Also please note the accessible interaction with the date-picker via the keyboard.

  • The seventh date-picker (rules) shows how to interact with the following parameters: min, max, disabled, and highlighted. Please note that a disabled date cannot be entered manually.

  • Attribute

    Type

    Required?

    Description

    name

    String

    Yes

    Identifies the date picker.

    <messageML>
      <form id="form_id">
        <h2>date-pickers</h2>
          <date-picker name="init" value="2020-08-28"></date-picker>
          <date-picker name="placeholder" placeholder="Only Placeholder: MM-DD-YYYY"></date-picker>
          <date-picker name="label" label="My Label"></date-picker>
          <date-picker name="tooltip" label="With Tooltip" title="My Tooltip\n With a second line"></date-picker>
          <date-picker name="req" required="true" label="Required"></date-picker>
          <date-picker name="format" label="Other Format" format="dd/MM/yyyy"></date-picker>
          <date-picker name="rules" label="With disabled and highlighted dates" min="2021-01-04" max="2021-01-27" disabled-date='[{"from": "2021-01-13", "to": "2021-01-15"}, {"from": "2021-01-19", "to": "2021-01-21"}, {"day": "2021-01-06"}, {"daysOfWeek": [0,6]}]' highlighted-date='[{"day": "2021-01-05"}, {"day": "2021-01-26"}]' />
          <button name="date-picker">Submit</button>
      </form>
    </messageML>
    [
        {
            "id": "iMpXPu",
            "messageId": "q9zkRlpFCYtzPiJ1aoCuWH___okHkL4TbQ",
            "timestamp": 1610485809644,
            "type": "SYMPHONYELEMENTSACTION",
            "initiator": {
                "user": {
                    "userId": 7078106482890,
                    "firstName": "User",
                    "lastName": "Bot",
                    "displayName": "User",
                    "email": "userbot@symphony.com",
                    "username": "user_bot"
                }
            },
            "payload": {
                "symphonyElementsAction": {
                    "stream": {
                        "streamId": "iiI-kbayOnMXCO-rb4hDN3___orZLc2XdA",
                        "streamType": "IM"
                    },
                    "formMessageId": "GZQEfj3SQ6UF_kPuqXo3eH___okIkJySbQ",
                    "formId": "form_id",
                    "formValues": {
                        "action": "date-picker",
                        "init": "2020-08-28",
                        "placeholder": "",
                        "label": "2021-01-16",
                        "tooltip": "2021-01-15",
                        "req": "2021-01-12",
                        "format": "2020-02-29",
                        "rules": "2021-01-05"
                    }
                }
            }
        }
    ]

    Main features introduced

    Agent needed to parse message sent by the bot

    Client 2.0 release

    Backward client-compatibility behavior (e.g. external rooms)

    Initial release

    20.12

    20.12

    Not working: date-picker is not displayed but the form can be sent

    Designs

    Attributes

    Accessibility

    Rules and Limitations

    Date as disabled and highlighted

    Note that currently, if a date is entered in the disabled and highlighted parameters at the same time, it cannot be selected via the calendar UI first. However, it can be enabled if the user enters this particular date manually. This behaviour will be fixed in the next versions and the date will then be considered as disabled and displayed as such.

    Examples

    Versions and Compatibility

    Date Picker designs
    Elements

    value

    String "HH:mm:ss"

    No

    Time with ISO_8601 format to be displayed by default by the time picker when rendered for the Symphony user. Overrides the placeholder value.

    title

    String (accepting \n for line break)

    No

    Description that will be displayed when clicking the tooltip icon located on top of the time picker Element.

    label

    String

    Not required but it is recommended if title is defined

    The text of the label that will be displayed above the time picker field.

    required

    Boolean (true or false)

    No

    If true, it specifies that a time must be picked before submitting the form.

    placeholder

    String

    No

    Specifies a short hint that describes the expected format of the time picker field. If the attributevalue is entered, the placeholder will not be displayed. If the placeholder is not set, the accepted time format will be displayed by default. Note: We recommend to use the default placeholder. It is better to rely on the label if context is needed, or the title if instructions are needed.

    min

    String "HH:mm:ss"

    No

    Specifies the earliest acceptable time with ISO_8601 format.

    Note: Times earlier than the min are not displayed in the time picker.

    max

    String "HH:mm:ss"

    No

    Specifies the latest acceptable time with ISO_8601 format.

    Note: Times later than the max are not displayed in the time picker.

    disabled-time

    Json array (in a String format)

    No

    Times or ranges of times that cannot be selected by the Symphony user. Maximum length of 1024 characters. There are 2 different patterns: 1. range of times: {"from": "HH:mm:ss", "to": "HH:mm:ss"}, 2. specific time: {"time": "HH:mm:ss"}. Important: single quote ' should wrap the xml parameter. See the examples below for more details.

    Note: Disabled times are displayed as disabled values in the time picker.

    format

    String

    No

    Format in which the time will be displayed to or should be entered by the Symphony user. Only accepts the letters 'h', 'H', 'm', 's', and 'a' as well as ':' or space as separator. • 'h' (for 12-hour format) and 'H' (for 24-hour format) define the hour. You can use either 1 ('h'; 'H') or 2 ('hh'; 'HH') to define the minimum number of digits displayed (i.e. corresponding to "3" or "03" for the third hour) • 'm' defines the minutes. Similarly to the hours, you can use one or two ('m' or 'mm') • 's' defines the seconds. Similarly to the hours and minutes, you can use one or two ('s' or 'ss')

    • 'a' (usually placed after a space) allows to display 'AM' for morning times and 'PM' for afternoon times Note 1: We recommend the use of the default value as much as possible. Note 2: The format only impacts what the end user will see. It does not affect how you have to specify the value, min, max, disabled-time, or the format of the user reply.

    step

    Number

    No

    Default is 900 (corresponding to15 min)

    The stepping interval (in seconds) for the times displayed in the dropdown menu.

    Min value: 600 (corresponding to 10 min)

    Max value: 43 200 (corresponding to half a day)

    strict

    Boolean

    No

    Default is false

    Enforce that the user cannot select a time that is not in the proposed list (e.g. we want him to only select an hour, he can’t decide to set the field to 9:15, even with the keyboard).

    Please note that in addition to this, the value picked will be validated against attributes min, max, and disabled-time.

    Either "Typing" or pressing "Tab" to go from the hours to the minutes, and then from the minutes to the seconds
  • Either "Deleting" or pressing "Shift+Tab" to go back from the seconds to the minutes, and then from the minutes to the hours

  • Finally using "Tab" to exit the component

  • in your text field by including it in the
    value
    parameter. Please note that unlike the
    placeholder
    text, the
    default time
    will be sent back to the Bot in the user reply when the form is submitted if it is not edited by the user.
  • The time-picker will be supported on the following versions of clients:

    • 20.14 for Client 2.0

    • 20.13 for Client 1.5

  • The third time-picker (label) shows how a label ("My Label") is displayed.
  • The fourth time-picker (tooltip) shows how the title attribute ("My Tooltip/n With a second line") is displayed.

  • The fifth time-picker (noreq) shows how a user can interact with a non-required field. Even if the field is empty (only a placeholder text is present but does not count as a value), it does not prevent the user from submitting the form.

  • The sixth time-picker (req) shows the behaviour of the unique required field of the form, which cannot be submitted in case it is not filled.

  • The seventh time-picker (format) shows the way the placeholder evolves to adapt to a new format transmitted thanks to the format parameter. Also please note the accessible interaction with the time-picker via the keyboard.

  • The eighth time-picker (step) shows how to modify the step between 2 consecutive values in the list of times. Please note that a Symphony user can select any other existing time by populating the field with his keyboard.

  • The ninth time-picker (strict_step) shows how to enforce the user to choose among the non-disabled values displayed in the dropdown, thanks to the strict attribute.

  • The tenth time-picker (rules) shows how to interact with the following parameters: min, max, and disabled-time. Please note that a disabled time cannot be entered manually.

  • Attribute

    Type

    Required?

    Description

    name

    String

    Yes

    Identifies the time picker.

    <messageML>
      <form id="form_id">
        <h2>time-pickers</h2>
          <time-picker name="init" label="With default value" value="13:51:06" />
          <time-picker name="placeholder" placeholder="Only Placeholder..." />
          <time-picker name="label" label="My Label" />
          <time-picker name="tooltip" label="With Tooltip" title="My Tooltip\n With a second line" />
          <time-picker name="noreq" placeholder="Not required" />
          <time-picker name="req" required="true" placeholder="Required" />
          <time-picker name="format" label="Other Format" format="hh:mm a" />
          <time-picker name="step" label="With a customed time-step" step="600" />
          <time-picker name="strict_step" label="Restricting values to the time-step defined" strict="true" />
          <time-picker name="rules" label="With Disabled values" min="08:00:00" max="17:00:00" disabled-time='[{"from": "12:00:00", "to": "14:00:00"}, {"time": "15:00:00"}]' />
          <button name="time-picker">Submit</button>
      </form>
    </messageML>
    [
        {
            "id": "uptHwx",
            "messageId": "9msDL6zbxKpXA82fG86tYH___oe6lh_LbQ",
            "timestamp": 1616072269876,
            "type": "SYMPHONYELEMENTSACTION",
            "initiator": {
                "user": {
                    "userId": 7078106482890,
                    "firstName": "User",
                    "lastName": "Bot",
                    "displayName": "User",
                    "email": "userbot@symphony.com",
                    "username": "user_bot"
                }
            },
            "payload": {
                "symphonyElementsAction": {
                    "stream": {
                        "streamId": "tp3eVYR3ZTyW7K7vmsmgYX___oq6-yN5dA",
                        "streamType": "ROOM"
                    },
                    "formMessageId": "UG1jcvtbGMdRlWQlq1AXgH___oe65VckbQ",
                    "formId": "form_id",
                    "formValues": {
                        "action": "time-picker",
                        "init": "13:51:06",
                        "placeholder": "01:30:00",
                        "label": "",
                        "tooltip": "",
                        "noreq": "",
                        "req": "12:45:02",
                        "format": "00:45:00",
                        "step": "00:10:02",
                        "strict_step": "00:15:00",
                        "rules": "14:15:00"
                    }
                }
            }
        }
    ]

    Main features introduced

    Agent needed to parse message sent by the bot

    Client 2.0 release

    Backward client-compatibility behavior (e.g. external rooms)

    Initial release

    20.12

    20.14

    Not working

    Designs

    Attributes

    Accessibility

    Rules and Limitations

    Please note that a limited amount of values are displayed in the dropdown of the time picker (see attribute step which minimum is 10 min). However, you can note that the time picker supports a precision to the second (see format attribute). Also, if you don't use the attribute strict, then user will be able to populate the field via their keyboard with any other non-disabled and existing time value than proposed in the list.

    Examples

    Versions and Compatibility

    Time Picker designs

    Boolean

    Optional

    Optional attribute of the <select> tag. it is a Boolean attribute indicating that an option with a non-empty string value must be selected.

    value

    String

    Yes

    Required attribute of the <option> tag. It contains the data value to submit to the server when that option is selected.

    selected

    Boolean

    Optional

    You can include a selected attribute on an <option> element to make it selected by default when the page first loads. Accepted values: true and false.

    data-placeholder

    String

    Optional

    Text displayed in the dropdown menu before an option is selected. It can be a short hint or a title for the dropdown menu.

    title

    It accepts a simple text and \n for line breaks

    Optional

    The description that will be displayed when clicking the tooltip icon located on top of the Masked Text Field Element. Max length: 256 characters.

    label

    String

    Not required but it is recommended if title is defined

    Definition of the label that will be displayed on top of the Masked Text Field Element.

    multiple

    String Boolean

    Optional Default is false

    Allows users to select multiple values and the developer to send dropdown with multiple preselected options.

    min

    String Integer ≥ 2 and ≤ max attribute

    Optional Can be used only if multiple attribute is set to true

    Minimum number of options to be selected by the Symphony user. NB: If undefined, no minimum option needs to be selected. Please use required attribute if you want to set min to 1.

    max

    String Integer ≥ 2

    Optional Can be used only if multiple attribute is set to true

    Maximum number of options to be selected by the Symphony user. NB: If undefined, user will be able to select as many options as wished. Please use multiple attribute set to false if you want to set max to 1.

    auto-submit

    Boolean

    Optional Default is false

    When enabled, selecting a value will submit the form.

    formnovalidate

    Boolean

    Optional Default is false

    Only valid when auto-submit is true. When set to true, this submit menu bypasses the form validation (required fields and regular expressions), meaning that the user can submit using this drop down menu even if the form validation is in error.

    Only one <option> of a given select can have the attribute selected as true.

    noreq
    ) shows how a user can interact with a
    non-required
    field. Even no option is selected by the user, it does not prevent the enduser from submitting the form.
  • The fourth dropdown (req) shows the behaviour of the unique required field of the form, which cannot be submitted in case no option from the dropdown menu is selected by the user; an error is displayed under the field in case the user submits the form with this empty field.

  • The fifth dropdown (label) shows how a label text ("My Label") is displayed.

  • The sixth dropdown (tooltip) shows how a title text ("My Tooltip/n With a second line") is inserted in the UI under the (i) icon, and how the text entered in the title parameter is displayed when the enduser clicks on the icon.

  • The seventh dropdown (multiple) shows how to combine multiple attribute with min/max rules to guide users selecting between 3 and 5 options.

  • 20.6

    Since first version

    Since first version

    Tooltip (title)

    20.7

    Since first version

    Since first version

    Multiple (with min and max) attributes

    20.14

    21.12

    Since first version

    auto-submit

    23.11

    23.12

    Not supported yet.

    formnovalidate

    25.6

    25.9

    Not supported yet.

    Attribute

    Type

    Required?

    Description

    name

    String

    Yes

    Required attribute of the <select> tag. It identifies the dropdown menu.

    <messageML>
      <form id="form_id">
        <h2>dropdown menus</h2>
          <select name="init"><option value="opt1">Unselected option 1</option><option value="opt2" selected="true">With selected option</option><option value="opt3">Unselected option 2</option></select>
          <select name="data-placeholder" data-placeholder="Only data-placeholder"><option value="opt1">Unselected option 1</option><option value="opt2">Unselected option 2</option><option value="opt3">Unselected option 3</option></select>
          <select name="noreq" data-placeholder="Not required"><option value="opt1">First</option><option value="opt2">Second</option><option value="opt3">Third</option></select>
          <select name="req" required="true" data-placeholder="Required"><option value="opt1">First</option><option value="opt2">Second</option><option value="opt3">Third</option></select>
          <select name="label" label="My Label" data-placeholder="With Label"><option value="opt1">Unselected option 1</option><option value="opt2">Unselected option 2</option><option value="opt3">Unselected option 3</option></select>
          <select name="tooltip" title="My Tooltip\n With a second line" data-placeholder="With Tooltip"><option value="opt1">Unselected option 1</option><option value="opt2">Unselected option 2</option><option value="opt3">Unselected option 3</option></select>
          <select name="multiple" label="With multiple select options - between 3 and 5" multiple="true" min="3" max="5"><option value="opt1" selected="true">Preselected option 1</option><option value="opt2" selected="true">Preselected option 2</option><option value="opt3" selected="true">Preselected option 3</option><option value="opt4">Unselected option 4</option><option value="opt5">Unselected option 5</option><option value="opt6">Unselected option 6</option></select>
          <button name="dropdown">Submit</button>
      </form>
    </messageML>
    [    
        {
            "id": "JQgymy",
            "messageId": "h53CRuPWoInmYbfw2T8dkn___pNK27l7bQ",
            "timestamp": 1566407149188,
            "type": "SYMPHONYELEMENTSACTION",
            "initiator": {
                "user": {
                    "userId": 7078106482890,
                    "firstName": "User",
                    "lastName": "Bot",
                    "displayName": "User",
                    "email": "user_bot@symphony.com",
                    "username": "user_bot"
                }
            },
            "payload": {
                "symphonyElementsAction": {
                    "actionStream": {
                        "streamId": "0YeiA-neZa1PrdHy1L82jX___pQjntU-dA"
                    },
                    "formStream": {
                        "streamId": "YuK1c2y2yuie6+UfQnjSPX///pQEn69idA=="
                    },
                    "formMessageId": "RfqsxcfTHCV08+UcO03HQH///pIqaO6fdA==",
                    "formId": "form_id",
                    "formValues": {
                        "action": "dropdown",
                        "init": "opt2",
                        "data-placeholder": "",
                        "noreq": "",
                        "req": "opt2",
                        "label": "",
                        "tooltip": "",
                        "multiple": ["opt1", "opt2", "opt3", "opt5", "opt6"]
                    }
                }
            }
        }
    ]

    Initial release

    2.55.9

    Since first version

    Since first version

    Rules and Limitations

    Message Size Limit:

    When designing forms with dropdown menus that include a very large number of options you may hit the characters limit of a Symphony message. For more information about message size limits, refer to .

    Examples

    Versions

    required

    Label

    <dialog> tag that defines the content of the dialog that will be displayed when the button is clicked.

    The <ui-action> tag wraps a single <button> children tag. The button tag supports the usual styles (primary, secondary, tertiary). Examples are available at the bottom of this page.

    The <ui-action> tag supports the following attributes:

    Attribute

    Type

    Required?

    Description

    action

    String

    Yes

    For Dialogs, always set to action='open-dialog'.

    Each <dialog> is split in three areas (children tags):

    • <title> - mandatory: specifies the title of the dialog and is always displayed at the top of it in a fixed and non scrollable position.

    • <body> - mandatory: specifies the content of the dialog that is displayed in the middle of it and can be scrollable when the content is too big to be contained in the view height.

    • <footer> - optional: specifies the footer of the dialog and is always displayed at the bottom in a fixed and non scrollable position.

    The <dialog> tag supports the following attributes

    Attribute

    Type

    Required?

    Description

    id

    String

    Yes

    Id of the dialog that will be triggered thanks to the ui-action it is associated to. See target-id attribute in <ui-action> tag.

    The following gif shows an example that contains two dialogs:

    1. The first dialog is embedded in a form. You will notice that the button used to trigger the dialog is positioned where the <ui-action> tag is coded.

    • As soon as the associated <dialog> is at its same nesting level, it can be placed anywhere before or after the ui-action.

    • You can also notice that users can interact with the form as well as submit it.

    • However, the dialog only contains text as it cannot contain any interactive Form Elements. Please note that a cancel button can be included in the dialog as it is not considered as an interactive Form Element: you can use it to offer another option for the user to close the dialog.

    • Please note the scrolling behaviour of the body whereas both title and footer are placed in a fixed position.

    1. The second dialog embeds a form instead.

    • After having started to fill-in the form, if the user closes the dialog and opens it back, the values of the fields will not reset to their original values, as long as the user does not refresh the page.

    • Also, when submitting a form that is in a dialog, the dialog will automatically close after a certain delay. If the user opens back the dialog without refreshing the page, then the values of the form and its state are persisted.

    <messageML>
      <form id="wrapping_dialog">
        <h4>First part: form wrapping a dialog</h4>
        <p>Here is the beginning of the form containing the dialog hiding some large text</p>
        <text-field name="input1" label="This is an interactive Element in the form but outside of the dialog" />
        <p>Please click on the following button in order to open the dialog and see the hidden information</p>
        <ui-action action="open-dialog" target-id="dialog_in_form">
          <button class="secondary">Open the dialog contained in the form</button>
        </ui-action>
        <text-field name="input2" label="This is an interactive Element in the form but outside of the dialog" />
        <button name="wrapping_dialog">Submit Button of the Form</button>
        <dialog id="dialog_in_form">
          <title>
            This is a title
          </title>
          <body>
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam congue viverra interdum. Integer quam odio, gravida ultricies pharetra ac, tempor eget leo. Duis vitae arcu sed turpis faucibus feugiat a at ipsum. Nulla facilisi. Phasellus egestas, leo et malesuada porttitor, felis turpis viverra tortor, quis suscipit orci nibh at augue. Curabitur erat libero, accumsan vitae ipsum eleifend, tincidunt bibendum purus. Curabitur ultricies lorem tincidunt rutrum viverra. Sed mattis dui at suscipit auctor. In rutrum neque urna, vitae lacinia turpis blandit eget. Nullam eu dignissim purus. Sed ut ante lorem. Duis quis mi nec enim imperdiet consectetur. Phasellus aliquet accumsan ipsum non ullamcorper.<br/><br/>
    Praesent convallis odio tortor, sit amet vulputate nulla tincidunt vitae. Donec ultrices eros suscipit mauris condimentum iaculis. Ut posuere finibus quam a consequat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nam aliquet dapibus vehicula. Nunc vel lectus congue, finibus felis ut, laoreet est. Maecenas eleifend gravida metus, nec viverra mi egestas eu. Pellentesque scelerisque mattis nibh, eu condimentum nulla finibus ut.<br/><br/>
    Ut dignissim varius libero ac volutpat. Sed hendrerit nec libero ut ullamcorper. Nunc et risus sed purus luctus faucibus nec eu est. Praesent id justo ante. Sed sed enim velit. Ut ac mauris magna. Fusce bibendum ullamcorper diam quis semper. Aenean mattis auctor ultricies. Mauris dui enim, vehicula sit amet finibus non, consectetur eu ante. Fusce at mi a ipsum gravida rhoncus.<br/><br/>
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam congue viverra interdum. Integer quam odio, gravida ultricies pharetra ac, tempor eget leo. Duis vitae arcu sed turpis faucibus feugiat a at ipsum. Nulla facilisi. Phasellus egestas, leo et malesuada porttitor, felis turpis viverra tortor, quis suscipit orci nibh at augue. Curabitur erat libero, accumsan vitae ipsum eleifend, tincidunt bibendum purus. Curabitur ultricies lorem tincidunt rutrum viverra. Sed mattis dui at suscipit auctor. In rutrum neque urna, vitae lacinia turpis blandit eget. Nullam eu dignissim purus. Sed ut ante lorem. Duis quis mi nec enim imperdiet consectetur. Phasellus aliquet accumsan ipsum non ullamcorper.<br/><br/>
    Praesent convallis odio tortor, sit amet vulputate nulla tincidunt vitae. Donec ultrices eros suscipit mauris condimentum iaculis. Ut posuere finibus quam a consequat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nam aliquet dapibus vehicula. Nunc vel lectus congue, finibus felis ut, laoreet est. Maecenas eleifend gravida metus, nec viverra mi egestas eu. Pellentesque scelerisque mattis nibh, eu condimentum nulla finibus ut.<br/><br/>
    Ut dignissim varius libero ac volutpat. Sed hendrerit nec libero ut ullamcorper. Nunc et risus sed purus luctus faucibus nec eu est. Praesent id justo ante. Sed sed enim velit. Ut ac mauris magna. Fusce bibendum ullamcorper diam quis semper. Aenean mattis auctor ultricies. Mauris dui enim, vehicula sit amet finibus non, consectetur eu ante. Fusce at mi a ipsum gravida rhoncus.
          </body>
          <footer>
            This is a footer
            <button name="cancel1" type="cancel">Close</button>
          </footer>
        </dialog>
      </form>
      <br/>
      <br/>
      <h4>Second part: message with a dialog hiding a form</h4>
      <p>Here is the beginning of the message containing the dialog hiding some large form</p>
      <dialog id="dialog_containing_form" width="large">
        <form id="wrapped_in_dialog">
          <title>
            This is a title
          </title>
          <body>
            <text-field name="input3" label="This is an interactive Element in the form which is contained in the dialog" />
            <textarea name="textarea" label="Other interactive Element in the dialog" />
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam congue viverra interdum. Integer quam odio, gravida ultricies pharetra ac, tempor eget leo. Duis vitae arcu sed turpis faucibus feugiat a at ipsum. Nulla facilisi. Phasellus egestas, leo et malesuada porttitor, felis turpis viverra tortor, quis suscipit orci nibh at augue. Curabitur erat libero, accumsan vitae ipsum eleifend, tincidunt bibendum purus. Curabitur ultricies lorem tincidunt rutrum viverra. Sed mattis dui at suscipit auctor. In rutrum neque urna, vitae lacinia turpis blandit eget. Nullam eu dignissim purus. Sed ut ante lorem. Duis quis mi nec enim imperdiet consectetur. Phasellus aliquet accumsan ipsum non ullamcorper.<br/><br/>
    Praesent convallis odio tortor, sit amet vulputate nulla tincidunt vitae. Donec ultrices eros suscipit mauris condimentum iaculis. Ut posuere finibus quam a consequat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nam aliquet dapibus vehicula. Nunc vel lectus congue, finibus felis ut, laoreet est. Maecenas eleifend gravida metus, nec viverra mi egestas eu. Pellentesque scelerisque mattis nibh, eu condimentum nulla finibus ut.<br/><br/>
    Ut dignissim varius libero ac volutpat. Sed hendrerit nec libero ut ullamcorper. Nunc et risus sed purus luctus faucibus nec eu est. Praesent id justo ante. Sed sed enim velit. Ut ac mauris magna. Fusce bibendum ullamcorper diam quis semper. Aenean mattis auctor ultricies. Mauris dui enim, vehicula sit amet finibus non, consectetur eu ante. Fusce at mi a ipsum gravida rhoncus.<br/><br/>
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam congue viverra interdum. Integer quam odio, gravida ultricies pharetra ac, tempor eget leo. Duis vitae arcu sed turpis faucibus feugiat a at ipsum. Nulla facilisi. Phasellus egestas, leo et malesuada porttitor, felis turpis viverra tortor, quis suscipit orci nibh at augue. Curabitur erat libero, accumsan vitae ipsum eleifend, tincidunt bibendum purus. Curabitur ultricies lorem tincidunt rutrum viverra. Sed mattis dui at suscipit auctor. In rutrum neque urna, vitae lacinia turpis blandit eget. Nullam eu dignissim purus. Sed ut ante lorem. Duis quis mi nec enim imperdiet consectetur. Phasellus aliquet accumsan ipsum non ullamcorper.<br/><br/>
    Praesent convallis odio tortor, sit amet vulputate nulla tincidunt vitae. Donec ultrices eros suscipit mauris condimentum iaculis. Ut posuere finibus quam a consequat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nam aliquet dapibus vehicula. Nunc vel lectus congue, finibus felis ut, laoreet est. Maecenas eleifend gravida metus, nec viverra mi egestas eu. Pellentesque scelerisque mattis nibh, eu condimentum nulla finibus ut.<br/><br/>
    Ut dignissim varius libero ac volutpat. Sed hendrerit nec libero ut ullamcorper. Nunc et risus sed purus luctus faucibus nec eu est. Praesent id justo ante. Sed sed enim velit. Ut ac mauris magna. Fusce bibendum ullamcorper diam quis semper. Aenean mattis auctor ultricies. Mauris dui enim, vehicula sit amet finibus non, consectetur eu ante. Fusce at mi a ipsum gravida rhoncus.
          </body>
          <footer>
            <button name="cancel2" type="cancel">Close</button>
            <button name="wrapping_dialog">Submit Button of the Form</button>
          </footer>
        </form>
      </dialog>
      <ui-action action="open-dialog" target-id="dialog_containing_form">
        <button class="secondary">Open the dialog containing the form</button>
      </ui-action>
    </messageML>

    Below are simpler examples with and without the use of forms.

    <messageML>
        <ui-action trigger="click" action="open-dialog" target-id="dialogId">
            <button>Simple dialog</button>
        </ui-action>
        <dialog id="dialogId">
            <form id="formId">
                <title>A Simple dialog</title>
                <body>
                    This is a simple dialog.
                </body>
                <footer>
                    <button type="cancel" name="cancel-button">Close</button>
                </footer>
            </form>
        </dialog>
    </messageML>
    <messageML>
        <ui-action trigger="click" action="open-dialog" target-id="dialogId">
            <button>Open the Dialog</button>
        </ui-action>
        <dialog id="dialogId">
            <form id="formId">
                <title>My Form in a Dialog</title>
                <body>
                    <text-field name="input" />
                </body>
                <footer>
                    <button type="action" name="send-form">Submit</button>
                    <button type="reset">Reset</button>
                    <button type="cancel" name="cancel-form">Close</button>
                </footer>
            </form>
        </dialog>
    </messageML>
    <messageML>
        <form id="formId">
            <text-field name="input" />
            <ui-action trigger="click" action="open-dialog" target-id="dialogId">
                <button>Open the Dialog</button>
            </ui-action>
            <dialog id="dialogId" width="small">
                <title>A Dialog</title>
                <body>
                    <expandable-card state="expanded">
                        <header>Dialog can include any other messageML component except Interactive Elements Forms</header>
                        <body>This does not contain any interactive element</body>
                    </expandable-card>
                </body>
                <footer>
                    Some text in the footer
                    <button type="cancel" name="cancel-form">Close</button>
                </footer>
            </dialog>
            <h3>Actions</h3>
            <button name="send-answers" type="action">Submit</button>
            <button type="reset">Reset Data</button>
        </form>
    </messageML>
    • The max length of any ui-action or dialog attribute is 256.

    • Please note that the attribute type of the button is not supported when wrapped by a <ui-action> tag.

    • The dialog and ui-action tags must be both present in the same message, at the same nesting level, and they must share the same and unique id / target-id. Please note it is possible to have several dialogs in the same message as soon as each dialog has a different id.

    • The dialog feature is supported in popped-out mode. The dialog will open in the popped-out window.

    • The dialog functionality supports in the following way:

      • Dialogs can be contained inside forms. However, if contained in a form, the dialog cannot contain any interactive Element (such as button, text-area, etc.)

      • Dialogs can contain a form. The <form> tag should wrap the entire content of the dialog, including the <title>

    • A dialog cannot be embedded in another dialog.

    Main features introduced

    Agent needed to parse message sent by the bot

    Client 2.0 release

    Client 1.5 release

    Backward client-compatibility behavior (e.g. external rooms)

    Initial release

    20.12.2

    21.10

    MessageML tags

    button

    UI-action with open-dialog

    Dialog tag

    Examples

    Simpler examples

    Rules and Limitations

    Even if this possible, please avoid embedding more than one form in a single dialog.

    Versions and Compatibility

    Regex

    20.6

    Since first version

    Since first version

    Label

    20.7

    Since first version

    Since first version

    Tooltip (title)

    20.7

    Since first version

    Since first version

    auto-submit

    23.11

    23.12

    Not supported yet.

    formnovalidate

    25.6

    25.9

    Not supported yet.

    Alignment of input texts
    Masked Text Field
    Regular Expressions - Regex

    Initial release

    20.12

    20.14

    Not supported (except for 20.12 client 1.5)

    tz database
    dropdown menu
    ,
    <body>
    and
    <footer>
    tags, as you can see in the examples below.
    This is useful when you want the submit button not to be hidden and always appear in the footer of the dialog whereas the rest of the form content is contained in the scrollable body area.
  • Please also note that users can close the dialog thanks to the cross (x) displayed at the top-right corner of it, as well as with a new type of that has been created for that purpose: <button type="cancel">. You can also specify the class attribute of the button which is by default set to "tertiary" for this new button.

  • target-id

    String

    Yes

    Id of the dialog that must be opened when user will trigger this ui-action.

    See the id attribute in the <dialog> tag.

    width

    String

    No.

    Default to medium

    Specifies the width of the dialog.

    NB: values can be: small, medium, large, or full-width.

    Not working

    Not working - entire message is not rendered

    Best Practice for using dialogs

    Interactive Elements Forms
    button

    Standard Entities

    This section lists the Structured Objects available for use in messages.

    Standard Entities

    Article

    Field

    Required

    Format

    Description

    title

    Yes

    FDC3 action buttons allow chat bots to embed buttons in messages which, on click, will raise an intent.

    Action buttons are only displayed to users who have a Desktop Integration Platform (DIP) set up, such as interop.io, Here Core or Connectifi.

    Learn more about Desktop Interop and intents .

    MessageML (message property)

    Note: Please see above the default text that would be displayed to users who don't have a desktop integration platform set up.

    EntityJSON part (data property)

    Display in Symphony:

    Continue here to learn more about structured objects:

    Message Size Limits

    id

    Yes

    Array of Objects

    An array of one or more of the following objects: org.symphonyoss.fin.security.id.ticker org.symphonyoss.fin.security.id.isin org.symphonyoss.fin.security.id.cusip org.symphonyoss.fin.security.id.openfigi More information about these objects is provided below.

    value

    Yes

    String

    The name/ID of a ticker.

    value

    Yes

    String

    The entity's ID.

    value

    Yes

    String

    The entity's ID.

    value

    Yes

    String

    The entity's ID.

    version

    Yes

    String

    The version.

    format

    Yes

    String

    The data format. Must be set to image.

    url

    Yes

    String

    The URL of the image.

    version

    Yes

    String

    The object's version.

    id

    Yes

    Array of objects

    An array of one or more of the following objects: • com.symphony.user.userId More information about these objects is provided below.

    value

    Yes

    String

    The ID of a user.

    version

    Yes

    String

    The version.

    format

    Yes

    String

    The video's format. Must be set to youtube or vimeo.

    url

    Yes

    String

    The URL of the video.

    id

    Yes

    String

    The unique ID of the video (can be extracted from the video URL).

    String

    The headline of the article

    subTitle

    No

    String

    The subtitle of the article

    blurb

    No

    String

    A summary of the article to display

    date

    No

    Unix Epoch Timestamp

    Date of publication

    publisher

    No

    String

    Name of the publisher

    author

    No

    String

    Name of the author

    thumbnail

    No

    URL (could be a data url)

    Image to be displayed - 106x106px

    id

    Must provide either id or href, or both.

    String

    An identifier used by the application to deeplink to the article

    href

    Must provide either id or href, or both.

    URL

    URL to the article (opened in a new browser window)

    Field

    Required

    Format

    Description

    type

    Yes

    String

    The type of object. Must be set to org.symphonyoss.fin.security.

    Field

    Required

    Format

    Description

    type

    Yes

    String

    The type of object. Must be set to org.symphonyoss.fin.security.id.ticker.

    Field

    Required

    Format

    Description

    type

    Yes

    String

    The type of object. Must be set to org.symphonyoss.fin.security.id.isin.

    Field

    Required

    Format

    Description

    type

    Yes

    String

    The type of object. Must be set to org.symphonyoss.fin.security.id.cusip.

    Field

    Required

    Format

    Description

    type

    Yes

    String

    The type of object. Must be set to org.symphonyoss.fin.security.id.openfigi.

    Field

    Required

    Format

    Description

    type

    Yes

    String

    The type of entity. Must be set to com.symphony.media.image.

    Field

    Required

    Format

    Description

    type

    Yes

    String

    The type of object. Must be set to com.symphony.user.mention.

    Field

    Required

    Format

    Description

    type

    Yes

    String

    The type of object. Must be set to com.symphony.user.userId.

    Field

    Required

    Format

    Description

    type

    Yes

    String

    The type of object. Must be set to com.symphony.media.video.

    Financial Objects

    org.symphonyoss.fin.security

    org.symphonyoss.fin.security.id.ticker

    org.symphonyoss.fin.security.id.isin

    org.symphonyoss.fin.security.id.cusip

    org.symphonyoss.fin.security.id.openfigi

    FDC3 Action buttons

    Image

    Taxonomy (mention)

    com.symphony.user.userId

    Video

    Go further...

    here
    Custom Entities
    On click, Symphony will raise the embedded intent.
    <messageML> This is a FDC3 action button: 
        <br/>
        <span class="entity" data-entity-id="0">View Chart 
            <span class="tempo-text-color--red" style="font-size: 10px">
                <i>(Action button: Desktop Integration Platform is not available.) </i>
            </span>
        </span>
    </messageML>
    {
    "0":
        {
        "actionData":
            {
            "context":
                {
                "id":
                    {
                    "ticker": "TSLA"
                    },
                "name": "Tesla, inc.",
                "type": "fdc3.instrument"
                },
            "intent": "ViewChart"
            },
        "label": "View a chart",
        "type": "fdc3.entity.action",
        "version": "1.2"
        }
    }

    Emojis

    Chat bots can send the same emojis as end users thanks to the MessageML short form tag <emoji shortcode="code" />.

    Example

    Here is an example of a message containing emojis:

    <messageML>
        Here are examples of using emojis: <emoji shortcode="flag_fr" /><emoji shortcode="flag_us" />
    </messageML>

    Annex: list of emoji codes

    The following table shows the codes corresponding to their emoji symbol:

    Code
    Emoji

    🎱

    a

    🅰

    ab

    🆎

    abc

    🔤

    abcd

    🔡

    accept

    🉑

    aerial_tramway

    🚡

    airplane

    ✈

    alarm_clock

    ⏰

    alien

    👽

    ambulance

    🚑

    anchor

    ⚓

    angel

    👼

    anger

    💢

    angry

    😠

    anguished

    😧

    ant

    🐜

    apple

    🍎

    aquarius

    ♒

    aries

    ♈

    arrow_backward

    ◀

    arrow_double_down

    ⏬

    arrow_double_up

    ⏫

    arrow_down

    ⬇

    arrow_down_small

    🔽

    arrow_forward

    ▶

    arrow_heading_down

    ⤵

    arrow_heading_up

    ⤴

    arrow_left

    ⬅

    arrow_lower_left

    ↙

    arrow_lower_right

    ↘

    arrow_right

    ➡

    arrow_right_hook

    ↪

    arrow_up

    ⬆

    arrow_up_down

    ↕

    arrow_up_small

    🔼

    arrow_upper_left

    ↖

    arrow_upper_right

    ↗

    arrows_clockwise

    🔃

    arrows_counterclockwise

    🔄

    art

    🎨

    articulated_lorry

    🚛

    astonished

    😲

    athletic_shoe

    👟

    atm

    🏧

    b

    🅱

    baby

    👶

    baby_bottle

    🍼

    baby_chick

    🐤

    baby_symbol

    🚼

    back

    🔙

    baggage_claim

    🛄

    balloon

    🎈

    ballot_box_with_check

    ☑

    bamboo

    🎍

    bangbang

    ‼

    bank

    🏦

    bar_chart

    📊

    barber

    💈

    baseball

    ⚾

    basketball

    🏀

    bath

    🛀

    bathtub

    🛁

    battery

    🔋

    bear

    🐻

    bee

    🐝

    beer

    🍺

    beers

    🍻

    beetle

    🐞

    beginner

    🔰

    bell

    🔔

    bento

    🍱

    bicyclist

    🚴

    bike

    🚲

    bikini

    👙

    bird

    🐦

    birthday

    🎂

    black_circle

    ⚫

    black_joker

    🃏

    black_large_square

    ⬛

    black_medium_small_square

    ◾

    black_medium_square

    ◼

    black_nib

    ✒

    black_small_square

    ▪

    black_square_button

    🔲

    blossom

    🌼

    blowfish

    🐡

    blue_book

    📘

    blue_car

    🚙

    blue_heart

    💙

    blush

    😊

    boar

    🐗

    boat

    ⛵

    bomb

    💣

    book

    📖

    bookmark

    🔖

    bookmark_tabs

    📑

    books

    📚

    boom

    💥

    boot

    👢

    bouquet

    💐

    bow

    🙇

    bowling

    🎳

    boy

    👦

    bread

    🍞

    bride_with_veil

    👰

    bridge_at_night

    🌉

    briefcase

    💼

    broken_heart

    💔

    bug

    🐛

    bulb

    💡

    bullettrain_front

    🚅

    bullettrain_side

    🚄

    bus

    🚌

    busstop

    🚏

    bust_in_silhouette

    👤

    busts_in_silhouette

    👥

    cactus

    🌵

    cake

    🍰

    calendar

    📆

    calling

    📲

    camel

    🐫

    camera

    📷

    cancer

    ♋

    candy

    🍬

    capital_abcd

    🔠

    capricorn

    ♑

    car

    🚗

    card_index

    📇

    carousel_horse

    🎠

    cat

    🐱

    cat2

    🐈

    cd

    💿

    chart

    💹

    chart_with_downwards_trend

    📉

    chart_with_upwards_trend

    📈

    checkered_flag

    🏁

    cherry_blossom

    🌸

    chestnut

    🌰

    chicken

    🐔

    children_crossing

    🚸

    chocolate_bar

    🍫

    christmas_tree

    🎄

    church

    ⛪

    cinema

    🎦

    circus_tent

    🎪

    city_sunrise

    🌇

    city_sunset

    🌆

    cl

    🆑

    clap

    👏

    clapper

    🎬

    clipboard

    📋

    clock1

    🕐

    clock10

    🕙

    clock1030

    🕥

    clock11

    🕚

    clock1130

    🕦

    clock12

    🕛

    clock1230

    🕧

    clock130

    🕜

    clock2

    🕑

    clock230

    🕝

    clock3

    🕒

    clock330

    🕞

    clock4

    🕓

    clock430

    🕟

    clock5

    🕔

    clock530

    🕠

    clock6

    🕕

    clock630

    🕡

    clock7

    🕖

    clock730

    🕢

    clock8

    🕗

    clock830

    🕣

    clock9

    🕘

    clock930

    🕤

    closed_book

    📕

    closed_lock_with_key

    🔐

    closed_umbrella

    🌂

    cloud

    ☁

    clubs

    ♣

    cocktail

    🍸

    coffee

    ☕

    cold_sweat

    😰

    collision

    💥

    computer

    💻

    confetti_ball

    🎊

    confounded

    😖

    confused

    😕

    congratulations

    ㊗

    construction

    🚧

    construction_worker

    👷

    convenience_store

    🏪

    cookie

    🍪

    cool

    🆒

    cop

    👮

    copyright

    ©

    corn

    🌽

    couple

    👫

    couple_with_heart

    💑

    couplekiss

    💏

    cow

    🐮

    cow2

    🐄

    credit_card

    💳

    crescent_moon

    🌙

    crocodile

    🐊

    crossed_flags

    🎌

    crown

    👑

    cry

    😢

    crying_cat_face

    😿

    crystal_ball

    🔮

    cupid

    💘

    curly_loop

    ➰

    currency_exchange

    💱

    curry

    🍛

    custard

    🍮

    customs

    🛃

    cyclone

    🌀

    dancer

    💃

    dancers

    👯

    dango

    🍡

    dart

    🎯

    dash

    💨

    date

    📅

    deciduous_tree

    🌳

    department_store

    🏬

    diamond_shape_with_a_dot_inside

    💠

    diamonds

    ♦

    disappointed

    😞

    disappointed_relieved

    😥

    dizzy

    💫

    dizzy_face

    😵

    do_not_litter

    🚯

    dog

    🐶

    dog2

    🐕

    dollar

    💵

    dolls

    🎎

    dolphin

    🐬

    door

    🚪

    dragon

    🐉

    dragon_face

    🐲

    dress

    👗

    dromedary_camel

    🐪

    droplet

    💧

    dvd

    📀

    e-mail

    📧

    ear

    👂

    ear_of_rice

    🌾

    earth_africa

    🌍

    earth_americas

    🌎

    earth_asia

    🌏

    egg

    🍳

    eight_pointed_black_star

    ✴

    eight_spoked_asterisk

    ✳

    electric_plug

    🔌

    elephant

    🐘

    email

    ✉

    end

    🔚

    envelope

    ✉

    envelope_with_arrow

    📩

    euro

    💶

    european_castle

    🏰

    european_post_office

    🏤

    evergreen_tree

    🌲

    exclamation

    ❗

    expressionless

    😑

    eyeglasses

    👓

    eyes

    👀

    facepunch

    👊

    factory

    🏭

    fallen_leaf

    🍂

    family

    👪

    fast_forward

    ⏩

    fax

    📠

    fearful

    😨

    feet

    🐾

    ferris_wheel

    🎡

    file_folder

    📁

    fire

    🔥

    fire_engine

    🚒

    fireworks

    🎆

    first_quarter_moon

    🌓

    first_quarter_moon_with_face

    🌛

    fish

    🐟

    fish_cake

    🍥

    fishing_pole_and_fish

    🎣

    fist

    ✊

    flags

    🎏

    flashlight

    🔦

    floppy_disk

    💾

    flower_playing_cards

    🎴

    flushed

    😳

    foggy

    🌁

    football

    🏈

    footprints

    👣

    fork_and_knife

    🍴

    fountain

    ⛲

    four_leaf_clover

    🍀

    free

    🆓

    fried_shrimp

    🍤

    fries

    🍟

    frog

    🐸

    frowning

    😦

    fuelpump

    ⛽

    full_moon

    🌕

    full_moon_with_face

    🌝

    game_die

    🎲

    gem

    💎

    gemini

    ♊

    ghost

    👻

    gift

    🎁

    gift_heart

    💝

    girl

    👧

    globe_with_meridians

    🌐

    goat

    🐐

    golf

    ⛳

    grapes

    🍇

    green_apple

    🍏

    green_book

    📗

    green_heart

    💚

    grey_exclamation

    ❕

    grey_question

    ❔

    grimacing

    😬

    grin

    😁

    grinning

    😀

    guardsman

    💂

    guitar

    🎸

    gun

    🔫

    haircut

    💇

    hamburger

    🍔

    hammer

    🔨

    hamster

    🐹

    hand

    ✋

    handbag

    👜

    handshake

    🤝

    hankey

    💩

    hatched_chick

    🐥

    hatching_chick

    🐣

    headphones

    🎧

    heart

    ❤

    heart_decoration

    💟

    heart_eyes

    😍

    heart_eyes_cat

    😻

    heartbeat

    💓

    heartpulse

    💗

    hearts

    ♥

    heavy_check_mark

    ✔

    heavy_division_sign

    ➗

    heavy_dollar_sign

    💲

    heavy_exclamation_mark

    ❗

    heavy_minus_sign

    ➖

    heavy_multiplication_x

    ✖

    heavy_plus_sign

    ➕

    helicopter

    🚁

    herb

    🌿

    hibiscus

    🌺

    high_brightness

    🔆

    high_heel

    👠

    honey_pot

    🍯

    honeybee

    🐝

    horse

    🐴

    horse_racing

    🏇

    hospital

    🏥

    hotel

    🏨

    hotsprings

    ♨

    hourglass

    ⌛

    hourglass_flowing_sand

    ⏳

    house

    🏠

    house_with_garden

    🏡

    hushed

    😯

    ice_cream

    🍨

    icecream

    🍦

    id

    🆔

    ideograph_advantage

    🉐

    imp

    👿

    inbox_tray

    📥

    incoming_envelope

    📨

    information_desk_person

    💁

    information_source

    ℹ

    innocent

    😇

    interrobang

    ⁉

    iphone

    📱

    izakaya_lantern

    🏮

    jack_o_lantern

    🎃

    japan

    🗾

    japanese_castle

    🏯

    japanese_goblin

    👺

    japanese_ogre

    👹

    jeans

    👖

    joy

    😂

    joy_cat

    😹

    key

    🔑

    keycap_ten

    🔟

    kimono

    👘

    kiss

    💋

    kissing

    😗

    kissing_cat

    😽

    kissing_closed_eyes

    😚

    kissing_heart

    😘

    kissing_smiling_eyes

    😙

    koala

    🐨

    koko

    🈁

    lantern

    🏮

    large_blue_circle

    🔵

    large_blue_diamond

    🔷

    large_orange_diamond

    🔶

    last_quarter_moon

    🌗

    last_quarter_moon_with_face

    🌜

    laughing

    😆

    leaves

    🍃

    ledger

    📒

    left_luggage

    🛅

    left_right_arrow

    ↔

    leftwards_arrow_with_hook

    ↩

    lemon

    🍋

    leo

    ♌

    leopard

    🐆

    libra

    ♎

    light_rail

    🚈

    link

    🔗

    lips

    👄

    lipstick

    💄

    lock

    🔒

    lock_with_ink_pen

    🔏

    lollipop

    🍭

    loop

    ➿

    loudspeaker

    📢

    love_hotel

    🏩

    love_letter

    💌

    low_brightness

    🔅

    m

    Ⓜ

    mag

    🔍

    mag_right

    🔎

    mahjong

    🀄

    mailbox

    📫

    mailbox_closed

    📪

    mailbox_with_mail

    📬

    mailbox_with_no_mail

    📭

    man

    👨

    man_with_gua_pi_mao

    👲

    man_with_turban

    👳

    mans_shoe

    👞

    maple_leaf

    🍁

    mask

    😷

    massage

    💆

    meat_on_bone

    🍖

    mega

    📣

    melon

    🍈

    memo

    📝

    mens

    🚹

    metro

    🚇

    microphone

    🎤

    microscope

    🔬

    milky_way

    🌌

    minibus

    🚐

    minidisc

    💽

    mobile_phone_off

    📴

    money_with_wings

    💸

    moneybag

    💰

    monkey

    🐒

    monkey_face

    🐵

    monorail

    🚝

    moon

    🌔

    mortar_board

    🎓

    mount_fuji

    🗻

    mountain_bicyclist

    🚵

    mountain_cableway

    🚠

    mountain_railway

    🚞

    mouse

    🐭

    mouse2

    🐁

    movie_camera

    🎥

    moyai

    🗿

    muscle

    💪

    mushroom

    🍄

    musical_keyboard

    🎹

    musical_note

    🎵

    musical_score

    🎼

    mute

    🔇

    nail_care

    💅

    name_badge

    📛

    necktie

    👔

    negative_squared_cross_mark

    ❎

    neutral_face

    😐

    new

    🆕

    new_moon

    🌑

    new_moon_with_face

    🌚

    newspaper

    📰

    ng

    🆖

    no_bell

    🔕

    no_bicycles

    🚳

    no_entry

    ⛔

    no_entry_sign

    🚫

    no_good

    🙅

    no_mobile_phones

    📵

    no_mouth

    😶

    no_pedestrians

    🚷

    no_smoking

    🚭

    non-potable_water

    🚱

    nose

    👃

    notebook

    📓

    notebook_with_decorative_cover

    📔

    notes

    🎶

    nut_and_bolt

    🔩

    o

    ⭕

    o2

    🅾

    ocean

    🌊

    octopus

    🐙

    oden

    🍢

    office

    🏢

    ok

    🆗

    ok_hand

    👌

    ok_woman

    🙆

    older_man

    👴

    older_woman

    👵

    on

    🔛

    oncoming_automobile

    🚘

    oncoming_bus

    🚍

    oncoming_police_car

    🚔

    oncoming_taxi

    🚖

    open_book

    📖

    open_file_folder

    📂

    open_hands

    👐

    open_mouth

    😮

    ophiuchus

    ⛎

    orange_book

    📙

    outbox_tray

    📤

    ox

    🐂

    package

    📦

    page_facing_up

    📄

    page_with_curl

    📃

    pager

    📟

    palm_tree

    🌴

    panda_face

    🐼

    paperclip

    📎

    parking

    🅿

    part_alternation_mark

    〽

    partly_sunny

    ⛅

    passport_control

    🛂

    paw_prints

    🐾

    pear

    🍐

    pencil

    📝

    pencil2

    ✏

    penguin

    🐧

    pensive

    😔

    performing_arts

    🎭

    persevere

    😣

    person_frowning

    🙍

    person_with_blond_hair

    👱

    person_with_pouting_face

    🙎

    phone

    ☎

    pig

    🐷

    pig2

    🐖

    pig_nose

    🐽

    pill

    💊

    pisces

    ♓

    pizza

    🍕

    point_down

    👇

    point_left

    👈

    point_right

    👉

    point_up

    ☝

    point_up_2

    👆

    police_car

    🚓

    poodle

    🐩

    post_office

    🏣

    postal_horn

    📯

    postbox

    📮

    potable_water

    🚰

    pouch

    👝

    poultry_leg

    🍗

    pound

    💷

    pouting_cat

    😾

    pray

    🙏

    princess

    👸

    punch

    👊

    purple_heart

    💜

    purse

    👛

    pushpin

    📌

    put_litter_in_its_place

    🚮

    question

    ❓

    rabbit

    🐰

    rabbit2

    🐇

    racehorse

    🐎

    radio

    📻

    radio_button

    🔘

    rage

    😡

    railway_car

    🚃

    rainbow

    🌈

    raised_hand

    ✋

    raised_hands

    🙌

    raising_hand

    🙋

    ram

    🐏

    ramen

    🍜

    rat

    🐀

    recycle

    ♻

    red_car

    🚗

    red_circle

    🔴

    registered

    ®

    relaxed

    ☺

    relieved

    😌

    repeat

    🔁

    repeat_one

    🔂

    restroom

    🚻

    revolving_hearts

    💞

    rewind

    ⏪

    ribbon

    🎀

    rice

    🍚

    rice_ball

    🍙

    rice_cracker

    🍘

    rice_scene

    🎑

    ring

    💍

    rocket

    🚀

    roller_coaster

    🎢

    rooster

    🐓

    rose

    🌹

    rotating_light

    🚨

    round_pushpin

    📍

    rowboat

    🚣

    rugby_football

    🏉

    runner

    🏃

    running

    🏃

    running_shirt_with_sash

    🎽

    sa

    🈂

    sagittarius

    ♐

    sailboat

    ⛵

    sake

    🍶

    sandal

    👡

    santa

    🎅

    satellite

    📡

    satisfied

    😆

    saxophone

    🎷

    school

    🏫

    school_satchel

    🎒

    scissors

    ✂

    scorpius

    ♏

    scream

    😱

    scream_cat

    🙀

    scroll

    📜

    seat

    💺

    secret

    ㊙

    seedling

    🌱

    shaved_ice

    🍧

    sheep

    🐑

    shell

    🐚

    ship

    🚢

    shirt

    👕

    shoe

    👞

    shower

    🚿

    signal_strength

    📶

    six_pointed_star

    🔯

    ski

    🎿

    skull

    💀

    sleeping

    😴

    sleepy

    😪

    slot_machine

    🎰

    small_blue_diamond

    🔹

    small_orange_diamond

    🔸

    small_red_triangle

    🔺

    small_red_triangle_down

    🔻

    smile

    😄

    smile_cat

    😸

    smiley

    😃

    smiley_cat

    😺

    smiling_imp

    😈

    smirk

    😏

    smirk_cat

    😼

    smoking

    🚬

    snail

    🐌

    snake

    🐍

    snowboarder

    🏂

    snowflake

    ❄

    snowman

    ⛄

    sob

    😭

    soccer

    ⚽

    soon

    🔜

    sos

    🆘

    sound

    🔉

    space_invader

    👾

    spades

    ♠

    spaghetti

    🍝

    sparkle

    ❇

    sparkler

    🎇

    sparkles

    ✨

    sparkling_heart

    💖

    speaker

    🔊

    speech_balloon

    💬

    speedboat

    🚤

    star

    ⭐

    star2

    🌟

    stars

    🌃

    station

    🚉

    statue_of_liberty

    🗽

    steam_locomotive

    🚂

    stew

    🍲

    straight_ruler

    📏

    stuck_out_tongue

    😛

    stuck_out_tongue_closed_eyes

    😝

    stuck_out_tongue_winking_eye

    😜

    sun_with_face

    🌞

    sunflower

    🌻

    sunglasses

    😎

    sunny

    ☀

    sunrise

    🌅

    sunrise_over_mountains

    🌄

    surfer

    🏄

    sushi

    🍣

    suspension_railway

    🚟

    sweat

    😓

    sweat_smile

    😅

    sweet_potato

    🍠

    swimmer

    🏊

    symbols

    🔣

    syringe

    💉

    tada

    🎉

    tanabata_tree

    🎋

    tangerine

    🍊

    taurus

    ♉

    taxi

    🚕

    tea

    🍵

    telephone

    ☎

    telephone_receiver

    📞

    telescope

    🔭

    tennis

    🎾

    tent

    ⛺

    thought_balloon

    💭

    thumbsdown

    👎

    thumbsup

    👍

    ticket

    🎫

    tiger

    🐯

    tiger2

    🐅

    tired_face

    😫

    tm

    ™

    toilet

    🚽

    tokyo_tower

    🗼

    tomato

    🍅

    tongue

    👅

    top

    🔝

    tophat

    🎩

    tractor

    🚜

    traffic_light

    🚥

    train

    🚃

    train2

    🚆

    tram

    🚊

    triangular_flag_on_post

    🚩

    triangular_ruler

    📐

    trident

    🔱

    triumph

    😤

    trolleybus

    🚎

    trophy

    🏆

    tropical_drink

    🍹

    tropical_fish

    🐠

    truck

    🚚

    trumpet

    🎺

    tshirt

    👕

    tulip

    🌷

    turtle

    🐢

    tv

    📺

    twisted_rightwards_arrows

    🔀

    two_hearts

    💕

    two_men_holding_hands

    👬

    two_women_holding_hands

    👭

    u5272

    🈹

    u5408

    🈴

    u55b6

    🈺

    u6307

    🈯

    u6708

    🈷

    u6709

    🈶

    u6e80

    🈵

    u7121

    🈚

    u7533

    🈸

    u7981

    🈲

    u7a7a

    🈳

    umbrella

    ☔

    unamused

    😒

    underage

    🔞

    unlock

    🔓

    up

    🆙

    v

    ✌

    vertical_traffic_light

    🚦

    vhs

    📼

    vibration_mode

    📳

    video_camera

    📹

    video_game

    🎮

    violin

    🎻

    virgo

    ♍

    volcano

    🌋

    vs

    🆚

    walking

    🚶

    waning_crescent_moon

    🌘

    waning_gibbous_moon

    🌖

    warning

    ⚠

    watch

    ⌚

    water_buffalo

    🐃

    watermelon

    🍉

    wave

    👋

    wavy_dash

    〰

    waxing_crescent_moon

    🌒

    waxing_gibbous_moon

    🌔

    wc

    🚾

    weary

    😩

    wedding

    💒

    whale

    🐳

    whale2

    🐋

    wheelchair

    ♿

    white_check_mark

    ✅

    white_circle

    ⚪

    white_flower

    💮

    white_large_square

    ⬜

    white_medium_small_square

    ◽

    white_medium_square

    ◻

    white_small_square

    ▫

    white_square_button

    🔳

    wind_chime

    🎐

    wine_glass

    🍷

    wink

    😉

    wolf

    🐺

    woman

    👩

    womans_clothes

    👚

    womans_hat

    👒

    womens

    🚺

    worried

    😟

    wrench

    🔧

    x

    ❌

    yellow_heart

    💛

    yen

    💴

    yum

    😋

    zap

    ⚡

    zzz

    💤

    angel_tone1

    👼🏻

    angel_tone2

    👼🏼

    angel_tone3

    👼🏽

    angel_tone4

    👼🏾

    angel_tone5

    👼🏿

    asterisk

    *⃣

    baby_tone1

    👶🏻

    baby_tone2

    👶🏼

    baby_tone3

    👶🏽

    baby_tone4

    👶🏾

    baby_tone5

    👶🏿

    basketball_player_tone1

    ⛹🏻

    basketball_player_tone2

    ⛹🏼

    basketball_player_tone3

    ⛹🏽

    basketball_player_tone4

    ⛹🏾

    basketball_player_tone5

    ⛹🏿

    bath_tone1

    🛀🏻

    bath_tone2

    🛀🏼

    bath_tone3

    🛀🏽

    bath_tone4

    🛀🏾

    bath_tone5

    🛀🏿

    bicyclist_tone1

    🚴🏻

    bicyclist_tone2

    🚴🏼

    bicyclist_tone3

    🚴🏽

    bicyclist_tone4

    🚴🏾

    bicyclist_tone5

    🚴🏿

    bow_tone1

    🙇🏻

    bow_tone2

    🙇🏼

    bow_tone3

    🙇🏽

    bow_tone4

    🙇🏾

    bow_tone5

    🙇🏿

    boy_tone1

    👦🏻

    boy_tone2

    👦🏼

    boy_tone3

    👦🏽

    boy_tone4

    👦🏾

    boy_tone5

    👦🏿

    bride_with_veil_tone1

    👰🏻

    bride_with_veil_tone2

    👰🏼

    bride_with_veil_tone3

    👰🏽

    bride_with_veil_tone4

    👰🏾

    bride_with_veil_tone5

    👰🏿

    call_me_tone1

    🤙🏻

    call_me_tone2

    🤙🏼

    call_me_tone3

    🤙🏽

    call_me_tone4

    🤙🏾

    call_me_tone5

    🤙🏿

    cartwheel_tone1

    🤸🏻

    cartwheel_tone2

    🤸🏼

    cartwheel_tone3

    🤸🏽

    cartwheel_tone4

    🤸🏾

    cartwheel_tone5

    🤸🏿

    clap_tone1

    👏🏻

    clap_tone2

    👏🏼

    clap_tone3

    👏🏽

    clap_tone4

    👏🏾

    clap_tone5

    👏🏿

    cn

    🇨🇳

    construction_worker_tone1

    👷🏻

    construction_worker_tone2

    👷🏼

    construction_worker_tone3

    👷🏽

    construction_worker_tone4

    👷🏾

    construction_worker_tone5

    👷🏿

    cop_tone1

    👮🏻

    cop_tone2

    👮🏼

    cop_tone3

    👮🏽

    cop_tone4

    👮🏾

    cop_tone5

    👮🏿

    couple_mm

    👨❤👨

    couple_ww

    👩❤👩

    dancer_tone1

    💃🏻

    dancer_tone2

    💃🏼

    dancer_tone3

    💃🏽

    dancer_tone4

    💃🏾

    dancer_tone5

    💃🏿

    de

    🇩🇪

    ear_tone1

    👂🏻

    ear_tone2

    👂🏼

    ear_tone3

    👂🏽

    ear_tone4

    👂🏾

    ear_tone5

    👂🏿

    eight

    8️⃣

    es

    🇪🇸

    eye_in_speech_bubble

    👁🗨

    face_palm_tone1

    🤦🏻

    face_palm_tone2

    🤦🏼

    face_palm_tone3

    🤦🏽

    face_palm_tone4

    🤦🏾

    face_palm_tone5

    🤦🏿

    family_mmb

    👨👨👦

    family_mmbb

    👨👨👦👦

    family_mmg

    👨👨👧

    family_mmgb

    👨👨👧👦

    family_mmgg

    👨👨👧👧

    family_mwbb

    👨👩👦👦

    family_mwg

    👨👩👧

    family_mwgb

    👨👩👧👦

    family_mwgg

    👨👩👧👧

    family_wwb

    👩👩👦

    family_wwbb

    👩👩👦👦

    family_wwg

    👩👩👧

    family_wwgb

    👩👩👧👦

    family_wwgg

    👩👩👧👧

    fingers_crossed_tone1

    🤞🏻

    fingers_crossed_tone2

    🤞🏼

    fingers_crossed_tone3

    🤞🏽

    fingers_crossed_tone4

    🤞🏾

    fingers_crossed_tone5

    🤞🏿

    fist_tone1

    ✊🏻

    fist_tone2

    ✊🏼

    fist_tone3

    ✊🏽

    fist_tone4

    ✊🏾

    fist_tone5

    ✊🏿

    five

    5️⃣

    flag_ac

    🇦🇨

    flag_ad

    🇦🇩

    flag_ae

    🇦🇪

    flag_af

    🇦🇫

    flag_ag

    🇦🇬

    flag_ai

    🇦🇮

    flag_al

    🇦🇱

    flag_am

    🇦🇲

    flag_ao

    🇦🇴

    flag_aq

    🇦🇶

    flag_ar

    🇦🇷

    flag_as

    🇦🇸

    flag_at

    🇦🇹

    flag_au

    🇦🇺

    flag_aw

    🇦🇼

    flag_ax

    🇦🇽

    flag_az

    🇦🇿

    flag_ba

    🇧🇦

    flag_bb

    🇧🇧

    flag_bd

    🇧🇩

    flag_be

    🇧🇪

    flag_bf

    🇧🇫

    flag_bg

    🇧🇬

    flag_bh

    🇧🇭

    flag_bi

    🇧🇮

    flag_bj

    🇧🇯

    flag_bl

    🇧🇱

    flag_bm

    🇧🇲

    flag_bn

    🇧🇳

    flag_bo

    🇧🇴

    flag_bq

    🇧🇶

    flag_br

    🇧🇷

    flag_bs

    🇧🇸

    flag_bt

    🇧🇹

    flag_bv

    🇧🇻

    flag_bw

    🇧🇼

    flag_by

    🇧🇾

    flag_bz

    🇧🇿

    flag_ca

    🇨🇦

    flag_cc

    🇨🇨

    flag_cd

    🇨🇩

    flag_cf

    🇨🇫

    flag_cg

    🇨🇬

    flag_ch

    🇨🇭

    flag_ci

    🇨🇮

    flag_ck

    🇨🇰

    flag_cl

    🇨🇱

    flag_cm

    🇨🇲

    flag_cn

    🇨🇳

    flag_co

    🇨🇴

    flag_cp

    🇨🇵

    flag_cr

    🇨🇷

    flag_cu

    🇨🇺

    flag_cv

    🇨🇻

    flag_cw

    🇨🇼

    flag_cx

    🇨🇽

    flag_cy

    🇨🇾

    flag_cz

    🇨🇿

    flag_de

    🇩🇪

    flag_dg

    🇩🇬

    flag_dj

    🇩🇯

    flag_dk

    🇩🇰

    flag_dm

    🇩🇲

    flag_do

    🇩🇴

    flag_dz

    🇩🇿

    flag_ea

    🇪🇦

    flag_ec

    🇪🇨

    flag_ee

    🇪🇪

    flag_eg

    🇪🇬

    flag_eh

    🇪🇭

    flag_er

    🇪🇷

    flag_es

    🇪🇸

    flag_et

    🇪🇹

    flag_eu

    🇪🇺

    flag_fi

    🇫🇮

    flag_fj

    🇫🇯

    flag_fk

    🇫🇰

    flag_fm

    🇫🇲

    flag_fo

    🇫🇴

    flag_fr

    🇫🇷

    flag_ga

    🇬🇦

    flag_gb

    🇬🇧

    flag_gd

    🇬🇩

    flag_ge

    🇬🇪

    flag_gf

    🇬🇫

    flag_gg

    🇬🇬

    flag_gh

    🇬🇭

    flag_gi

    🇬🇮

    flag_gl

    🇬🇱

    flag_gm

    🇬🇲

    flag_gn

    🇬🇳

    flag_gp

    🇬🇵

    flag_gq

    🇬🇶

    flag_gr

    🇬🇷

    flag_gs

    🇬🇸

    flag_gt

    🇬🇹

    flag_gu

    🇬🇺

    flag_gw

    🇬🇼

    flag_gy

    🇬🇾

    flag_hk

    🇭🇰

    flag_hm

    🇭🇲

    flag_hn

    🇭🇳

    flag_hr

    🇭🇷

    flag_ht

    🇭🇹

    flag_hu

    🇭🇺

    flag_ic

    🇮🇨

    flag_id

    🇮🇩

    flag_ie

    🇮🇪

    flag_il

    🇮🇱

    flag_im

    🇮🇲

    flag_in

    🇮🇳

    flag_io

    🇮🇴

    flag_iq

    🇮🇶

    flag_ir

    🇮🇷

    flag_is

    🇮🇸

    flag_it

    🇮🇹

    flag_je

    🇯🇪

    flag_jm

    🇯🇲

    flag_jo

    🇯🇴

    flag_jp

    🇯🇵

    flag_ke

    🇰🇪

    flag_kg

    🇰🇬

    flag_kh

    🇰🇭

    flag_ki

    🇰🇮

    flag_km

    🇰🇲

    flag_kn

    🇰🇳

    flag_kp

    🇰🇵

    flag_kr

    🇰🇷

    flag_kw

    🇰🇼

    flag_ky

    🇰🇾

    flag_kz

    🇰🇿

    flag_la

    🇱🇦

    flag_lb

    🇱🇧

    flag_lc

    🇱🇨

    flag_li

    🇱🇮

    flag_lk

    🇱🇰

    flag_lr

    🇱🇷

    flag_ls

    🇱🇸

    flag_lt

    🇱🇹

    flag_lu

    🇱🇺

    flag_lv

    🇱🇻

    flag_ly

    🇱🇾

    flag_ma

    🇲🇦

    flag_mc

    🇲🇨

    flag_md

    🇲🇩

    flag_me

    🇲🇪

    flag_mf

    🇲🇫

    flag_mg

    🇲🇬

    flag_mh

    🇲🇭

    flag_mk

    🇲🇰

    flag_ml

    🇲🇱

    flag_mm

    🇲🇲

    flag_mn

    🇲🇳

    flag_mo

    🇲🇴

    flag_mp

    🇲🇵

    flag_mq

    🇲🇶

    flag_mr

    🇲🇷

    flag_ms

    🇲🇸

    flag_mt

    🇲🇹

    flag_mu

    🇲🇺

    flag_mv

    🇲🇻

    flag_mw

    🇲🇼

    flag_mx

    🇲🇽

    flag_my

    🇲🇾

    flag_mz

    🇲🇿

    flag_na

    🇳🇦

    flag_nc

    🇳🇨

    flag_ne

    🇳🇪

    flag_nf

    🇳🇫

    flag_ng

    🇳🇬

    flag_ni

    🇳🇮

    flag_nl

    🇳🇱

    flag_no

    🇳🇴

    flag_np

    🇳🇵

    flag_nr

    🇳🇷

    flag_nu

    🇳🇺

    flag_nz

    🇳🇿

    flag_om

    🇴🇲

    flag_pa

    🇵🇦

    flag_pe

    🇵🇪

    flag_pf

    🇵🇫

    flag_pg

    🇵🇬

    flag_ph

    🇵🇭

    flag_pk

    🇵🇰

    flag_pl

    🇵🇱

    flag_pm

    🇵🇲

    flag_pn

    🇵🇳

    flag_pr

    🇵🇷

    flag_ps

    🇵🇸

    flag_pt

    🇵🇹

    flag_pw

    🇵🇼

    flag_py

    🇵🇾

    flag_qa

    🇶🇦

    flag_re

    🇷🇪

    flag_ro

    🇷🇴

    flag_rs

    🇷🇸

    flag_ru

    🇷🇺

    flag_rw

    🇷🇼

    flag_sa

    🇸🇦

    flag_sb

    🇸🇧

    flag_sc

    🇸🇨

    flag_sd

    🇸🇩

    flag_se

    🇸🇪

    flag_sg

    🇸🇬

    flag_sh

    🇸🇭

    flag_si

    🇸🇮

    flag_sj

    🇸🇯

    flag_sk

    🇸🇰

    flag_sl

    🇸🇱

    flag_sm

    🇸🇲

    flag_sn

    🇸🇳

    flag_so

    🇸🇴

    flag_sr

    🇸🇷

    flag_ss

    🇸🇸

    flag_st

    🇸🇹

    flag_sv

    🇸🇻

    flag_sx

    🇸🇽

    flag_sy

    🇸🇾

    flag_sz

    🇸🇿

    flag_ta

    🇹🇦

    flag_tc

    🇹🇨

    flag_td

    🇹🇩

    flag_tf

    🇹🇫

    flag_tg

    🇹🇬

    flag_th

    🇹🇭

    flag_tj

    🇹🇯

    flag_tk

    🇹🇰

    flag_tl

    🇹🇱

    flag_tm

    🇹🇲

    flag_tn

    🇹🇳

    flag_to

    🇹🇴

    flag_tr

    🇹🇷

    flag_tt

    🇹🇹

    flag_tv

    🇹🇻

    flag_tw

    🇹🇼

    flag_tz

    🇹🇿

    flag_ua

    🇺🇦

    flag_ug

    🇺🇬

    flag_um

    🇺🇲

    flag_us

    🇺🇸

    flag_uy

    🇺🇾

    flag_uz

    🇺🇿

    flag_va

    🇻🇦

    flag_vc

    🇻🇨

    flag_ve

    🇻🇪

    flag_vg

    🇻🇬

    flag_vi

    🇻🇮

    flag_vn

    🇻🇳

    flag_vu

    🇻🇺

    flag_wf

    🇼🇫

    flag_ws

    🇼🇸

    flag_xk

    🇽🇰

    flag_ye

    🇾🇪

    flag_yt

    🇾🇹

    flag_za

    🇿🇦

    flag_zm

    🇿🇲

    flag_zw

    🇿🇼

    fleur-de-lis

    ⚜

    four

    4️⃣

    fr

    🇫🇷

    gb

    🇬🇧

    girl_tone1

    👧🏻

    girl_tone2

    👧🏼

    girl_tone3

    👧🏽

    girl_tone4

    👧🏾

    girl_tone5

    👧🏿

    guardsman_tone1

    💂🏻

    guardsman_tone2

    💂🏼

    guardsman_tone3

    💂🏽

    guardsman_tone4

    💂🏾

    guardsman_tone5

    💂🏿

    haircut_tone1

    💇🏻

    haircut_tone2

    💇🏼

    haircut_tone3

    💇🏽

    haircut_tone4

    💇🏾

    haircut_tone5

    💇🏿

    hand_splayed_tone1

    🖐🏻

    hand_splayed_tone2

    🖐🏼

    hand_splayed_tone3

    🖐🏽

    hand_splayed_tone4

    🖐🏾

    hand_splayed_tone5

    🖐🏿

    handball_tone1

    🤾🏻

    handball_tone2

    🤾🏼

    handball_tone3

    🤾🏽

    handball_tone4

    🤾🏾

    handball_tone5

    🤾🏿

    handshake_tone1

    🤝🏻

    handshake_tone2

    🤝🏼

    handshake_tone3

    🤝🏽

    handshake_tone4

    🤝🏾

    handshake_tone5

    🤝🏿

    hash

    #️⃣

    horse_racing_tone1

    🏇🏻

    horse_racing_tone2

    🏇🏼

    horse_racing_tone3

    🏇🏽

    horse_racing_tone4

    🏇🏾

    horse_racing_tone5

    🏇🏿

    information_desk_person_tone1

    💁🏻

    information_desk_person_tone2

    💁🏼

    information_desk_person_tone3

    💁🏽

    information_desk_person_tone4

    💁🏾

    information_desk_person_tone5

    💁🏿

    it

    🇮🇹

    jp

    🇯🇵

    juggling_tone1

    🤹🏻

    juggling_tone2

    🤹🏼

    juggling_tone3

    🤹🏽

    juggling_tone4

    🤹🏾

    juggling_tone5

    🤹🏿

    kiss_mm

    👨❤💋👨

    kiss_ww

    👩❤💋👩

    kr

    🇰🇷

    left_facing_fist_tone1

    🤛🏻

    left_facing_fist_tone2

    🤛🏼

    left_facing_fist_tone3

    🤛🏽

    left_facing_fist_tone4

    🤛🏾

    left_facing_fist_tone5

    🤛🏿

    lifter_tone1

    🏋🏻

    lifter_tone2

    🏋🏼

    lifter_tone3

    🏋🏽

    lifter_tone4

    🏋🏾

    lifter_tone5

    🏋🏿

    man_dancing_tone1

    🕺🏻

    man_dancing_tone2

    🕺🏼

    man_dancing_tone3

    🕺🏽

    man_dancing_tone4

    🕺🏾

    man_dancing_tone5

    🕺🏿

    man_in_tuxedo_tone1

    🤵🏻

    man_in_tuxedo_tone2

    🤵🏼

    man_in_tuxedo_tone3

    🤵🏽

    man_in_tuxedo_tone4

    🤵🏾

    man_in_tuxedo_tone5

    🤵🏿

    man_tone1

    👨🏻

    man_tone2

    👨🏼

    man_tone3

    👨🏽

    man_tone4

    👨🏾

    man_tone5

    👨🏿

    man_with_gua_pi_mao_tone1

    👲🏻

    man_with_gua_pi_mao_tone2

    👲🏼

    man_with_gua_pi_mao_tone3

    👲🏽

    man_with_gua_pi_mao_tone4

    👲🏾

    man_with_gua_pi_mao_tone5

    👲🏿

    man_with_turban_tone1

    👳🏻

    man_with_turban_tone2

    👳🏼

    man_with_turban_tone3

    👳🏽

    man_with_turban_tone4

    👳🏾

    man_with_turban_tone5

    👳🏿

    massage_tone1

    💆🏻

    massage_tone2

    💆🏼

    massage_tone3

    💆🏽

    massage_tone4

    💆🏾

    massage_tone5

    💆🏿

    metal_tone1

    🤘🏻

    metal_tone2

    🤘🏼

    metal_tone3

    🤘🏽

    metal_tone4

    🤘🏾

    metal_tone5

    🤘🏿

    mountain_bicyclist_tone1

    🚵🏻

    mountain_bicyclist_tone2

    🚵🏼

    mountain_bicyclist_tone3

    🚵🏽

    mountain_bicyclist_tone4

    🚵🏾

    mountain_bicyclist_tone5

    🚵🏿

    mrs_claus_tone1

    🤶🏻

    mrs_claus_tone2

    🤶🏼

    mrs_claus_tone3

    🤶🏽

    mrs_claus_tone4

    🤶🏾

    mrs_claus_tone5

    🤶🏿

    muscle_tone1

    💪🏻

    muscle_tone2

    💪🏼

    muscle_tone3

    💪🏽

    muscle_tone4

    💪🏾

    muscle_tone5

    💪🏿

    nail_care_tone1

    💅🏻

    nail_care_tone2

    💅🏼

    nail_care_tone3

    💅🏽

    nail_care_tone4

    💅🏾

    nail_care_tone5

    💅🏿

    nine

    9️⃣

    no_good_tone1

    🙅🏻

    no_good_tone2

    🙅🏼

    no_good_tone3

    🙅🏽

    no_good_tone4

    🙅🏾

    no_good_tone5

    🙅🏿

    non-potable-water

    🚱

    nose_tone1

    👃🏻

    nose_tone2

    👃🏼

    nose_tone3

    👃🏽

    nose_tone4

    👃🏾

    nose_tone5

    👃🏿

    ok_hand_tone1

    👌🏻

    ok_hand_tone2

    👌🏼

    ok_hand_tone3

    👌🏽

    ok_hand_tone4

    👌🏾

    ok_hand_tone5

    👌🏿

    ok_woman_tone1

    🙆🏻

    ok_woman_tone2

    🙆🏼

    ok_woman_tone3

    🙆🏽

    ok_woman_tone4

    🙆🏾

    ok_woman_tone5

    🙆🏿

    older_man_tone1

    👴🏻

    older_man_tone2

    👴🏼

    older_man_tone3

    👴🏽

    older_man_tone4

    👴🏾

    older_man_tone5

    👴🏿

    older_woman_tone1

    👵🏻

    older_woman_tone2

    👵🏼

    older_woman_tone3

    👵🏽

    older_woman_tone4

    👵🏾

    older_woman_tone5

    👵🏿

    one

    1️⃣

    open_hands_tone1

    👐🏻

    open_hands_tone2

    👐🏼

    open_hands_tone3

    👐🏽

    open_hands_tone4

    👐🏾

    open_hands_tone5

    👐🏿

    person_frowning_tone1

    🙍🏻

    person_frowning_tone2

    🙍🏼

    person_frowning_tone3

    🙍🏽

    person_frowning_tone4

    🙍🏾

    person_frowning_tone5

    🙍🏿

    person_with_blond_hair_tone1

    👱🏻

    person_with_blond_hair_tone2

    👱🏼

    person_with_blond_hair_tone3

    👱🏽

    person_with_blond_hair_tone4

    👱🏾

    person_with_blond_hair_tone5

    👱🏿

    person_with_pouting_face_tone1

    🙎🏻

    person_with_pouting_face_tone2

    🙎🏼

    person_with_pouting_face_tone3

    🙎🏽

    person_with_pouting_face_tone4

    🙎🏾

    person_with_pouting_face_tone5

    🙎🏿

    point_down_tone1

    👇🏻

    point_down_tone2

    👇🏼

    point_down_tone3

    👇🏽

    point_down_tone4

    👇🏾

    point_down_tone5

    👇🏿

    point_left_tone1

    👈🏻

    point_left_tone2

    👈🏼

    point_left_tone3

    👈🏽

    point_left_tone4

    👈🏾

    point_left_tone5

    👈🏿

    point_right_tone1

    👉🏻

    point_right_tone2

    👉🏼

    point_right_tone3

    👉🏽

    point_right_tone4

    👉🏾

    point_right_tone5

    👉🏿

    point_up_2_tone1

    👆🏻

    point_up_2_tone2

    👆🏼

    point_up_2_tone3

    👆🏽

    point_up_2_tone4

    👆🏾

    point_up_2_tone5

    👆🏿

    point_up_tone1

    ☝🏻

    point_up_tone2

    ☝🏼

    point_up_tone3

    ☝🏽

    point_up_tone4

    ☝🏾

    point_up_tone5

    ☝🏿

    pray_tone1

    🙏🏻

    pray_tone2

    🙏🏼

    pray_tone3

    🙏🏽

    pray_tone4

    🙏🏾

    pray_tone5

    🙏🏿

    pregnant_woman_tone1

    🤰🏻

    pregnant_woman_tone2

    🤰🏼

    pregnant_woman_tone3

    🤰🏽

    pregnant_woman_tone4

    🤰🏾

    pregnant_woman_tone5

    🤰🏿

    prince_tone1

    🤴🏻

    prince_tone2

    🤴🏼

    prince_tone3

    🤴🏽

    prince_tone4

    🤴🏾

    prince_tone5

    🤴🏿

    princess_tone1

    👸🏻

    princess_tone2

    👸🏼

    princess_tone3

    👸🏽

    princess_tone4

    👸🏾

    princess_tone5

    👸🏿

    punch_tone1

    👊🏻

    punch_tone2

    👊🏼

    punch_tone3

    👊🏽

    punch_tone4

    👊🏾

    punch_tone5

    👊🏿

    rainbow_flag

    🏳🌈

    raised_back_of_hand_tone1

    🤚🏻

    raised_back_of_hand_tone2

    🤚🏼

    raised_back_of_hand_tone3

    🤚🏽

    raised_back_of_hand_tone4

    🤚🏾

    raised_back_of_hand_tone5

    🤚🏿

    raised_hand_tone1

    ✋🏻

    raised_hand_tone2

    ✋🏼

    raised_hand_tone3

    ✋🏽

    raised_hand_tone4

    ✋🏾

    raised_hand_tone5

    ✋🏿

    raised_hands_tone1

    🙌🏻

    raised_hands_tone2

    🙌🏼

    raised_hands_tone3

    🙌🏽

    raised_hands_tone4

    🙌🏾

    raised_hands_tone5

    🙌🏿

    raising_hand_tone1

    🙋🏻

    raising_hand_tone2

    🙋🏼

    raising_hand_tone3

    🙋🏽

    raising_hand_tone4

    🙋🏾

    raising_hand_tone5

    🙋🏿

    right_facing_fist_tone1

    🤜🏻

    right_facing_fist_tone2

    🤜🏼

    right_facing_fist_tone3

    🤜🏽

    right_facing_fist_tone4

    🤜🏾

    right_facing_fist_tone5

    🤜🏿

    rowboat_tone1

    🚣🏻

    rowboat_tone2

    🚣🏼

    rowboat_tone3

    🚣🏽

    rowboat_tone4

    🚣🏾

    rowboat_tone5

    🚣🏿

    ru

    🇷🇺

    runner_tone1

    🏃🏻

    runner_tone2

    🏃🏼

    runner_tone3

    🏃🏽

    runner_tone4

    🏃🏾

    runner_tone5

    🏃🏿

    santa_tone1

    🎅🏻

    santa_tone2

    🎅🏼

    santa_tone3

    🎅🏽

    santa_tone4

    🎅🏾

    santa_tone5

    🎅🏿

    selfie_tone1

    🤳🏻

    selfie_tone2

    🤳🏼

    selfie_tone3

    🤳🏽

    selfie_tone4

    🤳🏾

    selfie_tone5

    🤳🏿

    seven

    7️⃣

    shrug_tone1

    🤷🏻

    shrug_tone2

    🤷🏼

    shrug_tone3

    🤷🏽

    shrug_tone4

    🤷🏾

    shrug_tone5

    🤷🏿

    six

    6️⃣

    spy_tone1

    🕵🏻

    spy_tone2

    🕵🏼

    spy_tone3

    🕵🏽

    spy_tone4

    🕵🏾

    spy_tone5

    🕵🏿

    surfer_tone1

    🏄🏻

    surfer_tone2

    🏄🏼

    surfer_tone3

    🏄🏽

    surfer_tone4

    🏄🏾

    surfer_tone5

    🏄🏿

    swimmer_tone1

    🏊🏻

    swimmer_tone2

    🏊🏼

    swimmer_tone3

    🏊🏽

    swimmer_tone4

    🏊🏾

    swimmer_tone5

    🏊🏿

    three

    3️⃣

    thumbsdown_tone1

    👎🏻

    thumbsdown_tone2

    👎🏼

    thumbsdown_tone3

    👎🏽

    thumbsdown_tone4

    👎🏾

    thumbsdown_tone5

    👎🏿

    thumbsup_tone1

    👍🏻

    thumbsup_tone2

    👍🏼

    thumbsup_tone3

    👍🏽

    thumbsup_tone4

    👍🏾

    thumbsup_tone5

    👍🏿

    two

    2️⃣

    uk

    🇬🇧

    us

    🇺🇸

    v_tone1

    ✌🏻

    v_tone2

    ✌🏼

    v_tone3

    ✌🏽

    v_tone4

    ✌🏾

    v_tone5

    ✌🏿

    vulcan_tone1

    🖖🏻

    vulcan_tone2

    🖖🏼

    vulcan_tone3

    🖖🏽

    vulcan_tone4

    🖖🏾

    vulcan_tone5

    🖖🏿

    walking_tone1

    🚶🏻

    walking_tone2

    🚶🏼

    walking_tone3

    🚶🏽

    walking_tone4

    🚶🏾

    walking_tone5

    🚶🏿

    water_polo_tone1

    🤽🏻

    water_polo_tone2

    🤽🏼

    water_polo_tone3

    🤽🏽

    water_polo_tone4

    🤽🏾

    water_polo_tone5

    🤽🏿

    wave_tone1

    👋🏻

    wave_tone2

    👋🏼

    wave_tone3

    👋🏽

    wave_tone4

    👋🏾

    wave_tone5

    👋🏿

    woman_tone1

    👩🏻

    woman_tone2

    👩🏼

    woman_tone3

    👩🏽

    woman_tone4

    👩🏾

    woman_tone5

    👩🏿

    writing_hand_tone1

    ✍🏻

    writing_hand_tone2

    ✍🏼

    writing_hand_tone3

    ✍🏽

    writing_hand_tone4

    ✍🏾

    writing_hand_tone5

    ✍🏿

    zero

    0️⃣

    100

    💯

    1234

    🔢

    +1

    👍

    -1

    👎

    8ball