* Convert user groups main modal to GenericModal, convert menu to Menu component, fixes
* Added useFocusTrap on other modals, fix DOM ordering
* [MM-64018] Add proper aria-labels to the menu button
* [MM-64025] Convert user group button to an actual button
* [MM-64017] Fixed aria-label on 3-dot menu in view user group modal
* [MM-64030] Show aria-live region when search results are rendered
* Fix tests
* PR feedback
* PR feedback
* fixed the url styling for webhooks to now use pure html instead of markdown
* remove code styling from outgoing webhook token
* updated test snapshots
* added code styling to more integrations tokens
* update snapshots
* fixed translation strings for english and german
* Fix notification message for posts with no text
Changed the default notification message from "did something new" to
"posted a message" for better clarity when receiving notifications
from posts with no readable text content.
Fixes: MM-61948
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* address feedback from code review
---------
Co-authored-by: Claude <noreply@anthropic.com>
* rm "No TEST_DATABASE... override" log message
Let's only log if this value is actually overridden.
* rm "(Created|Dropped) temporary database" message
* only log "Pinging SQL" on subsequent attempts
* disable morph logging from TestMain
* Fix style issues in store test files
- Add missing parameter to migrate() function calls in tests
- Remove unused log function in settings.go
- Fix formatting with go fmt
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* within sqlstore, use "enable" vs "disable" for clarity
* remove trailing newline from morph logs
---------
Co-authored-by: Claude <noreply@anthropic.com>
* [MM-28779] Fix errcheck issues in server/channels/app/brand.go
Remove brand.go from the errcheck exclusion list in .golangci.yml and fixed the error by properly handling the return value from a.MoveFile().
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* [MM-28779] Add test to verify brand image backup functionality
Add a new test that verifies backup of the original brand image happens when a new one is uploaded. This helps to ensure the fix for errcheck issues is working as expected.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* use seperate temporary filestore for each test
* Use FileSettings.Directory instead of finding the dir programatically
* Fix another test
* Fix defer
* Update server/channels/api4/job_test.go
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Fix bad bot commit
* Cleanup logs message
* cleanup file path
* Fix error variable names
* WIP:cleanup panic ussage
* Revert "WIP:cleanup panic ussage"
This reverts commit c3284e4427a41c818acc161926cd2535dee9a6b9.
* cleanup error checks
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Mattermost Build <build@mattermost.com>
(*Busy).Set would set its own timer, and additionally
send a message across the cluster. In this case, the cluster
is mocked locally. But the timer calculation happens again.
We marshal the expiry time with b.expires.Unix() and send that
as part of model.ServerBusyState. This is parsed again in
ClusterEventChanged and converted to duration with time.Until.
Therefore, if it takes longer for the code to reach those lines,
then the new time calculated would have already expired, failing
the test.
To fix this, we increase the timeout. This slows down the test
at the cost of extra reliability. This is a common failure point
with any timer related tests.
Additionally, we also change the condition in compareBusyState
to check for less-than rather than strict equality.
https://mattermost.atlassian.net/browse/MM-63300
```release-note
NONE
```
Co-authored-by: Mattermost Build <build@mattermost.com>
* MM-63925 Remove most nested transactions from channel_store_categories.go
There's one place which still has a nested transaction in
CreateInitialSidebarCategories, but that's because it's calling out to a
different part of the store. The only way to avoid that would be to
break the extraction like UpdateSidebarCategories does to update
preferences, but I chose not to follow that pattern here and leave it
as-is.
* MM-63923 Prevent deadlocks caused by updating multiple categories in a different order
* MM-63923 Prevent deadlocks while deleting from SidebarChannels
This could also have been resolved by sorting the categories, but
combining the queries seems a bit more elegant.
* MM-63924 Ensure adding SidebarChannels rows is idempotent
* Add additional test to cause deadlocks
* Prevent channels from appearing in a single category multiple times
* Other review feedback
* 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>