/** * @package Helix3 Framework * @author JoomShaper https://www.joomshaper.com * @copyright (c) 2010 - 2021 JoomShaper * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later */ jQuery(function ($) { /* ---------- Load existing template ------------- */ $(document).on("click", ".layout-del-action", function (event) { event.preventDefault(); var $that = $(this), layoutName = $(".layoutlist select").val(), data = { action: $that.data("action"), layoutName: layoutName, }; if (confirm("Click Ok button to delete " + layoutName + ", Cancel to leave.") != true) { return false; } if (data.action != "remove") { alert("You are doing somethings wrong."); } var request = { option: "com_ajax", plugin: "helix3", data: data, format: "json", }; $.ajax({ type: "POST", data: request, beforeSend: function () { $(".layout-del-action .fa-spin").show(); }, success: function (response) { var data = $.parseJSON(response.data), layouts = data.layout, tplHtml = ""; $("#jform_params_layoutlist").find("option").remove(); if (layouts.length) { for (var i = 0; i < layouts.length; i++) { tplHtml += '<option value="' + layouts[i] + '">' + layouts[i].replace(".json", "") + "</option>"; } $("#jform_params_layoutlist").html(tplHtml); } $(".layout-del-action .fa-spin").fadeOut("fast"); }, error: function () { alert("Somethings wrong, Try again"); $(".layout-del-action .fa-spin").fadeOut("fast"); }, }); return false; }); // Save new copy of layout $(document).on("click", ".layout-save-action", function (event) { $("#layout-modal").find(".sp-modal-body").empty(); $("#layout-modal .sp-modal-title").text("Save New Layout"); $("#layout-modal #save-settings").data("flag", "save-layout"); var $clone = $(".save-box").clone(true); $("#layout-modal").find(".sp-modal-body").append($clone); $("#layout-modal").spmodal(); }); // load layout from file $(".layoutlist select").change(function () { var $that = $(this), layoutName = $that.val(), data = { action: "load", layoutName: layoutName, }; if (layoutName == "" || layoutName == " ") { alert("You are doing somethings wrong."); } var request = { option: "com_ajax", plugin: "helix3", data: data, format: "raw", }; $.ajax({ type: "POST", data: request, dataType: "html", beforeSend: function () {}, success: function (response) { $("#helix-layout-builder").empty(); $("#helix-layout-builder").append(response).fadeIn("normal"); jqueryUiLayout(); }, }); return false; }); /********* Layout Builder JavaScript **********/ jqueryUiLayout(); function jqueryUiLayout() { $("#helix-layout-builder") .sortable({ placeholder: "ui-state-highlight", forcePlaceholderSize: true, axis: "y", opacity: 0.8, tolerance: "pointer", }) .disableSelection(); $(".layoutbuilder-section").find(".row").rowSortable(); } // setInputValue Callback Function $.fn.setInputValue = function (options) { if (this.attr("type") == "checkbox") { if (options.filed == "1") { this.attr("checked", "checked"); } else { this.removeAttr("checked"); } } else { this.val(options.filed); } if (this.data("attrname") == "column_type") { if (this.val() == "component") { $(".form-group.name").hide(); } } }; // callback function, return checkbox value $.fn.getInputValue = function () { if (this.attr("type") == "checkbox") { if (this.is(":checked")) { return "1"; } else { return "0"; } } else { return this.val(); } }; // color picker initialize $.fn.initColorPicker = function () { this.find(".minicolors").each(function () { $(this).minicolors({ control: "hue", position: "bottom", theme: "bootstrap", }); }); }; // Open Row settings Modal $(document).on("click", ".row-ops-set", function (event) { event.preventDefault(); $(".layoutbuilder-section").removeClass("row-active"); $parent = $(this).closest(".layoutbuilder-section"); $parent.addClass("row-active"); $("#layout-modal").find(".sp-modal-body").empty(); $("#layout-modal .sp-modal-title").text("Row Settings"); $("#layout-modal #save-settings").data("flag", "row-setting"); var $clone = $(".row-settings").clone(true); $clone.find(".sppb-color").each(function () { $(this).addClass("minicolors"); }); $clone = $("#layout-modal").find(".sp-modal-body").append($clone); $clone.find(".addon-input").each(function () { var $that = $(this), attrValue = $parent.data($that.data("attrname")); $that.setInputValue({ filed: attrValue }); }); $clone.initColorPicker(); $("#layout-modal").spmodal(); }); // Open Column settings Modal $(document).on("click", ".col-ops-set", function (event) { event.preventDefault(); $(".layout-column").removeClass("column-active"); $parent = $(this).closest(".layout-column"); $parent.addClass("column-active"); $("#layout-modal").find(".sp-modal-body").empty(); $("#layout-modal .sp-modal-title").text("Column Settings"); $("#layout-modal #save-settings").data("flag", "col-setting"); var $clone = $(".column-settings").clone(true); $clone.find(".sppb-color").each(function () { $(this).addClass("minicolors"); }); $clone = $("#layout-modal").find(".sp-modal-body").append($clone); var comFlug = false; $clone.find(".addon-input").each(function () { var $that = $(this), $attrname = $that.data("attrname"), attrValue = $parent.data($attrname); if ($attrname == "column_type" && attrValue == "1") { comFlug = true; } else if ($attrname == "name" && comFlug == true) { $that.closest(".form-group").slideUp("fast"); } $that.setInputValue({ filed: attrValue }); }); $clone.initColorPicker(); $("#layout-modal").spmodal(); }); $(".input-column_type").change(function (event) { var $parent = $(this).closest(".column-settings"), flag = false; $("#helix-layout-builder") .find(".layout-column") .not(".column-active") .each(function (index, val) { if ($(this).data("column_type") == "1") { flag = true; return false; } }); if (flag) { alert("Component Area Taken"); $(this).prop("checked", false); $parent.children(".form-group.name").slideDown("400"); return false; } if ($(this).is(":checked")) { $parent.children(".form-group.name").slideUp("400"); } else { $parent.children(".form-group.name").slideDown("400"); } }); // Save Row Column Settings $(document).on("click", "#save-settings", function (event) { event.preventDefault(); var flag = $(this).data("flag"); switch (flag) { case "row-setting": $("#layout-modal") .find(".addon-input") .each(function () { var $this = $(this), $parent = $(".row-active"), $attrname = $this.data("attrname"); $parent.removeData($attrname); if ($attrname == "name") { var nameVal = $this.val(); if (nameVal != "" || $this.val() != null) { $(".row-active .section-title").text($this.val()); } else { $(".row-active .section-title").text("Section Header"); } } $parent.attr("data-" + $attrname, $this.getInputValue()); }); break; case "col-setting": var component = false; $("#layout-modal") .find(".addon-input") .each(function () { var $this = $(this), $parent = $(".column-active"), $attrname = $this.data("attrname"); $parent.removeData($attrname), (dataVal = $this.val()); if ($attrname == "column_type" && $(this).is(":checked")) { component = true; $(".column-active .col-title").text("Component"); } else if ($attrname == "name" && component != true) { if (dataVal == "" || dataVal == undefined) { dataVal = "none"; } $(".column-active .col-title").text(dataVal); } $parent.attr("data-" + $attrname, $this.getInputValue()); }); break; case "save-layout": var layoutName = $("#layout-modal .addon-input").val(), data = { action: "save", layoutName: layoutName, content: JSON.stringify(getGeneratedLayout()), }; if (layoutName == "" || layoutName == " ") { alert("Without Name Layout Can't be save"); return false; } var request = { option: "com_ajax", plugin: "helix3", data: data, format: "json", }; $.ajax({ type: "POST", data: request, beforeSend: function () {}, success: function (response) { var data = $.parseJSON(response.data), layouts = data.layout, tplHtml = ""; $("#jform_params_layoutlist").find("option").remove(); if (layouts.length) { for (var i = 0; i < layouts.length; i++) { tplHtml += '<option value="' + layouts[i] + '">' + layouts[i].replace(".json", "") + "</option>"; } $("#jform_params_layoutlist").html(tplHtml); } }, error: function () { alert("Somethings wrong, Try again"); }, }); break; default: alert("You are doing somethings wrongs. Try again"); } }); // Column Layout Arrange $(document).on("click", ".column-layout", function (event) { event.preventDefault(); var $that = $(this), colType = $that.data("type"), column; if ($that.hasClass("active") && colType != "custom") { return; } if (colType == "custom") { column = prompt("Enter your custom layout like 4,2,2,2,2 as total 12 grid", "4,2,2,2,2"); } var $parent = $that.closest(".column-list"), $gparent = $that.closest(".layoutbuilder-section"), oldLayoutData = $parent.find(".active").data("layout"), oldLayout = ["12"], layoutData = $that.data("layout"), newLayout = ["12"]; if (oldLayoutData != 12) { oldLayout = oldLayoutData.split(","); } if (layoutData != 12) { newLayout = layoutData.split(","); } if (colType == "custom") { var error = true; if (column != null) { var colArray = column.split(","); var colSum = colArray.reduce(function (a, b) { return Number(a) + Number(b); }); if (colSum == 12) { newLayout = colArray; $(this).data("layout", column); error = false; } } if (error) { alert("Error generated. Please correct your column arragnement and try again."); return false; } } var col = [], colAttr = []; $gparent.find(".layout-column").each(function (i, val) { col[i] = $(this).html(); var colData = $(this).data(); if (typeof colData == "object") { colAttr[i] = $(this).data(); } else { colAttr[i] = ""; } }); $parent.find(".active").removeClass("active"); $that.addClass("active"); var new_item = ""; for (var i = 0; i < newLayout.length; i++) { var dataAttr = ""; if (typeof colAttr[i] == "object") { $.each(colAttr[i], function (index, value) { dataAttr += " data-" + index + '="' + value + '"'; }); } new_item += '<div class="layout-column col-sm-' + newLayout[i].trim() + '" ' + dataAttr + ">"; if (col[i]) { new_item += col[i]; } else { new_item += '<div class="column"> <h6 class="col-title pull-left">None</h6> <a class="col-ops-set pull-right" href="#" ><i class="fa fa-gears"></i></a></div>'; } new_item += "</div>"; } $old_column = $gparent.find(".layout-column"); $gparent.find(".row.ui-sortable").append(new_item); $old_column.remove(); jqueryUiLayout(); }); // add row $(document).on("click", ".add-row", function (event) { event.preventDefault(); var $parent = $(this).closest(".layoutbuilder-section"), $rowClone = $("#layoutbuilder-section").clone(true); $rowClone.addClass("layoutbuilder-section").removeAttr("id"); $($rowClone).insertAfter($parent); jqueryUiLayout(); }); // Remove Row $(document).on("click", ".remove-row", function (event) { event.preventDefault(); if (confirm("Click Ok button to delete Row, Cancel to leave.") == true) { $(this) .closest(".layoutbuilder-section") .slideUp(500, function () { $(this).remove(); }); } }); // Generate Layout JSON function getGeneratedLayout() { var item = []; $("#helix-layout-builder") .find(".layoutbuilder-section") .each(function (index) { var $row = $(this), rowIndex = index, rowObj = $row.data(); delete rowObj.sortableItem; var activeLayout = $row.find(".column-layout.active"), layoutArray = activeLayout.data("layout"), layout = 12; if (layoutArray != 12) { layout = layoutArray.split(",").join(""); } item[rowIndex] = { type: "row", layout: layout, settings: rowObj, attr: [], }; // Find Column Elements $row.find(".layout-column").each(function (index) { var $column = $(this), colIndex = index, className = $column.attr("class"), colObj = $column.data(); delete colObj.sortableItem; item[rowIndex].attr[colIndex] = { type: "sp_col", className: className, settings: colObj, }; }); }); return item; } //On Submit document.adminForm.onsubmit = function (event) { //WebFonts $(".webfont").each(function () { var $that = $(this), webfont = { fontFamily: $that.find(".list-font-families").val(), fontWeight: $that.find(".list-font-weight").val(), fontSubset: $that.find(".list-font-subset").val(), fontSize: $that.find(".webfont-size").val(), }; $that.find(".input-webfont").val(JSON.stringify(webfont)); }); //Generate Layout $("#jform_params_layout").val(JSON.stringify(getGeneratedLayout())); }; });