From d9ecd0d51c1a549182a1bffa636d51ac00a26af1 Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Mon, 24 Nov 2014 00:07:11 +0100 Subject: [PATCH 1/4] Added new category 'Issues' in forum; --- controllers/discussion.js | 33 +++++++++++++++++++++++++++++++-- libs/modelQuery.js | 8 ++++++++ routes.js | 2 +- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/controllers/discussion.js b/controllers/discussion.js index 5d6323f3e..075be56f3 100644 --- a/controllers/discussion.js +++ b/controllers/discussion.js @@ -42,6 +42,11 @@ var categories = [ name: 'General Discussion', description: 'Off-topic discussion about anything related to user scripts or OpenUserJS.org' }, + { + slug: 'issues', + name: 'Issues', + description: 'Discussions on scripts' + } ]; exports.categories = categories; @@ -128,6 +133,7 @@ exports.list = function (aReq, aRes, aNext) { var authedUser = aReq.session.user; var categorySlug = aReq.params.category; + var categoryIssues = categorySlug === 'issues'; var category = _.findWhere(categories, { slug: categorySlug }); if (!category) @@ -144,7 +150,8 @@ exports.list = function (aReq, aRes, aNext) { // Category category = options.category = modelParser.parseCategory(category); - options.canPostTopicToCategory = category.canUserPostTopic(authedUser); + options.canPostTopicToCategory = category.canUserPostTopic(authedUser) && !categoryIssues; + options.multipleCategories = categoryIssues; // Page metadata pageMetadata(options, [category.name, 'Discussions'], category.description); @@ -159,7 +166,7 @@ exports.list = function (aReq, aRes, aNext) { var discussionListQuery = Discussion.find(); // discussionListQuery: category - discussionListQuery.find({ category: category.slug }); + modelQuery.applyDiscussionCategoryFilter(discussionListQuery, options, category.slug); // discussionListQuery: Defaults modelQuery.applyDiscussionListQueryDefaults(discussionListQuery, options, aReq); @@ -182,6 +189,28 @@ exports.list = function (aReq, aRes, aNext) { //--- PreRender // discussionList options.discussionList = _.map(options.discussionList, modelParser.parseDiscussion); + if (categoryIssues) { + _.map(options.discussionList, function (aDiscussion) { + var category = _.findWhere(categories, { slug: aDiscussion.category }); + if (!category) { + category = { + name: aDiscussion.category, + slug: aDiscussion.category, + }; + + var regex = /^(scripts|libs)\/([^\/]+)(\/[^\/]+)?\/([^\/]+)\/issues$/; + var match = regex.exec(category.slug); + var isScriptIssue = match; + if (isScriptIssue) { + var scriptAuthorNameSlug = match[2]; + var scriptNameSlug = match[4]; + var scriptName = scriptNameSlug.replace(/\_/g, ' '); + category.name = scriptAuthorNameSlug + '/' + scriptName; + } + } + aDiscussion.category = modelParser.parseCategory(category); + }); + } // Pagination options.paginationRendered = pagination.renderDefault(aReq); diff --git a/libs/modelQuery.js b/libs/modelQuery.js index f6c8524a0..684626d4a 100644 --- a/libs/modelQuery.js +++ b/libs/modelQuery.js @@ -134,6 +134,14 @@ var parseRemovedItemSearchQuery = function (aRemovedItemListQuery, aQuery) { }; exports.parseCommentSearchQuery = parseCommentSearchQuery; +exports.applyDiscussionCategoryFilter = function (aDiscussionListQuery, aOptions, aCatergorySlug) { + if (aCatergorySlug === 'issues') { + aDiscussionListQuery.find({ issue: true }); + } else { + aDiscussionListQuery.find({ category: aCatergorySlug }); + } +}; + var applyModelListQueryFlaggedFilter = function (aModelListQuery, aOptions, aFlaggedQuery) { // Only list flagged items if authedUser >= moderator or if authedUser owns the item. if (aOptions.isYou || aOptions.isMod) { diff --git a/routes.js b/routes.js index 086c60fff..2a38c8498 100644 --- a/routes.js +++ b/routes.js @@ -130,7 +130,7 @@ module.exports = function (aApp) { // Discussion routes // TODO: Update templates for new discussion routes aApp.route('/forum').get(discussion.categoryListPage); - aApp.route('/:p(forum)?/:category(announcements|corner|garage|discuss)').get(discussion.list); + aApp.route('/:p(forum)?/:category(announcements|corner|garage|discuss|issues)').get(discussion.list); aApp.route('/:p(forum)?/:category(announcements|corner|garage|discuss)/:topic').get(discussion.show).post(discussion.createComment); aApp.route('/:p(forum)?/:category(announcements|corner|garage|discuss)/new').get(discussion.newTopic).post(discussion.createTopic); // dupe From d38727073bf0aafcedff4698c272b99930b7fb51 Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Mon, 24 Nov 2014 00:08:59 +0100 Subject: [PATCH 2/4] Removed all discussions with category issue from main forum; --- controllers/discussion.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/controllers/discussion.js b/controllers/discussion.js index 075be56f3..2e0222d2e 100644 --- a/controllers/discussion.js +++ b/controllers/discussion.js @@ -78,6 +78,9 @@ exports.categoryListPage = function (aReq, aRes, aNext) { // discussionListQuery var discussionListQuery = Discussion.find(); + // discussionListQuery: non-issue + discussionListQuery.and({ issue: { $ne: true } }); + // discussionListQuery: Defaults modelQuery.applyDiscussionListQueryDefaults(discussionListQuery, options, aReq); From 81a25bef26f7f96536d52583f8232ee0d49f2bf4 Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Mon, 24 Nov 2014 20:47:32 +0100 Subject: [PATCH 3/4] Added new category 'All Discussions' in forum; --- controllers/discussion.js | 18 ++++++++++++------ libs/modelQuery.js | 1 + routes.js | 2 +- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/controllers/discussion.js b/controllers/discussion.js index 2e0222d2e..5daf6f5a5 100644 --- a/controllers/discussion.js +++ b/controllers/discussion.js @@ -45,7 +45,14 @@ var categories = [ { slug: 'issues', name: 'Issues', - description: 'Discussions on scripts' + description: 'Discussions on scripts', + virtual: true + }, + { + slug: 'all', + name: 'All Discussions', + description: 'Overview of all discussions', + virtual: true } ]; exports.categories = categories; @@ -78,7 +85,7 @@ exports.categoryListPage = function (aReq, aRes, aNext) { // discussionListQuery var discussionListQuery = Discussion.find(); - // discussionListQuery: non-issue + // discussionListQuery: remove issues discussionListQuery.and({ issue: { $ne: true } }); // discussionListQuery: Defaults @@ -136,7 +143,6 @@ exports.list = function (aReq, aRes, aNext) { var authedUser = aReq.session.user; var categorySlug = aReq.params.category; - var categoryIssues = categorySlug === 'issues'; var category = _.findWhere(categories, { slug: categorySlug }); if (!category) @@ -153,8 +159,8 @@ exports.list = function (aReq, aRes, aNext) { // Category category = options.category = modelParser.parseCategory(category); - options.canPostTopicToCategory = category.canUserPostTopic(authedUser) && !categoryIssues; - options.multipleCategories = categoryIssues; + options.canPostTopicToCategory = !category.virtual && category.canUserPostTopic(authedUser); + options.multipleCategories = category.virtual; // Page metadata pageMetadata(options, [category.name, 'Discussions'], category.description); @@ -192,7 +198,7 @@ exports.list = function (aReq, aRes, aNext) { //--- PreRender // discussionList options.discussionList = _.map(options.discussionList, modelParser.parseDiscussion); - if (categoryIssues) { + if (category.virtual) { _.map(options.discussionList, function (aDiscussion) { var category = _.findWhere(categories, { slug: aDiscussion.category }); if (!category) { diff --git a/libs/modelQuery.js b/libs/modelQuery.js index 684626d4a..aea839552 100644 --- a/libs/modelQuery.js +++ b/libs/modelQuery.js @@ -135,6 +135,7 @@ var parseRemovedItemSearchQuery = function (aRemovedItemListQuery, aQuery) { exports.parseCommentSearchQuery = parseCommentSearchQuery; exports.applyDiscussionCategoryFilter = function (aDiscussionListQuery, aOptions, aCatergorySlug) { + if (aCatergorySlug === 'all') { return; } if (aCatergorySlug === 'issues') { aDiscussionListQuery.find({ issue: true }); } else { diff --git a/routes.js b/routes.js index 2a38c8498..a4cc10969 100644 --- a/routes.js +++ b/routes.js @@ -130,7 +130,7 @@ module.exports = function (aApp) { // Discussion routes // TODO: Update templates for new discussion routes aApp.route('/forum').get(discussion.categoryListPage); - aApp.route('/:p(forum)?/:category(announcements|corner|garage|discuss|issues)').get(discussion.list); + aApp.route('/:p(forum)?/:category(announcements|corner|garage|discuss|issues|all)').get(discussion.list); aApp.route('/:p(forum)?/:category(announcements|corner|garage|discuss)/:topic').get(discussion.show).post(discussion.createComment); aApp.route('/:p(forum)?/:category(announcements|corner|garage|discuss)/new').get(discussion.newTopic).post(discussion.createTopic); // dupe From 00f6062b1a3194e378fb140cb651ee0868be0bec Mon Sep 17 00:00:00 2001 From: Jeroen van Warmerdam Date: Mon, 24 Nov 2014 21:42:49 +0100 Subject: [PATCH 4/4] Moved unknown/issue category to modelParser; --- controllers/discussion.js | 30 ++---------------------------- libs/modelParser.js | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 28 deletions(-) diff --git a/controllers/discussion.js b/controllers/discussion.js index 5daf6f5a5..797d01215 100644 --- a/controllers/discussion.js +++ b/controllers/discussion.js @@ -112,20 +112,7 @@ exports.categoryListPage = function (aReq, aRes, aNext) { _.map(options.discussionList, function (aDiscussion) { var category = _.findWhere(categories, { slug: aDiscussion.category }); if (!category) { - category = { - name: aDiscussion.category, - slug: aDiscussion.category, - }; - - var regex = /^(scripts|libs)\/([^\/]+)(\/[^\/]+)?\/([^\/]+)\/issues$/; - var match = regex.exec(category.slug); - var isScriptIssue = match; - if (isScriptIssue) { - var scriptAuthorNameSlug = match[2]; - var scriptNameSlug = match[4]; - var scriptName = scriptNameSlug.replace(/\_/g, ' '); - category.name = scriptAuthorNameSlug + '/' + scriptName; - } + category = modelParser.parseCategoryUnknown(aDiscussion.category); } aDiscussion.category = modelParser.parseCategory(category); }); @@ -202,20 +189,7 @@ exports.list = function (aReq, aRes, aNext) { _.map(options.discussionList, function (aDiscussion) { var category = _.findWhere(categories, { slug: aDiscussion.category }); if (!category) { - category = { - name: aDiscussion.category, - slug: aDiscussion.category, - }; - - var regex = /^(scripts|libs)\/([^\/]+)(\/[^\/]+)?\/([^\/]+)\/issues$/; - var match = regex.exec(category.slug); - var isScriptIssue = match; - if (isScriptIssue) { - var scriptAuthorNameSlug = match[2]; - var scriptNameSlug = match[4]; - var scriptName = scriptNameSlug.replace(/\_/g, ' '); - category.name = scriptAuthorNameSlug + '/' + scriptName; - } + category = modelParser.parseCategoryUnknown(aDiscussion.category); } aDiscussion.category = modelParser.parseCategory(category); }); diff --git a/libs/modelParser.js b/libs/modelParser.js index d9ec13a1a..2f35693c3 100644 --- a/libs/modelParser.js +++ b/libs/modelParser.js @@ -422,6 +422,24 @@ var parseCategory = function (aCategoryData) { parseModelFnMap.Category = parseCategory; exports.parseCategory = parseCategory; +var parseCategoryUnknown = function (aCategoryUnknownSlug) { + var category = { + name: aCategoryUnknownSlug, + slug: aCategoryUnknownSlug + }; + + var isScriptIssueRegex = /^(scripts|libs)\/([^\/]+)(\/[^\/]+)?\/([^\/]+)\/issues$/; + var isScriptIssue = isScriptIssueRegex.exec(category.slug); + if (isScriptIssue) { + var scriptAuthorNameSlug = isScriptIssue[2]; + var scriptNameSlug = isScriptIssue[4]; + var scriptName = scriptNameSlug.replace(/\_/g, ' '); + category.name = scriptAuthorNameSlug + '/' + scriptName; + } + return category; +}; +exports.parseCategoryUnknown = parseCategoryUnknown; + /** * Remove */