From 86a8103c152ab7bc5c2f6eb77dccc57067274420 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 19 Feb 2014 15:07:38 -0500 Subject: [PATCH] saving, updating, deleting widgets; widget dragging improvements --- public/src/forum/admin/themes.js | 84 +++++++++++++++++++++++++++---- public/templates/admin/themes.tpl | 12 +++-- src/routes/admin.js | 14 +++++- src/socket.io/admin.js | 14 +++++- src/widgets.js | 26 ++++++++++ 5 files changed, 132 insertions(+), 18 deletions(-) create mode 100644 src/widgets.js diff --git a/public/src/forum/admin/themes.js b/public/src/forum/admin/themes.js index 1cf7e3a36f..eedbc58fa4 100644 --- a/public/src/forum/admin/themes.js +++ b/public/src/forum/admin/themes.js @@ -142,16 +142,29 @@ define(['forum/admin/settings'], function(Settings) { connectToSortable: ".widget-area" }); + function appendToggle(el) { + if (!el.hasClass('block')) { + el.addClass('block') + .children('.panel-heading') + .append('
 
'); + } + } + $('#widgets .widget-area').sortable({ update: function (event, ui) { - if (!ui.item.hasClass('block')) { - ui.item.addClass('block'); - ui.item.children('.panel-heading').append('
'); - } - - } + appendToggle(ui.item); + }, + connectWith: "div" }).on('click', '.toggle-widget', function() { $(this).parents('.panel').children('.panel-body').toggleClass('hidden'); + }).on('click', '.delete-widget', function() { + var panel = $(this).parents('.panel'); + + bootbox.confirm('Are you sure you wish to delete this widget?', function(confirm) { + if (confirm) { + panel.remove(); + } + }); }); $('#widgets .btn[data-template]').on('click', function() { @@ -162,12 +175,24 @@ define(['forum/admin/settings'], function(Settings) { widgets = []; area.find('.panel[data-widget]').each(function() { - var widget = {}; - widget[this.getAttribute('data-widget')] = $(this).find('form').serializeArray(); - widgets.push(widget); + var widgetData = {}, + data = $(this).find('form').serializeArray(); + + for (var d in data) { + if (data.hasOwnProperty(d)) { + if (data[d].name) { + widgetData[data[d].name] = data[d].value; + } + } + } + + widgets.push({ + widget: this.getAttribute('data-widget'), + data: widgetData + }); }); - socket.emit('admin.themes.widgets.set', { + socket.emit('admin.widgets.set', { template: template, location: location, widgets: widgets @@ -181,7 +206,46 @@ define(['forum/admin/settings'], function(Settings) { }); }); }); + + function populateWidget(widget, data) { + widget.find('input, textarea').each(function() { + var input = $(this), + value = data[input.attr('name')]; + + if (this.type === 'checkbox') { + input.attr('checked', !!value); + } else { + input.val(value); + } + }); + + return widget; + } + $.get(RELATIVE_PATH + '/api/admin/themes', function(data) { + var areas = data.areas; + + for (var a in areas) { + if (areas.hasOwnProperty(a)) { + var area = areas[a], + widgetArea = $('#widgets .area [data-template="' + area.template + '"][data-location="' + area.location + '"]').parents('.area').find('.widget-area'); + + console.log('data', area.data); + for (var i in area.data) { + if (area.data.hasOwnProperty(i)) { + var data = area.data[i], + widgetEl = $('.available-widgets [data-widget="' + data.widget + '"]').clone(); + + + widgetArea.append(populateWidget(widgetEl, data.data)); + appendToggle(widgetEl); + } + } + + + } + } + }); }; return Themes; diff --git a/public/templates/admin/themes.tpl b/public/templates/admin/themes.tpl index 255a3d76fa..b33e7796fd 100644 --- a/public/templates/admin/themes.tpl +++ b/public/templates/admin/themes.tpl @@ -54,7 +54,7 @@

Widgets

-
+

Available Widgets

@@ -67,13 +67,17 @@
-
+
- Markdown Markdown formatted text + Text Markdown formatted text
diff --git a/src/routes/admin.js b/src/routes/admin.js index ceb2074d06..fa60980dcf 100644 --- a/src/routes/admin.js +++ b/src/routes/admin.js @@ -2,6 +2,7 @@ var nconf = require('nconf'), fs = require('fs'), path = require('path'), winston = require('winston'), + async = require('async'), db = require('./../database'), user = require('./../user'), @@ -11,6 +12,7 @@ var nconf = require('nconf'), categories = require('./../categories'), meta = require('../meta'), plugins = require('../plugins'), + widgets = require('../widgets'), image = require('./../image'), file = require('./../file'), Languages = require('../languages'), @@ -411,9 +413,17 @@ var nconf = require('nconf'), app.get('/themes', function (req, res) { plugins.fireHook('filter:widgets.getAreas', [], function(err, areas) { - res.json(200, { - areas: areas + async.each(areas, function(area, next) { + widgets.getArea(area.template, area.location, function(err, areaData) { + area.data = areaData; + next(err); + }); + }, function(err) { + res.json(200, { + areas: areas, + }); }); + }); }); diff --git a/src/socket.io/admin.js b/src/socket.io/admin.js index da1de17596..21f3d8bf11 100644 --- a/src/socket.io/admin.js +++ b/src/socket.io/admin.js @@ -3,6 +3,7 @@ var groups = require('../groups'), meta = require('../meta'), plugins = require('../plugins'), + widgets = require('../widgets'), user = require('../user'), topics = require('../topics'), categories = require('../categories'), @@ -255,10 +256,11 @@ SocketAdmin.categories.groupsList = function(socket, cid, callback) { }); }; -/* Themes & Plugins */ +/* Themes, Widgets, and Plugins */ SocketAdmin.themes = {}; SocketAdmin.plugins = {}; +SocketAdmin.widgets = {}; SocketAdmin.themes.getInstalled = function(socket, data, callback) { meta.themes.get(callback); @@ -269,7 +271,7 @@ SocketAdmin.themes.set = function(socket, data, callback) { return callback(new Error('invalid data')); } meta.themes.set(data, callback); -} +}; SocketAdmin.plugins.toggle = function(socket, plugin_id) { plugins.toggleActive(plugin_id, function(status) { @@ -277,6 +279,14 @@ SocketAdmin.plugins.toggle = function(socket, plugin_id) { }); }; +SocketAdmin.widgets.set = function(socket, data, callback) { + if(!data) { + return callback(new Error('invalid data')); + } + + widgets.setArea(data, callback); +}; + /* Configs */ SocketAdmin.config = {}; diff --git a/src/widgets.js b/src/widgets.js new file mode 100644 index 0000000000..5c506619af --- /dev/null +++ b/src/widgets.js @@ -0,0 +1,26 @@ +var async = require('async'), + winston = require('winston'), + db = require('./database'); + + +(function(Widgets) { + + Widgets.setArea = function(data, callback) { + if (!data.location || !data.template) { + callback({ + error: 'Missing location and template data' + }) + } + + db.setObjectField('widgets:' + data.template, data.location, JSON.stringify(data.widgets), function(err) { + callback(err); + }); + }; + + Widgets.getArea = function(template, location, callback) { + db.getObjectField('widgets:' + template, location, function(err, widgets) { + callback(err, JSON.parse(widgets)); + }) + }; + +}(exports)); \ No newline at end of file