mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-27 09:06:15 +01:00
fix: use slug instead of groupname in acp for groups
#13286, acp page was inaccessible
This commit is contained in:
@@ -136,8 +136,8 @@ paths:
|
|||||||
$ref: 'read/admin/manage/admins-mods.yaml'
|
$ref: 'read/admin/manage/admins-mods.yaml'
|
||||||
/api/admin/manage/groups:
|
/api/admin/manage/groups:
|
||||||
$ref: 'read/admin/manage/groups.yaml'
|
$ref: 'read/admin/manage/groups.yaml'
|
||||||
"/api/admin/manage/groups/{name}":
|
"/api/admin/manage/groups/{slug}":
|
||||||
$ref: 'read/admin/manage/groups/name.yaml'
|
$ref: 'read/admin/manage/groups/slug.yaml'
|
||||||
/api/admin/manage/uploads:
|
/api/admin/manage/uploads:
|
||||||
$ref: 'read/admin/manage/uploads.yaml'
|
$ref: 'read/admin/manage/uploads.yaml'
|
||||||
/api/admin/manage/digest:
|
/api/admin/manage/digest:
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ get:
|
|||||||
- admin
|
- admin
|
||||||
summary: Get user group details
|
summary: Get user group details
|
||||||
parameters:
|
parameters:
|
||||||
- name: name
|
- name: slug
|
||||||
in: path
|
in: path
|
||||||
required: true
|
required: true
|
||||||
schema:
|
schema:
|
||||||
@@ -29,6 +29,8 @@ get:
|
|||||||
type: string
|
type: string
|
||||||
displayName:
|
displayName:
|
||||||
type: string
|
type: string
|
||||||
|
slug:
|
||||||
|
type: string
|
||||||
selected:
|
selected:
|
||||||
type: boolean
|
type: boolean
|
||||||
allowPrivateGroups:
|
allowPrivateGroups:
|
||||||
@@ -27,10 +27,6 @@ define('admin/manage/group', [
|
|||||||
|
|
||||||
const groupName = ajaxify.data.group.name;
|
const groupName = ajaxify.data.group.name;
|
||||||
|
|
||||||
$('#group-selector').on('change', function () {
|
|
||||||
ajaxify.go('admin/manage/groups/' + $(this).val() + window.location.hash);
|
|
||||||
});
|
|
||||||
|
|
||||||
memberList.init('admin/manage/group');
|
memberList.init('admin/manage/group');
|
||||||
|
|
||||||
changeGroupUserTitle.on('keyup', function () {
|
changeGroupUserTitle.on('keyup', function () {
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ const groups = require('../../groups');
|
|||||||
const meta = require('../../meta');
|
const meta = require('../../meta');
|
||||||
const pagination = require('../../pagination');
|
const pagination = require('../../pagination');
|
||||||
const events = require('../../events');
|
const events = require('../../events');
|
||||||
const slugify = require('../../slugify');
|
|
||||||
|
|
||||||
const groupsController = module.exports;
|
const groupsController = module.exports;
|
||||||
|
|
||||||
@@ -23,7 +22,7 @@ groupsController.list = async function (req, res) {
|
|||||||
const stop = start + groupsPerPage - 1;
|
const stop = start + groupsPerPage - 1;
|
||||||
groupNames = groupNames.slice(start, stop + 1);
|
groupNames = groupNames.slice(start, stop + 1);
|
||||||
|
|
||||||
const groupData = await groups.getGroupsData(groupNames);
|
const groupData = await groups.getGroupsData(groupNames.map(g => g.name));
|
||||||
res.render('admin/manage/groups', {
|
res.render('admin/manage/groups', {
|
||||||
groups: groupData,
|
groups: groupData,
|
||||||
pagination: pagination.create(page, pageCount),
|
pagination: pagination.create(page, pageCount),
|
||||||
@@ -32,8 +31,16 @@ groupsController.list = async function (req, res) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
groupsController.get = async function (req, res, next) {
|
groupsController.get = async function (req, res, next) {
|
||||||
const slug = slugify(req.params.name);
|
const lowercaseSlug = req.params.slug.toLowerCase();
|
||||||
const groupName = await groups.getGroupNameByGroupSlug(slug);
|
if (req.params.slug !== lowercaseSlug) {
|
||||||
|
if (res.locals.isAPI) {
|
||||||
|
req.params.slug = lowercaseSlug;
|
||||||
|
} else {
|
||||||
|
return res.redirect(`${nconf.get('relative_path')}/admin/manage/groups/${lowercaseSlug}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const groupName = await groups.getGroupNameByGroupSlug(req.params.slug);
|
||||||
if (!groupName) {
|
if (!groupName) {
|
||||||
return next();
|
return next();
|
||||||
}
|
}
|
||||||
@@ -46,10 +53,11 @@ groupsController.get = async function (req, res, next) {
|
|||||||
return next();
|
return next();
|
||||||
}
|
}
|
||||||
|
|
||||||
const groupNameData = groupNames.map(name => ({
|
const groupNameData = groupNames.map(g => ({
|
||||||
encodedName: encodeURIComponent(name),
|
encodedName: encodeURIComponent(g.name),
|
||||||
displayName: validator.escape(String(name)),
|
displayName: validator.escape(String(g.name)),
|
||||||
selected: name === groupName,
|
slug: g.slug,
|
||||||
|
selected: g.name === groupName,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
res.render('admin/manage/group', {
|
res.render('admin/manage/group', {
|
||||||
@@ -62,13 +70,14 @@ groupsController.get = async function (req, res, next) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
async function getGroupNames() {
|
async function getGroupNames() {
|
||||||
const groupNames = Object.values(await db.getObject('groupslug:groupname'));
|
let groupEntries = Object.entries(await db.getObject('groupslug:groupname'));
|
||||||
return groupNames.filter(name => (
|
groupEntries = groupEntries.map(g => ({ slug: g[0], name: g[1] }));
|
||||||
name !== 'registered-users' &&
|
return groupEntries.filter(g => (
|
||||||
name !== 'verified-users' &&
|
g.name !== 'registered-users' &&
|
||||||
name !== 'unverified-users' &&
|
g.name !== 'verified-users' &&
|
||||||
name !== groups.BANNED_USERS
|
g.name !== 'unverified-users' &&
|
||||||
)).sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));
|
g.name !== groups.BANNED_USERS
|
||||||
|
)).sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase()));
|
||||||
}
|
}
|
||||||
|
|
||||||
groupsController.getCSV = async function (req, res) {
|
groupsController.getCSV = async function (req, res) {
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ module.exports = function (app, name, middleware, controllers) {
|
|||||||
helpers.setupAdminPageRoute(app, `/${name}/manage/admins-mods`, middlewares, controllers.admin.adminsMods.get);
|
helpers.setupAdminPageRoute(app, `/${name}/manage/admins-mods`, middlewares, controllers.admin.adminsMods.get);
|
||||||
|
|
||||||
helpers.setupAdminPageRoute(app, `/${name}/manage/groups`, middlewares, controllers.admin.groups.list);
|
helpers.setupAdminPageRoute(app, `/${name}/manage/groups`, middlewares, controllers.admin.groups.list);
|
||||||
helpers.setupAdminPageRoute(app, `/${name}/manage/groups/:name`, middlewares, controllers.admin.groups.get);
|
helpers.setupAdminPageRoute(app, `/${name}/manage/groups/:slug`, middlewares, controllers.admin.groups.get);
|
||||||
|
|
||||||
helpers.setupAdminPageRoute(app, `/${name}/manage/uploads`, middlewares, controllers.admin.uploads.get);
|
helpers.setupAdminPageRoute(app, `/${name}/manage/uploads`, middlewares, controllers.admin.uploads.get);
|
||||||
helpers.setupAdminPageRoute(app, `/${name}/manage/digest`, middlewares, controllers.admin.digest.get);
|
helpers.setupAdminPageRoute(app, `/${name}/manage/digest`, middlewares, controllers.admin.digest.get);
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
</button>
|
</button>
|
||||||
<ul class="dropdown-menu {{{ if config.isRTL }}}dropdown-menu-end{{{ end }}} p-1" role="menu">
|
<ul class="dropdown-menu {{{ if config.isRTL }}}dropdown-menu-end{{{ end }}} p-1" role="menu">
|
||||||
{{{ each templates }}}
|
{{{ each templates }}}
|
||||||
<li><a class="dropdown-item rounded-1 d-flex justify-content-between align-items-center gap-3" href="#" data-template="{./template}" data-toggle="pill" role="menuitem">{./template} <span class="badge text-bg-light border" style="min-width: 2.15em;">{./widgetCount}</span></a></li>
|
<li><a class="dropdown-item rounded-1 d-flex justify-content-between align-items-center gap-3" href="#" data-template="{./template}" role="menuitem">{./template} <span class="badge text-bg-light border" style="min-width: 2.15em;">{./widgetCount}</span></a></li>
|
||||||
{{{ end }}}
|
{{{ end }}}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -20,8 +20,8 @@
|
|||||||
<a class="dropdown-item rounded-1" role="menuitem">[[search:no-matches]]</a>
|
<a class="dropdown-item rounded-1" role="menuitem">[[search:no-matches]]</a>
|
||||||
</li>
|
</li>
|
||||||
{{{ each groupNames }}}
|
{{{ each groupNames }}}
|
||||||
<li role="presentation" class="group" data-name="{groupNames.displayName}">
|
<li role="presentation" class="group" data-name="{./displayName}">
|
||||||
<a class="dropdown-item rounded-1" href="{config.relative_path}/admin/manage/groups/{groupNames.encodedName}" role="menuitem">{groupNames.displayName}</a>
|
<a class="dropdown-item rounded-1" href="{config.relative_path}/admin/manage/groups/{./slug}" role="menuitem">{./displayName}</a>
|
||||||
</li>
|
</li>
|
||||||
{{{ end }}}
|
{{{ end }}}
|
||||||
</ul>
|
</ul>
|
||||||
|
|||||||
Reference in New Issue
Block a user