From d9484db7188900f95f82fdc0145128cb41f4c3f2 Mon Sep 17 00:00:00 2001 From: Bianca Nenciu Date: Wed, 2 Jun 2021 08:36:49 +0300 Subject: [PATCH] FIX: Split link watched words from replace (#13196) It was not clear that replace watched words can be used to replace text with URLs. This introduces a new watched word type that makes it easier to understand. --- .../addon/components/admin-watched-word.js | 1 + .../addon/components/watched-word-form.js | 19 ++++- .../modals/admin-watched-word-test.js | 8 +- .../components/admin-watched-word.hbs | 2 +- .../components/watched-word-form.hbs | 20 ++++- .../modal/admin-watched-word-test.hbs | 2 +- .../addon/templates/watched-words-action.hbs | 2 +- .../javascripts/discourse/app/lib/text.js | 3 +- .../tests/unit/lib/pretty-text-test.js | 16 +++- .../pretty-text/addon/pretty-text.js | 6 +- ...ched-words-replace.js => watched-words.js} | 77 ++++++++++++------- .../stylesheets/common/admin/staff_logs.scss | 17 ++++ app/models/watched_word.rb | 17 +++- app/serializers/site_serializer.rb | 7 +- app/services/word_watcher.rb | 4 +- config/locales/client.en.yml | 11 ++- config/locales/server.en.yml | 2 + ...rate_watched_words_from_replace_to_link.rb | 15 ++++ lib/pretty_text.rb | 3 +- spec/components/pretty_text_spec.rb | 16 ++-- 20 files changed, 186 insertions(+), 62 deletions(-) rename app/assets/javascripts/pretty-text/engines/discourse-markdown/{watched-words-replace.js => watched-words.js} (66%) create mode 100644 db/migrate/20210528144647_migrate_watched_words_from_replace_to_link.rb diff --git a/app/assets/javascripts/admin/addon/components/admin-watched-word.js b/app/assets/javascripts/admin/addon/components/admin-watched-word.js index 1dcee049eb7..8c5fd514966 100644 --- a/app/assets/javascripts/admin/addon/components/admin-watched-word.js +++ b/app/assets/javascripts/admin/addon/components/admin-watched-word.js @@ -9,6 +9,7 @@ export default Component.extend({ isReplace: equal("actionKey", "replace"), isTag: equal("actionKey", "tag"), + isLink: equal("actionKey", "link"), @discourseComputed("word.replacement") tags(replacement) { diff --git a/app/assets/javascripts/admin/addon/components/watched-word-form.js b/app/assets/javascripts/admin/addon/components/watched-word-form.js index 7730b2ada8b..89eb6bfe950 100644 --- a/app/assets/javascripts/admin/addon/components/watched-word-form.js +++ b/app/assets/javascripts/admin/addon/components/watched-word-form.js @@ -15,9 +15,16 @@ export default Component.extend({ formSubmitted: false, actionKey: null, showMessage: false, + selectedTags: null, canReplace: equal("actionKey", "replace"), canTag: equal("actionKey", "tag"), + canLink: equal("actionKey", "link"), + + didInsertElement() { + this._super(...arguments); + this.set("selectedTags", []); + }, @discourseComputed("siteSettings.watched_words_regular_expressions") placeholderKey(watchedWordsRegularExpressions) { @@ -47,6 +54,13 @@ export default Component.extend({ }, actions: { + changeSelectedTags(tags) { + this.setProperties({ + selectedTags: tags, + replacement: tags.join(","), + }); + }, + submit() { if (!this.isUniqueWord) { this.setProperties({ @@ -61,7 +75,10 @@ export default Component.extend({ const watchedWord = WatchedWord.create({ word: this.word, - replacement: this.canReplace || this.canTag ? this.replacement : null, + replacement: + this.canReplace || this.canTag || this.canLink + ? this.replacement + : null, action: this.actionKey, }); diff --git a/app/assets/javascripts/admin/addon/controllers/modals/admin-watched-word-test.js b/app/assets/javascripts/admin/addon/controllers/modals/admin-watched-word-test.js index 3dfbd278b56..3ce120419c0 100644 --- a/app/assets/javascripts/admin/addon/controllers/modals/admin-watched-word-test.js +++ b/app/assets/javascripts/admin/addon/controllers/modals/admin-watched-word-test.js @@ -6,15 +6,17 @@ import { equal } from "@ember/object/computed"; export default Controller.extend(ModalFunctionality, { isReplace: equal("model.nameKey", "replace"), isTag: equal("model.nameKey", "tag"), + isLink: equal("model.nameKey", "link"), @discourseComputed( "value", "model.compiledRegularExpression", "model.words", "isReplace", - "isTag" + "isTag", + "isLink" ) - matches(value, regexpString, words, isReplace, isTag) { + matches(value, regexpString, words, isReplace, isTag, isLink) { if (!value || !regexpString) { return; } @@ -22,7 +24,7 @@ export default Controller.extend(ModalFunctionality, { const regexp = new RegExp(regexpString, "ig"); const matches = value.match(regexp) || []; - if (isReplace) { + if (isReplace || isLink) { return matches.map((match) => ({ match, replacement: words.find((word) => diff --git a/app/assets/javascripts/admin/addon/templates/components/admin-watched-word.hbs b/app/assets/javascripts/admin/addon/templates/components/admin-watched-word.hbs index 26f8a9ebbda..53d61a9b97a 100644 --- a/app/assets/javascripts/admin/addon/templates/components/admin-watched-word.hbs +++ b/app/assets/javascripts/admin/addon/templates/components/admin-watched-word.hbs @@ -1,5 +1,5 @@ {{d-icon "times"}} {{word.word}} -{{#if isReplace}} +{{#if (or isReplace isLink)}} → {{word.replacement}} {{else if isTag}} → diff --git a/app/assets/javascripts/admin/addon/templates/components/watched-word-form.hbs b/app/assets/javascripts/admin/addon/templates/components/watched-word-form.hbs index 8d10aeb14da..be6727ca687 100644 --- a/app/assets/javascripts/admin/addon/templates/components/watched-word-form.hbs +++ b/app/assets/javascripts/admin/addon/templates/components/watched-word-form.hbs @@ -5,15 +5,29 @@ {{#if canReplace}}
- - {{text-field id="watched-replacement" value=replacement disabled=formSubmitted class="watched-word-input-field" autocorrect="off" autocapitalize="off" placeholderKey="admin.watched_words.form.replacement_placeholder"}} + + {{text-field id="watched-replacement" value=replacement disabled=formSubmitted class="watched-word-input-field" autocorrect="off" autocapitalize="off" placeholderKey="admin.watched_words.form.replace_placeholder"}}
{{/if}} {{#if canTag}}
- {{text-field id="watched-tag" value=replacement disabled=formSubmitted class="watched-word-input-field" autocorrect="off" autocapitalize="off" placeholderKey="admin.watched_words.form.tag_placeholder"}} + {{tag-chooser + id="watched-tag" + class="watched-word-input-field" + allowCreate=true + disabled=formSubmitted + tags=selectedTags + onChange=(action "changeSelectedTags") + }} +
+{{/if}} + +{{#if canLink}} +
+ + {{text-field id="watched-replacement" value=replacement disabled=formSubmitted class="watched-word-input-field" autocorrect="off" autocapitalize="off" placeholderKey="admin.watched_words.form.link_placeholder"}}
{{/if}} diff --git a/app/assets/javascripts/admin/addon/templates/modal/admin-watched-word-test.hbs b/app/assets/javascripts/admin/addon/templates/modal/admin-watched-word-test.hbs index 2b2361bb35b..92b6b22679c 100644 --- a/app/assets/javascripts/admin/addon/templates/modal/admin-watched-word-test.hbs +++ b/app/assets/javascripts/admin/addon/templates/modal/admin-watched-word-test.hbs @@ -5,7 +5,7 @@

{{i18n "admin.watched_words.test.found_matches"}}