"use strict"; /* global define, app, socket */ define('admin/extend/widgets', ['jqueryui'], function (jqueryui) { var Widgets = {}; Widgets.init = function () { $('#widgets .nav-pills a').on('click', function (ev) { var $this = $(this); $('#widgets .nav-pills li').removeClass('active'); $this.parent().addClass('active'); $('#widgets .tab-pane').removeClass('active'); $('#widgets .tab-pane[data-template="' + $this.attr('data-template') + '"]').addClass('active'); ev.preventDefault(); return false; }); $('#widget-selector').on('change', function () { $('.available-widgets [data-widget]').addClass('hide'); $('.available-widgets [data-widget="' + $(this).val() + '"]').removeClass('hide'); }); $('#widget-selector').trigger('change'); loadWidgetData(); }; function prepareWidgets() { $('[data-location="drafts"]').insertAfter($('[data-location="drafts"]').closest('.tab-content')); $('#widgets .available-widgets .widget-panel').draggable({ helper: function (e) { return $(e.target).parents('.widget-panel').clone(); }, distance: 10, connectToSortable: ".widget-area" }); $('#widgets .available-containers .containers > [data-container-html]') .draggable({ helper: function (e) { var target = $(e.target); target = target.attr('data-container-html') ? target : target.parents('[data-container-html]'); return target.clone().addClass('block').width(target.width()).css('opacity', '0.5'); }, distance: 10 }) .each(function () { $(this).attr('data-container-html', $(this).attr('data-container-html').replace(/\\\{([\s\S]*?)\\\}/g, '{$1}')); }); $('#widgets .widget-area').sortable({ update: function (event, ui) { createDatePicker(ui.item); appendToggle(ui.item); }, connectWith: "div" }).on('click', '.delete-widget', function () { var panel = $(this).parents('.widget-panel'); bootbox.confirm('Are you sure you wish to delete this widget?', function (confirm) { if (confirm) { panel.remove(); } }); }).on('mouseup', '> .panel > .panel-heading', function (evt) { if ( !( $(this).parent().is('.ui-sortable-helper') || $(evt.target).closest('.delete-widget').length ) ) { $(this).parent().children('.panel-body').toggleClass('hidden'); } }); $('#save').on('click', saveWidgets); function saveWidgets() { var total = $('#widgets [data-template][data-location]').length; $('#widgets [data-template][data-location]').each(function (i, el) { el = $(el); var template = el.attr('data-template'), location = el.attr('data-location'), area = el.children('.widget-area'), widgets = []; area.find('.widget-panel[data-widget]').each(function () { var widgetData = {}, data = $(this).find('form').serializeArray(); for (var d in data) { if (data.hasOwnProperty(d)) { if (data[d].name) { if (widgetData[data[d].name]) { if(!Array.isArray(widgetData[data[d].name])) { widgetData[data[d].name] = [ widgetData[data[d].name] ]; } widgetData[data[d].name].push(data[d].value); }else{ widgetData[data[d].name] = data[d].value; } } } } widgets.push({ widget: $(this).attr('data-widget'), data: widgetData }); }); socket.emit('admin.widgets.set', { template: template, location: location, widgets: widgets }, function (err) { total--; if (err) { app.alertError(err.message); } if (total === 0) { app.alert({ alert_id: 'admin:widgets', type: 'success', title: 'Widgets Updated', message: 'Successfully updated widgets', timeout: 2500 }); } }); }); } $('.color-selector').on('click', '.btn', function () { var btn = $(this), selector = btn.parents('.color-selector'), container = selector.parents('[data-container-html]'), classList = []; selector.children().each(function () { classList.push($(this).attr('data-class')); }); container .removeClass(classList.join(' ')) .addClass(btn.attr('data-class')); container.attr('data-container-html', container.attr('data-container-html') .replace(/class="[a-zA-Z0-9-\s]+"/, 'class="' + container[0].className.replace(' pointer ui-draggable', '') + '"') ); }); } function createDatePicker(el) { var currentYear = new Date().getFullYear(); el.find('.date-selector').datepicker({ changeMonth: true, changeYear: true, yearRange: currentYear + ':' + (currentYear + 100) }); } function appendToggle(el) { if (!el.hasClass('block')) { el.addClass('block').css('width', '').css('height', '') .droppable({ accept: '[data-container-html]', drop: function (event, ui) { var el = $(this); el.find('.panel-body .container-html').val(ui.draggable.attr('data-container-html')); el.find('.panel-body').removeClass('hidden'); }, hoverClass: "panel-info" }) .children('.panel-heading') .append('
 
') .children('small').html(''); } } function loadWidgetData() { function populateWidget(widget, data) { if (data.title) { var title = widget.find('.panel-heading strong'); title.text(title.text() + ' - ' + data.title); } widget.find('input, textarea, select').each(function () { var input = $(this), value = data[input.attr('name')]; if (input.attr('type') === 'checkbox') { input.prop('checked', !!value).trigger('change'); } else { input.val(value); } }); return widget; } $.get(RELATIVE_PATH + '/api/admin/extend/widgets', function (data) { var areas = data.areas; for(var i = 0; i < areas.length; ++i) { var area = areas[i], widgetArea = $('#widgets .area[data-template="' + area.template + '"][data-location="' + area.location + '"]').find('.widget-area'); widgetArea.html(''); for (var k = 0; k < area.data.length; ++k) { var widgetData = area.data[k], widgetEl = $('.available-widgets [data-widget="' + widgetData.widget + '"]').clone(true).removeClass('hide'); widgetArea.append(populateWidget(widgetEl, widgetData.data)); appendToggle(widgetEl); createDatePicker(widgetEl); } } prepareWidgets(); }); } return Widgets; });