diff --git a/public/less/admin/admin.less b/public/less/admin/admin.less index 6331c3b1e2..0e35f3a6df 100644 --- a/public/less/admin/admin.less +++ b/public/less/admin/admin.less @@ -317,3 +317,14 @@ cursor: move; } } + +.privilege-table { + th { + font-size: 10px; + } + + img { + max-width: 24px; + max-height: 24px; + } +} diff --git a/public/src/admin/manage/category.js b/public/src/admin/manage/category.js index d6057e2663..c0344604e8 100644 --- a/public/src/admin/manage/category.js +++ b/public/src/admin/manage/category.js @@ -4,8 +4,9 @@ define('admin/manage/category', [ 'uploader', 'admin/modules/iconSelect', - 'admin/modules/colorpicker' -], function(uploader, iconSelect, colorpicker) { + 'admin/modules/colorpicker', + 'autocomplete' +], function(uploader, iconSelect, colorpicker, autocomplete) { var Category = {}; Category.init = function() { @@ -113,7 +114,7 @@ define('admin/manage/category', [ uploader.open(RELATIVE_PATH + '/api/admin/category/uploadpicture', { cid: cid }, 0, function(imageUrlOnServer) { inputEl.val(imageUrlOnServer); - var previewBox = inputEl.parent().siblings('.category-preview'); + var previewBox = inputEl.parent().parent().siblings('.category-preview'); previewBox.css('background', 'url(' + imageUrlOnServer + '?' + new Date().getTime() + ')') .css('background-size', 'cover'); modified(inputEl[0]); @@ -125,6 +126,8 @@ define('admin/manage/category', [ iconSelect.init($(this).find('i'), modified); }); + Category.setupPrivilegeTable(); + $(function() { @@ -312,5 +315,68 @@ define('admin/manage/category', [ // }); // }; + Category.setupPrivilegeTable = function() { + var searchEl = $('.privilege-search'), + searchObj = autocomplete.user(searchEl); + + // User search + addition to table + searchObj.on('autocompleteselect', function(ev, ui) { + socket.emit('admin.categories.setPrivilege', { + cid: ajaxify.variables.get('cid'), + privilege: 'read', + set: true, + member: ui.item.user.uid + }, function(err) { + if (err) { + return app.alertError(err.message); + } + + Category.refreshPrivilegeTable(); + searchEl.val(''); + }); + }); + + // Checkbox event capture + $('.privilege-table-container').on('change', 'input[type="checkbox"]', function() { + var checkboxEl = $(this), + privilege = checkboxEl.parent().attr('data-privilege'), + state = checkboxEl.prop('checked'), + rowEl = checkboxEl.parents('tr'), + member = rowEl.attr('data-group-slug') || rowEl.attr('data-uid'); + + if (member) { + socket.emit('admin.categories.setPrivilege', { + cid: ajaxify.variables.get('cid'), + privilege: privilege, + set: state, + member: member + }, function(err) { + if (err) { + return app.alertError(err.message); + } + + checkboxEl.replaceWith(''); + Category.refreshPrivilegeTable(); + }); + } else { + app.alertError('No member or group was selected'); + } + }) + }; + + Category.refreshPrivilegeTable = function() { + socket.emit('admin.categories.getPrivilegeSettings', 2, function(err, privileges) { + if (err) { + return app.alertError(err.message); + } + + templates.parse('admin/partials/categories/privileges', { + privileges: privileges + }, function(html) { + $('.privilege-table-container').html(html); + }); + }); + }; + return Category; }); \ No newline at end of file diff --git a/public/src/modules/autocomplete.js b/public/src/modules/autocomplete.js index d8b2311b98..55c15b8686 100644 --- a/public/src/modules/autocomplete.js +++ b/public/src/modules/autocomplete.js @@ -7,7 +7,7 @@ define('autocomplete', function() { var module = {}; module.user = function (input) { - input.autocomplete({ + return input.autocomplete({ delay: 100, source: function(request, response) { socket.emit('user.search', {query: request.term}, function(err, result) { @@ -17,7 +17,15 @@ define('autocomplete', function() { if (result && result.users) { var names = result.users.map(function(user) { - return user && user.username; + return user && { + label: user.username, + value: user.username, + user: { + uid: user.uid, + name: user.username, + slug: user.userslug + } + }; }); response(names); } diff --git a/public/src/modules/helpers.js b/public/src/modules/helpers.js index 5361099476..dfecb7e78b 100644 --- a/public/src/modules/helpers.js +++ b/public/src/modules/helpers.js @@ -98,6 +98,21 @@ } }; + helpers.spawnPrivilegeStates = function(privileges) { + var states = []; + for(var priv in privileges) { + if (privileges.hasOwnProperty(priv)) { + states.push({ + name: priv, + state: privileges[priv] + }); + } + } + return states.map(function(priv) { + return '
+ You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or + a per-group basis. You can add a new user or group to this table by searching for them in the form below. +
++ Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting + these settings. +
+