431 lines
15 KiB
JavaScript
431 lines
15 KiB
JavaScript
var blockClose = false;
|
||
|
||
$(document).ready(function() {
|
||
loadWingman();
|
||
});
|
||
|
||
const loadWingman = () => {
|
||
consoleReport("Запускаю процессы.");
|
||
dataEditFormControl();
|
||
dataCreateFormControl();
|
||
navScrollbarControl();
|
||
editorControl();
|
||
floatingBlockCheck();
|
||
multifieldSortableControl();
|
||
hideMultifield();
|
||
searchControl();
|
||
tabsControl();
|
||
floatingBlockControl();
|
||
favoritesControl();
|
||
consoleReport("Процессы запущены.");
|
||
}
|
||
|
||
$(window).on('beforeunload', function(){
|
||
if (blockClose) return 'Are you sure you want to leave?';
|
||
});
|
||
|
||
|
||
const favoritesControl = () => {
|
||
consoleReport("Подключаем работу избранного.");
|
||
$(".favorite_button").each(function (index, el) {
|
||
$(el).unbind();
|
||
$(el).on("click", function (e) {
|
||
if($(el).hasClass("active")) removeFavoritePage(el)
|
||
else addFavoritePage(el);
|
||
});
|
||
});
|
||
}
|
||
|
||
const removeFavoritePage = (el) => {
|
||
const data = {
|
||
link: window.location.href,
|
||
}
|
||
|
||
$.ajax({
|
||
url: "/wingman/favorite_remove_page/",
|
||
method: "POST",
|
||
dataType: 'html',
|
||
data,
|
||
success: function(data){
|
||
$(el).removeClass("active");
|
||
}
|
||
});
|
||
}
|
||
|
||
const addFavoritePage = (el) => {
|
||
$(el).addClass("active");
|
||
|
||
const data = {
|
||
link: window.location.href,
|
||
name: $(el).attr("data-link-name")
|
||
}
|
||
|
||
$.ajax({
|
||
url: "/wingman/favorite_add_page/",
|
||
method: "POST",
|
||
dataType: 'html',
|
||
data,
|
||
success: function(data){}
|
||
});
|
||
}
|
||
|
||
var active_tabs = {};
|
||
|
||
const tabsControl = () => {
|
||
consoleReport("Перехватываю работу табов.");
|
||
$(".b_tabs").each(function () {
|
||
const tabs_wrapper = $(this);
|
||
const tabs_group = tabs_wrapper.attr("data-tabs-group");
|
||
tabs_wrapper.find(".b_tab[data-tabs-group='" + tabs_group + "']").each(function (index) {
|
||
const tab = $(this);
|
||
tab.unbind();
|
||
tab.on("click", function (){
|
||
consoleReport("Переключаю таб.");
|
||
activeTab(tabs_group, index);
|
||
active_tabs[tabs_group] = index;
|
||
})
|
||
});
|
||
|
||
if(active_tabs[tabs_group]) activeTab(tabs_group, active_tabs[tabs_group])
|
||
else activeTab(tabs_group, 0)
|
||
});
|
||
}
|
||
|
||
const activeTab = (tabs_group, index) => {
|
||
const tabs = $(".b_tab[data-tabs-group='" + tabs_group + "']");
|
||
const tabs_content = $(".b_tab_content[data-tabs-group='" + tabs_group + "']");
|
||
|
||
tabs.each(function () {
|
||
$(this).removeClass("active");
|
||
});
|
||
|
||
tabs_content.each(function () {
|
||
$(this).addClass("hide");
|
||
});
|
||
|
||
tabs.eq(index).addClass("active");
|
||
tabs_content.eq(index).removeClass("hide");
|
||
}
|
||
|
||
const searchControl = () => {
|
||
const search_input = $(".b-global-search > input");
|
||
search_input.unbind();
|
||
search_input.on("input", function (){
|
||
const search = $(this).val();
|
||
const page = $(".b-global-search").attr("data-page");
|
||
if(search.length > 0 && search.length < 3) return;
|
||
const data = { page, search }
|
||
|
||
$.ajax({
|
||
url: "/wingman/load_submenu_search/",
|
||
method: "POST",
|
||
dataType: 'html',
|
||
data,
|
||
success: function(data){
|
||
$(".admin-subnav > .nav-item__sub").replaceWith(data);
|
||
}
|
||
});
|
||
})
|
||
}
|
||
|
||
const dataEditFormControl = () => {
|
||
consoleReport("Перехватываю работу форм редактирования.");
|
||
$(".datatype-edit-wrapper .admin-data-form").each(function( index, el ) {
|
||
$(el).find("input").each(function( index, el ) {
|
||
$(el).unbind();
|
||
$(el).on("change", function (e) {
|
||
changeStatusBar("Не сохранено", "warning")
|
||
consoleReport("Блокирую выход.");
|
||
blockClose = true;
|
||
});
|
||
})
|
||
|
||
$(el).find("button[type=submit]").unbind();
|
||
$(el).find("button[type=submit]").click(function() {
|
||
$("button[type=submit]", $(this).parents("form")).removeAttr("clicked");
|
||
$(this).attr("clicked", "true");
|
||
});
|
||
|
||
$(this).unbind();
|
||
$(this).on("submit", function (e) {
|
||
e.preventDefault();
|
||
var form = $(el);
|
||
var formData = new FormData();
|
||
|
||
form.find('input, select, textarea').each(function() {
|
||
var field = $(this);
|
||
var fieldName = field.attr('name');
|
||
var fieldValue = field.val();
|
||
if(field.attr('type') === "checkbox" && !field.is(':checked')) return;
|
||
if(field.attr('type') === "radio" && !field.is(':checked')) return;
|
||
|
||
if(field.attr('type') === "file") {
|
||
if(!this.files.length) return;
|
||
const file = this.files[0];
|
||
formData.append(fieldName, file);
|
||
} else formData.append(fieldName, fieldValue);
|
||
});
|
||
|
||
const currentURL = getCurrentURL();
|
||
blockAllButtons(form.find("button"), "Кнопки");
|
||
blockAllButtons(form.find("input"), "Поля");
|
||
consoleReport("Отправляю форму.");
|
||
changeStatusBar("Сохраняем...", "warning")
|
||
|
||
formData.append("b_wingman", "true");
|
||
|
||
var clickedButton = $("button[type=submit][clicked=true]");
|
||
if(clickedButton && clickedButton.attr("name") && clickedButton.attr("value"))
|
||
formData.append(clickedButton.attr("name"), clickedButton.attr("value"));
|
||
|
||
$.ajax({
|
||
url: currentURL,
|
||
method: form.attr('method'),
|
||
processData: false,
|
||
contentType: false,
|
||
dataType: 'html',
|
||
data: formData,
|
||
success: function(data){
|
||
$(".datatype-edit-wrapper").replaceWith(data);
|
||
loadWingman();
|
||
|
||
changeStatusBar("Сохранено", "success")
|
||
consoleReport("Форма отправлена.");
|
||
unblockAllButtons(form.find("button"), "Кнопки");
|
||
unblockAllButtons(form.find("input"), "Поля");
|
||
blockClose = false;
|
||
}
|
||
});
|
||
});
|
||
});
|
||
}
|
||
|
||
const dataCreateFormControl = () => {
|
||
consoleReport("Перехватываю работу форм создания.");
|
||
$(".datatype-create-wrapper .admin-data-form").each(function( index, el ) {
|
||
$(el).find("input").each(function( index, el ) {
|
||
$(el).unbind();
|
||
$(el).on("change", function (e) {
|
||
changeStatusBar("Не сохранено", "warning")
|
||
consoleReport("Блокирую выход.");
|
||
blockClose = true;
|
||
});
|
||
})
|
||
|
||
$(el).find("button[type=submit]").unbind();
|
||
$(el).find("button[type=submit]").click(function() {
|
||
$("button[type=submit]", $(this).parents("form")).removeAttr("clicked");
|
||
$(this).attr("clicked", "true");
|
||
});
|
||
|
||
$(this).unbind();
|
||
$(this).on("submit", function (e) {
|
||
e.preventDefault();
|
||
var form = $(el);
|
||
var formData = new FormData();
|
||
|
||
form.find('input, select, textarea').each(function() {
|
||
var field = $(this);
|
||
var fieldName = field.attr('name');
|
||
var fieldValue = field.val();
|
||
if(field.attr('type') === "checkbox" && !field.is(':checked')) return;
|
||
if(field.attr('type') === "radio" && !field.is(':checked')) return;
|
||
|
||
if(field.attr('type') === "file") {
|
||
if(!this.files.length) return;
|
||
const file = this.files[0];
|
||
formData.append(fieldName, file);
|
||
} else formData.append(fieldName, fieldValue);
|
||
});
|
||
|
||
const currentURL = getCurrentURL();
|
||
blockAllButtons(form.find("button"), "Кнопки");
|
||
blockAllButtons(form.find("input"), "Поля");
|
||
changeStatusBar("Сохраняем...", "warning")
|
||
formData.append("b_wingman", "true");
|
||
|
||
var clickedButton = $("button[type=submit][clicked=true]");
|
||
if(clickedButton && clickedButton.attr("name") && clickedButton.attr("value"))
|
||
formData.append(clickedButton.attr("name"), clickedButton.attr("value"));
|
||
|
||
consoleReport("Отправляю форму.");
|
||
|
||
$.ajax({
|
||
url: currentURL,
|
||
method: form.attr('method'),
|
||
processData: false,
|
||
contentType: false,
|
||
data: formData,
|
||
success: function(data){
|
||
blockClose = false;
|
||
const json = JSON.parse(data);
|
||
window.location.replace(json.redirect);
|
||
}
|
||
});
|
||
});
|
||
});
|
||
}
|
||
|
||
const multifieldSortableControl = () => {
|
||
consoleReport("Возможности для сортировки списков.");
|
||
$(".bive-multifield__wrapper").each(function( index, el ) {
|
||
consoleReport("Нашел список, будем его сортировать.");
|
||
$(el).sortable({
|
||
handle: ".input-number", // Используем блок с классом "input-number" в качестве ручки для перетаскивания
|
||
update: function(event, ui) {
|
||
const row = $(ui.item[0]);
|
||
multifieldCalc(el);
|
||
changeStatusBar("Не сохранено", "warning")
|
||
consoleReport("Блокирую выход.");
|
||
blockClose = true;
|
||
row.addClass("active");
|
||
setTimeout(() => row.removeClass("active"), 3000)
|
||
}
|
||
});
|
||
});
|
||
}
|
||
|
||
const multifieldCalc = (el) => {
|
||
const multifield = $(el);
|
||
const level = multifield.attr("data-level");
|
||
multifield.children(".bive-multifield__row").each(function(index, el) {
|
||
const row = $(el);
|
||
const realNum = index;
|
||
row.children(".input-number").text(index);
|
||
row.find("input, select, textarea").each(function(index, el) {
|
||
const input = $(el)
|
||
const name = input.attr("name");
|
||
const newName = level + name.replace(level, "").replace(/\[\d+\]/, `[${realNum}]`);
|
||
input.attr("name", newName)
|
||
})
|
||
})
|
||
}
|
||
|
||
let multifieldOpen = {};
|
||
|
||
const hideMultifield = () => {
|
||
$(".bive-multifield").each(function( index, el ) {
|
||
consoleReport("Скрываю списки");
|
||
const rowsCount = $(el).children(".bive-multifield__wrapper").children(".bive-multifield__row").length;
|
||
|
||
if(!multifieldOpen[index] && rowsCount > 1) {
|
||
$(el).addClass("hide");
|
||
multifieldOpen[index] = false;
|
||
} else multifieldOpen[index] = true;
|
||
|
||
$(el).children(".bive-multifield__buttons").children(".bive-multifield__hide").unbind();
|
||
$(el).children(".bive-multifield__buttons").children(".bive-multifield__hide").on("click", function () {
|
||
$(el).addClass("hide");
|
||
multifieldOpen[index] = false;
|
||
})
|
||
|
||
$('<span>', {
|
||
class: 'bive-multifield__show',
|
||
click: function() {
|
||
$(el).removeClass("hide");
|
||
multifieldOpen[index] = true;
|
||
}
|
||
}).text('Содержимое списка скрыто. Нажмите чтобы окрыть.').appendTo(el);
|
||
});
|
||
}
|
||
|
||
const editorControl = () => {
|
||
$(".bive-textarea__content").each((index, el) => {
|
||
let editor = CKEDITOR.replace( $(el).attr("id") );
|
||
editor.on( 'change', function( evt ) {
|
||
$(el).html(evt.editor.getData());
|
||
});
|
||
})
|
||
}
|
||
|
||
const changeStatusBar = (status, name = null) => {
|
||
consoleReport("Изменяю статусбар.");
|
||
const statusBar = $(".admin-floating-status");
|
||
statusBar.removeClass("success");
|
||
statusBar.removeClass("cancel");
|
||
statusBar.removeClass("warning");
|
||
statusBar.text(status);
|
||
if (name) statusBar.addClass(name);
|
||
}
|
||
|
||
const navScrollbarControl = () => {
|
||
consoleReport("Скроллим меню относительно прокрутки страницы.");
|
||
|
||
let lastScrollTop = $(window).scrollTop();
|
||
|
||
$(window).on('scroll', function() {
|
||
let currentScrollTop = $(window).scrollTop();
|
||
let delta = currentScrollTop - lastScrollTop; // разница с прошлым значением
|
||
|
||
// двигаем меню на эту разницу
|
||
$('.admin-subnav').scrollTop(function(_, currentMenuScroll) {
|
||
return currentMenuScroll + delta;
|
||
});
|
||
|
||
lastScrollTop = currentScrollTop;
|
||
});
|
||
}
|
||
|
||
const floatingBlockControl = () => {
|
||
floatingBlockCheck();
|
||
consoleReport("Активирую плаващий блок.");
|
||
$(window).scroll(function() {
|
||
floatingBlockCheck();
|
||
});
|
||
}
|
||
|
||
const floatingBlockCheck = () => {
|
||
// consoleReport("Просчитываю плаващий блок.");
|
||
//
|
||
// var block = $('.admin-floating-block');
|
||
// var wrapper = $('.admin-floating-wrapper');
|
||
// if(!block.length || !wrapper.length) return;
|
||
//
|
||
// var windowTop = $(window).scrollTop();
|
||
// var windowHeight = $(window).height();
|
||
// var blockTop = wrapper.offset().top;
|
||
// var blockHeight = wrapper.outerHeight();
|
||
// var documentHeight = $(document).height();
|
||
//
|
||
// if (blockTop + blockHeight < windowTop || blockTop - 100 > windowTop + windowHeight) {
|
||
// // Блок вышел за пределы видимости
|
||
// block.css('position', 'fixed');
|
||
// block.css('bottom', '0');
|
||
// block.addClass("active");
|
||
// } else {
|
||
// block.removeClass("active");
|
||
// // Блок видим в окне просмотра
|
||
// block.css('position', 'static');
|
||
// }
|
||
//
|
||
// if (blockTop + blockHeight > documentHeight) {
|
||
// // Блок достиг нижней границы документа
|
||
// block.removeClass("active");
|
||
// block.css('position', 'static');
|
||
// block.css('top', documentHeight - blockHeight);
|
||
// }
|
||
}
|
||
|
||
const blockAllButtons = (selector, name) => {
|
||
consoleReport(`Блокирую ${name}.`);
|
||
selector.each(function() {
|
||
$(this).attr("disabled", true);
|
||
$(this).attr("readonly", true);
|
||
});
|
||
}
|
||
|
||
const unblockAllButtons = (selector, name) => {
|
||
consoleReport(`Разблокирую ${name}.`);
|
||
selector.each(function() {
|
||
$(this).attr("disabled", false);
|
||
$(this).attr("readonly", false);
|
||
});
|
||
}
|
||
|
||
const consoleReport = (message) => {
|
||
console.log("[Wingman] - " + message);
|
||
}
|
||
|
||
const getCurrentURL = () => {
|
||
return window.location.href;
|
||
} |