The Chat SDK is built with a default HTML template that you can modify using the html: {} statement in the build method. Here is how you can create a Chat instance with your own custom HTML.
In the build method, a new configuration is available: the html:{} statement.
The Chat SDK allows you to customize some UI components. A component is a piece of visual element, plus a design and a behaviour. An example of a customizable component would be conversation-window-header, which contains the necessary HTML to render the header of the conversationWindow.
On the other hand, there are also "atomic" components, such as the "reset session" button: it has its own HTML structure and uses CSS for its design and behaviour (It displays a systemMessage in a modal format). This component has its own HTML and functionality, and it is not possible to modify its HTML.
There are 2 different Custom HTML types. When you select the type components, you can use all these components (atomic or not) inside the customizable components when you modify their HTML, and they will keep the original functionality.
Use the htmlType configuration parameter to set the Custom HTML type. It can have the following values:
components: This is the default value and it allows you to use the mentioned SDK components.html-only: This type only allows you to add your own HTML code, which means it does not allow you to use the mentioned SDK components.To allow adding internal SDK components, the `components` HTML type needs to compile the components in runtime, which can conflict with strict Content Security Policies. If your webpage has strict Content Security Policies, consider using the `html-only` type.
You can only insert one root element in the custom HTML. This is a technical restriction that can not be circumvented.
Example
The following implementation uses the components HTML type.
config.htmlType = 'components';
config.html = {
'conversation-window-header-buttons':
'<div class="header__actions">'
+'<reset-session-button />'
+'</div>'
}The following implementation uses the html-only HTML type.
config.htmlType = 'html-only';
config.html = {
'conversation-window-header-buttons':
'<div class="header__actions">'
+'<button type="button">Reset</button>'
+'</div>'
}The following correct implementation has only one root element, the <div class="header__actions">.
config.html = {
'conversation-window-header-buttons':
'<div class="header__actions">'
+'<reset-session-button />'
+'</div>'
}The following incorrect implementation will prompt an error and display the HTML incorrectly. If you need to add this custom label, you must add it inside the header actions or create a parent div element that can contain both header__actions and the custom label.
config.html = {
'conversation-window-header-buttons':
'<div class="header__actions">'
+'<reset-session-button />'
+'</div>'
+'<div>Custom Label </div>'
}The HTML components that are now available for customizations are listed below. The original HTML of the components is provided and can be copied and modified to allow any custom feature desired.
div elements. The first is inbenta-bot__chat__header, followed by header__title (which defines the title of the Chat SDK). After the second div, there is the conversation-window-header:
<div class="inbenta-bot__chat__header">
<div class="header__title">
SDK Demo
</div>
<conversation-window-header-buttons />
</div>header__actions div), then the components explained below. By default, it has both "minimize" and "close" buttons, but hides the "close" button, which can be modified in the close button configuration. 'conversation-window-header-buttons':
<div class="header__actions">
<hide-conversation-window-button />
<reset-session-button />
</div>
interface-title label.
conversation-window-header-title:
<div class="header__title">
<img src="<my-logo-url>"
</div>close-custom-conversation-window atomic component.
'custom-window-header':
<close-custom-conversation-window/>inbenta-bot__bubble__header div) with a few components inside. By default, it will show the side-window-header-title atomic component and the side-window-header-buttons customizable component. side-window-header:
<div class="inbenta-bot__bubble__header">
<side-window-header-title />
<side-window-header-buttons />
</div>header__actions div) in the side window, then the components explained below. By default, it has a "close" button, which is in charge of closing the side window. side-window-header-buttons:
<div class="header__actions">
<side-window-header-close-button />
</div>
side-window-header-title: This component has the HTML of the side window header title. By default, it shows the title of the displayed intent.
side-window-header-title:
<div class="header__title"></div>conversation-window-footer: This template has the HTML of the conversation window footer. By default, it will show the conversation-window-footer-form which has the following atomic components between its tags: upload-media-button, chatbot-input, character-counter, send-button
conversation-window-footer:
<conversation-window-footer-form>
<upload-media-button />
<chatbot-input />
<character-counter />
<send-button />
</conversation-window-footer-form> conversation-window-footer-prefix:
<button><span class="speech-to-text"></span></button>hide-conversation-window-button: Minimizes/hides the conversationWindow, originally placed inside the conversation-window-header.
reset-session-button: Calls the displaySystemMessage action that asks for a confirmation before you leave the conversation. Upon confirmation, it resets the session, originally placed inside the conversation-window-header.
close-custom-conversation-window: When there is a custom-conversationWindow, hides it and shows the original again.
side-window-header-title: Shows the side window title, which by default is the content title.
side-window-header-close-button: Closes the sideWindow, originally placed inside side-window-header-buttons.
character-counter: Shows the remaining available characters left, which is obtained from the length of the query in the chatbot-input and the inputCharacterCounterMax set parameter. It is hidden by default, configurable in the character counter configuration
chatbot-input: Input text the user can use to write to the Chat app. In order to be able to send the text to the Chat app, this atomic component needs to be placed inside the conversation-window-footer-form component (see example above).
send-button: Shows the send message button. On click, it will send the message written in the chatbot-input atomic component.
upload-media-button: This button lets the user upload a file and send it to tan external system. This button will only be shown when the showUpload action has been triggered.
conversation-window-footer-form: This component is the form which contains all the other atomic components and provides the footer styling. The component cannot be customized, but it is used to wrap all the needed components inside the footer.
config.html = {
'conversation-window-header':
'<div class="inbenta-bot__chat__header">'
+'<div class="header__title">'
+'<img src="custom_icon" style=" width: 30px; margin: 0; margin-right: 15px">'
+'SDK Demo'
+'</div>'
+'<conversation-window-header-buttons />'
+'</div>',
}
config.html = {
'conversation-window-header-buttons':
'<div class="header__actions">'
+'<reset-session-button />'
+'</div>'
}
Bootstrap is used to generate the dropdown menu, so include the CDN to use it.
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script> config.html = {
'conversation-window-header':
'<div class="inbenta-bot__chat__header">'
+'<div class="header__title">'
+'<img src="custom_image" style=" width: 30px; margin: 0; margin-right: 15px">'
+'SDK Demo'
+'</div>'
+'<conversation-window-header-buttons />'
+'</div>',
'conversation-window-header-buttons':
'<div class="header__actions">'
+'<div class="dropdown">'
+'<div class="inbenta-bot-icon dropdown-toggle" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></div>'
+'<div class="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownMenuButton">'
+'<a class="dropdown-item" href="#">Action</a>'
+'<a class="dropdown-item" href="#">Another action</a>'
+'<a class="dropdown-item" href="#">Something else here</a>'
+'</div>'
+'</div>'
+'<hide-conversation-window-button />'
+'<reset-session-button />'
+'</div>'
}
close-custom-conversation-window: config.html = {
'custom-window-header': '<div class="inbenta-bot__chat__header">'
+'<div class="header__title">'
+'Custom Inbenta form'
+'</div>'
+'<close-custom-conversation-window/>'
+'</div>';
}