Commit Graph
22021 Commits
Author SHA1 Message Date
Eva Sarafianou 24d3fed777 Update filippo.io/edwards25519 (#35422) 2026-02-25 11:27:48 -05:00
Ben Schumacher 60fbce7d03 [MM-67671] Add CJK Post search support for PostgreSQL (#35260)
Add LIKE-based CJK (Chinese, Japanese, Korean) search support for PostgreSQL, gated behind a `CJKSearch` feature flag.

PostgreSQL's built-in full-text search (`to_tsvector`/`to_tsquery`) does not support CJK languages because it relies on whitespace-based tokenization, which doesn't work for logographic/syllabic scripts that don't use spaces between words. This PR adds a `LIKE`-based fallback for search terms containing CJK characters.

**How it works:** When the `CJKSearch` feature flag is enabled and a search term contains CJK characters (Han, Hiragana, Katakana, or Hangul), the query builder generates `LIKE '%term%'` clauses instead of `to_tsvector @@ to_tsquery` expressions. Case-sensitive `LIKE` is used rather than `ILIKE` since CJK scripts have no letter casing, which also allows potential use of standard B-tree indexes.
2026-02-25 10:18:51 -05:00
sabril 7b5c34339d E2E/Test: Migrate flaky MM-T388 to playwright (#35369)
* migrate: MM-T388 to playwright

* remove test.describe
2026-02-25 14:28:21 +08:00
Harrison Healey b831c18f67 Increase minimum version of Node to 24 and NPM to 11 (#35413)
* Increase minimum version of NPM to 11

When we updated the Node.js version, I asked Saturn to make the Node/NPM
version checks looser because I didn't know about anything that would cause
the package-lock.json or package.json formats to change. It seems like NPM 10
is causing a few fields to be removed now, so we should require 11 to avoid
thrashing on that.

* And update the Node version
2026-02-25 11:58:04 +08:00
sabril 4b8ff4e6a3 fix: flaky MM-T5521-8 (#35385) 2026-02-24 11:36:00 +08:00
Elias Nahum 8fd7aea63c update intune doc link (#35166) 2026-02-23 17:57:33 -04:00
ec0ad9d1b1 Translations update from Mattermost Weblate (#35404)
* Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/

* Translated using Weblate (English (Australia))

Currently translated at 100.0% (2967 of 2967 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/en_AU/

* Translated using Weblate (English (Australia))

Currently translated at 95.3% (6714 of 7039 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/en_AU/

* Translated using Weblate (German)

Currently translated at 99.6% (2958 of 2967 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/de/

* Translated using Weblate (English (Australia))

Currently translated at 100.0% (2967 of 2967 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/en_AU/

* Translated using Weblate (English (Australia))

Currently translated at 100.0% (2967 of 2967 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/en_AU/

* Translated using Weblate (English (Australia))

Currently translated at 100.0% (2967 of 2967 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/en_AU/

* Translated using Weblate (English (Australia))

Currently translated at 100.0% (2967 of 2967 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/en_AU/

* Translated using Weblate (Polish)

Currently translated at 100.0% (2967 of 2967 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/pl/

* Translated using Weblate (English (Australia))

Currently translated at 100.0% (7039 of 7039 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/en_AU/

* Translated using Weblate (Polish)

Currently translated at 94.8% (6676 of 7039 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/pl/

* Translated using Weblate (German)

Currently translated at 100.0% (2967 of 2967 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/de/

* Translated using Weblate (German)

Currently translated at 97.3% (6849 of 7039 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/de/

* Translated using Weblate (Polish)

Currently translated at 95.1% (6696 of 7039 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/pl/

* Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 98.5% (6935 of 7039 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/zh_Hans/

* Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (2967 of 2967 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/zh_Hans/

* Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (7039 of 7039 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/zh_Hans/

* Translated using Weblate (Polish)

Currently translated at 95.3% (6710 of 7039 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/pl/

* Translated using Weblate (Dutch)

Currently translated at 99.9% (2966 of 2967 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/nl/

* Translated using Weblate (Dutch)

Currently translated at 98.7% (6954 of 7039 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/nl/

* Translated using Weblate (Dutch)

Currently translated at 99.7% (7021 of 7039 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/nl/

* Translated using Weblate (Dutch)

Currently translated at 100.0% (7039 of 7039 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/nl/

* Translated using Weblate (Polish)

Currently translated at 95.4% (6720 of 7039 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/pl/

---------

Co-authored-by: Matthew Williams <Matthew.Williams@outlook.com.au>
Co-authored-by: jprusch <rs@schaeferbarthold.de>
Co-authored-by: Roy Orbitson <roy-orbitson@devo.net.au>
Co-authored-by: master7 <marcin.karkosz@rajska.info>
Co-authored-by: ThrRip <coding@thrrip.space>
Co-authored-by: Tom De Moor <tom@controlaltdieliet.be>
2026-02-23 13:24:09 +00:00
Harshil SharmaandMattermost Build 8d511d77a8 Handled null column for scheduled post type in database (#35193)
* Handled null column for scheduled post type in database

* [skip ci]

* CI

* CI

* Minor improvement

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2026-02-23 08:45:07 +05:30
Harshil SharmaandMattermost Build b96f7c1a8d Content flagging actions implementation tests (#35035)
* Added tests for TestGetFlaggingConfiguration

* added tests for RemoveFlaggedPost

* added tests for KeepFlaggedPost

* Added tests for scrubPost and keep flagged post APp layer functions

* Added tests for DeleteAllForPost

* added tests for DeleteAllPostRemindersForPost

* Added tests for DataSpillageFooter

* Added tests for KeepRemoveFlaggedMessageConfirmationModal

* Added tests for KeepRemoveFlaggedMessageConfirmationModal

* Fixed lint errors

* lint fix

* Fixed query param

* fixed tests

* Used middleware to check for content flagging basic checks

* Added TestRequireContentFlaggingEnabled

* Updated tests

* refactoring to reduce code duplication

* review fixes

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2026-02-23 06:15:40 +05:30
Harrison Healey 033867a344 MM-67522 Add tests for syncing user statuses (#35269)
* MM-67522 Add tests for syncing user statuses

* Clean up newly added tests

* Fix style

* Use SyncResponse.StatusErrors when statuses fail to sync
2026-02-20 16:21:05 -05:00
Ben Cooke 334c1bcbb7 update default worker count for autotranslations (#35355) 2026-02-20 15:09:47 -05:00
Ben Cooke 100cde3a1a [MM-67587] Exclude system messages from autotranslation queue (#35267) 2026-02-20 15:09:23 -05:00
Harrison Healey 392253a168 MM-67539 Fix 'Last login' column in System Console Users table never being populated (#35239) 2026-02-20 15:01:12 -05:00
Ben Cooke e80dec2260 GetAllForObject, use Master instead of replica (#35356) 2026-02-20 14:47:55 -05:00
Pablo VélezandMattermost Build 7590aff7ab MM-64490 - Add ABAC system console E2E tests (#35066)
* MM-64490 - Add ABAC system console E2E tests

* split abac e2e tests in logical folders

* Export ABAC helpers from playwright-lib main package

* fix linter issues

* fix prettier

* fix linter

* revert unwanted changes to packa-lock

* Fix ABAC test to use refactored SystemConsoleSidebar API

* fix two failing tests

* fix prettier

* clean up before running the test to make them more reliable

* make create policy less flaky by adding better wait time

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2026-02-19 23:54:42 -05:00
Scott Bishel 8309cb6a07 Fix: Channels header disappears in Find Channels dialog during search (#35202)
The "Channels" header was flashing and then disappearing when typing in
the Find Channels dialog (Ctrl/Cmd+K). This was caused by the
fetchUsersAndChannels method returning results without the groups
structure that was introduced in MM-62990.
2026-02-19 08:41:41 -07:00
David Krauser c45ba96139 [MM-67565] Prevent setting protected=true on fields without source_plugin_id (#35265)
Add validation to block updates that would create orphaned protected fields (protected=true but no source_plugin_id), which cannot be modified by anyone.

Includes test coverage for single and bulk update paths.
2026-02-19 10:39:33 -05:00
sabril 4e81e504c4 Fix E2E-only PRs and duplicate E2E test runs after PR merges (#35368)
* use master or release base branch correctly for e2e-test-change only

* prevent duplicate run for PR already merged to master or release branch
2026-02-19 23:24:54 +08:00
Daniel Schalla 202334aaa0 Allow GH Bash Invocations (#35376) 2026-02-19 12:27:06 +00:00
Daniel Schalla 7ccafd7988 Fix PR Checkout (#35375) 2026-02-19 11:59:02 +00:00
Andre Vasconcelos 5f9ecb7e55 MM-67091 Fixing notification titles rendering encoded values as-is (#35001)
* fix: ensuring that webapp and mobile notifications decode special characters

* fix: linter error

* Replacing anonymous function with existing utility to escape regex

* Added missing characters to webapp handling, excluded markdown renderer from being affected

- Added tests that explicitly check for script injection
2026-02-19 13:44:36 +02:00
Daniel Schalla 0fa5e235bc Fix Permission Request for Docs Agent (#35373) 2026-02-19 12:07:09 +01:00
Pablo VélezandMattermost Build 31ebadd0b7 MM-66410 - standardize abac suggestions (#34446)
* MM-66410 - standardize abac suggestions

* make text translatable

* fix linter issues

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2026-02-19 00:29:04 -05:00
5d3a04760b [MM-67605] Add DCR redirect URI allowlist for OAuth DCR (#35291)
* [MM-67605] Add DCR redirect URI allowlist enforcement

Introduce ServiceSettings.DCRRedirectURIAllowlist with glob-based validation and enforce it during OAuth dynamic client registration to block unapproved redirect URIs. Add System Console wiring and tests for config validation, wildcard matching semantics, API error behavior, and localhost wildcard support.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Fix pre-commit checks: TypeScript type assertion, gofmt, and regenerate CI artifacts

- admin_definition_dcr_allowlist.test.tsx: Add AdminDefinitionSettingInput type assertion for 'multiple' property
- oauth_dcr_test.go: Fix comment spacing (gofmt)
- Regenerate mocks, go.sum, gen-serialized, mmctl-docs per CI requirements

Co-authored-by: Cursor <cursoragent@cursor.com>

* Revert unnecessary pre-commit regenerations

Revert mmctl docs, mocks, go.sum, and gen-serialized to master. Keep only
the TypeScript and gofmt fixes from the previous commit.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Fix import order in admin_definition_dcr_allowlist.test.tsx

Co-authored-by: Cursor <cursoragent@cursor.com>

* Fix i18n

* Update server/public/model/oauth_dcr.go

Co-authored-by: Eva Sarafianou <eva.sarafianou@gmail.com>

* Fix

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Eva Sarafianou <eva.sarafianou@gmail.com>
Co-authored-by: Mattermost Build <build@mattermost.com>
2026-02-19 01:06:08 +00:00
Scott Bishel 5318fc3ff3 MM-66830: Fix RHS panel snapping to minimum width on resize (#35236)
Race condition caused mousemove events to fire after reset() but before
cleanup, resulting in negative width calculations that CSS clamped to
min-width.
2026-02-18 18:02:13 -07:00
sabrilandMattermost Build 316ab57b0b fix(test): MM-T5523-1 column sort test to verify actual sort order (#35309)
Co-authored-by: Mattermost Build <build@mattermost.com>
2026-02-19 09:00:42 +08:00
Ben Cooke d6ef403b8f New translation for autotranslations (#34894) 2026-02-18 17:37:12 -05:00
Daniel Schalla 45f54a0e3f Implementation of Documentation Impact Review Workflow via GH Actions (#35358)
* Experiemntal Docs Agent

* Improve analysis section

* Remove PR Creation Features; Add some safety instructions

* Remove Safety Instructions after riskier operations were removed
2026-02-18 20:13:51 +01:00
David KrauserandClaude Sonnet 4.5 5c8b989428 [MM-67564] Reduce channel banner height to 24px with 13px font (#35338)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-18 13:43:19 -05:00
Ben Cooke 324b4937fd libre key fix (#35297) 2026-02-18 13:01:03 -05:00
Ben Cooke 6e28452434 [MM-67563] Change websocket format for translation update events (#35268) 2026-02-18 10:11:45 -05:00
cca467ab2f [MM-67530] Only show autotranslation permissions to licensed users (#35283)
* [MM-67530] Only show autotranslation permissions to licensed users

* Fix and add more tests

* Update webapp/channels/src/components/admin_console/permission_schemes_settings/permissions_tree/permissions_tree.test.tsx

Co-authored-by: Doug Lauder <wiggin77@warpmail.net>

* Update webapp/channels/src/components/admin_console/permission_schemes_settings/permissions_tree/permissions_tree.test.tsx

Co-authored-by: Doug Lauder <wiggin77@warpmail.net>

---------

Co-authored-by: Doug Lauder <wiggin77@warpmail.net>
Co-authored-by: Mattermost Build <build@mattermost.com>
2026-02-18 12:27:00 +01:00
dde324873f [MM-67531] Add beta label to auto translations feature (#35284)
* [MM-67531] Add beta label to auto translations feature

* Fix lint

* Update webapp/channels/src/components/admin_console/localization/localization.scss

Co-authored-by: Matthew Birtch <mattbirtch@gmail.com>

---------

Co-authored-by: Matthew Birtch <mattbirtch@gmail.com>
Co-authored-by: Mattermost Build <build@mattermost.com>
2026-02-18 12:26:37 +01:00
Andre Vasconcelos 46e35cecb5 Bumped prepackaged MS Calendar version to 1.6.0 (#35328) 2026-02-18 12:56:01 +02:00
Ben Cooke 932086e29c separate websocket event for translations metrics (#35296) 2026-02-17 23:29:01 -05:00
Pablo VélezandMattermost Build 71780f4e0a MM-66909 - Fix BoR sender not seeing priority label on new post (#34964)
* MM-66909 - Fix BoR sender not seeing priority label on new post

* Use RequestContextWithMaster for BoR priority fetching

* fix linter

* Add BoR post priority unit test

* unique error code and remove webapp workaround

* fix translation

* remove unnecessary line

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2026-02-17 20:10:30 -05:00
Pablo VélezandMattermost Build 5efc41c1bb MM-66442 - Add empty state message for ABAC channel modal (#34965)
* MM-66442 - Add empty state message for ABAC channel modal

* fix translation and ts issue

* Remove empty filter controls border in channel modal

* extract and memoize message

* adjust modal header title style and text color

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2026-02-17 20:06:40 -05:00
Pablo Vélez cef5134865 Mm 65975 - migrate team modal to generic modal (#35256)
* MM-65975 - migrate team modal to generic modal

* add e2e tests to team settings

* apply self review fixes, organize test pom and clean code

* fix cypress tests
2026-02-17 17:40:29 -05:00
Harrison Healey 2da1e56e6c MM-67323 Add system for plugins to use shared package and allow plugins to load asynchronously (#35183)
* Remove jest-junit and unignore build folder in web app packages

We don't actually use the file output by jest-junit, and I don't think we
have since we moved off of Jenkins for CI

* Move parcel-namer-shared into build folder

* MM-67323 Add loadSharedDependency API and script for plugins to use it

* Fix client and mattermost-redux packages missing const enums

* Change interface for webAppExternals
2026-02-17 12:57:49 -05:00
Maria A NunezandCursor 28406fbe23 Rename "Self-Deleting Messages" to "Burn-on-Read Messages" (#35318)
* Rename "Self-Deleting Messages" to "Burn-on-Read Messages"

Updated the Burn on Read feature naming in the System Console for consistency with the product terminology and made all Posts subsection titles translatable for better internationalization support.

- Renamed section title from "Self-Deleting Messages" to "Burn-on-Read Messages"
- Updated section description to clarify that messages delete after being read (removed "or sent")
- Added translation keys for all 6 Posts subsection titles
- Updated type definitions and UI components to support translatable subsection titles

Co-authored-by: Cursor <cursoragent@cursor.com>

* Linting

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-17 07:56:30 -05:00
Harshil SharmaandMattermost Build a69653ce2e Data spillage caching (#35016)
* Elliminated loadFlaggedPost

* Elliminated loadChannel

* WIP

* Cached teams data

* Always use Set in dataloader

* minor cleanup

* test: add tests for content flagging actions

* Added tests

* Handled user logout event in content flagging reducers

* Fixed content flagging playwrite tests

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2026-02-17 11:07:25 +05:30
sabril 0ec4a474d5 E2E/Test: Increase parallel tests and removed smoke tests (#35271)
* test: increase parallel tests and removed smoke tests both in cypress and playwright

* add duration and retest info

* indicate overall, first-pass and re-run run and test durations
2026-02-17 10:23:41 +08:00
53aa05d8c6 Interactive Dialog - DateTime manual entry and timezone support (#34932)
* Respect user display preferences for date and time formatting

User Preference Support:
- Read isUseMilitaryTime preference from user settings
- Apply 24-hour format when enabled (14:00 instead of 2:00 PM)
- Apply 12-hour format when disabled (2:00 PM instead of 14:00)
- Pass useTime prop to Timestamp component with correct hourCycle/hour12

Date Formatting Consistency:
- Create formatDateForDisplay() utility in date_utils.ts
- Centralize date formatting logic (month: 'short', day/year: 'numeric')
- Use consistent "Jan 15, 2025" format across all date/datetime fields
- Replace DateTime.fromJSDate().toLocaleString() which varies by browser

Components Updated:
- DateTimeInput: Use isMilitaryTime for dropdown and selected time display
- DateTimeInput: Use formatDateForDisplay for date display
- AppsFormDateField: Use formatDateForDisplay instead of inline Intl code

Tests Added:
- 4 tests for user preference handling (military time, locale)
- 5 tests for formatDateForDisplay utility
- Updated snapshot for Timestamp changes

Benefits:
- Single source of truth for date formatting
- Easy to change format globally by updating one function
- Respects user preferences consistently
- Fixes inconsistency where datetime showed "1/1/2026" vs date showing "Jan 1, 2026"

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>

* Add timezone and manual time entry support for datetime fields

Object Model:
- Create DialogDateTimeConfig with TimeInterval, LocationTimezone, AllowManualTimeEntry
- Add DateTimeConfig field to DialogElement
- Keep legacy MinDate, MaxDate, TimeInterval for fallback

Timezone Support (location_timezone):
- Display datetime in specific IANA timezone (e.g., "Europe/London", "Asia/Tokyo")
- Show timezone indicator: "🌍 Times in GMT"
- Preserve timezone through all operations
- Fix momentToString to clone before converting to UTC (prevents mutation)
- Use moment.tz array syntax for timezone-safe moment creation
- Generate time intervals starting at midnight in display timezone

Manual Time Entry (allow_manual_time_entry):
- Add parseTimeString() function supporting multiple formats:
  - 12-hour: 12a, 12:30p, 3:45pm
  - 24-hour: 14:30, 9:15
- Add TimeInputManual component with text input
- Conditional rendering: manual input OR dropdown
- No rounding for manual entry (exact minutes preserved)
- No auto-advance (validation only, show error for invalid format)
- Respects user's 12h/24h preference for placeholder

Critical Bug Fixes:
- Fix getTimeInIntervals to return Moment[] instead of Date[] (preserves timezone)
- Fix momentToString mutation: use .clone() before .utc()
- Use .clone() when calling .startOf('day') to preserve timezone
- Use moment.tz([...], timezone) array syntax instead of .tz().hour() mutation
- Display selected time using .format() instead of Timestamp component
- Fix null handling: optional fields start empty, show '--:--'
- Manual entry gets exact current time, dropdown gets rounded time

Component Updates:
- DateTimeInput: Add TimeInputManual component, parseTimeString, timezone handling
- AppsFormDateTimeField: Extract config, timezone indicator, pass timezone to child
- Modal components: Handle Moment | null signatures
- CSS: Add manual entry input styles with error states

Features:
- Timezone-aware time generation (dropdown starts at midnight in display TZ)
- Manual entry works with timezones (creates moments in correct TZ)
- Optional fields start empty (null value, no display default)
- Required datetime fields get rounded default from apps_form_component

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>

* Fix momentToString mutation - clone before converting to UTC

Prevents .utc() from mutating the original moment object.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>

* Add E2E test for 12h/24h time preference support

Test MM-T2530H verifies that datetime fields respect user's display preference:
- Sets preference to 24-hour format
- Verifies dropdown shows times as 14:00, 15:00, etc.
- Verifies selected time displays in 24-hour format
- Changes preference to 12-hour format
- Verifies dropdown shows times as 2:00 PM, 3:00 PM, etc.

Uses cy.apiSaveClockDisplayModeTo24HourPreference() to set user preference.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>

* Auto-round time to interval boundaries in DateTimeInput

Automatically rounds displayed time to timePickerInterval to ensure
consistent behavior across all callers.

Problem:
- DND modal and Custom Status modal showed unrounded times (e.g., 13:47)
- Should show rounded times (e.g., 14:00) to match dropdown intervals
- Some callers pre-rounded, others didn't (inconsistent)

Solution:
- Add useEffect in DateTimeInput that auto-rounds on mount
- Only calls handleChange if time needs rounding
- Uses timePickerInterval prop or 30-minute default
- Harmless for callers that already pre-round (no change triggered)

Behavior:
- DND modal: Now shows 14:00 instead of 13:47
- Custom Status: Still works (already pre-rounded, so no-op)
- Post Reminder: Still works (already pre-rounded, so no-op)
- Interactive Dialog: Still works (uses custom intervals)

Added 3 unit tests for auto-rounding behavior.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>

* lint fix

* Add deferred login cleanup to post_test.go 'not logged in' test

Ensures the test helper is logged back in after the logout test completes, preventing test state issues for subsequent tests.

Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>

* Add unit tests for parseTimeString and timezone handling

parseTimeString tests (9 test cases):
- 12-hour format with AM/PM (12a, 3:30pm, etc.)
- 24-hour format (14:30, 23:59, etc.)
- Time without minutes (defaults to :00)
- Invalid hours, minutes, and formats
- Edge cases (midnight 12:00am, noon 12:00pm)

Timezone handling tests (3 test cases):
- Preserve timezone in getTimeInIntervals
- Generate intervals starting at midnight in timezone
- Timezone conversion pattern verification

Total: 12 new tests added (32 total in file)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>

* Add E2E tests and webhook support for timezone/manual entry

E2E Tests Added (MM-T2530O through MM-T2530S):
- MM-T2530O: Manual time entry basic functionality
- MM-T2530P: Manual time entry multiple formats (12a, 14:30, 9pm)
- MM-T2530Q: Manual time entry invalid format handling
- MM-T2530R: Timezone support dropdown (London GMT)
- MM-T2530S: Timezone support manual entry (London GMT)

Webhook Server Support:
- Added getTimezoneManualDialog() to webhook_utils.js
- Added 'timezone-manual' case to webhook_serve.js
- Dialog with 3 fields: local manual, London dropdown, London manual

Bug Fixes:
- Skip auto-rounding for allowManualTimeEntry fields (preserve exact minutes)
- Generate dropdown options even when displayTime is null (use currentTime fallback)
- Scope Cypress selectors with .within() to avoid duplicate ID issues

All tests passing (13 total datetime tests).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>

* Fix ESLint no-multi-spaces in apps.ts

Remove extra spacing before comments to comply with ESLint rules.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>

* Fix gofmt formatting in integration_action.go

Align Options, MultiSelect, and Refresh field spacing to match Go formatting standards.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>

* more lint fixes

* css lint fix

* i18n-extract

* lint fixes

* update snapshot

* Fix modal scroll containment for datetime fields

The .modal-overflow class was applying overflow: visible to .modal-body,
which broke scroll containment when datetime fields were present. This
caused the entire form to scroll instead of scrolling within the modal-body
viewport.

Changes:
- Remove .modal-body overflow override from .modal-overflow class to
  preserve scroll containment while still allowing date/time popups to
  display correctly via z-index
- Remove italic styling from timezone indicator for cleaner appearance
- Remove redundant "Time" label from manual time entry input (aria-label
  is sufficient for accessibility)
- Add CSS rule to ensure "(optional)" label text is not bold

Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>

* fixes for cypress tests

* fix for using timezone crossing dates

* fix dateonly strings parse failures

* regex fix

* linter fix

---------

Co-authored-by: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>
Co-authored-by: Mattermost Build <build@mattermost.com>
2026-02-16 13:32:31 -07:00
Scott Bishel ad39398eee Add support for channel mentions in webhook attachments (#34235)
* Add support for channel mentions in webhook attachments

Implement client-side channel mention rendering in incoming webhook
attachments. Channel mentions (~channel-name) now render as clickable
links in attachment content fields (pretext, text, field values) while
correctly remaining as plain text in title/label fields.
2026-02-16 13:31:32 -07:00
Felipe MartinandCopilot 1be8a68dd7 feat: pluginapi: filewillbedownloaded / sendtoastmessage (#34596)
* feat: filewillbedonwloaded hook

* feat: error popup

* chore: make generated pluginapi

* tests

* feat: different errors for different download types

* feat: allow toast positions

* fix: avoid using deprecated i18n function

* feat: add plugin API to show toasts

* feat: downloadType parameter

* tests: updated tests

* chore: make check-style

* chore: i18n

* chore: missing fields in tests

* chore: sorted i18n for webapp

* chore: run mmjstool

* test: fixed webapp tests with new changes

* test: missing mocks

* fix: ensure one-file attachments (previews) are handler properly as thumbnails

* chore: lint

* test: added new logic to tests

* chore: lint

* Add SendToastMessage API and FileWillBeDownloaded hook

- Introduced SendToastMessage method for sending toast notifications to users with customizable options.
- Added FileWillBeDownloaded hook to handle file download requests, allowing plugins to control access to files.
- Updated related types and constants for file download handling.
- Enhanced PluginSettings to include HookTimeoutSeconds for better timeout management.

* Update webapp/channels/src/components/single_image_view/single_image_view.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* chore: copilot reviews

* test: head requests

* chore: linted the webapp

* tests: fixed path

* test: fixed mocked args

* allow sending message to a connection directly

* fix: hook thread safety

* chore: formatting

* chore: remove configuration from system console

* chore: release version

* chore: update signature

* chore: update release version

* chore: addressed comments

* fix: update file rejection handling to use 403 Forbidden status and include rejection reason header

* Fix nil pointer panic in runFileWillBeDownloadedHook

The atomic.Value in runFileWillBeDownloadedHook can be nil if no
plugins implement the FileWillBeDownloaded hook. This causes a panic
when trying to assert the nil interface to string.

This fix adds a nil check before the type assertion, defaulting to
an empty string (which allows the download) when no hooks have run.

Fixes:
- TestUploadDataMultipart/success panic
- TestUploadDataMultipart/resume_success panic

* test: move the logout test last

* chore: restored accidential deletion

* chore: lint

* chore: make generated

* refactor: move websocket events to new package

* chore: go vet

* chore: missing mock

* chore: revert incorrect fmt

* chore: import ordering

* chore: npm i18n-extract

* chore: update constants.tsx from master

* chore: make i18n-extract

* revert: conflict merge

* fix: add missing isFileRejected prop to SingleImageView tests

* fix: mock fetch in SingleImageView tests for async thumbnail check

The component now performs an async fetch to check thumbnail availability
before rendering. Tests need to mock fetch and use waitFor to handle
the async state updates.

* refactor: move hook logic to app layer

* chore: update version to 11.5

* Scope file download rejection toast to the requesting connection

Thread the Connection-Id header through RunFileWillBeDownloadedHook and
sendFileDownloadRejectedEvent so the WebSocket event is sent only to the
connection that initiated the download, instead of all connections for
the user.

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
server/public/v0.2.0
2026-02-16 17:10:39 +01:00
Pablo VélezandMattermost Build 37a9a30f40 Mm 66813 sso callback metadata (#34955)
* MM-66813 - Add server origin verification to mobile SSO callbacks

* Enhance mobile SSO security and deprecate code-exchange

* Update code-exchange deprecation to follow MM standards

* Use config SiteURL for srv param, fix flow terminology

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2026-02-16 11:07:02 -05:00
Daniel Espino GarcíaandMattermost Build a8dc8baa90 [MM-67235] Add support for autotranslations on GM and DM (#35255)
* [MM-67235] Add support for autotranslations on GM and DM

* Address copilot feedback

* Fix tests

* Fix bug and tests

* Address feedback

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2026-02-16 16:13:08 +01:00
catalintomai 8738f8c4b3 MM-67099 - Membership Sync fix (#35230) 2026-02-16 16:05:04 +01:00
d5eeebae82 Translations update from Mattermost Weblate (#35315)
* Translated using Weblate (Croatian)

Currently translated at 27.1% (1898 of 6987 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/hr/

* Translated using Weblate (Swedish)

Currently translated at 93.3% (6522 of 6987 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/sv/

* Translated using Weblate (Dutch)

Currently translated at 99.5% (2945 of 2958 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/nl/

* Translated using Weblate (Dutch)

Currently translated at 99.6% (2949 of 2958 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/nl/

* Translated using Weblate (Polish)

Currently translated at 98.9% (2928 of 2958 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/pl/

* Translated using Weblate (Polish)

Currently translated at 95.0% (6640 of 6987 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/pl/

* Translated using Weblate (German)

Currently translated at 100.0% (2958 of 2958 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/de/

* Translated using Weblate (German)

Currently translated at 95.7% (6691 of 6987 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/de/

* Translated using Weblate (Swedish)

Currently translated at 93.4% (6526 of 6987 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/sv/

* Translated using Weblate (Polish)

Currently translated at 99.3% (2938 of 2958 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/pl/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 78.1% (5460 of 6987 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/nb_NO/

* Translated using Weblate (Polish)

Currently translated at 95.1% (6650 of 6987 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/pl/

* Translated using Weblate (Polish)

Currently translated at 100.0% (2958 of 2958 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/pl/

* Translated using Weblate (Polish)

Currently translated at 95.2% (6657 of 6987 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/pl/

* Translated using Weblate (English (Australia))

Currently translated at 100.0% (2958 of 2958 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/en_AU/

* Translated using Weblate (English (Australia))

Currently translated at 100.0% (2958 of 2958 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/en_AU/

* Translated using Weblate (English (Australia))

Currently translated at 100.0% (2958 of 2958 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/en_AU/

* Translated using Weblate (English (Australia))

Currently translated at 100.0% (2958 of 2958 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/en_AU/

* Translated using Weblate (English (Australia))

Currently translated at 100.0% (2958 of 2958 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/en_AU/

* Translated using Weblate (English (Australia))

Currently translated at 100.0% (2958 of 2958 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/en_AU/

* Translated using Weblate (Ukrainian)

Currently translated at 88.2% (2611 of 2958 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/uk/

* Translated using Weblate (German)

Currently translated at 96.9% (6771 of 6987 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/de/

* Translated using Weblate (English (Australia))

Currently translated at 95.3% (6664 of 6987 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/en_AU/

* Translated using Weblate (Polish)

Currently translated at 95.4% (6667 of 6987 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/pl/

* Translated using Weblate (English (Australia))

Currently translated at 95.9% (6704 of 6987 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/en_AU/

* Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/

* Translated using Weblate (English (Australia))

Currently translated at 95.9% (6707 of 6987 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/en_AU/

* Translated using Weblate (English (Australia))

Currently translated at 96.0% (6709 of 6987 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/en_AU/

* Translated using Weblate (English (Australia))

Currently translated at 96.0% (6710 of 6987 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/en_AU/

---------

Co-authored-by: Milo Ivir <mail@milotype.de>
Co-authored-by: Kristoffer Grundström <swedishsailfishosuser@tutanota.com>
Co-authored-by: Tom De Moor <tom@controlaltdieliet.be>
Co-authored-by: master7 <marcin.karkosz@rajska.info>
Co-authored-by: jprusch <rs@schaeferbarthold.de>
Co-authored-by: Frank Paul Silye <frankps@gmail.com>
Co-authored-by: Roy Orbitson <roy-orbitson@devo.net.au>
Co-authored-by: Matthew Williams <Matthew.Williams@outlook.com.au>
Co-authored-by: Serhii Khomiuk <sergiy.khomiuk@gmail.com>
2026-02-16 14:50:29 +00:00
Nuno Simões 436f96f0e1 server: ignore tmp mattermost/shared in file (#35316)
The generation of notice-file is failing with
```
2026/02/16 10:20:39 NPM load failed  @mattermost/shared
2026/02/16 10:20:39 Error occured while generating notice.txt @mattermost/shared:http status code 404 when downloading "https://registry.npmjs.org/@mattermost/shared"
```

This relates with https://github.com/mattermost/mattermost/pull/35065 because
the package is still local and isn't yet published in npm

So, this is ignores the shared package while it isn't published.
2026-02-16 14:45:33 +01:00