Commit Graph

58975 Commits

Author SHA1 Message Date
2dfafe3fd2 DEV: Report runtime duration of each parallel test process (#32457)
This information is generally useful to know and it simple for us to
instrument.
2025-04-25 15:23:53 +08:00
27ebf5f41a FIX: add category title badges to boxed layout (#32395)
This was missed when adding category badges in #32109. Category title
badges are now added when the site setting for `Desktop category page
style` or `Mobile category page style` is set to either:

- Boxes with Subcategories
- Boxes with Featured Topics
2025-04-25 11:20:41 +04:00
1d7c1eca27 DEV: Move SiteSettingFilter to admin namespace (#32458)
100% lift-and-shift of SiteSettingFilter into the admin JS namespace, where it is exclusively used.
2025-04-25 14:13:49 +08:00
3f845c6cdd UX: Better differentiation for dark-mode (#32450) 2025-04-24 16:29:00 -05:00
0ef80077e4 DEV: Pass toggleNavigationMenu to above sidebar PluginOutlet (#32449) 2025-04-24 13:31:54 -05:00
fcf2ba8c8a UX: rich editor placeholder edge case (#32448) 2025-04-24 14:48:38 -03:00
588caa60b9 UX: Add missing discourse-table SVG icon (#32447)
Meta:
https://meta.discourse.org/t/icon-missing-in-admin-panel-after-updating-discourse-today/363295

The `discourse-table` icon usage was introduced in
464726d973.
However, the SVG doesn't exist in core, but instead in the [AI
plugin](https://github.com/discourse/discourse-ai/blob/main/svg-icons/icons-sprite.svg?short_path=9d0511c).

The PR adds this SVG icon to the core.
2025-04-24 13:45:24 -04:00
8533e2017e UX: Locale and name shouldn't be "optional" (#32446)
## 🔍 Overview
The validation was already working and you can't submit localizations
without name and locale, but we want to add the client-side validation
and ensure the "optional" label is removed from the form.

## 📸 Screenshots

### ←Before
![Screenshot 2025-04-24 at 10 08
54](https://github.com/user-attachments/assets/088e7281-b03c-4c7f-8454-451c0cb53348)

### → After
![Screenshot 2025-04-24 at 10 07
35](https://github.com/user-attachments/assets/3a6e4b1f-714c-44c8-acae-bb96f63bf9f6)
2025-04-24 10:28:38 -07:00
a31a2d9a9f UX: Remove position & z-index style (#32445) 2025-04-24 12:15:19 -05:00
4e62990648 UX: Fix content from not showing above composer (#32443) 2025-04-24 12:03:28 -05:00
c38b50994d PERF: Enable brotli in NGINX (#32333)
This enables on-the-fly brotli compression at level 4 for all responses
which we currently gzip. This level should provide slightly improved
file sizes when compared to gzip, as well as slightly faster processing
times. This is the [level which Cloudflare
use](https://blog.cloudflare.com/results-experimenting-brotli/) for
dynamic responses.

When compared to our existing gzip level-5 configuration, our own
experiments confirm that it provides slightly faster compression, with
slightly smaller file sizes.

For static assets which are cached by CDNs/browsers, we use brotli level
6 for an even better compression ratio.
2025-04-24 15:45:13 +01:00
fe12500767 UX: Do not let composer affect chat window height (#32423) 2025-04-24 09:32:28 -05:00
bc6dae07ee DEV: Don't attempt to install minio binary in CI (#32438)
The binary is already preinstalled in the Docker image so we don't have
to attempt to install it again.

### Reviewer notes

Installing the minio binary is taking more than 45 seconds consistently
causing the test to timeout:
https://github.com/discourse/discourse/actions/runs/14638755310/job/41075932169

<img width="1091" alt="Screenshot 2025-04-24 at 6 15 48 PM"
src="https://github.com/user-attachments/assets/ec746740-fe46-4ef8-8a76-c210be1e3204"
/>
2025-04-24 18:58:58 +08:00
ed2740d0ca FIX: correctly reset panel when resizing window (#32437)
The problem is mainly that we also have a css animation made from js
which was setting a different width for the panel, so the `style.width =
"auto"` was not overriding this part. This animation happens in a parent
component after `didResizeContainer` is called, so it could be fine most
of the times, but the simpler change is to ensure, panel resize, or
window resize ends up in the same codepath so whatever the developer
decides to do in `didResizeContainer` hook will be applied in both
cases.

No test as it's fairly hard to test and would require a complex system
spec setup.

It avoids this situation where the side panel is larger than viewport
after window resize:
![Screenshot 2025-04-24 at 11 58
09](https://github.com/user-attachments/assets/8b58793a-32dc-4bc8-9989-7498e458c059)
2025-04-24 20:31:55 +10:00
199d7fb074 DEV: Reduce runtime of spec/system/(login|signup)_spec.rb (#32436)
This commit applies a similar optimisation as
d0d755ad8c478db45e3298df9de1cdabe59d9592.

Basically, the `full_page_login` site setting is going to be dropped
this week and these extra system tests we are running due to this site
setting is accounting for a significant percentage of the overall
runtime for core system tests.

### Reviewer notes

The PR to remove the `full_page_login` site setting is at
https://github.com/discourse/discourse/pull/32189 and scheduled to be
merged by us on 29th April.
2025-04-24 17:55:29 +08:00
ce76d7aaa7 DEV: Avoid unnecessary redirect in system tests when visiting a topic (#32418)
Visiting `/t/-/<topic_id>` results in an extra redirect request.
2025-04-24 16:59:08 +08:00
86f35b6a17 DEV: More linting fix (#32435) 2025-04-24 16:30:13 +08:00
d0d755ad8c DEV: Remove social authentication system tests for non full page login (#32433)
The `full_page_login` site setting is going to be removed soon so I am
dropping the social authentication system tests for when
`SiteSetting.full_page_login = false`.

This cuts the runtime for `spec/system/social_authentication_spec.rb` by
half from around 4 minutes to 2 minutes on my local machine.
2025-04-24 16:12:30 +08:00
8ebc202355 DEV: Fix linting (#32434) 2025-04-24 16:11:47 +08:00
2038c9c03f DEV: Simplify "Admin Flags Page" system test to reduce runtime duration (#32431)
This particular system test is taking a long time (~20 seconds) on CI
because it is doing many full page loads. This commit refactors the test
to be more efficient about the number of full page loads triggered by
the tests thus reducing the runtime by half.

Co-authored-by: Krzysztof Kotlarek <kotlarek.krzysztof@gmail.com>
2025-04-24 15:47:22 +08:00
846fbb7c75 Build(deps-dev): Bump puppeteer-core from 24.7.0 to 24.7.1 (#32428)
Bumps [puppeteer-core](https://github.com/puppeteer/puppeteer) from
24.7.0 to 24.7.1.
- [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.7.0...puppeteer-core-v24.7.1)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-24 16:23:13 +10:00
59d0062f90 Build(deps): Bump connection_pool from 2.5.1 to 2.5.2 (#32425)
Bumps [connection_pool](https://github.com/mperham/connection_pool) from
2.5.1 to 2.5.2.
-
[Changelog](https://github.com/mperham/connection_pool/blob/main/Changes.md)
-
[Commits](https://github.com/mperham/connection_pool/compare/v2.5.1...v2.5.2)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-24 12:40:26 +08:00
d059938dde DEV: Avoid installing minio binaries in CI (#32432)
We are seeing test timeouts on CI due to attempts to download the minio
binaries while the tests are running. Example backtrace:

```
  /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-protocol-0.2.2/lib/net/protocol.rb:229:in `wait_readable'
  /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-protocol-0.2.2/lib/net/protocol.rb:229:in `rbuf_fill'
  /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-protocol-0.2.2/lib/net/protocol.rb:164:in `read'
  /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-http-0.6.0/lib/net/http/response.rb:723:in `read'
  /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-http-0.6.0/lib/net/http/response.rb:631:in `read_chunked'
  /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-http-0.6.0/lib/net/http/response.rb:595:in `block in read_body_0'
  /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-http-0.6.0/lib/net/http/response.rb:570:in `inflater'
  /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-http-0.6.0/lib/net/http/response.rb:593:in `read_body_0'
  /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-http-0.6.0/lib/net/http/response.rb:363:in `read_body'
  /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-http-0.6.0/lib/net/http/response.rb:401:in `body'
  /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-http-0.6.0/lib/net/http/response.rb:321:in `reading_body'
  /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-http-0.6.0/lib/net/http.rb:2430:in `transport_request'
  /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-http-0.6.0/lib/net/http.rb:2384:in `request'
  /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/webmock-3.25.1/lib/webmock/http_lib_adapters/net_http.rb:108:in `block in request'
  /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/webmock-3.25.1/lib/webmock/http_lib_adapters/net_http.rb:113:in `request'
  /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-http-0.6.0/lib/net/http.rb:1990:in `get'
  /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/minio_runner-0.1.2/lib/minio_runner/network.rb:36:in `block in get'
  /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/webmock-3.25.1/lib/webmock/http_lib_adapters/net_http.rb:130:in `start_without_connect'
  /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/webmock-3.25.1/lib/webmock/http_lib_adapters/net_http.rb:157:in `start'
  /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-http-0.6.0/lib/net/http.rb:1070:in `start'
  /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/minio_runner-0.1.2/lib/minio_runner/network.rb:31:in `get'
  /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/minio_runner-0.1.2/lib/minio_runner/network.rb:64:in `block in download'
  /usr/local/lib/ruby/3.3.0/tempfile.rb:371:in `open'
  /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/minio_runner-0.1.2/lib/minio_runner/network.rb:63:in `download'
  /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/minio_runner-0.1.2/lib/minio_runner/binary_manager.rb:48:in `download_binary'
  /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/minio_runner-0.1.2/lib/minio_runner/binary_manager.rb:23:in `install'
  /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/minio_runner-0.1.2/lib/minio_runner/binary_manager.rb:9:in `install'
  /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/minio_runner-0.1.2/lib/minio_runner.rb:69:in `install_binaries'
  /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/minio_runner-0.1.2/lib/minio_runner.rb:52:in `start'
  /__w/discourse/discourse/spec/support/system_helpers.rb:201:in `setup_or_skip_s3_system_test'
  /__w/discourse/discourse/spec/system/s3_secure_uploads_spec.rb:26:in `block (3 levels) in <main>'
```
2025-04-24 12:11:07 +08:00
10c817fab5 FEATURE: Set category localizations in category settings (#32412)
This update is a follow-up to b0ab1b2321, where we now allow localizations for a category to be set in the category settings UI.
2025-04-24 10:48:35 +08:00
4c443283cf UX: Border radius removal (#32424) 2025-04-23 16:38:59 -05:00
621c3483d9 DEV: tentatively fix some flaky rich editor tests (#32421) 2025-04-23 17:19:18 -03:00
d3af1abf70 A11Y: welcome banner heading should not be an H1 (#32420)
The H1 doesn't work here because the same text appears on all top level
discovery pages and it doesn't describe the page content or purpose.

So for example, navigating from heading to heading with a screen
reader... on every discovery page you'd end up hitting "welcome back,
username" before jumping to the next heading level (which are topic
titles) — this is undesirable.

The H1 was adding bold and margin, so I've added that to the class.
There are no visual changes.
2025-04-23 13:43:09 -04:00
c696a03232 DEV: add before-user-profile-bio plugin outlet and componentize CollapseInfo (#32371)
- Add before-user-profile-bio plugin outlet 
- Convert collapsed content into a component (`CollapseInfo`) and pass
any necessary arguments
2025-04-23 12:32:35 -05:00
f545728c8b A11Y: site-text-logo should not be an H1 (#32405)
Without a site logo we render a the site name in the header as text,
this is a nice fallback!


![image](https://github.com/user-attachments/assets/007b9ad3-cbd7-4bcf-b5a3-6e4c813609b2)

...but it's marked up as an H1, and having the same H1 on every page
means it's not a meaningful page heading and can make headings fairly
annoying to navigate using screenreaders and other assistive
technologies

This converts it to a div and ensures that it retains the bold styling
previously applied by the heading tag. Font size is already handled by
the ID, so there are no visual changes as a result.
2025-04-23 12:42:56 -04:00
6abda2a3ef UX: improve input rules for rich editor autolink/linkify (#32366)
Adds support to creating an "autolink" by explicitly typing the
`<https://link>`.

Changes linkification while typing to only act when `markup` is
`linkify` (so, not a `[normal](link)` nor an `<autolink>`), and adds a
test to make sure `<http://auto.links>` won't convert to a `linkify`
while typing.

Avoids linkifying within code when pasting `text/html`.

Removes the `markup: "linkify"` when pasting a URL over a selection, as
that will create a `[normal](link)` instead.

Fixes the case on Firefox when you're typing an `example.com` URL
mid-paragraph and it stopped the link mark before the last letter,
leaving an un-linked dangling `m`.

Also uses a `linkify.test()` call before `linkify.match()` for "best
speed" as per
https://markdown-it.github.io/linkify-it/doc/#LinkifyIt.prototype.match.
2025-04-23 11:43:31 -03:00
129e3a9bec DEV: Fix flaky User#silenced_till test (#32419)
### What is happening?

For some reason, not on local, and not on PRs, but in the build
pipeline, the precision of the timestamp changes during a database
roundtrip, causing the build to fail.

This fixes the build.
2025-04-23 21:29:26 +08:00
e19e43f1bd FIX: Delegate silenced_till from anonymous user to main user account (#32416)
When a user is silenced they can, given they have the permissions, enter anonymous mode and keep posting, essentially bypassing the silence that way.

This change delegates the silenced_till attribute to the main user record if the user is anonymous.
2025-04-23 16:34:51 +08:00
9f280872f8 DEV: remove scrolling mixin (#32399)
Follow up to https://github.com/discourse/discourse/pull/32212 which
replaced the use of this mixin with a service.
2025-04-23 14:22:44 +08:00
21c8d6fe53 Build(deps-dev): Bump rubocop-rspec from 3.5.0 to 3.6.0 (#32372)
Bumps [rubocop-rspec](https://github.com/rubocop/rubocop-rspec) from
3.5.0 to 3.6.0.
- [Release notes](https://github.com/rubocop/rubocop-rspec/releases)
-
[Changelog](https://github.com/rubocop/rubocop-rspec/blob/master/CHANGELOG.md)
-
[Commits](https://github.com/rubocop/rubocop-rspec/compare/v3.5.0...v3.6.0)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-23 13:46:56 +08:00
e531a451f4 Build(deps-dev): Bump lefthook from 1.11.10 to 1.11.11 (#32383)
Bumps [lefthook](https://github.com/evilmartians/lefthook) from 1.11.10
to 1.11.11.
- [Release notes](https://github.com/evilmartians/lefthook/releases)
-
[Changelog](https://github.com/evilmartians/lefthook/blob/master/CHANGELOG.md)
-
[Commits](https://github.com/evilmartians/lefthook/compare/v1.11.10...v1.11.11)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-23 13:46:13 +08:00
4284379ffb Build(deps): Bump nokogiri from 1.18.7 to 1.18.8 (#32384)
Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.18.7
to 1.18.8.
- [Release notes](https://github.com/sparklemotion/nokogiri/releases)
-
[Changelog](https://github.com/sparklemotion/nokogiri/blob/main/CHANGELOG.md)
-
[Commits](https://github.com/sparklemotion/nokogiri/compare/v1.18.7...v1.18.8)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-23 13:46:04 +08:00
a024e663f9 Build(deps): Bump stringio from 3.1.6 to 3.1.7 (#32385)
Bumps [stringio](https://github.com/ruby/stringio) from 3.1.6 to 3.1.7.
- [Release notes](https://github.com/ruby/stringio/releases)
- [Changelog](https://github.com/ruby/stringio/blob/master/NEWS.md)
- [Commits](https://github.com/ruby/stringio/compare/v3.1.6...v3.1.7)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-23 13:45:57 +08:00
1278e8f7c6 Build(deps-dev): Bump bullet from 8.0.3 to 8.0.5 (#32386)
Bumps [bullet](https://github.com/flyerhzm/bullet) from 8.0.3 to 8.0.5.
- [Changelog](https://github.com/flyerhzm/bullet/blob/main/CHANGELOG.md)
- [Commits](https://github.com/flyerhzm/bullet/compare/8.0.3...8.0.5)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-23 13:45:44 +08:00
5f70aa6308 Build(deps-dev): Bump puppeteer-core from 24.6.1 to 24.7.0 (#32407)
Bumps [puppeteer-core](https://github.com/puppeteer/puppeteer) from
24.6.1 to 24.7.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.6.1...puppeteer-core-v24.7.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-04-23 13:44:19 +08:00
069303bb1c Build(deps-dev): Bump rubocop from 1.75.2 to 1.75.3 (#32408)
Bumps [rubocop](https://github.com/rubocop/rubocop) from 1.75.2 to
1.75.3.
- [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.75.2...v1.75.3)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-23 13:43:56 +08:00
98d4c17a92 Build(deps): Bump net-imap from 0.5.6 to 0.5.7 (#32409)
Bumps [net-imap](https://github.com/ruby/net-imap) from 0.5.6 to 0.5.7.
- [Release notes](https://github.com/ruby/net-imap/releases)
- [Commits](https://github.com/ruby/net-imap/compare/v0.5.6...v0.5.7)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-23 13:43:44 +08:00
dd622bbfc5 FIX: allow to email backup even if backups disabled (#32415)
In this PR, we allowed to download backups even if backups are disabled:

https://github.com/discourse/discourse/pull/32396

This PR is fixing bug and allowing email action.
2025-04-23 11:04:41 +08:00
d3e1158d4c FIX: hide unnecessary tabs and buttons when backups disabled (#32396)
When backups are disabled, backup files and logs tabs should be hidden.
Same for backup and read only button.

Demo


https://github.com/user-attachments/assets/7ce373cc-4fab-4f0f-89ef-d9fc7b889255


https://meta.discourse.org/t/disabling-backups-does-not-remove-item-from-admin-sidebar/36209
2025-04-23 10:22:31 +08:00
25938208ff FIX: recalculate respects default invitee trust level (#32393)
Currently, trust level is calculated with this formula:
`[granted_trust_level, previous_trust_level,
SiteSetting.default_trust_level].max`

When a user is invited, SiteSetting.default_invitee_trust_level should
be respected in that calculation.
2025-04-23 09:49:44 +08:00
e4c70e37cc DEV: remove scroll-top mixin file (#32398)
Follow up to https://github.com/discourse/discourse/pull/32367, and
removal of references to this mixin file from other supported repos.

This deletes the mixin file, the logic is duplicated in
1e0d773b54/app/assets/javascripts/discourse/app/lib/scroll-top.js.
2025-04-23 09:45:38 +08:00
b888ec07cb UX: Chat more message actions adjustments (#32404) 2025-04-22 16:36:21 -05:00
822a4f8195 UX: avoid nested paragraph tags causing extra large category descriptions (#32403)
It seems there are some situations where we can get nested paragraph
tags in category headings, and in these cases we end up with
twice-as-large descriptions. Moving the font-size rule to the parent
avoids this.


Before:

![image](https://github.com/user-attachments/assets/c4ff27e3-a16f-463a-a330-04d44e178f7e)


After:

![image](https://github.com/user-attachments/assets/b33e9a8e-6b48-48b8-b13f-76736aac1ac3)
2025-04-22 16:12:47 -04:00
f9273ddcb7 A11Y: add aria-label to reply count link in topic list (#32402)
At the moment the reply count is labelled by the topic list's header
column, which is good — but we don't actually describe what the link
does, so it's a little ambiguous.

This adds an aria-label to describe the behavior "jump to first post" so
it will be read as:

"n replies, jump to first post" 

This provides better coverage for link-to-link navigation because it
both describes the number and the function.
2025-04-22 15:22:52 -04:00
e887a389fe DEV: generate identifier for collections (#32368)
This is particularly important for array of primitives, eg: `["a", "b",
"c"]` where ember will struggle to know it's re-rendering the same
object.

The previous code was mostly working by chance as calling index on
something almost works for anything in javascript. But since we
introduced array of primitives in collections, we could now end up with
an `undefined` value for the items of the collection, and calling
`index` on `undefined` would raise an error.

This commit create a more general and explicit solution to this problem.
2025-04-22 14:33:40 +02:00
8367819b1b DEV: Attempt at stabilizing components listing page system spec (#32352)
This commits reworks the assertions for components shown on the components listing page to eliminate flakiness we've seen with those assertions.
2025-04-22 11:04:10 +03:00