discourse/app/assets/javascripts
Sérgio Saquetim 7b14cd98c7
DEV: Add behavior transformers (#27409)
This commit introduces the `behaviorTransformer` API to safely override behaviors defined in Discourse.

Two new plugin APIs are introduced:

- `addBehaviorTransformerName` which allows plugins and theme-components to add a new valid transformer name if they want to provide overridable behaviors;
- `registerBehaviorTransformer` to register a transformer to override behaviors.

It also introduces the function `applyBehaviorTransformer` which can be imported from `discourse/lib/transformer`. This is used to mark a callback containing the desired behavior as overridable and applies the transformer logic.

How does it work?

## Marking a behavior as overridable:
 
To mark a behavior as overridable, in Discourse core, first the transformer name must be added to `app/assets/javascripts/discourse/app/lib/transformer/registry.js`. For plugins and theme-components, use the plugin API `addBehaviorTransformerName` instead.

Then, in your component or class, use the function `applyBehaviorTransformer` to mark the Behavior as overridable and handle the logic:

- example:

```js
  ...
  @action
  loadMore() {
    applyBehaviorTransformer(
      "discovery-topic-list-load-more",
      () => {
        this.documentTitle.updateContextCount(0);
        return this.model
          .loadMore()
          .then(({ moreTopicsUrl, newTopics } = {}) => {
            if (
              newTopics &&
              newTopics.length &&
              this.bulkSelectHelper?.bulkSelectEnabled
            ) {
              this.bulkSelectHelper.addTopics(newTopics);
            }
            if (moreTopicsUrl && $(window).height() >= $(document).height()) {
              this.send("loadMore");
            }
          });
      },
      { model: this.model }
    );
  },
  ...	
```

## Overriding a behavior in plugins or themes

To override a behavior in plugins, themes, or TCs use the plugin API `registerBehaviorTransformer`:

- Example:

```js
withPluginApi("1.35.0", (api) => {
  api.registerBehaviorTransformer("example-transformer", ({ context, next }) => {
    console.log('we can introduce new behavior here instead', context);

    next(); // call next to execute the expected behavior
  });
});
```
2024-07-31 16:39:22 -03:00
..
admin DEV: Convert components/admin-user-field-item to native class (#28174) 2024-07-31 19:06:59 +01:00
custom-proxy Build(deps-dev): Bump glob from 10.4.2 to 10.4.3 (#27751) 2024-07-08 08:40:31 +08:00
deprecation-silencer DEV: Silence whitespace-eating-comment warnings (#27129) 2024-05-22 16:21:51 +02:00
dialog-holder Build(deps-dev): Bump webpack from 5.92.1 to 5.93.0 (#27882) 2024-07-12 01:30:31 +02:00
discourse DEV: Add behavior transformers (#27409) 2024-07-31 16:39:22 -03:00
discourse-common DEV: Fix random typos (#28103) 2024-07-26 23:13:12 +02:00
discourse-hbr DEV: Convert discourse-hbr to a regular package (#26562) 2024-04-08 20:00:34 +01:00
discourse-i18n FIX: Don't crash when MF definitions are missing 2024-07-29 18:13:17 +02:00
discourse-markdown-it SECURITY: Fixes for main (#28137) 2024-07-30 14:19:01 +08:00
discourse-plugins Build(deps): Bump the babel group across 1 directory with 2 updates (#27943) 2024-07-17 11:41:52 +01:00
discourse-widget-hbs Build(deps): Bump the babel group across 1 directory with 2 updates (#27943) 2024-07-17 11:41:52 +01:00
docs
ember-addons
ember-cli-progress-ci PERF: Improve production JS build in low-memory environments (#26849) 2024-05-02 11:43:59 +01:00
ember-production-deprecations DEV: Drop unused shims for Ember 3 deprecations (#26563) 2024-04-09 09:22:37 +01:00
float-kit DEV: Fix random typos (#28103) 2024-07-26 23:13:12 +02:00
locales FEATURE: Add Uyghur language (#27183) 2024-05-27 09:58:18 +02:00
pretty-text Build(deps): Bump the babel group across 1 directory with 2 updates (#27943) 2024-07-17 11:41:52 +01:00
select-kit DEV: Clean up imports (#28060) 2024-07-25 15:09:06 +02:00
theme-transpiler Build(deps): Bump terser from 5.31.2 to 5.31.3 (#27944) 2024-07-17 11:42:10 +01:00
truth-helpers Build(deps): Bump ember-auto-import from 2.7.3 to 2.7.4 (#27615) 2024-06-26 01:35:06 +02:00
.npmrc
handlebars-shim.js
polyfills.js
run-patch-package
service-worker.js.erb DEV: Drop workbox dependency (#26735) 2024-04-24 10:19:12 +01:00