From 34ff9e413661d8ddbc8971a61eccde551ce1b264 Mon Sep 17 00:00:00 2001 From: Angus McLeod Date: Fri, 23 Dec 2022 17:28:09 +0100 Subject: [PATCH] Add watch_tags action --- .../components/wizard-custom-action.js.es6 | 5 +- .../discourse/lib/wizard-schema.js.es6 | 6 ++ .../components/wizard-custom-action.hbs | 77 ++++++++++++++++++- config/locales/client.en.yml | 4 + lib/custom_wizard/action.rb | 46 +++++++++++ lib/custom_wizard/subscription.rb | 2 +- spec/components/custom_wizard/action_spec.rb | 16 ++++ spec/fixtures/actions/watch_tags.json | 15 ++++ 8 files changed, 163 insertions(+), 8 deletions(-) create mode 100644 spec/fixtures/actions/watch_tags.json diff --git a/assets/javascripts/discourse/components/wizard-custom-action.js.es6 b/assets/javascripts/discourse/components/wizard-custom-action.js.es6 index c9c2c4c9..81a12530 100644 --- a/assets/javascripts/discourse/components/wizard-custom-action.js.es6 +++ b/assets/javascripts/discourse/components/wizard-custom-action.js.es6 @@ -15,6 +15,7 @@ export default Component.extend(UndoChanges, { createTopic: equal("action.type", "create_topic"), updateProfile: equal("action.type", "update_profile"), watchCategories: equal("action.type", "watch_categories"), + watchTags: equal("action.type", "watch_tags"), sendMessage: equal("action.type", "send_message"), openComposer: equal("action.type", "open_composer"), sendToApi: equal("action.type", "send_to_api"), @@ -36,9 +37,7 @@ export default Component.extend(UndoChanges, { availableNotificationLevels: notificationLevels.map((type) => { return { id: type, - name: I18n.t( - `admin.wizard.action.watch_categories.notification_level.${type}` - ), + name: I18n.t(`admin.wizard.action.watch_x.notification_level.${type}`), }; }), diff --git a/assets/javascripts/discourse/lib/wizard-schema.js.es6 b/assets/javascripts/discourse/lib/wizard-schema.js.es6 index 69254695..8c3323ff 100644 --- a/assets/javascripts/discourse/lib/wizard-schema.js.es6 +++ b/assets/javascripts/discourse/lib/wizard-schema.js.es6 @@ -132,6 +132,12 @@ const action = { wizard_user: true, usernames: null, }, + watch_tags: { + tags: null, + notification_level: null, + wizard_user: true, + usernames: null, + }, send_to_api: { api: null, api_endpoint: null, diff --git a/assets/javascripts/discourse/templates/components/wizard-custom-action.hbs b/assets/javascripts/discourse/templates/components/wizard-custom-action.hbs index 51ff000e..8245f1b8 100644 --- a/assets/javascripts/discourse/templates/components/wizard-custom-action.hbs +++ b/assets/javascripts/discourse/templates/components/wizard-custom-action.hbs @@ -386,7 +386,7 @@
- +
@@ -396,14 +396,14 @@ onChange=(action (mut action.notification_level)) options=(hash isDisabled=action.custom_title_enabled - none="admin.wizard.action.watch_categories.select_a_notification_level" + none="admin.wizard.action.watch_x.select_a_notification_level" )}}
- +
@@ -413,7 +413,76 @@
- + +
+ +
+ {{wizard-mapper + inputs=action.usernames + property="usernames" + onUpdate=(action "mappedFieldUpdated") + options=(hash + context="action" + wizardFieldSelection=true + userFieldSelection="key,value" + userSelection="output" + )}} +
+
+{{/if}} + +{{#if watchTags}} +
+
+ +
+ +
+ {{wizard-mapper + inputs=action.tags + property="tags" + onUpdate=(action "mappedFieldUpdated") + options=(hash + textSelection="key,value" + tagSelection="output" + wizardFieldSelection=true + wizardActionSelection=true + userFieldSelection="key,value" + context="action" + )}} +
+
+ +
+
+ +
+ +
+ {{combo-box + value=action.notification_level + content=availableNotificationLevels + onChange=(action (mut action.notification_level)) + options=(hash + isDisabled=action.custom_title_enabled + none="admin.wizard.action.watch_x.select_a_notification_level" + )}} +
+
+ +
+
+ +
+ +
+ {{input type="checkbox" checked=action.wizard_user}} +
+
+ +
+
+
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index b3adf8d4..1ec2b3ce 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -370,6 +370,10 @@ en: label: "Watch Categories" categories: "Categories" mute_remainder: "Mute Remainder" + watch_tags: + label: "Watch Tags" + tags: "Tags" + watch_x: notification_level: label: "Notification Level" regular: "Normal" diff --git a/lib/custom_wizard/action.rb b/lib/custom_wizard/action.rb index 5917a1bc..edd3b23c 100644 --- a/lib/custom_wizard/action.rb +++ b/lib/custom_wizard/action.rb @@ -190,6 +190,52 @@ class CustomWizard::Action end end + def watch_tags + tags = CustomWizard::Mapper.new( + inputs: action['tags'], + data: mapper_data, + user: user + ).perform + + tags = [*tags] + level = action['notification_level'].to_sym + + if level.blank? + log_error("Notifcation Level was not set. Exiting watch tags action") + return + end + + users = [] + + if action['usernames'] + mapped_users = CustomWizard::Mapper.new( + inputs: action['usernames'], + data: mapper_data, + user: user + ).perform + + if mapped_users.present? + mapped_users = mapped_users.split(',') + .map { |username| User.find_by(username: username) } + users.push(*mapped_users) + end + end + + if ActiveRecord::Type::Boolean.new.cast(action['wizard_user']) + users.push(user) + end + + users.each do |user| + result = TagUser.batch_set(user, level, tags) + + if result + log_success("#{user.username} notifications for #{tags} set to #{level}") + else + log_error("failed to set #{user.username} notifications for #{tags} to #{level}") + end + end + end + def watch_categories watched_categories = CustomWizard::Mapper.new( inputs: action['categories'], diff --git a/lib/custom_wizard/subscription.rb b/lib/custom_wizard/subscription.rb index 700e6087..c3c9803d 100644 --- a/lib/custom_wizard/subscription.rb +++ b/lib/custom_wizard/subscription.rb @@ -69,7 +69,7 @@ class CustomWizard::Subscription action: { type: { none: ['create_topic', 'update_profile', 'open_composer', 'route_to'], - standard: ['create_topic', 'update_profile', 'open_composer', 'route_to', 'send_message', 'watch_categories', 'add_to_group'], + standard: ['create_topic', 'update_profile', 'open_composer', 'route_to', 'send_message', 'watch_categories', 'watch_tags', 'add_to_group'], business: ['*'], community: ['*'] } diff --git a/spec/components/custom_wizard/action_spec.rb b/spec/components/custom_wizard/action_spec.rb index e5dedfa9..07c1084f 100644 --- a/spec/components/custom_wizard/action_spec.rb +++ b/spec/components/custom_wizard/action_spec.rb @@ -3,12 +3,14 @@ describe CustomWizard::Action do fab!(:user) { Fabricate(:user, name: "Angus", username: 'angus', email: "angus@email.com", trust_level: TrustLevel[2]) } fab!(:category) { Fabricate(:category, name: 'cat1', slug: 'cat-slug') } + fab!(:tag) { Fabricate(:tag, name: 'tag1') } fab!(:group) { Fabricate(:group) } let(:wizard_template) { get_wizard_fixture("wizard") } let(:open_composer) { get_wizard_fixture("actions/open_composer") } let(:create_category) { get_wizard_fixture("actions/create_category") } let(:watch_categories) { get_wizard_fixture("actions/watch_categories") } + let(:watch_tags) { get_wizard_fixture("actions/watch_tags") } let(:create_group) { get_wizard_fixture("actions/create_group") } let(:add_to_group) { get_wizard_fixture("actions/add_to_group") } let(:send_message) { get_wizard_fixture("actions/send_message") } @@ -219,6 +221,20 @@ describe CustomWizard::Action do enable_subscription("standard") end + it 'watches tags' do + watch_tags[:tags][0][:output] = tag.name + wizard_template[:actions] << watch_tags + update_template(wizard_template) + + wizard = CustomWizard::Builder.new(@template[:id], user).build + wizard.create_updater(wizard.steps[0].id, step_1_field_1: "Text input").update + + expect(TagUser.where( + tag_id: tag.id, + user_id: user.id + ).first.notification_level).to eq(2) + end + it 'watches categories' do watch_categories[:categories][0][:output] = category.id wizard_template[:actions] << watch_categories diff --git a/spec/fixtures/actions/watch_tags.json b/spec/fixtures/actions/watch_tags.json new file mode 100644 index 00000000..29e50207 --- /dev/null +++ b/spec/fixtures/actions/watch_tags.json @@ -0,0 +1,15 @@ +{ + "id": "action_3", + "run_after": "step_1", + "type": "watch_tags", + "notification_level": "tracking", + "wizard_user": true, + "tags": [ + { + "type": "assignment", + "output": "tag1", + "output_type": "text", + "output_connector": "set" + } + ] +}