Commit Graph
60975 Commits
Author SHA1 Message Date
Joffrey JAFFEUX 61e838781e FIX: ensures quick reactions usage shows in frequently (#34798)
Prior to this change we would have different context for quick reactions
and for channels this commit just move everything into one context which
is less surprising.
2025-09-15 07:48:22 +02:00
Ted Johansson b36747163b FEATURE: Allow hiding user fields on signup form (#34672)
We want to allow configuring fields that are both optional and editable to not show up in the signup form.

- Fields that are optional but not editable need to be on the signup form, or they can never be filled in.
- Fields that are not optional need to be on the signup form, or you can never sign up.
2025-09-15 10:42:07 +08:00
Ted Johansson 4c1ba3f051 UX: Polish for topic list controls (#34714)
Some small polish.
2025-09-15 09:57:22 +08:00
Selase Krakani 77e6d185a6 DEV: Add Intermediate DB support for user_associated_accounts (#34425)
Implement Discourse converter step and import step for
`user_associated_accounts`
2025-09-15 01:00:25 +00:00
Joffrey JAFFEUX ed6beea336 UX: control event display through a site setting (#34795)
Allows admins to set the `calendar_event_display` site setting to decide
how full-calendar should render events.

It accepts the following values:
- auto
- block
- list-item

And will default to: auto
2025-09-13 11:35:52 +02:00
Joffrey JAFFEUX 79928d858a FIX: removes custom fc-past-event (#34796)
fullcalendar will add fc-event-past class by itself, this commit also
correctly reapplies the opacity on past events.
2025-09-13 11:22:17 +02:00
Selase Krakani 99ace1be12 DEV: Add support for table-level constraints (#34739)
Allow table-level check constraints in the Intermediate DB


In https://github.com/discourse/discourse/pull/34339, I’ve worked on
distinguishing between `user_custom_fields` tied to `user_fields` and
arbitrary `user_custom_fields` entries.

To support this, I’ve made both `field_id` and `name` nullable, which
requires a table-level constraint to ensure each entry has either a
`field_id` (referencing `user_fields`) or an arbitrary `name` for the
value.

This first pass supports only named  table-level `CHECK` constraints.

## Usage

```yaml
user_custom_fields:
      columns:
        exclude:
          - "id"
        modify:
          - name: "name"
            nullable: true
        add:
          - name: "field_id"
            datatype: numeric
          - name: "is_multiselect_field"
            datatype: boolean
      indexes:
      # ...
      constraints:
        - name: "require_field_id_or_name"
          condition: "field_id IS NOT NULL OR name IS NOT NULL"
        - name: "disallow_both_field_id_and_name"
          type: check      # default, only `check` supported for now
          condition: "NOT (field_id IS NOT NULL AND name IS NOT NULL)"
```



```sql
CREATE TABLE user_custom_fields
(
    created_at           DATETIME,
    field_id             NUMERIC,
    is_multiselect_field BOOLEAN,
    name                 TEXT,
    user_id              NUMERIC  NOT NULL,
    value                TEXT,
    CONSTRAINT require_field_id_or_name CHECK (field_id IS NOT NULL OR name IS NOT NULL),
    CONSTRAINT disallow_both_field_id_and_name CHECK (NOT (field_id IS NOT NULL AND name IS NOT NULL))
);
```
2025-09-12 20:14:51 +00:00
David Taylor 1aa055cee2 FIX: Update 'modern mobile' regex following iOS 15 support drop (#34792) 2025-09-12 11:33:30 -04:00
Discourse Translator Bot 3a8a9f27ce Update translations (#34745) 2025-09-12 16:17:25 +02:00
Bianca Nenciu d82fcb8af8 FIX: Validate email length (#34786)
* The maximum total length of a user name or other local-part is 64
octets.

* The maximum total length of a domain name or number is 255 octets.
2025-09-11 18:58:07 +03:00
Kris 3dc4686cc1 FIX: check if _cardClickListenerSelectors selector exists before adding listener (#34779)
There's an error that happens when there's a required user field on an
existing account,

```
Uncaught TypeError: can't access property "addEventListener", document.querySelector(...) is null
    didInsertElement card-contents-base.js:114
    didInsertElement card-contents-base.js:112
```

This should help avoid it
2025-09-11 11:53:52 -04:00
Gary Pendergast 8990c973ec FIX: Define the typical AFL Grand Final date. (#34768)
The AFL Grand Final is typically help on the last Saturday of September,
though there are occasional exceptions. Since 2015, the Friday before
the Grand Final is a public holiday in Victoria, Australia.

This change defines the typical date for the public holiday, but allows
exceptions to be defined where necessary.
2025-09-11 11:21:31 +10:00
Gary Pendergast a9bac35678 FIX: Ensure base_path is correctly inserted into LLM triage messages. (#34778)
When the LLM Triage automation script causes a post to be placed in the
review queue, it includes a message linking to the rule responsible.

The string for this message included a placeholder for `base_path`, but
didn't interpolate it in the `i18n` call.
2025-09-11 11:21:06 +10:00
Kris f7238c188e UX: use more specific language for dynamic polls (#34769)
"Editing" can be a little misleading, because we technically only allow
adding/removing — if you edit an existing option the votes are reset.

This shortens the text by removing the "dynamic poll" text (seems
self-explanatory without naming it), and also specifies adding/removing


Before:
<img width="1252" height="878" alt="image"
src="https://github.com/user-attachments/assets/c583fa91-5b06-476e-b220-d9d86026e0de"
/>
<img width="1160" height="856" alt="image"
src="https://github.com/user-attachments/assets/16314712-71e2-4590-8093-b837b194fc32"
/>


After: 
<img width="1170" height="826" alt="image"
src="https://github.com/user-attachments/assets/8725a789-c2dd-44e0-8881-7b31871a4e58"
/>
<img width="1162" height="1012" alt="image"
src="https://github.com/user-attachments/assets/7ebacfee-1785-4d6f-8bca-73025db9a924"
/>


I also reduced padding to the poll info slightly to give text a little
more space before wrapping.
2025-09-10 09:14:32 -04:00
Joffrey JAFFEUX db974047e4 FIX: ensures category calendar is querying a date range (#34764)
We were loading all events and not just the displayed range for category
calendar, which would load too many events and mostly expired events.
2025-09-08 17:01:21 +02:00
dependabot[bot]dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Discourse CI
66f53ac5b9 Build(deps-dev): Bump ember-exam from 9.1.0 to 10.0.0 (#34572)
Bumps [ember-exam](https://github.com/ember-cli/ember-exam) from 9.1.0
to 10.0.0.
- [Release notes](https://github.com/ember-cli/ember-exam/releases)
-
[Changelog](https://github.com/ember-cli/ember-exam/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ember-cli/ember-exam/commits)

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Discourse CI <ci@ci.invalid>
2025-09-05 23:36:15 +02:00
Blake Erickson d7601c904d DEV: Skip flaky d-assign spec (#34749)
This test appears to be flaky. Specifically the last expect.

Follow up to: #34734

Also added a spoiler-alert flakey spec
2025-09-05 12:45:28 -06:00
chapoi 22b4d248d5 UX: ensure all blockquotes handle long word wrapping (#34748)
Meta report:
https://meta.discourse.org/t/long-words-in-embedded-solutions-arent-wrapped/380751/2
2025-09-05 16:34:57 +02:00
Kris 6a99e7490a UX: minor improvements to the admin email log layout (#34735)
Some minor improvements to the table layout

Giving long columns a little min width...

Before:
<img width="186" height="209" alt="image"
src="https://github.com/user-attachments/assets/d129b567-40e5-4d0c-a55b-d2252440f5e7"
/>

After:
<img width="332" height="291" alt="image"
src="https://github.com/user-attachments/assets/3b205942-ae31-4f45-ba91-9fab999c0267"
/>

Putting user info within a single link...

Before:
<img width="327" height="199" alt="image"
src="https://github.com/user-attachments/assets/54ece2d2-1ac5-4b9f-891a-dc62ea7a93b2"
/>


After: 
<img width="334" height="160" alt="image"
src="https://github.com/user-attachments/assets/ba1dd821-c9f9-4846-8c9f-a4c592923d33"
/>
2025-09-05 10:11:45 -04:00
dependabot[bot]dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Discourse CI
7d201b37ae Build(deps-dev): Bump webpack from 5.99.9 to 5.101.3 (#34737)
Bumps [webpack](https://github.com/webpack/webpack) from 5.99.9 to
5.101.3.
- [Release notes](https://github.com/webpack/webpack/releases)
-
[Commits](https://github.com/webpack/webpack/compare/v5.99.9...v5.101.3)

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Discourse CI <ci@ci.invalid>
2025-09-05 14:05:06 +02:00
Penar Musaraj 6c8c1bb7b6 DEV: Fix flaky assign spec (#34734) 2025-09-05 11:48:33 +08:00
Alan Guo Xiang Tan 568bf653ea DEV: Fix flaky system test (#34743)
This commit fixes the flaky "Admin Customize Themes Config Area Page
when there are components installed loads more components when scrolling
to the bottom"
system test by reducing the height of the window to totally prevent
infinite
loading from triggering until we scroll.
2025-09-05 11:32:51 +08:00
Alan Guo Xiang Tan 435ae4c5f3 DEV: Skip a broken spec (#34742)
When visiting a channel's members info route directly, the add member
button will always be shown because the logic to show the button assumes
that chat messages have been loaded. Skip for now while we figure out a
fix.
2025-09-05 11:32:29 +08:00
Alan Guo Xiang Tan dce4eb718b DEV: Update PageObjects::Components::FormKit#submit to click submit (#34740)
I don't see a good reason why we should be executing a script to submit
a form when we can just click the submit button.
2025-09-05 10:21:12 +08:00
Alan Guo Xiang Tan 128f18449e DEV: Remove unnecessary system test (#34741)
This commit removes `spec/system/user_invites_spec.rb` added in
55bf0e21fb. The system tests are flaky
because of the use of an [arbitrary `invite_redemption_delay` in

`User#invited_by`](https://github.com/discourse/discourse/blob/936ed3d8e78dfb802f37c5c36f2184710ab56c3e/app/models/user.rb#L613-L616).
In system test, the user is always going to be
created before the delay.

Also I don't think a system test is required here since we have unit
tests for the `User#invited_by` method. Hence, I'm removing the system
test instead of just fixing it.
2025-09-05 10:07:28 +08:00
dependabot[bot]dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Discourse CI
936ed3d8e7 Build(deps-dev): Bump puppeteer-core from 24.18.0 to 24.19.0 (#34738)
Bumps [puppeteer-core](https://github.com/puppeteer/puppeteer) from
24.18.0 to 24.19.0.
- [Release notes](https://github.com/puppeteer/puppeteer/releases)
-
[Changelog](https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md)
-
[Commits](https://github.com/puppeteer/puppeteer/compare/puppeteer-core-v24.18.0...puppeteer-core-v24.19.0)

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Discourse CI <ci@ci.invalid>
2025-09-05 07:02:59 +08:00
Sam 348423b960 FIX: can not click any reaction on ios (#34730)
Prevents a bug on iOS which would cause some unexpected scroll and
ultimately close the modal preventing the use of any reaction.
2025-09-05 00:49:00 +02:00
Kris 3a945f3663 UX: glimmerize CreateTopicButton, make btnType class variable for Horizon (#34733)
The Horizon theme was overriding `btn-default` styles for the new topic
button in the sidebar with custom CSS to achieve `btn-primary` styles.
Ideally we should be able to swap out the class and rely on that!

<img width="299" height="258" alt="image"
src="https://github.com/user-attachments/assets/3485fb0b-4714-49ce-9ac4-7e1ac6fb358b"
/>

So here I

 1. Convert CreateTopicButton to Glimmer component 
2. Add `@btnTypeClass` param - Allows parent components to specify the
button type
  (`btn-primary`, `btn-default`, etc.)
  3. Separate concerns:
    * `@btnClass` handles general class name needs (and existing use) 
    * `@btnTypeClass` handles core visual style
2025-09-04 17:16:33 -04:00
Bianca Nenciu f2b7224da4 FIX: Make web_hook_events#id a bigint (#34620)
Sites with many web hooks may come close to the limit of `int` due to
the high web hooks volume.
2025-09-04 22:20:34 +03:00
Penar MusarajandMartin Brennan 6f3a52c30d DEV: Add configurable limit for page param in TopicQuery (#34728)
Prevents pathological issues with crawlers querying topic lists with
very large page parameters. The new limit also allows us to tweak this
under specific instances or circumstances (high traffic, for example).

A `page` parameter above the limit will throw an `InvalidParameters`
400 error.

---------

Co-authored-by: Martin Brennan <martin@discourse.org>
2025-09-04 12:20:44 -04:00
dependabot[bot] 3d742d3b50 Build(deps): Bump puma from 6.6.0 to 7.0.0
Bumps [puma](https://github.com/puma/puma) from 6.6.0 to 7.0.0.
- [Release notes](https://github.com/puma/puma/releases)
- [Changelog](https://github.com/puma/puma/blob/master/History.md)
- [Commits](https://github.com/puma/puma/compare/v6.6.0...v7.0.0)

---
updated-dependencies:
- dependency-name: puma
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-04 17:12:44 +02:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 92738b3fdd Build(deps): Bump ace-builds from 1.43.2 to 1.43.3 (#34709)
Bumps [ace-builds](https://github.com/ajaxorg/ace-builds) from 1.43.2 to
1.43.3.
- [Release notes](https://github.com/ajaxorg/ace-builds/releases)
-
[Changelog](https://github.com/ajaxorg/ace-builds/blob/master/CHANGELOG.md)
-
[Commits](https://github.com/ajaxorg/ace-builds/compare/v1.43.2...v1.43.3)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-04 16:27:50 +02:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 553ecb1ee3 Build(deps-dev): Bump mime-types-data from 3.2025.0826 to 3.2025.0902 (#34721)
Bumps [mime-types-data](https://github.com/mime-types/mime-types-data)
from 3.2025.0826 to 3.2025.0902.
-
[Changelog](https://github.com/mime-types/mime-types-data/blob/main/CHANGELOG.md)
-
[Commits](https://github.com/mime-types/mime-types-data/compare/v3.2025.0826...v3.2025.0902)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-04 16:14:09 +02:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> fb22a3a125 Build(deps-dev): Bump rubocop from 1.80.1 to 1.80.2 (#34720)
Bumps [rubocop](https://github.com/rubocop/rubocop) from 1.80.1 to
1.80.2.
- [Release notes](https://github.com/rubocop/rubocop/releases)
-
[Changelog](https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md)
-
[Commits](https://github.com/rubocop/rubocop/compare/v1.80.1...v1.80.2)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-04 16:13:47 +02:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 145b34b0de Build(deps): Bump bigdecimal from 3.2.2 to 3.2.3 (#34717)
Bumps [bigdecimal](https://github.com/ruby/bigdecimal) from 3.2.2 to
3.2.3.
- [Release notes](https://github.com/ruby/bigdecimal/releases)
- [Changelog](https://github.com/ruby/bigdecimal/blob/master/CHANGES.md)
- [Commits](https://github.com/ruby/bigdecimal/compare/v3.2.2...v3.2.3)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-04 16:11:28 +02:00
Penar Musaraj a218dfbc04 DEV: Fix a rare bug where topic scrolls to OP unexpectedly (#34713)
Repro steps:
- enable the assign plugin
- check the `unassigned on close` and `reassign on open` site settings
- assign a topic with more than 5 posts to a user
- view the topic and scroll to post 5 or more
- close the topic
- open the topic
- repeat a few times (behaviour can be inconsistent)

Expected: topic reloads without scrolling away from the current post.

Current behaviour: topic scrolls to OP. Notice in the video that it also
scrolls to OP for any other clients that are on the same topic
(left-side browser is of a random user).


https://github.com/user-attachments/assets/0cc79bf2-a2e9-4a1e-b3e3-5f2b19763d8c


Why? The assign plugin passes `reload_topic: true, refresh_stream: true`
via MessageBus. On the frontend code, when we reload the topic we did
not pass the `post_number` to the request, and therefore the current
position was lost. Passing the current post number to the topic reload
fixes the issue because then in the frontend the topic model maintains
the right position.

Another option is to not trigger `refresh_stream=true` here. It feels
unnecessary to do so for assignments that are opened/closed. That said,
other plugins also use this option and may have a valid reason to do so.
2025-09-04 09:18:40 -04:00
Discourse Translator Bot 06b9718717 Update translations (#34723) 2025-09-04 12:27:34 +02:00
chapoiandOsamaSayegh 3e01922cb8 DEV: add automation trigger on-close-topic (#34705)
Adds a trigger to use when a topic closes.

---------

Co-authored-by: OsamaSayegh <asooomaasoooma90@gmail.com>
2025-09-04 12:00:32 +02:00
Natalie Tay 641ef5cd30 DEV: Remove remnant puts (#34716)
Remnant from https://github.com/discourse/discourse/pull/34678
2025-09-04 11:12:38 +08:00
Alan Guo Xiang Tan 21eb6cec2a DEV: Fix a flaky signup system test (#34715)
The test is flaky because the route which we are asserting for leads to
a redirect. If the assertion is called before the redirect, the test
passes. If the assertion is called after the redirect, the test fails.

Instead, we can just assert for the final state which we want to see.
The intermediate route itself is not important.
2025-09-04 11:04:36 +08:00
Jarek Radosz 423593fe22 DEV: Include mobile browserlist targets (#34707)
…for autoprefixer. This fixes missing prefixed props (like
`-webkit-text-size-adjust`) in cases where e.g. desktop Safari doesn't
support a property at all (`text-size-adjust`) but mobile Safari does
(but prefixed)
2025-09-04 01:51:06 +02:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> a061d9e8a4 Build(deps): Bump terser from 5.43.1 to 5.44.0 (#34711)
Bumps [terser](https://github.com/terser/terser) from 5.43.1 to 5.44.0.
- [Changelog](https://github.com/terser/terser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/terser/terser/compare/v5.43.1...v5.44.0)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-03 23:17:07 +02:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 850bb0beb7 Build(deps): Bump version_gem from 1.1.8 to 1.1.9 (#34708)
Bumps [version_gem](https://github.com/ruby-oauth/version_gem) from
1.1.8 to 1.1.9.
- [Release notes](https://github.com/ruby-oauth/version_gem/releases)
-
[Changelog](https://github.com/ruby-oauth/version_gem/blob/main/CHANGELOG.md)
-
[Commits](https://github.com/ruby-oauth/version_gem/compare/v1.1.8...v1.1.9)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-03 21:47:27 +02:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> dbd011c457 Build(deps): Bump pg from 1.6.1 to 1.6.2 (#34706)
Bumps [pg](https://github.com/ged/ruby-pg) from 1.6.1 to 1.6.2.
- [Changelog](https://github.com/ged/ruby-pg/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ged/ruby-pg/compare/v1.6.1...v1.6.2)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-03 19:46:13 +02:00
Kris 5c37e27844 UX: only remove paragaph margin in banner if it's the last child (#34695)
Using `last-of-type` means the margin is removed from the last
paragraph, even if there are other elements that fall at the end of the
banner... so we lose some needed space here:

<img width="977" height="258" alt="image"
src="https://github.com/user-attachments/assets/48195d9f-37b7-4a36-8ea6-96849d248b1e"
/>

if we use `last-child` it will ensure the `p` is actually the last node,
so space is retained

<img width="973" height="269" alt="image"
src="https://github.com/user-attachments/assets/763975d3-d184-4c22-ad8b-393aac9b5ee4"
/>
2025-09-03 13:02:19 -04:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> dda3a2da1f Build(deps): Bump immer from 10.1.1 to 10.1.3 (#34687)
Bumps [immer](https://github.com/immerjs/immer) from 10.1.1 to 10.1.3.
- [Release notes](https://github.com/immerjs/immer/releases)
- [Commits](https://github.com/immerjs/immer/compare/v10.1.1...v10.1.3)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-03 19:01:02 +02:00
Natalie Tay a9b1fb9b43 FIX: Add ld+json VideoObject to each lazy video (#34678)
Lazily loaded videos currently won't be picked up by search engines as
they do not contain an iframe or VideoObject.

This commit uses a new API `build_plugin_html
"server:topic-show-crawler-post-end"` to insert populated
[ld+json](https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data#supported-formats)
into the end of each post which has a video.

Results:
-
https://search.google.com/test/rich-results/result?id=vegb8Qkz7HThsMbFaeN2AQ
-
https://search.google.com/test/rich-results/result?id=asumX41RneM2tMstchv45A
- (vimeo)
https://search.google.com/test/rich-results/result?id=EZWOMJCkDqEQIHfOLkSkcw

Note: 

There were originally two ways around this 
- add each VideoObject to the `post.cook` all the time agnostic of
crawler view
- or add them to the `<head>` with appropriate metadata, needing to
duplicate all post meta data within a `isPartOf` attribute.

I chose to create a new api so that we can satisfy both "only add the
meta data in crawler view" and prevent post metadata duplication.
2025-09-03 22:01:14 +08:00
David Battersby 7ca6fe119e FIX: allow draft auto save after escaping modal (#34703)
When escaping the composer discard draft modal, this change allows users
to continue editing and auto save their draft as usual. With this
change, escaping the modal has the same functionality as the Keep
Editing button.

Internal ref: /t/-/162257
2025-09-03 17:42:15 +04:00
Discourse Translator Bot 95ea149548 Update translations (#34698) 2025-09-03 15:32:48 +02:00
David Battersby c795da91d0 FIX: reset category styles for ancestor recursion (#34702)
When both parent and child categories had the same style type, the icon
and emoji values would leak from the child to the parent when generating
the category badge html. When processing categories recursively in this
way we should unset these values to ensure they are taken from the
ancestor category directly rather than from an option.

### Before

<img width="459" height="81" alt="Screenshot 2025-09-03 at 3 30 39 PM"
src="https://github.com/user-attachments/assets/476b10ed-b9f9-4d84-bae2-6cd0dfbbf507"
/>


### After

<img width="461" height="73" alt="Screenshot 2025-09-03 at 3 30 24 PM"
src="https://github.com/user-attachments/assets/55960899-f0db-43d1-9831-c6087c42349e"
/>
2025-09-03 16:56:42 +04:00