From e0de9238a132bd4e54303ae10dbcad4263388804 Mon Sep 17 00:00:00 2001 From: Sam Saffron Date: Fri, 1 Nov 2019 14:15:28 +1100 Subject: [PATCH] FEATURE: new category setting to add "Unassigned" navigation menu When a category is used exclusively for managing topic assignments it can be very useful to list all the unassigned topics. This introduces a new category setting that allows admins to opt for this new navigation item. It works both on mobile and desktop. This uses an amended nav item API, to experience this fully you need latest versions of Discourse. --- .../assign-settings.hbs | 13 +++++++++++ .../assign-settings.js.es6 | 10 ++++++++ .../initializers/extend-for-assigns.js.es6 | 23 +++++++++++++++++++ .../extend-category-for-assign.js.es6 | 20 ++++++++++++++++ config/locales/client.en.yml | 5 ++++ plugin.rb | 1 + 6 files changed, 72 insertions(+) create mode 100644 assets/javascripts/discourse-assign/connectors/category-custom-settings/assign-settings.hbs create mode 100644 assets/javascripts/discourse-assign/connectors/category-custom-settings/assign-settings.js.es6 create mode 100644 assets/javascripts/discourse-assign/pre-initializers/extend-category-for-assign.js.es6 diff --git a/assets/javascripts/discourse-assign/connectors/category-custom-settings/assign-settings.hbs b/assets/javascripts/discourse-assign/connectors/category-custom-settings/assign-settings.hbs new file mode 100644 index 0000000..0ee2383 --- /dev/null +++ b/assets/javascripts/discourse-assign/connectors/category-custom-settings/assign-settings.hbs @@ -0,0 +1,13 @@ +

{{i18n 'discourse_assign.assign.title'}}

+
+
+ +
+
diff --git a/assets/javascripts/discourse-assign/connectors/category-custom-settings/assign-settings.js.es6 b/assets/javascripts/discourse-assign/connectors/category-custom-settings/assign-settings.js.es6 new file mode 100644 index 0000000..dcd2b94 --- /dev/null +++ b/assets/javascripts/discourse-assign/connectors/category-custom-settings/assign-settings.js.es6 @@ -0,0 +1,10 @@ +export default { + actions: { + onChangeSetting(value) { + this.set( + "category.custom_fields.enable_unassigned_filter", + value ? "true" : "false" + ); + } + } +}; diff --git a/assets/javascripts/discourse-assign/initializers/extend-for-assigns.js.es6 b/assets/javascripts/discourse-assign/initializers/extend-for-assigns.js.es6 index ea262d9..5dfbdb2 100644 --- a/assets/javascripts/discourse-assign/initializers/extend-for-assigns.js.es6 +++ b/assets/javascripts/discourse-assign/initializers/extend-for-assigns.js.es6 @@ -55,6 +55,29 @@ function registerTopicFooterButtons(api) { } function initialize(api) { + api.addNavigationBarItem({ + name: "unassigned", + customFilter: category => { + return category && category.enable_unassigned_filter; + }, + customHref: category => { + if (category) { + return ( + Discourse.getURL(category.url) + + "/l/latest?status=open&assigned=nobody" + ); + } + }, + forceActive: (category, args, router) => { + return ( + router.currentURL && + router.currentURL.indexOf("assigned=nobody") > -1 && + router.currentURL.indexOf("status=open") > -1 + ); + }, + before: "top" + }); + // You can't act on flags claimed by another user api.modifyClass( "component:flagged-post", diff --git a/assets/javascripts/discourse-assign/pre-initializers/extend-category-for-assign.js.es6 b/assets/javascripts/discourse-assign/pre-initializers/extend-category-for-assign.js.es6 new file mode 100644 index 0000000..3bb263e --- /dev/null +++ b/assets/javascripts/discourse-assign/pre-initializers/extend-category-for-assign.js.es6 @@ -0,0 +1,20 @@ +import Category from "discourse/models/category"; + +export default { + name: "extend-category-for-assign", + + before: "inject-discourse-objects", + + initialize() { + Category.reopen({ + enable_unassigned_filter: Ember.computed( + "custom_fields.enable_unassigned_filter", + { + get(fieldName) { + return Ember.get(this.custom_fields, fieldName) === "true"; + } + } + ) + }); + } +}; diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index c09e9be..3654e44 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -1,9 +1,14 @@ en: js: + filters: + unassigned: + title: "Unassigned" + help: "Topics that are not assigned" action_codes: assigned: "assigned %{who} %{when}" unassigned: "unassigned %{who} %{when}" discourse_assign: + add_unassigned_filter: "Add 'unassigned' filter to category" cant_act: "You cannot act on flags that have been assigned to other users" cant_act_unclaimed: "You must claim this topic before acting on flags." assigned: "Assigned" diff --git a/plugin.rb b/plugin.rb index cc59d97..425d733 100644 --- a/plugin.rb +++ b/plugin.rb @@ -100,6 +100,7 @@ after_initialize do end TopicList.preloaded_custom_fields << TopicAssigner::ASSIGNED_TO_ID + Site.preloaded_category_custom_fields << "enable_unassigned_filter" if Site.respond_to? :preloaded_category_custom_fields TopicList.on_preload do |topics, topic_list| if SiteSetting.assign_enabled?