294 lines
8.4 KiB
JavaScript
Executable File
294 lines
8.4 KiB
JavaScript
Executable File
(function ($) {
|
|
"use strict";
|
|
|
|
wp.customize.controlConstructor["bloglo-widget"] =
|
|
wp.customize.Control.extend({
|
|
ready: function () {
|
|
"use strict";
|
|
|
|
var control = this;
|
|
|
|
control.widget_count = control.container.find(".widget").length;
|
|
control.setupSortable();
|
|
|
|
// Expand widget content on header click
|
|
control.container.on(
|
|
"click",
|
|
".bloglo-widget-container .widget-top",
|
|
function () {
|
|
$(this)
|
|
.closest(".widget")
|
|
.toggleClass("bloglo-expanded")
|
|
.find(".widget-inside")
|
|
.slideToggle(200);
|
|
}
|
|
);
|
|
|
|
// Minimize widget content when clicked on Done
|
|
control.container.on(
|
|
"click",
|
|
".bloglo-widget-container .widget-control-close",
|
|
function () {
|
|
$(this)
|
|
.closest(".widget")
|
|
.toggleClass("bloglo-expanded")
|
|
.find(".widget-inside")
|
|
.slideToggle(200);
|
|
}
|
|
);
|
|
|
|
// Show available widgets
|
|
control.container.on("click", ".bloglo-add-widget", function (e) {
|
|
e.preventDefault();
|
|
control.updateList();
|
|
});
|
|
|
|
control.container.on(
|
|
"change paste keyup",
|
|
"input, textarea, select",
|
|
function (e) {
|
|
control.update();
|
|
}
|
|
);
|
|
|
|
control.container.on("click", ".widget-control-remove", function () {
|
|
$(this).closest(".widget").remove();
|
|
control.update();
|
|
control.updateList();
|
|
});
|
|
|
|
control.container.on("click", ".bloglo-widget-edit-nav", function () {
|
|
wp.customize
|
|
.control(
|
|
"nav_menu_locations[" +
|
|
$(this)
|
|
.closest(".bloglo-widget-nav-container")
|
|
.data("menu-location") +
|
|
"]"
|
|
)
|
|
.focus();
|
|
control.close();
|
|
});
|
|
|
|
// Close the panel if the URL in the preview changes
|
|
wp.customize.previewer.bind("url", this.close);
|
|
|
|
$(control.container)
|
|
.find(".bloglo-widget-nav-container")
|
|
.each(function () {
|
|
var $this = $(this);
|
|
control.bindMenuLocation($this);
|
|
});
|
|
},
|
|
|
|
bindMenuLocation: function ($container) {
|
|
var menu_location = $container.data("menu-location");
|
|
|
|
// Bind menu location setting
|
|
wp.customize(
|
|
"nav_menu_locations[" + menu_location + "]",
|
|
function (value) {
|
|
value.bind(function (newval) {
|
|
if (newval) {
|
|
var menu_name = wp.customize
|
|
.control("nav_menu_locations[" + menu_location + "]")
|
|
.container.find("option:selected")
|
|
.html();
|
|
|
|
$container
|
|
.addClass("bloglo-widget-nav-has-menu")
|
|
.find(".bloglo-widget-nav-name")
|
|
.html(menu_name);
|
|
} else {
|
|
$container.removeClass("bloglo-widget-nav-has-menu");
|
|
}
|
|
});
|
|
}
|
|
);
|
|
},
|
|
|
|
// Changes visibility of available widgets
|
|
updateList: function () {
|
|
var widget,
|
|
self = this,
|
|
widgets = self.params.widgets;
|
|
|
|
// Filter which widgets are available.
|
|
if (widgets) {
|
|
// Hide all widgets.
|
|
$("#bloglo-available-widgets-list .bloglo-widget")
|
|
.hide()
|
|
.removeClass("disabled");
|
|
|
|
// Display allowed widgets.
|
|
$.each(widgets, function (index, el) {
|
|
widget = $(
|
|
"#bloglo-available-widgets-list #bloglo-widget-tpl-bloglo_customizer_widget_" +
|
|
index
|
|
);
|
|
|
|
widget.show();
|
|
|
|
if (
|
|
el.hasOwnProperty("max_uses") &&
|
|
el.max_uses > 0 &&
|
|
el.max_uses <=
|
|
$(self.container).find(
|
|
'.bloglo-widget-container [data-widget-type="' + index + '"]'
|
|
).length
|
|
) {
|
|
widget.addClass("disabled");
|
|
}
|
|
});
|
|
} else {
|
|
// Show all widgets
|
|
$("#bloglo-available-widgets-list .bloglo-widget").show();
|
|
}
|
|
},
|
|
|
|
addWidget: function (widget_id_base) {
|
|
var widget_html, widget_uuid;
|
|
|
|
widget_uuid = this.setting.id + "-" + this.widget_count;
|
|
|
|
// Get widget form
|
|
widget_html = $.trim(
|
|
$(this.container)
|
|
.find(".bloglo-widget-tpl-" + widget_id_base)
|
|
.html()
|
|
);
|
|
widget_html = widget_html.replace(/<[^<>]+>/g, function (m) {
|
|
return m.replace(/__i__|%i%/g, widget_uuid);
|
|
});
|
|
|
|
// Append new widget.
|
|
var $widget = $(widget_html).appendTo(
|
|
this.container.find(".bloglo-widget-container")
|
|
);
|
|
|
|
// Increase widget count.
|
|
this.widget_count++;
|
|
|
|
// Expand the widget and focus first setting.
|
|
$widget.find(".widget-top").trigger("click");
|
|
|
|
this.update();
|
|
|
|
if ($widget.find(".bloglo-widget-nav-container").length) {
|
|
this.bindMenuLocation($widget.find(".bloglo-widget-nav-container"));
|
|
}
|
|
},
|
|
|
|
close: function () {
|
|
$("body").removeClass("bloglo-adding-widget");
|
|
},
|
|
|
|
update: function () {
|
|
// Get all widgets in the area
|
|
var widgets = this.container.find(".bloglo-widget-container .widget");
|
|
var inputs,
|
|
widgetobj,
|
|
new_value = [],
|
|
option,
|
|
checked,
|
|
$widget;
|
|
|
|
if (widgets.length) {
|
|
// Get from each widfget
|
|
_.each(widgets, function (widget) {
|
|
$widget = $(widget);
|
|
widgetobj = {};
|
|
widgetobj.classname = $widget.data("widget-base");
|
|
widgetobj.type = $widget.data("widget-type");
|
|
widgetobj.values = {};
|
|
|
|
inputs = $widget.find("input, textarea, select");
|
|
|
|
_.each(inputs, function (input) {
|
|
option = $(input).attr("data-option-name");
|
|
|
|
// Save values.
|
|
if (typeof option !== typeof undefined && option !== false) {
|
|
widgetobj.values[$(input).attr("data-option-name")] =
|
|
$(input).val();
|
|
}
|
|
});
|
|
|
|
_.each($widget.find(".buttonset"), function (buttonset) {
|
|
// Save location if exist.
|
|
checked = $(buttonset).find('input[type="radio"]:checked');
|
|
|
|
// Save values.
|
|
if (typeof checked !== typeof undefined && checked !== false) {
|
|
widgetobj.values[checked.data("option-name")] = checked.val();
|
|
}
|
|
});
|
|
|
|
new_value.push(widgetobj);
|
|
});
|
|
|
|
this.setting.set(new_value);
|
|
} else {
|
|
this.setting.set(false);
|
|
}
|
|
},
|
|
|
|
setupSortable: function () {
|
|
var self = this;
|
|
|
|
$(this.container)
|
|
.find(".bloglo-widget-container")
|
|
.sortable({
|
|
items: "> .widget",
|
|
handle: ".widget-top",
|
|
intersect: "pointer",
|
|
axis: "y",
|
|
update: function () {
|
|
self.update();
|
|
},
|
|
});
|
|
},
|
|
});
|
|
|
|
$(document).ready(function () {
|
|
var control;
|
|
|
|
$(".wp-full-overlay").on(
|
|
"click",
|
|
".bloglo-add-widget, .bloglo-close-widgets-panel",
|
|
function (e) {
|
|
e.preventDefault();
|
|
|
|
$("body").toggleClass("bloglo-adding-widget");
|
|
|
|
if ($(this).data("location-title")) {
|
|
control = wp.customize.control($(this).data("control"));
|
|
$("#bloglo-available-widgets")
|
|
.attr("data-control", control.params.id)
|
|
.find(".bloglo-widget-caption")
|
|
.find("h3")
|
|
.html($(this).data("location-title"));
|
|
}
|
|
}
|
|
);
|
|
|
|
$(".wp-full-overlay").on("click", ".customize-section-back", function (e) {
|
|
$("body").removeClass("bloglo-adding-widget");
|
|
$("#bloglo-available-widgets").removeAttr("data-control");
|
|
});
|
|
|
|
// Add widget to widget control.
|
|
$("#bloglo-available-widgets").on("click", ".bloglo-widget", function (e) {
|
|
// Get active control.
|
|
control = wp.customize.control(
|
|
$("#bloglo-available-widgets").attr("data-control")
|
|
);
|
|
|
|
var widget_id = $(this).data("widget-id");
|
|
var widget_form = control.addWidget(widget_id);
|
|
|
|
control.close();
|
|
});
|
|
});
|
|
})(jQuery);
|