mirror of
https://github.com/mattermost/mattermost.git
synced 2026-04-15 05:57:37 -04:00
15 commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
6b28864fdc
|
E2E/Cypress: Upgrade cypress to 15.11 (#35466)
* chore: upgrade cypress to 15.11 * update per comment * update flaky test (while here) --------- Co-authored-by: Mattermost Build <build@mattermost.com> |
||
|
|
db55f9fa43
|
MM-66653: migrate i18n extraction from mmjstool to @formatjs/cli (#34498)
* feat(webapp): migrate i18n extraction from mmjstool to @formatjs/cli
Replace custom mmjstool with industry-standard @formatjs/cli for i18n
message extraction. Adds support for localizeMessage as a recognized
extraction function and enables comprehensive ESLint rules for i18n.
Changes by area:
Dependencies (package.json):
- Add @formatjs/cli v6.7.4
- Remove @mattermost/mmjstool dependency
- Replace i18n-extract script with formatjs command
- Remove mmjstool-specific scripts (clean-empty, check-empty-src)
- Add i18n-extract:check for diff validation
Code (utils.tsx):
- Refactor localizeMessage to accept MessageDescriptor format
- Support {id, defaultMessage, description} parameters
- Maintain Redux store access (non-React context compatible)
- Add comprehensive JSDoc documentation
Linting (.eslintrc.json):
- Configure formatjs settings with additionalFunctionNames
- Enable 9 formatjs ESLint rules including enforce-id (error)
- Ensure all messages require explicit manual IDs
CI/CD (webapp-ci.yml):
- Simplify i18n check to formatjs extraction + diff
- Remove mmjstool and mobile-dir references
Context: Second attempt at PR #25830. Uses manual IDs only with
[id] placeholder pattern to enforce explicit ID requirements.
ESLint will catch missing IDs during development.
* chore(webapp): add temporary i18n reconciliation tooling
Add helper script to analyze conflicts between en.json and
defaultMessage values in code. This tooling will be reverted
after initial migration cleanup is complete.
Tooling added:
- scripts/i18n-reconcile-conflicts.js: Analyzes conflicts
- Detects spelling corrections
- Identifies placeholder mismatches
- Flags significant content changes
- Provides recommendations on which version to keep
- npm script: i18n-reconcile
Usage:
npm run i18n-reconcile
This will be reverted after reconciling the ~50 duplicate message
warnings and determining correct versions for conflicting messages.
* chore(webapp): upgrade eslint-plugin-formatjs and centralize formatjs deps
Move @formatjs/cli to root webapp package.json alongside other formatjs
dependencies for better monorepo organization. Upgrade eslint-plugin-formatjs
from 4.12.2 to 5.4.2 for latest features and bug fixes.
Changes:
- Upgrade eslint-plugin-formatjs: 4.12.2 → 5.4.2
- Move @formatjs/cli to webapp/package.json (from channels)
- Centralize formatjs tooling at monorepo root level
This provides:
- Better dependency management in monorepo
- Latest formatjs ESLint rules and features
- Consistent tooling across workspaces
* feat(webapp): make localizeMessage fully compatible with formatMessage API
Extend localizeMessage to accept a values parameter for placeholder
interpolation, making it fully compatible with react-intl's formatMessage API.
Remove the now-redundant localizeAndFormatMessage function.
Changes to localizeMessage:
- Add values parameter for {placeholder} interpolation
- Use getIntl() for proper ICU message formatting
- Support full formatMessage feature parity outside React contexts
- Update JSDoc with interpolation examples
- Mark as deprecated (prefer useIntl in React components)
Code cleanup:
- Remove localizeAndFormatMessage function (redundant)
- Migrate all localizeAndFormatMessage usages to localizeMessage
- Remove unused imports: getCurrentLocale, getTranslations
- Add getIntl import
Files migrated:
- notification_actions.tsx: notification.crt message
- app_command_parser_dependencies.ts: intlShim formatMessage
This consolidates i18n logic and provides a single, feature-complete
localization function for non-React contexts.
Example usage:
// Before (old function)
localizeAndFormatMessage(
{id: 'welcome', defaultMessage: 'Hello {name}'},
{name: 'John'}
)
// After (consolidated)
localizeMessage(
{id: 'welcome', defaultMessage: 'Hello {name}'},
{name: 'John'}
)
* refactor(i18n): remove intlShim abstraction, use IntlShape directly
Remove intlShim wrapper and use react-intl's IntlShape type throughout.
Key Changes:
- Remove intlShim constant from app_command_parser_dependencies.ts
- Update errorMessage() signature to accept IntlShape parameter
- Use IntlShape for intl properties in AppCommandParser and ParsedCommand
- Call getIntl() at function start in actions (command.ts, marketplace.ts)
- Pass IntlShape to AppCommandParser and doAppSubmit consistently
Files Modified:
- app_command_parser_dependencies.ts: Remove intlShim, update errorMessage
- app_command_parser.ts: Use IntlShape type
- command.ts, marketplace.ts: Call getIntl() early, pass to parser
- app_provider.tsx, command_provider.tsx: Use getIntl() in constructor
- apps.ts: Update doAppSubmit signature
Benefits: Better type safety, standard react-intl patterns, eliminates
unnecessary abstraction.
Context: Part of migration to @formatjs/cli tooling.
* refactor(webapp): remove deprecated t() function and refactor login validation
Remove the deprecated t() function that was used as a marker for the old
mmjstool extraction. With @formatjs/cli, this is no longer needed as
extraction happens directly from formatMessage calls.
Changes:
- Remove t() function definition from utils/i18n.tsx
- Remove t() import and marker calls from login.tsx
- Refactor login validation logic from multiple if statements to a clean
switch(true) pattern that evaluates boolean combinations directly
- Add helpful comments documenting the structure of login method combinations
- Add default case as safety fallback
The switch(true) pattern eliminates the need to build a key string and makes
the login method combination logic clearer and more maintainable.
Prompt: Remove deprecated t() translation marker function used by old mmjstool.
Refactor login validation from if blocks to switch(true) with boolean cases.
* refactor(i18n): share IntlProvider's intl instance with getIntl()
Make getIntl() return the same IntlShape instance that IntlProvider creates,
ensuring consistency between React components (using useIntl()) and non-React
contexts (using getIntl()).
Changes:
- Add intlInstance storage in utils/i18n.tsx
- Export setIntl() function to store the intl instance
- Modify getIntl() to return stored instance if available, with fallback to
createIntl() for tests and early initialization
- Add IntlCapture component in IntlProvider that uses useIntl() hook to
capture and store the intl instance via setIntl()
Benefits:
- Single source of truth: Both React and non-React code use the same IntlShape
- Consistent translations: No duplicate translation loading or potential desync
- Leverages IntlProvider's translation loading lifecycle automatically
- Maintains fallback for edge cases where IntlProvider hasn't mounted yet
Prompt: Refactor getIntl() to reuse IntlProvider's intl instance instead of
creating a separate instance, ensuring both React and non-React contexts use
the same translations and intl configuration.
* 1
* exclude test files
* reset en.json
* refactor(i18n): inline message ID constants for formatjs extraction
Replace dynamic ID references with literal strings to enable proper formatjs
extraction. Formatjs can only extract from static message IDs, not from
variables or computed IDs.
Changes:
- configuration_bar.tsx: Inline AnnouncementBarMessages constants to literal
string IDs ('announcement_bar.error.past_grace', 'announcement_bar.error.preview_mode')
- system_analytics.test.tsx: Replace variable IDs (totalPlaybooksID,
totalPlaybookRunsID) with literal strings ('total_playbooks', 'total_playbook_runs')
- password.tsx: Use full message descriptor from passwordErrors object instead
of dynamic ID with hardcoded defaultMessage. The errorId is still built
dynamically using template strings, but the actual message is looked up from
the passwordErrors defineMessages block where formatjs can extract it.
This eliminates all "[id]" placeholder entries from extraction output and
ensures all messages have proper extractable definitions.
Prompt: Fix dynamic message ID references that formatjs extraction can't parse.
Inline constants and use message descriptor lookups to enable clean extraction
without [id] placeholders.
* fix(i18n): add missing defaultMessage to drafts.tooltipText
The drafts.tooltipText FormattedMessage had an empty defaultMessage, causing
formatjs extraction to output an empty string for this message.
Added the proper defaultMessage with plural formatting for draft and scheduled
post counts.
Prompt: Fix empty defaultMessage in drafts tooltip causing extraction issues.
* feat(i18n): add --preserve-whitespace flag to formatjs extraction
Add the --preserve-whitespace flag to ensure formatjs extraction maintains
exact whitespace from defaultMessage values. This is important for messages
with intentional formatting like tabs, multiple spaces, or line breaks.
Prompt: Add --preserve-whitespace to i18n extraction to maintain exact formatting.
* feat(i18n): add custom formatjs formatter matching mmjstool ordering
Create custom formatter that replicates mmjstool's sorting behavior:
- Case-insensitive alphabetical sorting
- Underscore (_) sorts before dot (.) to match existing en.json ordering
- Simple key-value format (extracts defaultMessage)
The underscore-before-dot collation matches mmjstool's actual behavior and
reduces diff size by 50% compared to standard alphabetical sorting.
Changes:
- scripts/formatter.js: Custom compareMessages, format, and compile functions
- package.json: Use --format scripts/formatter.js instead of --format simple
Prompt: Create custom formatjs formatter matching mmjstool's exact sorting
behavior including underscore-before-dot collation to minimize migration diff.
* feat(i18n): enhance reconciliation script with git history metadata
Add git log lookups to show when each message was last modified in both
en.json and code files. This enables data-driven decisions about which
version to keep when resolving conflicts.
Enhancements:
- getEnJsonLastModified(): Find when an en.json entry last changed
- findCodeFile(): Locate source file for a message ID (handles id= and id:)
- getCodeLastModified(): Get last modification date for source files
- Caching for performance (minimizes git operations)
Output includes:
📅 en.json: [date] | [hash] | [commit message]
📅 code: [date] | [hash] | [commit message]
📂 file: [source file path]
Analysis shows en.json entries from 2023 while code actively updated
2024-2025, indicating code is more authoritative.
Prompt: Add git history to reconciliation report showing modification dates
for data-driven conflict resolution decisions.
* feat(i18n): add optional duplicate message ID check script
Add i18n-extract:check-duplicates script that fails if the same message ID
has different defaultMessages in multiple locations. This is kept as an
optional standalone script rather than auto-chained with i18n-extract to
allow the migration to proceed while duplicates are addressed separately.
Usage:
npm run i18n-extract:check-duplicates
The script runs formatjs extract to /dev/null and checks stderr for
"Duplicate message id" warnings, failing if any are found.
Prompt: Add optional duplicate ID check as standalone npm script for gradual
migration without blocking on existing duplicate message IDs.
* about.enterpriseEditionLearn
* admin.accesscontrol.title
* eslint-plugin-formatjs version to eslint 8 compat
* admin.channel_settings.channel_detail.access_control_policy_title
* admin.connectionSecurityTls
- now: admin.connectionSecurityTls.title
* admin.customProfileAttribDesc
now:
- admin.customProfileAttribDesc.ldap
- admin.customProfileAttribDesc.saml
* admin.gitlab.clientSecretExample
* package-lock
* admin.google.EnableMarkdownDesc
- fix err `]` in admin.google.EnableMarkdownDesc.openid
- now:
- admin.google.EnableMarkdownDesc.oauth
- admin.google.EnableMarkdownDesc.openid
* admin.image.amazonS3BucketExample
- now:
- admin.image.amazonS3BucketExample
- admin.image.amazonS3BucketExampleExport
* admin.license.trialCard.contactSales
* admin.log.AdvancedLoggingJSONDescription
- now:
- admin.log.AdvancedLoggingJSONDescription
- admin.log.AdvancedAuditLoggingJSONDescription
* admin.rate.noteDescription
- now
- admin.rate.noteDescription
- admin.info_banner.restart_required.desc (3)
* admin.system_properties.user_properties.title
- now:
- admin.system_properties.user_properties.title
- admin.accesscontrol.user_properties.link.label
* admin.system_users.filters.team.allTeams, admin.system_users.filters.team.noTeams
* admin.user_item.email_title
* announcement_bar.error.preview_mode
* channel_settings.error_purpose_length
* deactivate_member_modal.desc
- now:
- deactivate_member_modal.desc
- deactivate_member_modal.desc_with_confirmation
* deleteChannelModal.canViewArchivedChannelsWarning
* edit_channel_header_modal.error
* filtered_channels_list.search
- now:
- filtered_channels_list.search
- filtered_channels_list.search.label
* flag_post.flag
* generic_icons.collapse
* installed_outgoing_oauth_connections.header
* intro_messages.group_message
* intro_messages.notificationPreferences
- now:
- intro_messages.notificationPreferences
- intro_messages.notificationPreferences.label
* katex.error
* multiselect.placeholder
- now:
- multiselect.placeholder
- multiselect.placeholder.addMembers
* post_info.pin, post_info.unpin, rhs_root.mobile.flag
take en.json
* texteditor.rewrite.rewriting
* user_groups_modal.addPeople
split to user_groups_modal.addPeople.field_title
* user.settings.general.validImage
take en.json
* userSettings.adminMode.modal_header
take en.json
* webapp.mattermost.feature.start_call
split to user_profile.call.start
* admin.general.localization.enableExperimentalLocalesDescription
take en.json
* login.contact_admin.title, login.contact_admin.detail
take en.json
* fix: correct spelling of "complementary" in accessibility sections
* Revert "about.enterpriseEditionLearn"
This reverts commit
|
||
|
|
d844530496
|
Fix copyright date and address for email footers (#34813)
Some checks are pending
API / build (push) Waiting to run
Server CI / Compute Go Version (push) Waiting to run
Server CI / Check mocks (push) Blocked by required conditions
Server CI / Check go mod tidy (push) Blocked by required conditions
Server CI / check-style (push) Blocked by required conditions
Server CI / Check serialization methods for hot structs (push) Blocked by required conditions
Server CI / Vet API (push) Blocked by required conditions
Server CI / Check migration files (push) Blocked by required conditions
Server CI / Generate email templates (push) Blocked by required conditions
Server CI / Check store layers (push) Blocked by required conditions
Server CI / Check mmctl docs (push) Blocked by required conditions
Server CI / Postgres with binary parameters (push) Blocked by required conditions
Server CI / Postgres (push) Blocked by required conditions
Server CI / Postgres (FIPS) (push) Blocked by required conditions
Server CI / Generate Test Coverage (push) Blocked by required conditions
Server CI / Run mmctl tests (push) Blocked by required conditions
Server CI / Run mmctl tests (FIPS) (push) Blocked by required conditions
Server CI / Build mattermost server app (push) Blocked by required conditions
Web App CI / check-lint (push) Waiting to run
Web App CI / check-i18n (push) Blocked by required conditions
Web App CI / check-types (push) Blocked by required conditions
Web App CI / test (platform) (push) Blocked by required conditions
Web App CI / test (mattermost-redux) (push) Blocked by required conditions
Web App CI / test (channels shard 1/4) (push) Blocked by required conditions
Web App CI / test (channels shard 2/4) (push) Blocked by required conditions
Web App CI / test (channels shard 3/4) (push) Blocked by required conditions
Web App CI / test (channels shard 4/4) (push) Blocked by required conditions
Web App CI / upload-coverage (push) Blocked by required conditions
Web App CI / build (push) Blocked by required conditions
* Fix copyright date and address for email footers * Update footer for email template |
||
|
|
8bf422d6e2
|
E2E/Cypress: Upgrade dependencies (#33665)
* upgrade cypress and other dependecies * fix eslint * remove axios-retry and update eslint * fix tests * fix lint on trailing spaces --------- Co-authored-by: Mattermost Build <build@mattermost.com> |
||
|
|
41e88b74ac
|
MM-61407: Remove Bleve (#33430)
https://mattermost.atlassian.net/browse/MM-61407 ```release-note NONE ``` * webapp i18n ```release-note NONE ``` * Fix e2e tests ```release-note NONE ``` * fix roles in e2e tests ```release-note NONE ``` * some review comments ```release-note NONE ``` * add back permissions to deprecated list ```release-note NONE ``` |
||
|
|
548a47ae56
|
[MM-63152] LDAP Wizard (#31417)
* [MM-63717] LDAP Wizard skeleton (#31029) * add ldap_wizard component to render its admin components * i18n * test adjustment * keys and props fixes * title fix * fix placeholders * fix value initialization * linting * remove all ...props (except custom component); any->unknown * fix i18n (temp, will be changed in later PR) * better return; simplify function checking/calling * [MM-64259] Sections sidebar and navigation (#31059) * initial sections list sidebar * sidebar highlighting and scroll on click * some tidying up * add custom section titles for section sidebar * i18n * updating border on sections * scss style lint * color -> border-color * simplify activeSectionKey initialization; remove trailing newline * add useSectionNavigation; clean up ldap_wizard and scss; PR comments * extract section of code into renderSidebar() --------- Co-authored-by: Asaad Mahmood <asaadmahmood@users.noreply.github.com> * [MM-64296] Add test connection for connection settings panel (#31190) * button -> ldap test connect api * fix console error by sanitizing value in text component * return detailed error as error; adjust button -> primary, flushLeft * middle of redesigning how we do hover text, first button * add hover text to bools and file uploads * i18n * add LdapSettings as api type; add new endpoint to api yaml * allow testing without first enabling LDAP and saving config * i18n id changes * improve TestLdapConnection to current standards * PR comments * safeDereference; cleaner returns * remove hover markdown; formatting and typing simplification * use button for "More Info"; i18n * finish renaming help_text_hover -> help_text_more_info * fix error output * only send bindpassword if it has been changed * fix: don't send blank bindPassword when it is still ***** * merge conflict * [MM-64480] Refactor Admin Definition (#31280) * move ldap definition to its own file for simplicity & context * refactor admin_definition to eliminate circular dependencies * merge conflicts * before: buggy userHasReadPermissinOnSomeResources; after: fix incorrect snapshot * merge conflict: new bindPasssword definition was left behind; fixed. * merge conflict * [MM-63765] LDAP Wizard: User filter expandable section (#31286) * add "more info" hover to user filter help texts; make wider * add expandable_setting type and component * use Dislosure show/hide pattern for accessibility * fix tooltip scss selectors * fix hover -> more_info; make sure translation files are correct * use join('\n\n') instead of the eslint disable line * Revert "use join('\n\n') instead of the eslint disable line" This reverts commit 274667e875b34703f14fee0706cd28b0125cefc9. * [MM-64482] LDAP Wizard - Test User filters (#31312) * initial cut at UI and backend for test filters * api definitions; mocks * clean up to current standards * [MM-64512] - Test user filters UI (#31355) * result_count -> total_count * json cannot marshal error, returning error as string as god intended * render errors with icon, hover text, and better feedback texts * gather the settings that may be in expandable sections * remove success, use error == "" to indicate success * [MM-64536] LDAP Wizard: Test user attributes (#31373) * LdapFilterTestResult -> LdapDiagnosticResult; FilterName -> TestName * implement test_attributes endpoint and limited frontend (first step) * adding EntriesWithValue * [MM-64550] LDAP Wizard: Test user attributes UI (#31374) * [MM-64551] LDAP Wizard: Test group attributes (#31375) * remove Test LDAP button (not needed); reused helptext for other btn * implement test_group_attributes endpoint; button/client-side paths * [MM-64552] LDAP Wizard: Test group attributes UI (#31376) * implement Test Group Attributes button * simplify helper functions (improves useCallback dependencies) * show the default filter that was used on the backend in the tooltip * show the icon when there's an error (e.g. required filter/attribute) * fix infinite rerendering * fix error after failed save; fix navigation unlocked after save * empty * Adjust message feedback given we don't test the schema anymore * improve css; don't use inline styles * removed unneccesary pointer indirection * improved i18n strings and logic * combining filters/attributes/group attributes endpoints improve types * improve help text for User Filter (it's tricky) * AvailableAttrs -> AvailableAttributes * fix for e2e tests (renamed title) * more e2e fixes * skip broken e2e test --------- Co-authored-by: Asaad Mahmood <asaadmahmood@users.noreply.github.com> |
||
|
|
8533350a91
|
MM-61893 Replace usage of hasOwnProperty with Object.hasOwn (#29428)
* MM-61893 Replace usage of hasOwnProperty with Object.hasOwn * Update type guard in messageToElement * Replace a couple more hasOwnProperty calls |
||
|
|
3d38d239ff
|
MM-47291 refactor: migrate collapsed_reply_threads to ts (#27808)
* refactor: migrate collapsed_reply_threads to ts - migrate collapsed_reply_threads e2e tests to typescript - update matterpollPlugin plugin constant so that it matches with apiUploadAndEnablePlugin argument Fixes: #21296 * refactor: use PostMessageResp on channel_notifications_spec - use type PostMessageResp - convert cy.wrap to regular for loop * refactor: update types on collapsed_reply_threads - add missing types to variables - update types on current variables - remove unnecessary commands on following_spec.ts * fix: solve issue with non callable function - move wait call to next line * refactor: remove functions from global scope - keep functions as helper functions - fix lint issue |
||
|
|
e422b1f8af
|
Rename System Roles to Delegated Granular Administration (#27761)
Automatic Merge |
||
|
|
d26a76a890
|
Promote GIF picker, custom groups and message priority out of Beta (#27758)
* Remove Beta label for GIF picker, custom groups and message priority * Remove Give Feedback from post priority * Removed unused text * [MM-56904] Reduce the number of api requests made to fetch user information for GMs on page load (#27149) * use new endpoint to fetch group members * [MM-58440] Migrate tooltips of 'components/post_view/post_flag_icon' to WithTooltip (#27689) * Fixed bug around channel file sidebar (#27705) * Fixed the issue for DB layer, ES to go * Handled channel bookmarks * Handled Bleve * Lint fix * Added channel bookmark test * Skip bleve test * Used common function * SKipping ES as indexing logic in unavailable in test * [MM-58378] Prevent prepackaged playbook v2 from upgrading on servers without enterprise license (#27335) * add check for playbooks v2 * add new license helper --------- Co-authored-by: Mattermost Build <build@mattermost.com> * MM-59826: Add more invalidation event types (#27719) This came up as part of the Redis work. I noticed that a lot of new invalidation events were missing. This is important to understand where invalidations are coming from. https://mattermost.atlassian.net/browse/MM-59826 ```release-note NONE ``` Co-authored-by: Mattermost Build <build@mattermost.com> * Minor css changes for post priority menu --------- Co-authored-by: Ben Cooke <benkcooke@gmail.com> Co-authored-by: Zubair Imtiaz <106450046+ZubairImtiaz3@users.noreply.github.com> Co-authored-by: Harshil Sharma <18575143+harshilsharma63@users.noreply.github.com> Co-authored-by: Julien Tant <785518+JulienTant@users.noreply.github.com> Co-authored-by: Mattermost Build <build@mattermost.com> Co-authored-by: Agniva De Sarker <agnivade@yahoo.co.in> |
||
|
|
03c930daa0
|
Chore(cypress): Review and Fix tests failing on master (#26954) | ||
|
|
c9cb3d5bb0
|
Fix E2E test cases and setup for GHA (#26944)
* Fix E2E test cases and setup for GHA * Fix more test cases, apply recommendations |
||
|
|
9e5d486a5b
|
Fix Cypress tests on master (#26500) | ||
|
|
f3a9f166bb
|
[MM-52869] Update and fix links in the system console (#23694)
* Updated privacy policy link * Removed broken link from fa language * Updated terms of use link * Updated pricing links * Updated self hosted billing links * Updated terms-of-use links * Updated privacy-policy links across the project * Updated pricing links in e2e tests * Updated cloud billing docs * Fixed upgrading mattermost server links * Updated ssl client certificate links * Updated configure session lenghts links * Updated configure site url links * Updated elasticsearch links * Update data retention policy links * Updated ldap links * advanced-permissions * Updated anchor ServiceSettings.ListenAddress * Updated anchor #SystemSettings.Forward80To443 * Updated link desktop managed resources * Updated elasticsearch links * Updated file content extraction links * Updated HA Cluster inks * Updated setup image proxy link * Updated push notification links * Update performance monitoring links * Help links * Updated about mattermost links * updated report a problem links * Updated download apps links * Updated mobile apps links * Update share messages links * Updated format messages links * Updated in product notices links * Updated multi factor auth links * Updated LDAP links * Updated setup saml links * Updated saml/ldap configuration links * Updated plugins URL * Updated plugin signing links * Updated webhook links * Updated slash commands links * Updated oauth2 links * Updated webhook links * Update enable oauth2 links * Updated personal access tokens list * Updated experimental links * Updated snap files * check-style * privacy/terms links in about modal |
||
|
|
ba6b97fb62 | Move /e2e -> /e2e-tests |