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 @@
-