* Added user over usager alert in License and System Statistics page
* Fixed case below 90
* Fixed constant
* Linting
* Change over user notification threshold to 0
* Fix tests
* Saved dismissed preference
* Text tweek
* Fix tests
* More tests fixed
* Snapshot updated
* initial implementation of test documentation in spec file with AI-assisted prompt from Claude and linter script
* update snapshots
---------
Co-authored-by: Mattermost Build <build@mattermost.com>
* MM-63966 - save pannel not dissapearing after save
* adjust unit tests
* trim only on direct change
---------
Co-authored-by: Mattermost Build <build@mattermost.com>
* Bump prepackage Zoom plugin version to 1.9.0
* Bump prepackage GitLab plugin version to 1.10.0
* fixed zoom version
---------
Co-authored-by: Mattermost Build <build@mattermost.com>
* [MM-62980] Set aria-describedby for Input component when again custom message is set
* [MM-62970] Change password reset send link input to Input
* Fix i18n
* Fix e2e
* fix snapshots
---------
Co-authored-by: yasserfaraazkhan <attitude3cena.yf@gmail.com>
* MM-63406: Update timezone automatically
On focus as well as every 30 minutes, check if the timezone has changed.
Also, ignore the momentjs cache, otherwise this value is static as per https://momentjs.com/timezone/docs/#/using-timezones/guessing-user-timezone/
> By default Moment Timezone caches the detected timezone. This means that subsequent calls to moment.tz.guess() will always return the same value.
* migrate away from enzyme
* MM-63406: Address PR feedback - add constants and improve comments
* MM-63406: Address PR feedback - Extract timezone logic to a separate component
- Created a new TimezoneManager component for handling timezone updates
- Used fake timers in tests to properly test the periodic update
- Removed visibility change handler to simplify the component
* fix linting
* Remove comments from getBrowserTimezone function
* Move updateTimezone function before useEffect
* Simplify timezone detection with Intl.DateTimeFormat().resolvedOptions().timeZone
* Fix style issues
* Improve timezone manager tests with jest.getTimerCount()
Used jest.getTimerCount() to verify timer cleanup on unmount instead of spying on clearInterval.
This change addresses PR feedback in #30856.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* MM-63406: Simplify timezone updates to check every minute
- Simplify timezone manager by removing focus event and only checking every minute
- Replace 30-minute interval with 1-minute interval for more responsive timezone detection
- Update tests to match new implementation
- Change removes focus/blur event handling as per PR feedback
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* revert to simpler approach
---------
Co-authored-by: Mattermost Build <build@mattermost.com>
Co-authored-by: Claude <noreply@anthropic.com>
* MM-63968 - remove channel name input plus one
* adjust test to most common use in webapp
* adjust error for min lenght and add back minlenght indicator under a param bool value
---------
Co-authored-by: Mattermost Build <build@mattermost.com>
* MM-63965 - add scroll to advanced text editor
* show scroll only when content wraps in more than one line
* fix unit test
---------
Co-authored-by: Mattermost Build <build@mattermost.com>
* Adds the capability to retrieve a property field by name
Allows to retrieve a property field by name and groupID. As the name
is only unique within the context of a group, and we can have multiple
fields with the same name in the store, for this method the groupID is
directly included in the query instead of being an optional field.
* Adds the targetID parameter to correctly filter fields
* Ensure the method only retrieves non-deleted fields
---------
Co-authored-by: Miguel de la Cruz <miguel@ctrlz.es>
Co-authored-by: Mattermost Build <build@mattermost.com>
A recent change to the enterprise cluster code introduced the possibility that we could get cluster info with empty fields. This happens when we can't properly communicate with the related cluster node. In that case, we now show a warning to the admin.
A recent change to the enterprise cluster code introduced a change to the enterprise API interface. GetClusterInfos() can now return an error. This commit introduces code to handle that error.
* [MM-63000] Use CSS hover state instead of component state, add focus-within to ensure buttons are focusable
* [MM-63046] Allow draft panel to be correctly focusable and navigable using correct roles
* [MM-63046] Use `name` as `aria-label` for `Action`
* update locator for scheduled drafts and fix failing playwright tests
* fix lint
* PR feedback
* PR feedback
---------
Co-authored-by: yasserfaraazkhan <attitude3cena.yf@gmail.com>
On page load, we load ALL channels and channel members from all teams.
But then, on team_switch, we would again load channels and channel
members from that team. This was redundant and mainly kept
because previously the websocket events were considered unreliable.
Now with reliable websockets, and client-side pings, we can detect
broken connections faster and recover without loss.
Additionally, the getAllChannelMembers call would page through
all responses on the client side. This was inefficient and incur
extra latency. To optimize for this, we introduce server-side
streaming of the full response if page is set to -1.
This optimizes the intial response as well.
https://mattermost.atlassian.net/browse/MM-56906
```release-note
Optimize team switch operation by removing calls to get channels
and channel members.
```
Co-authored-by: Mattermost Build <build@mattermost.com>
* [MM-62973] Fix order of Close button and other buttons in the header
* [MM-63028] Add aria-live status area when searching for channels
* [MM-63027] Add announcement that channel is joined
* [MM-63034] Add role=checkbox and reformat HTML to have correct custom checkbox code
* Update snapshots from generic_modal change
* PR feedback
* PR feedback
* PR feedback
* [MM-62975] Convert results table to actual table instead of divs
* [MM-62981] Ensure remove user button is focusable
* fix playwright test
* fix playwright test
---------
Co-authored-by: yasserfaraazkhan <attitude3cena.yf@gmail.com>
We switch to using iterators introduced in Go 1.23
to make iteration alloc-free and fast. And since
element removal is allowed while iterating a map,
this also means we don't need to even copy the slice
any more.
While here, we also address the comment https://github.com/mattermost/mattermost/pull/30178#discussion_r1954862151.
I have simply gone back to using []string as the map
entry rather than a type alias or a redirection with
a struct.
https://mattermost.atlassian.net/browse/MM-63130
```release-note
NONE
```
* Changed back nil to len
```release-note
NONE
```
* fixing unused assignment
```release-note
NONE
```
* add benchmark
```
goos: linux
goarch: amd64
pkg: github.com/mattermost/mattermost/server/v8/channels/app/platform
cpu: Intel(R) Core(TM) i5-8265U CPU @ 1.60GHz
│ old.txt │ new.txt │
│ sec/op │ sec/op vs base │
HubConnIndexIterator/2_users-8 93.53n ± 1% 38.09n ± 1% -59.27% (p=0.000 n=10)
HubConnIndexIterator/3_users-8 106.30n ± 0% 38.41n ± 1% -63.86% (p=0.000 n=10)
HubConnIndexIterator/4_users-8 111.30n ± 1% 38.66n ± 1% -65.27% (p=0.000 n=10)
geomean 103.4n 38.39n -62.89%
│ old.txt │ new.txt │
│ B/op │ B/op vs base │
HubConnIndexIterator/2_users-8 16.00 ± 0% 24.00 ± 0% +50.00% (p=0.000 n=10)
HubConnIndexIterator/3_users-8 24.00 ± 0% 24.00 ± 0% ~ (p=1.000 n=10) ¹
HubConnIndexIterator/4_users-8 32.00 ± 0% 24.00 ± 0% -25.00% (p=0.000 n=10)
geomean 23.08 24.00 +4.00%
¹ all samples are equal
│ old.txt │ new.txt │
│ allocs/op │ allocs/op vs base │
HubConnIndexIterator/2_users-8 1.000 ± 0% 1.000 ± 0% ~ (p=1.000 n=10) ¹
HubConnIndexIterator/3_users-8 1.000 ± 0% 1.000 ± 0% ~ (p=1.000 n=10) ¹
HubConnIndexIterator/4_users-8 1.000 ± 0% 1.000 ± 0% ~ (p=1.000 n=10) ¹
geomean 1.000 1.000 +0.00%
¹ all samples are equal
```
```release-note
NONE
```
* ForChannel test as well
```release-note
NONE
```
* review comments
```release-note
NONE
```
* fix lint errors
```release-note
NONE
```
---------
Co-authored-by: Mattermost Build <build@mattermost.com>
This commit introduces listeners for network changes that will:
- Test the websocket if we get an offline event to check if we have disconnected.
- Re-connect the websocket immediately if we get an online event, and we are disconnected.
Additionally when a ping fails, we now immediately call the onclose() callback instead of waiting for the system to trigger it when the broken websocket closes. This allows us to re-connect much more quickly (since we don't have to wait for the broken websocket to get cleaned up by the system).
* First set of texts updated for Enterprise Adv upsells and trial
* Updated upsell message for all tiers
* Linting translation file
* Linting
* Reverting unintended styling changes
* my ide making lint more
* Fix tests
* More default texts updated
* Trial banner title
* Make advantages list translatable
* Text updates
* Fix tests
* More text tweaking
* Linting
* Reodered translations
* Fixed e2e test
* More linting
* Removed incorrect new test
* Fix test typo
---------
Co-authored-by: Mattermost Build <build@mattermost.com>