From 6595b11e25535b3b2cf8d51249db057e4f9986f6 Mon Sep 17 00:00:00 2001 From: Isaac Janzen <50783505+janzenisaac@users.noreply.github.com> Date: Fri, 7 Feb 2025 10:27:26 -0600 Subject: [PATCH] DEV: Add `composer-service-cannot-submit-post` transformer (#30903) - Add `composer-service-cannot-submit-post` transformer to allow for disabling submit based on custom conditions - Add tests for transformer - Add a couple helpful appEvents, that plugins can use add custom error popups to plugin-defined fields. --- .../discourse/app/lib/transformer/registry.js | 1 + .../discourse/app/services/composer.js | 12 ++++- .../composer-service-cant-submit-post-test.js | 49 +++++++++++++++++++ 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 app/assets/javascripts/discourse/tests/acceptance/transformers/composer-service-cant-submit-post-test.js diff --git a/app/assets/javascripts/discourse/app/lib/transformer/registry.js b/app/assets/javascripts/discourse/app/lib/transformer/registry.js index 29cb63a4069..1dd1e17a9ee 100644 --- a/app/assets/javascripts/discourse/app/lib/transformer/registry.js +++ b/app/assets/javascripts/discourse/app/lib/transformer/registry.js @@ -9,6 +9,7 @@ export const VALUE_TRANSFORMERS = Object.freeze([ // use only lowercase names "category-description-text", "category-display-name", + "composer-service-cannot-submit-post", "header-notifications-avatar-size", "home-logo-href", "home-logo-image-url", diff --git a/app/assets/javascripts/discourse/app/services/composer.js b/app/assets/javascripts/discourse/app/services/composer.js index f532483beb1..f6fbfbec333 100644 --- a/app/assets/javascripts/discourse/app/services/composer.js +++ b/app/assets/javascripts/discourse/app/services/composer.js @@ -29,6 +29,7 @@ import getURL from "discourse/lib/get-url"; import { disableImplicitInjections } from "discourse/lib/implicit-injections"; import { wantsNewWindow } from "discourse/lib/intercept-click"; import { emojiUnescape } from "discourse/lib/text"; +import { applyValueTransformer } from "discourse/lib/transformer"; import { authorizesOneOrMoreExtensions, uploadIcon, @@ -1008,13 +1009,21 @@ export default class ComposerService extends Service { } const composer = this.model; + const cantSubmitPost = applyValueTransformer( + "composer-service-cannot-submit-post", + composer?.cantSubmitPost, + { model: composer } + ); - if (composer?.cantSubmitPost) { + if (cantSubmitPost) { if (composer?.viewFullscreen) { this.toggleFullscreen(); } this.set("lastValidatedAt", Date.now()); + this.appEvents.trigger("composer-service:last-validated-at-updated", { + model: composer, + }); return; } @@ -1752,6 +1761,7 @@ export default class ComposerService extends Service { clearLastValidatedAt() { this.set("lastValidatedAt", null); + this.appEvents.trigger("composer-service:last-validated-at-cleared"); } } diff --git a/app/assets/javascripts/discourse/tests/acceptance/transformers/composer-service-cant-submit-post-test.js b/app/assets/javascripts/discourse/tests/acceptance/transformers/composer-service-cant-submit-post-test.js new file mode 100644 index 00000000000..5da03a6b0d0 --- /dev/null +++ b/app/assets/javascripts/discourse/tests/acceptance/transformers/composer-service-cant-submit-post-test.js @@ -0,0 +1,49 @@ +import { click, fillIn, visit } from "@ember/test-helpers"; +import { test } from "qunit"; +import { withPluginApi } from "discourse/lib/plugin-api"; +import { acceptance } from "discourse/tests/helpers/qunit-helpers"; + +acceptance("composer-service-cannot-submit-post transformer", function (needs) { + needs.user(); + needs.settings({ + allow_uncategorized_topics: true, + }); + + test("applying a value transformation - disable submit", async function (assert) { + withPluginApi("1.34.0", (api) => { + api.registerValueTransformer( + "composer-service-cannot-submit-post", + () => { + // Return true -- explicitly block submission! + return true; + } + ); + }); + + await visit("/new-topic?title=topic title that is pretty long"); + await fillIn(".d-editor-input", "this is the *content* of a post"); + await click(".submit-panel .create"); + + assert.dom(".d-editor-input").exists("composer is still open"); + }); + + test("applying a value transformation - allow submission", async function (assert) { + withPluginApi("1.34.0", (api) => { + api.registerValueTransformer( + "composer-service-cannot-submit-post", + ({ value }) => { + // Return value (which should be `false`, as we have a valid new topic to create) + return value; + } + ); + }); + + await visit("/new-topic?title=topic title that is pretty long"); + await fillIn(".d-editor-input", "this is the *content* of a post"); + await click(".submit-panel .create"); + + assert + .dom(".d-editor-input") + .doesNotExist("closes the composer on successful creation"); + }); +});