Rich Content Model

 

Root properties - required

 
 

property

required/optional

description

type

required

The type of rich content.

Should be set to options.

name

Optional

Default: empty string

A human readable name for the message for easier tracking of messages. It is not displayed.

externalId

Optional

An optional unique id of the rich content message. By setting an externalId, navigations can be traced back to the message.

bodyCss

Optional

The css applied on the body container.

It can be flex for simpler content and grid for more advanced content. Or anything else really.

If omitted it will fallback to the layout setting for rich content in the chat interaction or default to the vertical layout with flex column styling:

{
	display: 'flex',
	flexDirection: 'column',
	alignItems: 'center',
	gap: '10px'
}

body

required

Contains an array of objects which the user can interact with.

When the user has interacted, the rich content becomes disabled or stays active based on the afterResponse setting.

afterResponse

Optional

Default: disable

A string identifier for what should happen to the UI after the user has made a selection.

Supported values:

disable: disables the richContent after a selection or confirmation of a selections is done.

sticky: The richContent continues to be active after a selection is made.

reponseMethod

Optional

Default: optionsResponse

 

This decides what should be sent after the user has interacted with the rich content.

It can send an optionsResponse or a chat message with the values or both.

Supported values:

optionsResponse , chatMessage, both

Using chatMessage will not disable the richContent when selecting an option, in effect making the content sticky

 

submitType

Optional

Default: singleChoice

Decides if the a response should be sent on a single selection or using the submitButton.

When using checkboxes, submitType needs to be set to multiChoice and a submitButton is needed.

Supported values

singleChoice

multiChoice

testFlow

Optional

Default: should not be part of the data if not in test.

Test flow is used for end to end testing of bot flows. The property should not be exposed to customers. That means completely omitted.

 

 

testFlow

Only to be used for test purposed. Not to be used in production, if used incorrectly the chat application may crash. Not to be used to set initial values for the richContent or similar. 

Test flow is used for end to end testing of bot flows. It enables a simulation of user choices and responses. It’s an array with commands that will be executed in order.

Keep in mind that disabled buttons can still be clicked using testFlow. This means that buttons that have already been submitted can be clicked again.

Make sure that all buttons that are clicked actually exist in the richContent. Using click on missing buttons and submit button could generate errors or a crash.

If a new richContent with testFlow is received during an ongoing testFlow the commands will be interleaved creating unpredictable results.

testFlow commands

command

description

{
  type: 'click',
  id: 'id'
}

This will click a button with the id. It works on both multi select and single select buttons.

{
  type: 'click'
  id: 'submit'
}

This will click the submit button and trigger the submission. The id needs to be set to ‘submit’

{
  type: 'input',
  id: 'id',
  value: 'input text'
}

This will set the text of an input with id to value.

{
  type: 'wait'
  value: 1000
}

This will do a wait for the number of milliseconds in value. The wait command can be used the interaction more humanlike.

{
  type: 'chatMessage',
  value: 'the message'
}

This will send a regular chat message.

 

button

When a button is pressed the responseMethod and subsequently the afterResponse is executed.

property

required/optional

description

type

required

Is set to button

id

required

The id of the button

label

required

The label displayed on the button

value

required

The value of the button

icon

optional

Default: empty string

When set adds an icon in front of the label. The icon is defined by a string name.

group

optional

Default: singleChoice

Optional parameter. Should be left unset unless using buttons as radio buttons.

css

optional

Default: empty object

The css applied to the container that contains the item.

Use it for grid item styling.

sticky

optional

Default: false

When sticky is enabled the item remains active after the richContent is disabled.

This is particularly usefull for thumb buttons which need to be accesible at all times.

This is not to be confused with the afterResponse setting which makes the entire content sticky.

 

Example

{
    type: 'button',
    id: 'id1',
    label: 'Choice 1',
    value: 'value1'
}

 

symbol

A symbol that works like a button like thumbs up or down.

property

required/optional

description

type

required

Is set to symbol

id

required

The id of the symbol

value

required

The value of the symbol

icon

required

The icon of the symbol.

size

optional

Default: ‘30px’

The size sets the width and height of the symbol.

group

optional

Default: singleChoice

Should be set to something specific when using thumbs.

Make sure all thumbs have are in the same group.

css

optional

Default: empty object

The css applied to the container that contains the item.

Use it for grid item styling.

attributes

optional

Supported attributes:

aria-labelis a good idea to add for accesibility.

Any other attributes that are in attribues will also be used.

sticky

optional

Default: false

Set to true for sticky thumb buttons.

 

Example

{
    type: 'symbol',
    id: 'id1',
    icon: 'faThumbsUp',
    group: 'thumbs',
    value: 'value1'
}

 

checkbox

A checkbox element. It does not send a response when clicked. Use in conjunction with a submitButton.

Set submitType to multiChoice

 
 

property

required/optional

description

type

required

Is set to checkbox

id

required

The id of the checkbox

label

required

The label displayed next to the checkbox

value

required

The value of the checkbox

group

required

 

The group that the checkbox belogns to.

css

optional

Default: empty object

The css applied to the container that contains the item.

Use it for grid item styling.

sticky

optional

Default: false

The checkbox should not be set to sticky. Use afterResponse sticky instead.

attributes

optional

Supported attributes:

required This will make the checkbox mandatory.

 

Example

{
    type: 'checkbox',
    label: 'Choice 1',
    id: 'id1',
    value: 'value1',
    group: 'checkboxGroup'
}

 

submitButton

When the submitButton is pressed it sends a response based on responseMethod.

The submit button is active even when the user hasn’t made a choice. This maybe needs to change in the future.

Set submitType to multiChoice to enable the button.

 
 

property

required/optional

description

type

required

Is set to submitButton

label

required

The label displayed on the button

icon

optional

Default: empty string

When set adds an icon in front of the label. The icon is defined by a string name.

css

optional

Default: empty object

The css applied to the container that contains the item.

Use it for grid item styling.

 

Example

{
    type: 'submitButton',
    label: 'submit'
}

linkButton

Opens a link and sends a response.

Keep in mind that links can be added using the text item aswell. The difference is that the linkButton response can be traced back to the original message using externalId and the linkButton id.

property

required/optional

description

type

required

Is set to linkButton

id

required

The id of the button. This id is used when sending newTabNavigation

label

required

The label displayed on the button

icon

optional

Default: faArrowUpRightFromSquare

An Icon is default but can be changed. At the moment it’s not possible to remove the icon, only change it.

url

required

The url.

target

optional

This is not used. Links to other domains will automatically open in a new tab.

value

optional

This is not used.

css

optional

Default: empty object

The css applied to the container that contains the item.

Use it for grid item styling.

sticky

optional

Default: false

When sticky is enabled for an item remains active after the richContent is disabled.

 

Example

{
  label: 'puzzel.com',
  type: 'linkButton',
  id: 'buttonId',
  url: 'https://www.puzzel.com'
}

 

input

A text input field. This can be used to create a form.

 
 

property

required/optional

description

type

required

Is set to input

id

required

The id of the input

label

optional

This is not used

value

optional

default: empty string

The value of the input works differently than for single choice components. If a value is provided it will be used as a defatult value in the input.

When an optionsResponse is sent the value of the input item will correspond to the entered text in the input.

css

optional

Default: empty object

The css applied to the container that contains the item.

Use it for grid item styling.

sticky

optional

Default: false

The input should not be set to sticky. Use afterResponse sticky instead.

attributes

optional

Supported attributes:

required This will make the input mandatory.

type: default is text

Any other attributes that are in attribues will also be used. for example placeholder, autoComplete, minLength, maxLength and pattern.

 

Example

{
	type: 'input',
	id: 'id1',
	value: '',
	css: {
		...
	},
	attributes: {
		required: true,
		placeholder: 'Enter your name',
		autoComplete: 'given-name'
	}
}

 

Select

A dropdown for selecting single items. To be used in a form

 
 

property

required/optional

description

type

required

Is set to select

id

required

The id of the select

 

 

 

value

optional

default: empty string

The value of the select. Works like an input.

css

optional

Default: empty object

The css applied to the container that contains the item.

Use it for grid item styling.

sticky

optional

Default: false

The select should not be set to sticky. Use afterResponse sticky instead.

attributes

optional

Supported attributes:

required This will make the select mandatory.

aria-labelis a good idea to add for accesibility.

Any other attributes that are in attribues will also be used.

options

required

Options is an array of objects containing value and label for the entries in the select.

 

Example

{
	type: 'select',
	id: 'id1',
	value: '',
	css: {
		...
	},
	attributes: {
		...
	},
	options: [
		{ value: '', label: 'Select country' },
		{ value: 'SE', label: 'Sweden' },
		...
	]
}

Text

A text element that supports markdown.

property

required/optional

description

type

required

Is set to text

text (plain text or markdown)

Optional

Default: empty string

The displayed text. If omitted or set to empty it won’t be displayed. This can be used to show only afterResponseText.

afterResponseText (plain text or markdown)

Optional

Default: empty string

The text shown when the user has made a selection.

If it’s empty or undefined it will use the text property instead.

css

optional

Default: empty object

The css applied to the container that contains the item.

Use it for grid item styling.

 

Example

{
  type: 'text',
  text: 'Please select',
  afterResponseText: 'Good choice'
}

 

Response data format

The format of the data being sent to the endpoint /api/conversation/{id}/data when the user confirms a selection. The response supports single and multi choice selections. The data sent back is reduced of uneccessary properties and is not identical to the original.

This response is only sent by the visitor

LinkButton does not send an optionsResponse but a newTabNavigation.

Root parameters

Parameter

Value

dataType

Is set to optionsResponse

data

The data

 

Data parameters

Parameter

Value

eventId

The eventId of the chat message that contained the richContent. This is used by frontend

externalId

The id of the richContent that the user has interacted with.

nextStatus

Parameter used by frontend to handle sticky.

selection

An array with the selected options

 

Item parameters in the selection array

Parameter

Value

id

The id of the element that the user has interacted with.

value

The value of the element that the user has interacted with.

type

The type of the element that the user has interacted with.

 

Example

{
	dataType: 'optionsResponse',
	data: {
		eventId: 'chat message eventId',
		externalId: 'externalId',
		selection: [
			{
				id: 'buttonId',
				type: 'button'
				value: 'buttonValue',
			}
		]
	}
}

Rich content examples

Small example

A small example without bodyCss using the default layout setting in the chat interaction.

{
	type: 'options',
	name: 'small',
	externalId: 'externalId1',
	body: [
		{
			type: 'button',
			label: 'Choice 1',
			id: 'id1',
			value: 'value1'
		},
		{
			type: 'button',
			label: 'Choice 2',
			id: 'id2',
			value: 'value2'
		}
	]
}

 

Sticky example

Simple example with two choices using flex for styling. AfterResponse set to sticky so the user can reselect. Using responseMethod both to send both an optionsResponse and a chatMessage.

{
	type: 'options',
	name: 'sticky, flex',
	externalId: 'externalId1',
	afterResponse: 'sticky',
	responseMethod: 'both',
	bodyCss: {
		display: 'flex',
		flexDirection: 'column',
		alignItems: 'center',
		gap: '4px'
	},
	body: [
		{
			type: 'text',
			text: 'sticky, flex'
		},
		{
			type: 'button',
			label: 'Choice 1',
			id: 'id1',
			value: 'value1'
		},
		{
			type: 'button',
			label: 'Choice 2',
			id: 'id2',
			value: 'value2'
		}
	]
}

 

Thumbs example

Two choices and a link button. When the user has made a choice the buttons are disabled. The layout uses grid to place two thumb buttons next to eachother on the right side. The thumb buttons are sticky and continue to work after the other options have been disabled.

{
	type: 'options',
	name: 'grid, thumbs',
	externalId: 'externalId2',
	bodyCss: {
		display: 'grid',
		gridTemplateColumns: '2fr 1fr',
		gridAutoRows: '1fr',
		gridGap: '4px'
	},
	body: [
		{
			type: 'text',
			text: 'grid, thumbs',
			css: {
				gridColumn: '1 / span 2',
				justifySelf: 'center'
			}
		},
		{
			type: 'button',
			label: 'Choice 1',
			id: 'id1',
			value: 'value1',
			css: {
				gridColumn: '1 / span 2',
				justifySelf: 'center'
			}
		},
		{
			type: 'button',
			label: 'Choice 2',
			id: 'id2',
			value: 'value2',
			css: {
				gridColumn: '1 / span 2',
				justifySelf: 'center'
			}
		},
		{
			type: 'linkButton',
			label: 'link',
			url: 'https://www.puzzel.com',
			id: 'id4',
			value: 'value2',
			css: {
				gridColumn: '1 / span 2',
				justifySelf: 'center'
			}
		},
		{
			type: 'symbol',
			icon: 'faThumbsUp',
			id: 'id5',
			group: 'yesNo',
			value: 'yes',
			sticky: true,
			css: {
				gridColumn: '1',
				justifySelf: 'right'
			}
		},
		{
			type: 'symbol',
			icon: 'faThumbsDown',
			id: 'id6',
			group: 'yesNo',
			value: 'no',
			sticky: true,
			css: {
				gridColumn: '2',
				justifySelf: 'left'
			}
		}
	]

}

 

Submit example

An example using submitType multiChoice. A grid with three checkboxes and a submit button, thumb buttons, a markdown link and an after response text. The thumb buttons have been resized using size.

{
	type: 'options',
	name: 'submit example',
	externalId: 'externalId3',
	submitType: 'multiChoice',
	bodyCss: {
		display: 'grid',
		gridTemplateColumns: '2fr 1fr 1fr',
		gridAutoRows: 'auto',
		gridGap: '10px'
	},
	body: [
		{
			type: 'text',
			text: 'Submit example',
			css: {
				gridColumn: '1 / span 3',
				justifySelf: 'center'
			}
		},
		{
			type: 'checkbox',
			label: 'Stay hungry',
			id: 'id1',
			value: 'stayHungry',
			group: 'checkboxGroup',
			css: {
				justifySelf: 'start',
				gridColumn: '1 / span 3'
			}
		},
		{
			type: 'checkbox',
			label: 'Built on trust',
			id: 'id2',
			value: 'builtOnTrust',
			group: 'checkboxGroup',
			css: {
				justifySelf: 'start',
				gridColumn: '1 / span 3'
			}
		},
		{
			type: 'checkbox',
			label: 'Stronger together',
			id: 'id3',
			value: 'strongerTogether',
			group: 'checkboxGroup',
			css: {
				justifySelf: 'start',
				gridColumn: '1 / span 3'
			}
		},
		{
			type: 'submitButton',
			label: 'Submit',
			css: {
				justifySelf: 'center',
				gridColumn: '1 / span 3'
			}
		},
		{
			type: 'text',
			text: '',
			afterResponseText: 'Thank you',
			css: {
				justifySelf: 'center',
				gridColumn: '1 / span 3'
			}
		},
		{
			type: 'text',
			text: '[link](https://www.puzzel.com)',
			css: {
				gridColumn: '1',
				justifySelf: 'start',
				alignSelf: 'center'
			}
		},
		{
			type: 'symbol',
			icon: 'faThumbsUp',
			id: 'id4',
			group: 'yesNo',
			value: 'yes',
			size: '20px',
			sticky: true,
			css: {
				gridColumn: '2',
				justifySelf: 'right',
				alignSelf: 'center'
			}
		},
		{
			type: 'symbol',
			icon: 'faThumbsDown',
			id: 'id5',
			group: 'yesNo',
			value: 'no',
			size: '20px',
			sticky: true,
			css: {
				gridColumn: '3',
				justifySelf: 'left',
				alignSelf: 'center'
			}

		}
	]
}

 

Form Example

{
			type: 'options',
			name: 'form example',
			externalId: 'externalId3',
			submitType: 'multiChoice',
			responseMethod: 'both',
			bodyCss: {
				display: 'grid',
				gridTemplateColumns: '1fr 1fr 1fr .5fr',
				gridAutoRows: 'auto',
				gridGap: '10px'
			},
			body: [
				{
					type: 'text',
					text: 'Form example',
					css: {
						gridColumn: '1 / span 4',
						justifySelf: 'center'
					}
				},
				{
					type: 'input',
					label: 'name',
					id: 'id1',
					value: '',
					css: {
						justifySelf: 'center',
						gridColumn: '1 / span 4'
					},
					attributes: {
						required: true,
						placeholder: 'Enter your name',
						autoComplete: 'given-name'
					}
				},
				{
					type: 'input',
					label: 'lastName',
					id: 'id2',
					value: '',
					css: {
						justifySelf: 'center',
						gridColumn: '1 / span 4'
					},
					attributes: {
						required: true,
						placeholder: 'Enter your last name',
						autoComplete: 'family-name'
					}
				},
				{
					type: 'input',
					label: 'email',
					id: 'id3',
					value: '',
					css: {
						justifySelf: 'center',
						gridColumn: '1 / span 4'
					},
					attributes: {
						required: true,
						placeholder: 'Enter your email',
						autoComplete: 'email'
					}
				},
				{
					type: 'select',
					id: 'id7',
					value: '',
					options: [
						{ value: '', label: 'Select country' },
						{ value: 'SE', label: 'Sweden' },
						{ value: 'NO', label: 'Norway' },
						{ value: 'DK', label: 'Denmark' },
						{ value: 'FI', label: 'Finland' }
					],
					css: {
						justifySelf: 'center',
						gridColumn: '1 / span 4'
					},
					attributes: {
						required: true
					}
				},
				{
					type: 'checkbox',
					label: 'Agree to terms',
					id: 'id4',
					value: 'test',
					group: 'checkboxGroup',
					css: {
						alignSelf: 'center',
						justifySelf: 'center',
						gridColumn: '1 / span 2'
					},
					attributes: {
						required: true
					}
				},
				{
					type: 'text',
					text: '[terms](https://www.puzzel.com)',
					css: {
						gridColumn: '3',
						justifySelf: 'start',
						alignSelf: 'center'
					}
				},
				{
					type: 'submitButton',
					label: 'Submit',
					css: {
						justifySelf: 'center',
						gridColumn: '1 / span 4'
					}
				},
				{
					type: 'symbol',
					icon: 'faThumbsUp',
					id: 'id5',
					group: 'yesNo',
					value: 'yes',
					size: '20px',
					sticky: true,
					css: {
						gridColumn: '3',
						justifySelf: 'right',
						alignSelf: 'center'
					}
				},
				{
					type: 'symbol',
					icon: 'faThumbsDown',
					id: 'id6',
					group: 'yesNo',
					value: 'no',
					size: '20px',
					sticky: true,
					css: {
						gridColumn: '4',
						justifySelf: 'left',
						alignSelf: 'center'
					}

				}
			]
		}

 

testFlow example

 

Example with a testflow with button clicks, input fills, submit click, chat message and some delays.

{
	type: 'options',
	name: 'testFlow example',
	externalId: 'externalId2',
	submitType: 'multiChoice',
	bodyCss: {
		display: 'grid',
		gridTemplateColumns: '2fr 1fr',
		gridAutoRows: '1fr',
		gridGap: '4px'
	},
	body: [
		{
			type: 'text',
			text: 'Test flow example',
			css: {
				gridColumn: '1 / span 3',
				justifySelf: 'center'
			}
		},
		{
			type: 'checkbox',
			label: 'test1',
			id: 'id1',
			value: 'test1',
			group: 'checkboxGroup',
			css: {
				justifySelf: 'start',
				gridColumn: '1 / span 3'
			}
		},
		{
			type: 'input',
			label: 'test2',
			id: 'id2',
			value: '',
			css: {
				justifySelf: 'center',
				gridColumn: '1 / span 4'
			}
		},
		{
			type: 'submitButton',
			label: 'Submit',
			css: {
				justifySelf: 'center',
				gridColumn: '1 / span 3'
			}
		},
		{
			type: 'symbol',
			icon: 'faThumbsUp',
			id: 'id4',
			group: 'yesNo',
			value: 'yes',
			size: '20px',
			sticky: true,
			css: {
				gridColumn: '2',
				justifySelf: 'right',
				alignSelf: 'center'
			}
		},
		{
			type: 'symbol',
			icon: 'faThumbsDown',
			id: 'id5',
			group: 'yesNo',
			value: 'no',
			size: '20px',
			sticky: true,
			css: {
				gridColumn: '3',
				justifySelf: 'left',
				alignSelf: 'center'
			}

		}
	],
	testFlow: [
		{
			type: 'wait',
			value: 2000
		},
		{
			type: 'click',
			id: 'id1'
		},
		{
			type: 'input',
			id: 'id2',
			value: 'hej'
		},
		{
			type: 'wait',
			value: 2000
		},
		{
			type: 'click',
			id: 'submit'
		},
		{
			type: 'wait',
			value: 2000
		},
		{
			type: 'click',
			id: 'id5'
		},
		{
			type: 'wait',
			value: 2000
		},
		{
			type: 'chatMessage',
			value: 'I want to talk to a human'
		}
	]
}

Published

Last updated

0
0