Работа с диалогами
JS-расширение ui.dialogs.messagebox
JS расширение ui.dialogs.messagebox предоставляет API для создания стандартных диалогов типа
alert
и
confirm
(модуль UI с версии 19.0.500).
Подключение на PHP-странице
\Bitrix\Main\UI\Extension::load("ui.dialogs.messagebox");
Подключение в ES6
import { MessageBox } from 'ui.dialogs.messagebox';
Возможности
- 4 варианта кнопок: ОК, Да, Нет, Отмена.
- Несколько вариантов наборов кнопок: Ок, Да, Нет, Отмена, Ок-Отмена, Да-Отмена, Да-Нет, Да-Нет-Отмена.
- У каждой кнопки можно изменить текст и указать свой callback.
- Кнопка автоматически блокируется (disabled) для защиты от повторного нажатия.
- Если callback кнопки возвращает промис, кнопка переходит состояние "загрузка" (loading).
- Поддержка заголовка диалога. В этом случае кнопки становятся больше и отделяются от контента линией.
- Вместо стандартных кнопок можно указать произвольные (объекты или наследники класса BX.UI.Button).
- Режим modal добавляет оверлей.
- Дополнительно можно передать опции для BX.PopupWindow.
Базовое использование
Для быстрого создания диалогов используйте статические методы alert и confirm.
Примечание: Если диалог содержит многострочный текст или элементы верстки (картинки, чекбоксы и др.), обязательно задавайте заголовок.
Информационный диалог (alert)
Метод позволяет быстро создать информационный диалог (Alert).
BX.UI.Dialogs.MessageBox.alert("Message", (messageBox, button, event) => {});
BX.UI.Dialogs.MessageBox.alert("Message", (messageBox, button, event) => {}, "Продолжить");
BX.UI.Dialogs.MessageBox.alert("Message", "Title");
BX.UI.Dialogs.MessageBox.alert("Message", "Title", (messageBox, button, event) => {});
BX.UI.Dialogs.MessageBox.alert("Message", "Title", (messageBox, button, event) => {}, "Продолжить");
Примеры:
BX.UI.Dialogs.MessageBox.alert( message: string | Element | Node, okCallback?: Function, okCaption?: string ); //Сигнатура метода с указанием заголовка диалога BX.UI.Dialogs.MessageBox.alert( message: string | Element | Node, title?: string, okCallback?: Function, okCaption?: string );
Асинхронный callback
BX.UI.Dialogs.MessageBox.alert(
"Асинхронная обработка нажатия кнопки",
(messageBox, button, event) => {
return new Promise((resolve, reject) => {
console.log("async job started.");
setTimeout(() => {
console.log("async job ended.");
resolve(true);
}, 3000);
});
}
);
Этот же пример, но без промисов.
BX.UI.Dialogs.MessageBox.alert(
"Ручная асинхронная обработка нажатия кнопки",
(messageBox, button, event) => {
console.log("async job started.");
button.setWaiting();
setTimeout(() => {
button.setWaiting(false);
messageBox.close();
console.log("async job ended.");
}, 3000);
}
);
Диалог подтверждения (confirm)
Метод позволяет быстро создать диалог подтверждения (Confirm).
BX.UI.Dialogs.MessageBox.confirm("Message");
BX.UI.Dialogs.MessageBox.confirm("Message", () => {});
BX.UI.Dialogs.MessageBox.confirm("Message", () => {}, "Продолжить");
BX.UI.Dialogs.MessageBox.confirm("Message", () => {}, "Продолжить", () => {});
BX.UI.Dialogs.MessageBox.confirm("Message", "Title");
BX.UI.Dialogs.MessageBox.confirm("Message", "Title", () => {});
BX.UI.Dialogs.MessageBox.confirm("Message", "Title", () => {}, "Продолжить", () => {});
BX.UI.Dialogs.MessageBox.confirm( message: string | Element | Node, okCallback?: Function, okCaption?: string, cancelCallback?: Function ); //Сигнатура метода с указанием заголовка диалога BX.UI.Dialogs.MessageBox.confirm( message: string | Element | Node, title?: string, okCallback?: Function, okCaption?: string, cancelCallback?: Function );
Создание диалогов
Все настройки диалога можно передать через статический метод show.
BX.UI.Dialogs.MessageBox.show(
{
message: "Текст, поясняющий назначение данного попапа, находится здесь.",
modal: true,
buttons: BX.UI.Dialogs.MessageBoxButtons.OK_CANCEL,
onOk: function(messageBox)
{
console.log("onOk");
messageBox.close();
},
onCancel: function(messageBox)
{
console.log("onCancel");
messageBox.close();
},
}
);
Произвольный набор кнопок:
BX.UI.Dialogs.MessageBox.show(
{
message: `
<label class="ui-ctl ui-ctl-checkbox">
<input type="checkbox" class="ui-ctl-element">
<div class="ui-ctl-label-text">удалить настройки и данные приложения</div>
</label>
`,
title: "Вы уверены, что хотите удалить приложение?",
buttons: [
new BX.UI.Button(
{
color: BX.UI.Button.Color.DANGER,
text: "Удалить"
}
),
new BX.UI.CancelButton()
],
}
);
Если нужно получить ссылку на объект диалога, есть метод create.
const messageBox = BX.UI.Dialogs.MessageBox.create(
{
message: "Вы действительно хотите удалить файл?",
title: "Подтверждение удаления",
buttons: BX.UI.Dialogs.MessageBoxButtons.OK_CANCEL,
onOk: function(messageBox)
{
console.log("onOk");
messageBox.close();
},
}
);
messageBox.show();
Или создать объект класса BX.UI.Dialogs.MessageBox.
const messageBox = new BX.UI.Dialogs.MessageBox(
{
message: "Вы действительно хотите удалить файл?",
title: "Подтверждение удаления",
buttons: BX.UI.Dialogs.MessageBoxButtons.OK_CANCEL,
okCaption: "Да",
onOk: function()
{
console.log("onOk");
},
}
);
messageBox.show();
Обработка нажатия кнопок
По умолчанию нажатие на любую кнопку закрывает диалог. Если для кнопки определен обработчик, поведение диалога зависит от возвращаемого значения:
- true — диалог закрывается.
- false — с кнопки снимается заблокированность (disabled), диалог остается открытым.
- undefined (void) — никаких автоматических действий не выполняется, закрытие диалога или снятие заблокированности кнопки необходимо выполнить самостоятельно.
- Promise — кнопка переходит состояние "загрузка" (loading). Разрешение промиса (resolve) закрывает диалог, отклонение промиса (reject) возвращает кнопку в исходное состояние.
BX.UI.Dialogs.MessageBox.alert("Message", (messageBox, button, event) =>
{
messageBox.close();
}
);
Аргументы обработчиков кнопок следующие:
messageBox— объект диалога (экземпляр классаBX.UI.Dialogs.MessageBox).button— объект кнопки (экземпляр классаBX.UI.Button).event— объект события клика (MouseEvent).