Закажите бесплатную презентацию продуктов РосБизнесСофт прямо сейчас!
Модальное окно — это окно, которое не имеет своей индивидуальной формы в «Конфигураторе» (Редактирования/Списка).
Форма добавляется в ручном режиме в уже существующей другой (родительской) форме.
Все модальные окна имеют архитектуру и взаимодействия от semantic-ui modal.

Заголовок вверху модального окна. Может содержать текст и цвет.
Основное тело окна (контент). Может иметь дополнительные класс «scrolling», который говорит модальному окну, что контент внутри может быть прокручиваемый.
Содержит кнопки действий, связанные с событиями окна на JavaScript.
В любом окне можно добавить кнопки действия: Approve и Deny.
Для Approve кнопка должна иметь хотя бы один из классов: «.actions .positive, .actions .approve, .actions .ok».
В Системе в основном используется «ok».
При нажатии на такие кнопки, модальное окно генерирует Сallback-событие (см. ниже).
Пример модального окна:
<div class="header">Заголовок модального окна</div>
<div class="content">
Тело модального окна
</div>
<div class="actions">
<!--Кнопки действий обязательно находится должны здесь-->
<input type="submit" class="btn btn-rbs green button ok btn-sm" value="Ok">
<a class="cancel btn btn-default btn-sm" data-dismiss="modal">Закрыть</a>
</div>
</div>Любое модальное окно должно иметь классы «ui modal» и атрибут «data-backdrop» = «false» для того, что бы не было конфликтов с Bootstrap.
Размеры окна на разрешении FullHD (все окна адаптивны):
Модальное окно создается и открывается следующей конструкцией:
$("#confirmModal").modal("show");Все опции можно посмотреть на официальной странице документации.
$("#confirmModal").modal({
//возможность открывать несколько модальных окон сразу.
allowMultiple: true,
//Не закрывать при клике на фон или по клавише Escape
closable: false,
//отключить анимацию
duration: 0,
}).modal("show");Все методы можно посмотреть на официальной странице документации, в конце страницы.
//Показывает модальное окно
$("#confirmModal").modal("show");
//Скрывает модальное окно
$("#confirmModal").modal("hide");Все созданные окна после метода hide не удаляются.
Обратные вызовы определяют функцию, которая возникает после определенного поведения. Если в методе вернуть (return false), то метод не выполнится, например в onApprove, onHide.
Доступные Callback:
Пример:
$("#confirmModal").modal({
//возможность открывать несколько модальных окон сразу.
allowMultiple: true,
//Не закрывать при клике на фон или по клавише Escape
closable: false,
//отключить анимацию
duration: 0,
//OK
onApprove: function($element) {
},
//Cancel
onDeny($element) {
}
}).modal("show");
В классе jsApplication есть несколько заготовленных модальных окон с возможностью клонирования и удаления.
Пример:
{ //Заголовок окна
title: jsApplication.getTranslate("emptyModal.title"),
//Контент html
body: "",
//Размер окна
size: "big",
//Закрывать при клике на фон.
closable: true,
//Настройка Approve button
actionButton: {
//Название кнопки
label: jsApplication.getTranslate("buttons.Save"),
//Post action
action: "save",
//Цвет из библиотеки цветов
appendClass: "green",
},
//multiple window
multi: false
}jsApplication.setModalOptions (String | Selector selectorModal, Object modalOptions = {})
Где:
Selector String jsApplication.getClonedModal(String | Selector selectorModal)
Где:
Возвращает ID селектор нового модального окна с клонированного с оригинала. Все id будут заменены на id_%NUM%
jsApplication.closeModal(String | Selector selectorModal)
Где:
Удаляет cloned modal из DOM дерева.
Во всех jsApplication.*modal эта процедура выполняется автоматически в onHide.
jsApplication.clearModalSize(String | Selector selectorModal)
Где:
Пример:
jsApplication.clearModalSize("#LookupModal");Selector String jsApplication.getModalOptionsAttr (String | Selector selectorModal)
Где:
Для того, чтобы взять атрибут, например title и size, необходимо поставить префикс modal-%name%
Пример:
<div class="ui tiny modal" id="confirmModal" data-backdrop="false" modal-title="test" modal-size="large">
......
jsApplication.getModalOptionsAttr ($("#confirmModal"))
// Вернет {title: "test", size: "large"}
</div>Модальные окна рекомендуем инициализировать через jsApplication. Так как там есть механизмы для работы с нескольким окнами с возможностью наслоения, клонирования в список модальных окон и удаление их из DOM дерева. Все подобные окна, если не переопределять onHide, то автоматически выполняется jsApplication.closeModal();
Данный метод берет любое semantic-ui modal окно и создает cloneModal, а при закрытии closeModal автоматически.
Есть так же некоторые готовые наборы.
Вызывает простое модальное окно. Если не задан selectorModal, то берет системный #emptyModal.
Возвращает ID селектор нового модального окна
Дополнительные опции (modalOptions):
{
//Заголовок окна
title: jsApplication.getTranslate("emptyModal.title"),
//Размер окна
size: "big",
//Закрывать при клике на фон.
closable: true,
//Настройка Approve button
actionButton: {
//Название кнопки
label: jsApplication.getTranslate("emptyModal.cancelButton.title"),
//Цвет из библиотеки цветов
appendClass: "green",
},
}Шаблон:
<div class="ui small longer modal" id="emptyModal" data-backdrop="false">
<div class="header">Простое модальное окно</div>
<div class="scrolling content">
<p>simple modal</p>
</div>
<div class="actions">
<a class="cancel btn btn-default btn-sm" data-dismiss="modal">##L:Close</a>
</div>
</div>Вызов:
jsApplication.emptyModal({
title: "test",
onShow: function(){
//you code
}
});Вызывает модальное окно подтверждения. Если не задан selectorModal, то берет системный #confirmModal.
Возвращает ID селектор нового модального окна
Дополнительные опции (modalOptions):
{
//заголовок окна
title: "Confirm",
//содержание
body: "",
//Настройка Approve button
actionButton: {
//Название кнопки
label: "Ok",
//Цвет из библиотеки цветов
appendClass: "green",
},
}Шаблон:
<div class="ui tiny modal" id="confirmModal" data-backdrop="false">
<div class="header">#L:Deleting</div>
<div class="content">
<p>#L:DialogsConfirmDeleteText</p>
</div>
<div class="actions">
<input type="submit" id="confirmModalOkButton" class="btn btn-rbs green button ok btn-sm" value="#L:Confirm">
<a class="cancel btn btn-default btn-sm" data-dismiss="modal">##L:Close</a>
</div>
</div>Вызов:
jsApplication.confirmModal({
title: "Удаление объекта",
body: "Вы действительно хотите удалить?",
onApprove: function(){
//здесь какой-то код
//или ajax запрос
//то тогда нужно поставить return false;
//И закрыть окно самостоятельно
//jsApplication.closeModal(this);
}
});Результат:

Базовое модальное окно для всех frame-подобных модальных окон. В таких окнах есть callback функции для того, чтобы не переопределять через onApprove, т.к. во frameModal в таких методах переопределены многие надстройки, необходимые системе. В том числе autoresize frame.
Где:
Возвращает ID селектор нового модального окна.
При создании frameModal создается top.currentModal = selectorModal.
Расширенные опции frame modal:
{
//0-активность кнопок Approve активируется после frame.document.ready,
//1- это задача ложится на пользователя
customready: 0
}Шаблон:
<div class="ui fullscreen longer modal" id="EditModal" data-backdrop="false">
<div class="header">Добавить значение</div>
<div class="scrolling content frame-mode no-space">
<p>edit</p>
</div>
<div class="actions">
<input type="submit" class="btn btn-rbs green button ok btn-sm" value="#L:Save">
<a class="cancel btn btn-default btn-sm" data-dismiss="modal">##L:Close</a>
</div>
</div>Вызов:
jsApplication.frameModal($("#EditModal"), "/url/frame", {p1:"value1", p2:2}, { size: "big" },
function(currentModal, closeCallback){
if(closeCallback != undefined)
closeCallback(currentModal);
}
);После того, как frame загружен, срабатывает событие top.body(readyModal). Во втором параметре передается [selectorModal, modalName].
Так это событие можно выловить во frame. Подписываться на событие надо до момента frame.document.ready.
<script>
top.jsApplication.findTop("body").on("readyModal", function(e, selectorModal, modalName){
modalName = jsApplication.getString(modalName);
//Получить модальное окно в Top
jsApplication.getModal(selectorModal).find(".actions .btn.cancel").removeClass("disabled");
jsApplication.getModal(selectorModal).find(".content").removeClass("loading");
});
</script>Надстройка frameModal для lookup полей.
Где:
Возвращает ID селектор нового модального окна.
Шаблон:
<div class="ui fullscreen longer modal" id="LookupModal" data-backdrop="false">
<div class="header">##L:Select</div>
<div class="scrolling content frame-mode">
<p>lookup</p>
</div>
<div class="actions">
<input type="submit" id="delStruct22222" class="btn btn-rbs green button ok btn-sm" value="#L:Select">
<a class="cancel btn btn-default btn-sm" data-dismiss="modal">##L:Close</a>
</div>
</div>Вызов:
top.jsApplication.lookupModal( $("#LookupModal"), "/url/", undefined, function(obj, clickObject){
//obj = {id: 33, value: "text selected", loadedData: {}}
//you code on onSelected
}, modalSettings, clickObject);Надстройка frameModal для всех edit форм (EditModal). Обычно используется при добавлении записи в табличную часть.
Где:
Возвращает ID селектор нового модального окна
Шаблон:
<div class="ui fullscreen longer modal" id="EditModal" data-backdrop="false">
<div class="header">Добавить значение</div>
<div class="scrolling content frame-mode no-space">
<p>edit</p>
</div>
<div class="actions">
<input type="submit" class="btn btn-rbs green button ok btn-sm" value="#L:Save">
<a class="cancel btn btn-default btn-sm" data-dismiss="modal">##L:Close</a>
</div>
</div>В случае с editModal внутри должна быть форма. При onApprove, editModal ищет форму и выполняет submit.
В Action должен быть описан следующий метод:
//this = \Kernel\Actions\Forms\ModalEdit
protected function responseChange() {
// works - имя динамической таблицы, в которую вставляться будут значения
$this->response([
"works"=>[
"id" = $this->structure->id,
"act" = $this->formType,
"product" = $this->structure->name,
"article" = $this->structure->article,
"number" = $this->structure->number,
"price_nds" = Text::money($this->structure->price_nds),
"total" = Text::money($this->structure->total)
]
]);
]);
}Вызов:
top.jsApplication.editModal( $("#EditModal"), "/url/form, {}, function(response){
//your code
//response - то что возвращает responseChange
}, modalSettings);Код кнопки для открытия модального окна:
<button class="btn green-meadow" onclick="edition('$parent0', '$parent1')"><i class="fa fa-plus"></i> Открыть модальное окно</button>Функция JS:
function edition(owner, id) {
var modalSettings = {
size: 'fullscreen',
name: 'edition',
title: 'Тираж',
actionMode: 'saved',
actionButton: {
label: 'Сохранить'
}
};
owner = jsApplication.getNumber(owner);
id = jsApplication.getNumber(id);
var link = "/companies/" + owner + "/deals/" + id + "/calculation_edition/add";
top.jsApplication.frameModal( $("#EditModal"), link, undefined, modalSettings, function(currentModal, closeCallback) {
var form = $(currentModal).find("iframe").contents().find("#content form").get(0);
if(form != undefined) {
// здесь можно прописать валидацию, отправку формы на какой-либо адрес
jsApplication.closeModal(currentModal);
} else {
jsApplication.closeModal(currentModal);
}
});
}