Повідомлення
Навігація
Повідомлення
Макет повідомлень
<div class="page">
<div class="page-content messages-content">
<div class="messages">
<!-- Штамп дати -->
<div class="messages-title"><b>Sunday, Feb 9</b> 12:58</div>
<!-- Надіслане повідомлення (за умовчанням - зелений і праворуч) -->
<div class="message message-sent">
<div class="message-content">
<!-- Бульбашка з текстом -->
<div class="message-bubble">
<div class="message-text">Hi, Kate</div>
</div>
</div>
</div>
<!-- Ще одне надіслане повідомлення-->
<div class="message message-sent">
<div class="message-content">
<div class="message-bubble">
<div class="message-text">How are you?</div>
</div>
</div>
</div>
<!--Отримане повідомлення (за умовчанням - сірий зліва) -->
<div class="message message-received">
<!-- Аватар відправника -->
<div class="message-avatar" style="background-image:url(path/to/avatar.jpg)"></div>
<div class="message-content">
<!--Ім'я відправника-->
<div class="message-name">Blue Ninja</div>
<!-- Бульбашка з текстом -->
<div class="message-bubble">
<div class="message-text">Hi there, I am also fine, thanks! And how are you?</div>
</div>
</div>
</div>
</div>
</div>
</div>
● messages-content
- необхідний додатковий клас для оболонки повідомлень. Слід додати до вмісту сторінки page-content
● messages
- потрібна додаткова обгортка для бульбашок повідомлень. Обов'язковий елемент.
● messages-title
- заголовок повідомлень
● message
-одне повідомлення
Макет одного повідомлення
<div class="message">
<div class="message-avatar" style="background-image:url(path/to/avatar)"></div>
<div class="message-content">
<div class="message-name">John Doe</div>
<div class="message-header">Message header</div>
<div class="message-bubble">
<div class="message-text-header">Text header</div>
<div class="message-image">
<img src="path/to/image" />
</div>
<div class="message-text">Hello world!</div>
<div class="message-text-footer">Text footer</div>
</div>
<div class="message-footer">Message footer</div>
</div>
</div>
message-avatar
- аватар відправника, необов'язково
● message-name
- ім'я відправника, необов'язково
● message-header
- єдиний заголовок повідомлення, необов'язковий
● message-text-header
текстовий заголовок всередині бульбашки повідомлення, необов’язково
● message-image
- зображення повідомлення, необов'язково
● message-text
- текст повідомлення, необов'язково
● message-text-footer
- текстовий нижній колонтитул усередині бульбашки повідомленя, необов’язково
● message-footer
- текст нижнього колонтитула післябульбашки повідомлення, необов’язково
Додаткові класи для одного контейнера повідомлень
message-sent
- додатковий клас для одного повідомлення, який вказує, що це повідомлення було надіслано користувачем. Він залишається праворуч із зеленим кольором тла.
● message-received
- додатковий клас для одного повідомлення, який вказує, що це повідомлення було отримано користувачем. Він залишається ліворуч із сірим кольором тла.
● message-tail
- додатковий клас для одного повідомлення (отриманого або надісланого), щоб додати бульбашку "хвіст"
● message-same-name
- додатковий клас для вказівки, що повідомлення має таке саме ім’я відправника, як і попереднє повідомлення
● message-same-avatar
- додатковий клас для вказівки, що повідомлення має той самий аватар, що й попереднє повідомлення
● message-same-header
- додатковий клас для вказівки, що повідомлення має той самий заголовок, що й попереднє повідомлення
● message-same-footer
- додатковий клас для вказівки, що повідомлення має той самий нижній колонтитул, що й попереднє повідомлення
● message-last
- додатковий клас для одного повідомлення (отриманого або надісланого), щоб вказати останнє отримане або останнє надіслане повідомлення в поточній розмові одним відправником
● message-first
- додатковий клас для одного повідомлення (отриманого або надісланого), щоб вказати перше отримане або перше надіслане повідомлення в поточній розмові одним відправником
Методи застосунку Messages
Метод | Опис |
---|---|
app.messages.create( parameters ) | Ініціалізація повідомлень із параметрами
Метод повертає ініціалізований екземпляр Messages |
app.messages.destroy( el ) | Знищити екземпляр Messages
● |
app.messages.get( el ) | Отримати екземпляр Messages за елементом HTML
Метод повертає екземпляр Messages |
Параметри повідомлень
Параметр | За замовчуванням | Опис | Тип |
---|---|---|---|
autoLayout | true | Увімкніть автоматичний макет, щоб автоматично додавати всі необхідні додаткові класи на основі виконаних умов | boolean |
newMessagesFirst | false | Увімкніть, якщо ви хочете використовувати нові повідомлення зверху, а не внизу | boolean |
scrollMessages | true | Увімкнути/вимкнути автопрокрутку повідомлень при додаванні нового повідомлення | boolean |
scrollMessagesOnEdge | true | Якщо ввімкнено, автоматичне прокручування повідомлень відбуватиметься лише тоді, коли користувач перебуває у верхній/нижній частині перегляду повідомлень | boolean |
messages | Масив із початковими повідомленнями. Кожне повідомлення в масиві має бути представлено як об’єкт з окремими параметрами повідомлення | array | |
renderMessage | Функція відтворення одного повідомлення. Має повертати повний рядок HTML повідомлення | function(message) |
Параметр | Опис | Тип |
---|---|---|
on | Об'єкт з обробниками подій. Наприклад: | object |
var messages = app.messages.create({
el: '.messages',
on: {
change: function () {
console.log('Textarea value changed')
}
}
})
Умови автоверстки
Параметр | Опис | Тип |
---|---|---|
firstMessageRule | Функція, яка має повертати логічне значення true або false на основі необхідної умови залежно від попереднього та наступного повідомлень. У разі збігу до повідомлення буде додано message-first перший клас повідомлення | function (message, previousMessage, nextMessage) |
lastMessageRule | Функція, яка має повертати логічне значення true або false на основі необхідної умови залежно від попереднього та наступного повідомлень. У разі збігу до повідомлення буде додано останній клас message-last повідомлення | function (message, previousMessage, nextMessage) |
tailMessageRule | Функція, яка має повертати логічне значення true або false на основі необхідної умови залежно від попереднього та наступного повідомлень. У разі збігу до повідомлення буде додано клас хвоста повідомлення message-tail | function (message, previousMessage, nextMessage) |
sameNameMessageRule | Функція, яка має повертати логічне значення true або false на основі необхідної умови залежно від попереднього та наступного повідомлень. У разі збігу до повідомлення буде додано клас message-same-name | function (message, previousMessage, nextMessage) |
sameHeaderMessageRule | Функція, яка має повертати логічне значення true або false на основі необхідної умови залежно від попереднього та наступного повідомлень. У разі збігу до повідомлення буде додано клас message-same-header | function (message, previousMessage, nextMessage) |
sameFooterMessageRule | Функція, яка має повертати логічне значення true або false на основі необхідної умови залежно від попереднього та наступного повідомлень. У разі збігу до повідомлення буде додано клас message-same-footer | function (message, previousMessage, nextMessage) |
sameAvatarMessageRule | Функція, яка має повертати логічне значення true або false на основі необхідної умови залежно від попереднього та наступного повідомлень. У разі збігу до повідомлення буде додано клас message-same-avatar | function (message, previousMessage, nextMessage) |
customClassMessageRule | Функція, яка має повертати додаткові класи повідомлень у вигляді рядка на основі необхідної умови залежно від попереднього та наступного повідомлень. | function (message, previousMessage, nextMessage) |
Параметри одного повідомлення
messages
:Параметр | За замовчуванням | Опис | Тип |
---|---|---|---|
text | Текст повідомлення. | string | |
header | Один заголовок повідомлення | string | |
footer | Один футер повідомлення | string | |
name | Ім'я відправника | string | |
avatar | Рядок URL-адреси аватара відправника | string | |
type | sent | Тип повідомлення - надіслане sent або отримане received | string |
textHeader | Заголовок тексту повідомлення | string | |
textFooter | Нижній колонтитул тексту повідомлення | string | |
image | Рядок HTML зображення повідомлення, напр. <img src="/path/to/image" /> . Може використовуватися замість параметра imageSrc | string | |
imageSrc | Рядок URL-адреси зображення повідомлення. Може використовуватися замість параметра image | string | |
isTitle | Визначає, чи має відтворюватися як повідомлення чи як заголовок повідомлення | boolean | |
cssClass | Додатковий клас CSS для встановлення в елементі HTML повідомлення | string |
Параметр | Опис | Тип |
---|---|---|
attrs | Об’єкт із додатковими HTML-атрибутами, який буде встановлено в HTML-елементі повідомлення. Наприклад, щоб встановити додаткові атрибути даних, це має виглядати так: | object |
var message = {
text: 'Hello!',
attrs: {
'data-id': 1,
'data-author-id': 150
}
}
Методи та властивості повідомлень
var messages = app.messages.create({ /* parameters */ })
messages
у прикладі вище) з корисними методами та властивостями:Властивості
Властивість | Опис |
---|---|
messages.params | Об'єкт із переданими параметрами ініціалізації |
messages.el | Елемент HTML контейнера повідомлень ( <div class="messages"> ) |
messages.$el | Елемент Dom64 з елементом HTML повідомлень |
messages.messages | Масив з повідомленнями |
Методи
Метод | Опис |
---|---|
messages.showTyping( message ) | Показати індикатор повідомлень, що вводяться
● |
messages.hideTyping() | Приховати індикатор введеного повідомлення |
messages.addMessage ( | Додайте нове повідомлення в кінець або на початок залежно від параметра методу
Метод повертає екземпляр Messages |
messages.addMessages ( | Додайте кілька повідомлень за один раз.
Метод повертає екземпляр Messages |
messages.removeMessage ( | Видалити повідомлення
Метод повертає екземпляр Messages |
messages.removeMessages ( | Видалити кілька повідомлень
Метод повертає екземпляр Messages |
messages.scroll ( | Прокрутити повідомлення вгору/вниз залежно від параметра newMessagesFirst
● ● |
messages.renderMessages() | Виводити повідомлення HTML залежно від масиву повідомлень |
messages.layout(); | Примусове автоматичне компонування повідомлень |
messages.clear(); | Очистити/видалити всі повідомлення |
messages.destroy(); | Знищити екземпляр повідомлень |
Події Повідомлення
Події DOM
Подія | Об'єкт | Опис |
---|---|---|
messages:beforedestroy | Елемент повідомлень
| Подію буде запущено безпосередньо перед тим, як екземпляр Messages буде знищено |
Події екземплярів застосунку та повідомлень
messages
:Подія | Аргумент | Опис | Об'єкт |
---|---|---|---|
beforeDestroy | ( messages ) | Подію буде запущено безпосередньо перед тим, як екземпляр Messages буде знищено | messages |
messagesBeforeDestroy | ( messages ) | Подію буде запущено безпосередньо перед тим, як екземпляр Messages буде знищено | app |
Автоматична ініціалізація повідомлень
message-init
до елемента повідомлень, і всі необхідні параметри можна передаватися за допомогою атрибутів даних data-
:<div class="messages messages-init" data-new-messages-first="true">
...
</div>
camelCase
, наприклад newMessagesFirst
, в атрибутах data-
повинні використовуватися в kebab-case
як data-new-messages-first
Змінні CSS
:root {
--t4-message-text-header-text-color: inherit;
--t4-message-text-header-opacity: 0.65;
--t4-message-text-header-font-size: 12px;
--t4-message-text-footer-text-color: inherit;
--t4-message-text-footer-opacity: 0.65;
--t4-message-text-footer-font-size: 12px;
--t4-message-bubble-line-height: 1.2;
--t4-message-header-font-size: 12px;
--t4-message-footer-font-size: 11px;
--t4-message-name-font-size: 12px;
--t4-message-name-font-weight: inherit;
--t4-message-avatar-border-radius: 50%;
--t4-messages-title-font-weight: inherit;
/*
--t4-message-sent-bg-color: var(--t4-theme-color);
*/
--t4-message-sent-text-color: #fff;
--t4-messages-content-bg-color: #fff;
--t4-message-typing-indicator-bg-color: #000;
--t4-message-received-bg-color: #e5e5ea;
--t4-message-received-text-color: #000;
}
:root .dark,
:root.dark {
--t4-messages-title-text-color: rgba(255, 255, 255, 0.54);
--t4-message-header-text-color: rgba(255, 255, 255, 0.54);
--t4-message-name-text-color: rgba(255, 255, 255, 0.54);
--t4-message-footer-text-color: rgba(255, 255, 255, 0.54);
--t4-messages-content-bg-color: transparent;
--t4-message-received-bg-color: #252525;
--t4-message-received-text-color: #fff;
--t4-message-typing-indicator-bg-color: #fff;
}
.ios {
--t4-messages-title-text-color: rgba(0, 0, 0, 0.45);
--t4-messages-title-font-size: 11px;
--t4-message-header-text-color: rgba(0, 0, 0, 0.45);
--t4-message-footer-text-color: rgba(0, 0, 0, 0.45);
--t4-message-name-text-color: rgba(0, 0, 0, 0.45);
--t4-message-avatar-size: 29px;
--t4-message-margin: 10px;
--t4-message-bubble-min-height: 32px;
--t4-message-bubble-font-size: 17px;
--t4-message-bubble-border-radius: 16px;
--t4-message-bubble-padding-vertical: 6px;
--t4-message-bubble-padding-horizontal: 16px;
--t4-message-typing-indicator-opacity: 0.35;
}
.md {
--t4-messages-title-font-size: 12px;
--t4-message-avatar-size: 32px;
--t4-message-margin: 16px;
--t4-message-bubble-min-height: 32px;
--t4-message-bubble-font-size: 16px;
--t4-message-bubble-border-radius: 4px;
--t4-message-bubble-padding-vertical: 6px;
--t4-message-bubble-padding-horizontal: 8px;
--t4-message-typing-indicator-opacity: 0.6;
--t4-messages-title-text-color: rgba(0, 0, 0, 0.51);
--t4-message-header-text-color: rgba(0, 0, 0, 0.51);
--t4-message-footer-text-color: rgba(0, 0, 0, 0.51);
--t4-message-name-text-color: rgba(0, 0, 0, 0.51);
}
.aurora {
--t4-messages-title-font-size: 14px;
--t4-message-avatar-size: 32px;
--t4-message-margin: 16px;
--t4-message-bubble-min-height: 34px;
--t4-message-bubble-font-size: 16px;
--t4-message-bubble-line-height: 1.4;
--t4-message-bubble-border-radius: 16px;
--t4-message-bubble-padding-vertical: 6px;
--t4-message-bubble-padding-horizontal: 10px;
--t4-message-typing-indicator-opacity: 0.5;
--t4-message-header-font-size: 14px;
--t4-message-footer-font-size: 12px;
--t4-message-name-font-size: 14px;
--t4-messages-title-text-color: rgba(0, 0, 0, 0.51);
--t4-message-header-text-color: rgba(0, 0, 0, 0.51);
--t4-message-footer-text-color: rgba(0, 0, 0, 0.51);
--t4-message-name-text-color: rgba(0, 0, 0, 0.51);
}
Приклади
<template>
<div class="page">
<div class="navbar">
<div class="navbar-bg"></div>
<div class="navbar-inner">
<div class="title">Messages</div>
</div>
</div>
<div class="toolbar messagebar">
<div class="toolbar-inner">
<div class="messagebar-area">
<textarea class="resizable" placeholder="Message"></textarea>
</div>
<a class="link send-link" href="#" @click=${sendMessage}>Send</a>
</div>
</div>
<div class="page-content messages-content">
<div class="messages">
<div class="messages-title"><b>Sunday, Feb 9,</b> 12:58</div>
<div class="message message-sent">
<div class="message-avatar"
style="background-image:url(https://cdn.techno4.io/placeholder/people-100x100-7.jpg)"></div>
<div class="message-content">
<div class="message-name">John Doe</div>
<div class="message-header">Message header</div>
<div class="message-bubble">
<div class="message-text-header">Text header</div>
<div class="message-text">Lorem ipsum dolor sit amet, consectetur adipisicing elit.</div>
<div class="message-text-footer">Text footer</div>
</div>
<div class="message-footer">Message footer</div>
</div>
</div>
<div class="message message-received">
<div class="message-avatar"
style="background-image:url(https://cdn.techno4.io/placeholder/people-100x100-7.jpg)"></div>
<div class="message-content">
<div class="message-name">John Doe</div>
<div class="message-header">Message header</div>
<div class="message-bubble">
<div class="message-text-header">Text header</div>
<div class="message-text">Lorem ipsum dolor sit amet, consectetur adipisicing elit.</div>
<div class="message-text-footer">Text footer</div>
</div>
<div class="message-footer">Message footer</div>
</div>
</div>
<div class="message message-sent">
<div class="message-content">
<div class="message-bubble">
<div class="message-text">Hi, Kate</div>
</div>
</div>
</div>
<div class="message message-sent">
<div class="message-content">
<div class="message-bubble">
<div class="message-text">How are you?</div>
</div>
</div>
</div>
<div class="message message-received">
<div class="message-avatar"
style="background-image:url(https://cdn.techno4.io/placeholder/people-100x100-9.jpg)"></div>
<div class="message-content">
<div class="message-name">Kate</div>
<div class="message-bubble">
<div class="message-text">Hi, I am good!</div>
</div>
</div>
</div>
<div class="message message-received">
<div class="message-avatar"
style="background-image:url(https://cdn.techno4.io/placeholder/people-100x100-7.jpg)"></div>
<div class="message-content">
<div class="message-name">Blue Ninja</div>
<div class="message-bubble">
<div class="message-text">Hi there, I am also fine, thanks! And how are you?</div>
</div>
</div>
</div>
<div class="message message-sent">
<div class="message-content">
<div class="message-bubble">
<div class="message-text">Hey, Blue Ninja! Glad to see you ;)</div>
</div>
</div>
</div>
<div class="message message-sent">
<div class="message-content">
<div class="message-bubble">
<div class="message-text">Hey, look, cutest kitten ever!</div>
</div>
</div>
</div>
<div class="message message-sent">
<div class="message-content">
<div class="message-bubble">
<div class="message-image">
<img src="https://cdn.techno4.io/placeholder/cats-200x260-4.jpg"
style="width:200px; height: 260px" />
</div>
</div>
</div>
</div>
<div class="message message-received">
<div class="message-avatar"
style="background-image:url(https://cdn.techno4.io/placeholder/people-100x100-9.jpg)"></div>
<div class="message-content">
<div class="message-name">Kate</div>
<div class="message-bubble">
<div class="message-text">Nice!</div>
</div>
</div>
</div>
<div class="message message-received">
<div class="message-avatar"
style="background-image:url(https://cdn.techno4.io/placeholder/people-100x100-9.jpg)"></div>
<div class="message-content">
<div class="message-name">Kate</div>
<div class="message-bubble">
<div class="message-text">Like it very much!</div>
</div>
</div>
</div>
<div class="message message-received">
<div class="message-avatar"
style="background-image:url(https://cdn.techno4.io/placeholder/people-100x100-7.jpg)"></div>
<div class="message-content">
<div class="message-name">Blue Ninja</div>
<div class="message-bubble">
<div class="message-text">Awesome!</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default (props, { $t4, $, $on }) => {
let messages;
let messagebar;
// Response flag
var responseInProgress = false;
// Dummy response
var answers = [
'Yes!',
'No',
'Hm...',
'I am not sure',
'And what about you?',
'May be ;)',
'Lorem ipsum dolor sit amet, consectetur',
'What?',
'Are you sure?',
'Of course',
'Need to think about it',
'Amazing!!!'
]
var people = [
{
name: 'Kate Johnson',
avatar: 'https://cdn.techno4.io/placeholder/people-100x100-9.jpg'
},
{
name: 'Blue Ninja',
avatar: 'https://cdn.techno4.io/placeholder/people-100x100-7.jpg'
}
];
// Отримати повідомлення
const receiveMessage = () => {
responseInProgress = true;
setTimeout(function () {
// Отримайте випадкову відповідь і випадкову особу
var answer = answers[Math.floor(Math.random() * answers.length)];
var person = people[Math.floor(Math.random() * people.length)];
// Показати індикатор набору тексту
messages.showTyping({
header: person.name + ' is typing',
avatar: person.avatar
});
setTimeout(function () {
// Додати отримане фіктивне повідомлення
messages.addMessage({
text: answer,
type: 'received',
name: person.name,
avatar: person.avatar
});
// Приховати індикатор набору тексту
messages.hideTyping();
responseInProgress = false;
}, 4000);
}, 1000);
}
// Відправити повідомлення
const sendMessage = () => {
var text = messagebar.getValue().replace(/\n/g, '<br>').trim();
// повернути, якщо повідомлення пусте
if (!text.length) return;
// Очистити зону
messagebar.clear();
// Повернути фокус до області
messagebar.focus();
// Додати повідомлення до повідомлень
messages.addMessage({
text: text,
});
if (responseInProgress) return;
// Отримати фіктивне повідомлення
receiveMessage();
}
$on('pageInit', () => {
// ініціалізація Повідомлення
messages = app.messages.create({
el: '.messages',
// Правило першого повідомлення
firstMessageRule: function (message, previousMessage, nextMessage) {
// Пропустити заголовок
if (message.isTitle) return false;
/* якщо:
- попереднього повідомлення немає
- або інший тип попереднього повідомлення (надіслано/отримано).
- або ім'я відправника попереднього повідомлення інше
*/
if (!previousMessage || previousMessage.type !== message.type || previousMessage.name !== message.name) return true;
return false;
},
// Правило останнього повідомлення
lastMessageRule: function (message, previousMessage, nextMessage) {
// Пропустити заголовок
if (message.isTitle) return false;
/* якщо:
- наступного повідомлення немає
- або тип наступного повідомлення (відправлено/отримано) інший
- або ім'я відправника наступного повідомлення інше
*/
if (!nextMessage || nextMessage.type !== message.type || nextMessage.name !== message.name) return true;
return false;
},
// Правило останнього повідомлення
tailMessageRule: function (message, previousMessage, nextMessage) {
// Пропустити якщо це заголовок
if (message.isTitle) return false;
/* if (загалом те саме, що lastMessageRule):
- наступного повідомлення немає
- або тип наступного повідомлення (відправлено/отримано) інший
- або ім'я відправника наступного повідомлення інше
*/
if (!nextMessage || nextMessage.type !== message.type || nextMessage.name !== message.name) return true;
return false;
}
});
// Init Messagebar
messagebar = app.messagebar.create({
el: '.messagebar'
});
});
return $render;
}
</script>
Techno4 Framework
- Get Started
- Introduction
- Kitchen Sink
- Installation
- Package Structure
- App HTML Layout
- RTL Layout
- Initialize App
- Events
- Router Component
- Routes
- Store
- App/Core
- Accordion/Collapsible
- Action Sheet
- Area chart
- Autocomplete
- Badge
- Block/Content Block
- Breadcrumbs
- Button
- Calendar/Date Picker
- Cards
- Checkbox
- Chips
- Color Picker
- Contact List
- Data Table
- Dialog
- Floating action button
- Form
- Gauge
- Icons
- Inputs / Form Inputs
- Grid /Layout Grid
- Link
- List Button
- List View
- List Index
- Login Screen
- Menu List
- Messagebar
- Navbar
- Messages
- Notification
- Panel/Side Panels
- Photo Browser
- Picker
- Pie Chart
- Popover
- Popup
- Preloader
- Progressbar
- Pull to Refresh
- Radio
- Range Slider
- Searchbar