From f581c052ee2dcf75ab00d600abf2ce37046b0ee4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 4 Dec 2018 14:32:43 -0500 Subject: [PATCH] feat: #7023 - add category selector to privileges and category create modals - allow category selector to work for multiple selectors on same page --- public/less/admin/admin.less | 9 ++-- public/src/admin/manage/categories.js | 23 ++++++-- public/src/admin/manage/privileges.js | 9 ++-- public/src/modules/categorySelector.js | 54 +++++++++++-------- src/controllers/admin/privileges.js | 13 +++-- src/socket.io/categories.js | 19 +++---- src/views/admin/manage/privileges.tpl | 15 ++---- .../admin/partials/categories/create.tpl | 18 ++----- 8 files changed, 82 insertions(+), 78 deletions(-) diff --git a/public/less/admin/admin.less b/public/less/admin/admin.less index 59eb225e5f..16dff9d563 100644 --- a/public/less/admin/admin.less +++ b/public/less/admin/admin.less @@ -235,13 +235,14 @@ body { margin: 35px 5px 0 5px; } } - -.category-dropdown-menu { - max-height: 600px; - overflow-y: auto; +[component="category-selector"] { .fa-stack { border-radius: 50%; } + .category-dropdown-menu { + max-height: 600px; + overflow-y: auto; + } } .table-reordering { diff --git a/public/src/admin/manage/categories.js b/public/src/admin/manage/categories.js index 76504eec6f..409e5fd02f 100644 --- a/public/src/admin/manage/categories.js +++ b/public/src/admin/manage/categories.js @@ -1,7 +1,11 @@ 'use strict'; - -define('admin/manage/categories', ['vendor/jquery/serializeObject/jquery.ba-serializeobject.min', 'translator', 'benchpress'], function (serialize, translator, Benchpress) { +define('admin/manage/categories', [ + 'vendor/jquery/serializeObject/jquery.ba-serializeobject.min', + 'translator', + 'benchpress', + 'categorySelector', +], function (serialize, translator, Benchpress, categorySelector) { var Categories = {}; var newCategoryId = -1; var sortables; @@ -54,11 +58,16 @@ define('admin/manage/categories', ['vendor/jquery/serializeObject/jquery.ba-seri }; Categories.throwCreateModal = function () { - socket.emit('admin.categories.getNames', {}, function (err, categories) { + socket.emit('categories.getSelectCategories', {}, function (err, categories) { if (err) { return app.alertError(err.message); } + categories.unshift({ + cid: 0, + name: '[[admin/manage/categories:parent-category-none]]', + icon: 'fa-none', + }); Benchpress.parse('admin/partials/categories/create', { categories: categories, }, function (html) { @@ -74,11 +83,15 @@ define('admin/manage/categories', ['vendor/jquery/serializeObject/jquery.ba-seri }, }); + var parentSelector = categorySelector.init(modal.find('#parentCidGroup [component="category-selector"]')); + var cloneFromSelector = categorySelector.init(modal.find('#cloneFromCidGroup [component="category-selector"]')); function submit() { var formData = modal.find('form').serializeObject(); formData.description = ''; formData.icon = 'fa-comments'; formData.uid = app.user.uid; + formData.parentCid = parentSelector.getSelectedCid(); + formData.cloneFromCid = cloneFromSelector.getSelectedCid(); Categories.create(formData); modal.modal('hide'); @@ -87,11 +100,11 @@ define('admin/manage/categories', ['vendor/jquery/serializeObject/jquery.ba-seri $('#cloneChildren').on('change', function () { var check = $(this); - var parentSelect = $('#parentCid'); + var parentSelect = modal.find('#parentCidGroup [component="category-selector"] .dropdown-toggle'); if (check.prop('checked')) { parentSelect.attr('disabled', 'disabled'); - parentSelect.val(''); + parentSelector.selectCategory(0); } else { parentSelect.removeAttr('disabled'); } diff --git a/public/src/admin/manage/privileges.js b/public/src/admin/manage/privileges.js index 2413729555..ef575e9fbd 100644 --- a/public/src/admin/manage/privileges.js +++ b/public/src/admin/manage/privileges.js @@ -13,11 +13,10 @@ define('admin/manage/privileges', [ Privileges.init = function () { cid = ajaxify.data.cid || 0; - $('ul[for="category-selector"]').on('click', 'li', function () { - var val = this.getAttribute('data-cid'); - ajaxify.go('admin/manage/privileges/' + (val === 'global' ? '' : val)); + categorySelector.init($('[component="category-selector"]'), function (category) { + var cid = parseInt(category.cid, 10); + ajaxify.go('admin/manage/privileges/' + (cid || '')); }); - Privileges.setupPrivilegeTable(); }; @@ -179,7 +178,7 @@ define('admin/manage/privileges', [ }; Privileges.copyPrivilegesFromCategory = function () { - categorySelector.modal(function (fromCid) { + categorySelector.modal(ajaxify.data.categories.slice(1), function (fromCid) { socket.emit('admin.categories.copyPrivilegesFrom', { toCid: cid, fromCid: fromCid }, function (err) { if (err) { return app.alertError(err.message); diff --git a/public/src/modules/categorySelector.js b/public/src/modules/categorySelector.js index f9117630ba..ac8377a71d 100644 --- a/public/src/modules/categorySelector.js +++ b/public/src/modules/categorySelector.js @@ -2,32 +2,45 @@ define('categorySelector', ['benchpress', 'translator', 'categorySearch'], function (Benchpress, translator, categorySearch) { var categorySelector = {}; - var selectedCategory; - var el; - categorySelector.init = function (_el, callback) { + + categorySelector.init = function (el, callback) { callback = callback || function () {}; - el = _el; - selectedCategory = null; + var selector = { + el: el, + selectedCategory: null, + }; + el.on('click', '[data-cid]', function () { var categoryEl = $(this); - categorySelector.selectCategory(categoryEl.attr('data-cid')); - callback(selectedCategory); + if (categoryEl.hasClass('disabled')) { + return false; + } + selector.selectCategory(categoryEl.attr('data-cid')); + callback(selector.selectedCategory); }); categorySearch.init(el); - }; - categorySelector.getSelectedCategory = function () { - return selectedCategory; - }; + selector.selectCategory = function (cid) { + var categoryEl = selector.el.find('[data-cid="' + cid + '"]'); + selector.selectedCategory = { + cid: cid, + name: categoryEl.attr('data-name'), + }; - categorySelector.selectCategory = function (cid) { - var categoryEl = el.find('[data-cid="' + cid + '"]'); - selectedCategory = { - cid: cid, - name: categoryEl.attr('data-name'), + if (categoryEl.length) { + selector.el.find('[component="category-selector-selected"]').html(categoryEl.find('[component="category-markup"]').html()); + } else { + selector.el.find('[component="category-selector-selected"]').translateHtml('[[topic:thread_tools.select_category]]'); + } + }; + selector.getSelectedCategory = function () { + return selector.selectedCategory; + }; + selector.getSelectedCid = function () { + return selector.selectedCategory ? selector.selectedCategory.cid : 0; }; - el.find('[component="category-selector-selected"]').html(categoryEl.find('[component="category-markup"]').html()); + return selector; }; categorySelector.modal = function (categories, callback) { @@ -50,12 +63,11 @@ define('categorySelector', ['benchpress', 'translator', 'categorySearch'], funct }, }, }); - categorySelector.init(modal.find('[component="category-selector"]')); + var selector = categorySelector.init(modal.find('[component="category-selector"]')); function submit(ev) { ev.preventDefault(); - var selectedCategory = categorySelector.getSelectedCategory(); - if (selectedCategory) { - callback(selectedCategory.cid); + if (selector.selectedCategory) { + callback(selector.selectedCategory.cid); modal.modal('hide'); } return false; diff --git a/src/controllers/admin/privileges.js b/src/controllers/admin/privileges.js index e4aa4a400b..accbc8b67d 100644 --- a/src/controllers/admin/privileges.js +++ b/src/controllers/admin/privileges.js @@ -19,7 +19,7 @@ privilegesController.get = function (req, res, callback) { privileges.categories.list(cid, next); } }, - allCategories: function (next) { + categories: function (next) { async.waterfall([ function (next) { categories.getAllCidsFromSet('categories:cid', next); @@ -36,7 +36,12 @@ privilegesController.get = function (req, res, callback) { }, next); }, function (data) { - data.allCategories.forEach(function (category) { + data.categories.unshift({ + cid: 0, + name: '[[admin/manage/privileges:global]]', + icon: 'fa-list', + }); + data.categories.forEach(function (category) { if (category) { category.selected = category.cid === cid; @@ -48,8 +53,8 @@ privilegesController.get = function (req, res, callback) { res.render('admin/manage/privileges', { privileges: data.privileges, - allCategories: data.allCategories, - selected: data.selected ? data.selected.name : '[[admin/manage/privileges:global]]', + categories: data.categories, + selectedCategory: data.selected, cid: cid, }); }, diff --git a/src/socket.io/categories.js b/src/socket.io/categories.js index 06cfbfecd7..2af93cad2d 100644 --- a/src/socket.io/categories.js +++ b/src/socket.io/categories.js @@ -21,7 +21,7 @@ SocketCategories.get = function (socket, data, callback) { isAdmin: async.apply(user.isAdministrator, socket.uid), categories: function (next) { async.waterfall([ - async.apply(categories.getAllCidsFromSet, 'categories:cid'), + async.apply(categories.getCidsByPrivilege, 'categories:cid', socket.uid, 'find'), async.apply(categories.getCategoriesData), ], next); }, @@ -132,23 +132,16 @@ SocketCategories.getCategoriesByPrivilege = function (socket, privilege, callbac }; SocketCategories.getMoveCategories = function (socket, data, callback) { + SocketCategories.getSelectCategories(socket, data, callback); +}; + +SocketCategories.getSelectCategories = function (socket, data, callback) { async.waterfall([ function (next) { async.parallel({ isAdmin: async.apply(user.isAdministrator, socket.uid), categories: function (next) { - async.waterfall([ - function (next) { - categories.getAllCidsFromSet('categories:cid', next); - }, - function (cids, next) { - categories.getCategories(cids, socket.uid, next); - }, - function (categoriesData, next) { - categoriesData = categories.getTree(categoriesData); - categories.buildForSelectCategories(categoriesData, next); - }, - ], next); + categories.buildForSelect(socket.uid, 'find', next); }, }, next); }, diff --git a/src/views/admin/manage/privileges.tpl b/src/views/admin/manage/privileges.tpl index 586751d400..a4bc0a8997 100644 --- a/src/views/admin/manage/privileges.tpl +++ b/src/views/admin/manage/privileges.tpl @@ -5,19 +5,10 @@ [[admin/manage/categories:privileges.description]]

-

+

[[admin/manage/categories:privileges.category-selector]] - - - -

+ +

diff --git a/src/views/admin/partials/categories/create.tpl b/src/views/admin/partials/categories/create.tpl index c1daa78925..a76e195d89 100644 --- a/src/views/admin/partials/categories/create.tpl +++ b/src/views/admin/partials/categories/create.tpl @@ -3,24 +3,14 @@ -
+
- +
-
+
- +