Chat window user interface using EJ2 JavaScript ListView control
10 Mar 202515 minutes to read
ListView can be customized to function as a chat window. To achieve this, use the ListView template
property alongside the Avatar
control.
- The ListView template property is used to showcase the ListView as chat window.
- Avatar control is used to design the image of contact person.
Refer to the template code snippet below for a chat window implementation:
let template =
'<div class="settings">' +
'${if(chat!=="receiver")}' +
'<div id="content">' +
'<div class="name">${text}</div>' +
'<div id="info">${contact}</div></div>' +
'${if(avatar!=="")}' +
'<div id="image"><span class="e-avatar img1 e-avatar-circle">${avatar}</span></div>' +
"${else}" +
'<div id="image"><span class="${pic} img1 e-avatar e-avatar-circle"> </span></div>' +
"${/if}" +
"${else}" +
'${if(avatar!=="")}' +
'<div id="image2"><span class="e-avatar img2 e-avatar-circle">${avatar}</span></div>' +
"${else}" +
'<div id="image2"><span class="${pic} img2 e-avatar e-avatar-circle"> </span></div>' +
"${/if}" +
'<div id="content1">' +
'<div class="name1">${text}</div>' +
'<div id="info1">${contact}</div>' +
"</div>" +
"${/if}" +
"</div>";
Chat order in template
The ListView template is rendered with list items based on sender and receiver information from the ListView’s data source.
Adding messages to chat window
- Use textbox to get message from user.
- Add the textbox message to ListView dataSource using
addItem
method.
document.getElementById("btn").addEventListener("click", e => {
var value = document.getElementById("name").value;
document
.getElementById("List")
.ej2_instances[0].addItem([
{
text: "Amenda",
contact: value,
id: "2",
avatar: "A",
pic: "",
chat: "receiver"
}
]);
});
var template =
'<div class="settings">' +
'${if(chat!=="receiver")}' +
'<div id="content">' +
'<div class="name">${text}</div>' +
'<div id="info">${contact}</div></div>' +
'${if(avatar!=="")}' +
'<div id="image"><span class="e-avatar img1 e-avatar-circle">${avatar}</span></div>' +
"${else}" +
'<div id="image"><span class="${pic} img1 e-avatar e-avatar-circle"> </span></div>' +
"${/if}" +
'${else}' +
'${if(avatar!=="")}' +
'<div id="image2"><span class="e-avatar img2 e-avatar-circle">${avatar}</span></div>' +
"${else}" +
'<div id="image2"><span class="${pic} img2 e-avatar e-avatar-circle"> </span></div>' +
"${/if}" +
'<div id="content1">' +
'<div class="name1">${text}</div>' +
'<div id="info1">${contact}</div>' +
"</div>" +
'${/if}' +
"</div>";
//Define an array of JSON data
var dataSource = [
{ text: "Jenifer", contact: "Hi", id: "1", avatar: "", pic: "pic01", chat: "sender" },
{ text: "Amenda", contact: "Hello", id: "2", avatar: "A", pic: "", chat: "receiver" },
{ text: "Jenifer", contact: "What kind of application going to launch", id: "4", avatar: "", pic: "pic02", chat: "sender" },
{ text: "Amenda", contact: "A kind of Emergency broadcast App", id: "5", avatar: "A", pic: "", chat: "receiver" },
{ text: "Jacob", contact: "Can you please elaborate", id: "6", avatar: "", pic: "pic04", chat: "sender" }
];
var listObj = new ej.lists.ListView({
//Set defined data to dataSource property.
//Set the defined data to the dataSource property
dataSource: dataSource,
//Map the appropriate columns to the fields property
fields: { text: "text" },
//Set the width of the ListView
width: "350px",
//Enable the header of the ListView
showHeader: true,
//Set the header title
headerTitle: "Chat",
//Set the customized template
template: template,
});
listObj.appendTo('#List');
var button = new ej.buttons.Button();
// Render initialized button.
button.appendTo('#btn');
document.getElementById('btn').addEventListener('click', (e) => {
var value = document.getElementById('name').value;
document.getElementById('List').ej2_instances[0].addItem([{ text: "Amenda", contact: value, id: "2", avatar: "A", pic: "", chat: "receiver" }]);
document.getElementById('name').value = "";
});
<!DOCTYPE html>
<html lang="en">
<head><script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<title>Essential JS 2 for ListView </title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Essential JS 2 for ListView UI Control">
<meta name="author" content="Syncfusion">
<link href="index.css" rel="stylesheet">
<link href="https://cdn.syncfusion.com/ej2/29.1.33/ej2-base/styles/material.css" rel="stylesheet">
<link href="https://cdn.syncfusion.com/ej2/29.1.33/ej2-lists/styles/material.css" rel="stylesheet">
<link href="https://cdn.syncfusion.com/ej2/29.1.33/ej2-buttons/styles/material.css" rel="stylesheet">
<link href="https://cdn.syncfusion.com/ej2/29.1.33/ej2-layouts/styles/material.css" rel="stylesheet">
<link href="https://cdn.syncfusion.com/ej2/29.1.33/ej2-inputs/styles/material.css" rel="stylesheet">
<script src="https://cdn.syncfusion.com/ej2/29.1.33/dist/ej2.min.js" type="text/javascript"></script>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id="container">
<div id="List" tabindex="1"></div>
<div style="width: 350px;margin: 0 auto;"><input id="name" style="width: 275px" class="e-input" type="text"
placeholder="Type your message">
<button id="btn" style="float:right">Send</button>
</div>
</div>
<style>
#List {
margin: 0 auto;
border: 1px solid #ccc;
}
#List .e-list-item {
height: auto;
cursor: pointer;
}
#List .e-list-header .e-text {
font-family: sans-serif;
font-size: 18px;
line-height: 26px;
}
#List #info,
#List .name {
font-size: 11px;
line-height: 20px;
}
#List .name {
padding-top: 3px;
font-weight: 500;
padding-left: 150px;
}
#List #info {
float: right;
margin-right: 10px;
}
.pic01 {
background-image: url("https://ej2.syncfusion.com/demos/src/grid/images/1.png");
}
.pic02 {
background-image: url("https://ej2.syncfusion.com/demos/src/grid/images/3.png");
}
.pic03 {
background-image: url("https://ej2.syncfusion.com/demos/src/grid/images/5.png");
}
.pic04 {
background-image: url("https://ej2.syncfusion.com/demos/src/grid/images/2.png");
}
/* csslint ignore:start */
.img2 {
margin-left: 10px;
margin-top: 2px !important;
font-size: 13px;
}
#List #content1 {
width: 200px;
background-color: aliceblue;
display: inline-block;
margin: 5px;
}
#List #info1,
#List .name1 {
font-size: 11px;
line-height: 20px;
margin-left: 10px;
}
#List .name1 {
padding-top: 3px;
font-weight: 500;
}
#List #content {
margin: 5px;
width: 200px;
margin-left: 87px;
background-color: aliceblue;
display: inline-block
}
#image {
float: right;
display: inline-block;
}
#image2 {
float: left;
display: inline-block;
}
.img1 {
margin-right: 10px;
margin: 5px;
font-size: 13px;
}
.e-listview .e-list-item {
padding: 0 !important;
}
.e-listview .e-list-header {
color: white !important;
}
.e-listview .e-list-header {
background: rgb(2, 120, 215) !important;
}
#List.e-listview .e-hover {
background-color: transparent;
}
/* csslint ignore:end */
</style>
<script>
var ele = document.getElementById('container');
if (ele) {
ele.style.visibility = "visible";
}
</script>
<script src="index.js" type="text/javascript"></script>
</body>
</html>
#container {
visibility: hidden;
}
#loader {
color: #008cff;
height: 40px;
width: 30%;
position: absolute;
font-family: "Helvetica Neue", "calibiri";
font-size: 14px;
top: 45%;
left: 45%;
}