Matthew Birtch
34fb9adbc2
MM-63800 Add label tag for create account checkbox ( #30799 )
...
* added proper label tag for checkbox
* fix linting issues
* updated cursor on checkbox label
* remove uneccessary class on span
* resolve lint error
* Update screenshots
---------
Co-authored-by: yasserfaraazkhan <attitude3cena.yf@gmail.com >
2025-04-25 12:35:25 -04:00
Harrison Healey
80b61ad79b
MM-61611 Fix layout of emoji picker in mobile view ( #30747 )
...
* Stop emoji picker header from overlapping tabs
* Move emoji picker header above tabs
There was also some stuff I could remove because the header will always
be visible.
* Don't scroll the emoji picker on hover
* MM-61611 Fix emoji picker tabs being covered in mobile view
* Improve layout of emoji picker and gif picker
A lot of the emoji picker was explicitly sized before which made it
difficult to make everything responsive in mobile view. Making the emoji
picker layout into a flexbox fixed that, but due to the way that it's
nested, that was a bit tricky, and it required a couple tricks:
1. The AutoSizer doesn't work if it's placed inside a flexbox container,
but you can fix that by putting a div with position: relative in
between it and the flexbox parent. That was already the case, but I
accidentally removed it while trying to sort out the seemingly
excessive nesting.
2. Children of flexbox elements will cause the parent to expand if they
don't have min-height/min-width set. That's because the default
value for those is 0 outside of flexbox, but it's auto inside of one.
This breaks the layout and animation of the skin tone selector in the
emoji picker, but that has issues on master as well, so it'll be
addressed in the next commit.
* Improve and fix opening animation for skin tone selector
While this looked worse before in mobile view, it had some weirdness in
desktop as well. I ended up rewriting the way that that animation worked
so that I could position it correctly in both mobile (where it doesn't
cover the input) and desktop (where it does).
Notably, that change required:
1. Changing the skin tone selector to wait until its contents are hidden
to unmount them so that the position and size could be calculated
correctly.
2. Removed the flexbox from the search row and used a margin to make the
skin tone button pretend to offset the input. That let us smoothy
expand the selector over the input without having the input resize
behind it.
* Update CSS for positioning emojis and headings in emoji picker
2025-04-25 19:28:31 +03:00
Jesse Hallam
291d5a2ba7
fix missing newline in upgrader.go ( #30853 )
2025-04-25 11:21:37 -03:00
Daniel Espino García
71334c6d8b
Report a problem ( #30444 )
...
* Add report a problem type and allow logs config
* Improve device type logic
* Add tests and minor fixes
* Add texts
* Fix tests by avoiding circular dependencies
* Fix test
* Fix useexternallink updating mailtos, and changing the content of query parameters
* Fix texts
* Fix e2e test
* Fix tsc
---------
Co-authored-by: Mattermost Build <build@mattermost.com >
2025-04-25 11:08:39 +02:00
Agniva De Sarker
29f7c895b8
MM-63878: Fix INSERT IGNORE in saveChannelT ( #30850 )
...
INSERT IGNORE will ignore ALL errors in the INSERT statement.
This is not what was intended. The right way is to do a
redundant update on duplicate key.
It's not great, but that's how MySQL wants us to do it.
https://mattermost.atlassian.net/browse/MM-63878
```release-note
NONE
```
2025-04-24 21:29:09 +05:30
Arya Khochare
faf68a6d86
MM-56630 Scroll Fix of center panel ( #30144 )
...
* pageup/pagedown button scroll for center post-list
* revert package.json
* changing id, using ? and returning in keyHandler
* added e2e test for pageup/pagedown scroll
* Fix dynamic-virtualized-list not being in lockfile and update path
Moving the package under the MM namespace wasn't necessary, but it stops
some warnings from NPM.
* Move E2E test from Cypress to Playwright
Cypress's cy.type doesn't seem to properly trigger browser functions
because it doesn't seem to use native keyboard events. A newer version
of Cypress has a new cy.press method which is supposed to use native
keyboard events, but it also only supports the tab key currently, so it
wouldn't be useful here.
* Fix new test on iPad
* Add page up/down support to RHS and Threads view
* Update type definitions for dynamic-virtualized-list
---------
Co-authored-by: Harrison Healey <harrisonmhealey@gmail.com >
2025-04-24 11:15:40 -04:00
Pablo Vélez
89319cafb1
Mm 61590 - trap focus in modals ( #30622 )
...
* MM-61590 - trap focus in modals
* Adjust focus trap for dynamic loading elements and multi modal support
* add tests and improve code in generic modal
* fix snapshot
---------
Co-authored-by: Mattermost Build <build@mattermost.com >
2025-04-24 11:46:36 +02:00
Agniva De Sarker
131cf039bb
MM-63756: Added index to sidebarchannels table ( #30724 )
...
The (s SqlChannelStore) getSidebarCategoriesT gets called quite frequently.
- Team switch
- WS reconnect
- Category created
- Category updated
- Category deleted
Of these 1 and 2 are probably the most commonly called sources. Based on that,
the sidebarChannels table is not that well-optimized. Even though
the query time might be reasonable, without an index, it has to churn a lot of
DB CPU for a sequential scan.
We add a new index to optimize this.
CREATE INDEX idx_sidebarchannels_categoryid ON sidebarchannels(categoryid);
```
Before:
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Sort (cost=40854.18..40854.19 rows=4 width=193) (actual time=251.635..251.646 rows=204 loops=1)
Sort Key: sidebarcategories.sortorder, sidebarchannels.sortorder
Sort Method: quicksort Memory: 65kB
Buffers: shared hit=1203 read=23668
-> Nested Loop (cost=8.87..40854.14 rows=4 width=193) (actual time=251.345..251.455 rows=204 loops=1)
Buffers: shared hit=1203 read=23668
-> Nested Loop (cost=0.41..9.47 rows=1 width=54) (actual time=0.068..0.074 rows=1 loops=1)
Buffers: shared hit=5
-> Seq Scan on teams (cost=0.00..1.03 rows=1 width=27) (actual time=0.024..0.026 rows=1 loops=1)
Filter: (((id)::text = '3ee5y5ok6jgxicrmqstdnghmfr'::text) AND (deleteat = 0))
Rows Removed by Filter: 1
Buffers: shared hit=1
-> Index Scan using teammembers_pkey on teammembers (cost=0.41..8.43 rows=1 width=27) (actual time=0.039..0.043 rows=1 loops=1)
Index Cond: (((teamid)::text = '3ee5y5ok6jgxicrmqstdnghmfr'::text) AND ((userid)::text = 'tc3p1yqw67d8idcp3g98awexqe'::text))
Filter: (deleteat = 0)
Buffers: shared hit=4
-> Hash Right Join (cost=8.45..40844.62 rows=4 width=193) (actual time=251.274..251.361 rows=204 loops=1)
Hash Cond: ((sidebarchannels.categoryid)::text = (sidebarcategories.id)::text)
Buffers: shared hit=1198 read=23668
-> Seq Scan on sidebarchannels (cost=0.00..37514.77 rows=1265277 width=100) (actual time=0.043..99.345 rows=1265444 loops=1)
Buffers: shared hit=1194 read=23668
-> Hash (cost=8.44..8.44 rows=1 width=158) (actual time=0.047..0.047 rows=6 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 10kB
Buffers: shared hit=4
-> Index Scan using idx_sidebarcategories_userid_teamid on sidebarcategories (cost=0.42..8.44 rows=1 width=158) (actual time=0.029..0.037 rows=6 loops=1)
Index Cond: (((userid)::text = 'tc3p1yqw67d8idcp3g98awexqe'::text) AND ((teamid)::text = '3ee5y5ok6jgxicrmqstdnghmfr'::text))
Buffers: shared hit=4
Planning:
Buffers: shared hit=9
Planning Time: 1.215 ms
Execution Time: 251.755 ms
(31 rows)
After:
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Sort (cost=1544.53..1544.54 rows=4 width=192) (actual time=0.834..0.859 rows=204 loops=1)
Sort Key: sidebarcategories.sortorder, sidebarchannels.sortorder
Sort Method: quicksort Memory: 65kB
Buffers: shared hit=58
-> Nested Loop Left Join (cost=8.53..1544.49 rows=4 width=192) (actual time=0.066..0.252 rows=204 loops=1)
Buffers: shared hit=58
-> Nested Loop (cost=0.83..17.93 rows=1 width=157) (actual time=0.042..0.098 rows=6 loops=1)
Buffers: shared hit=34
-> Nested Loop (cost=0.42..9.48 rows=1 width=157) (actual time=0.030..0.049 rows=6 loops=1)
Buffers: shared hit=10
-> Index Scan using idx_sidebarcategories_userid_teamid on sidebarcategories (cost=0.42..8.44 rows=1 width=157) (actual time=0.018..0.022 rows=6 loops=1)
Index Cond: (((userid)::text = 'tc3p1yqw67d8idcp3g98awexqe'::text) AND ((teamid)::text = '3ee5y5ok6jgxicrmqstdnghmfr'::text))
Buffers: shared hit=4
-> Seq Scan on teams (cost=0.00..1.03 rows=1 width=27) (actual time=0.002..0.003 rows=1 loops=6)
Filter: (((id)::text = '3ee5y5ok6jgxicrmqstdnghmfr'::text) AND (deleteat = 0))
Rows Removed by Filter: 1
Buffers: shared hit=6
-> Index Scan using teammembers_pkey on teammembers (cost=0.41..8.43 rows=1 width=27) (actual time=0.007..0.007 rows=1 loops=6)
Index Cond: (((teamid)::text = '3ee5y5ok6jgxicrmqstdnghmfr'::text) AND ((userid)::text = 'tc3p1yqw67d8idcp3g98awexqe'::text))
Filter: (deleteat = 0)
Buffers: shared hit=24
-> Bitmap Heap Scan on sidebarchannels (cost=7.69..1522.35 rows=421 width=100) (actual time=0.012..0.017 rows=34 loops=6)
Recheck Cond: ((categoryid)::text = (sidebarcategories.id)::text)
Heap Blocks: exact=6
Buffers: shared hit=24
-> Bitmap Index Scan on idx_sidebarchannels_categoryid (cost=0.00..7.58 rows=421 width=0) (actual time=0.010..0.010 rows=34 loops=6)
Index Cond: ((categoryid)::text = (sidebarcategories.id)::text)
Buffers: shared hit=18
Planning:
Buffers: shared hit=18
Planning Time: 0.543 ms
Execution Time: 0.968 ms
(32 rows)
```
I have also looked at potentially re-ordering the JOINs to make
sidebarchannels and sidebarcategories JOIN earlier, but that didn't give
a major benefit.
Also looked at adding a compound index with (categoryid, sortorder) to improve
sorting performance, but that didn't give a major benefit from what the single
column index already gives.
The `completePopulatingCategoryChannelsT` query also partially benefits
from this. But the Postgres optimizer sometimes selects the index on categoryId
and sometimes on ChannelId, both giving equivalent performance. So there's no major
improvement there, but at the same time, no regression as well.
```
Original:
[bigdb] # EXPLAIN (ANALYZE, BUFFERS) SELECT Id FROM ChannelMembers LEFT JOIN Channels ON Channels.Id=ChannelMembers.ChannelId WHERE (ChannelMembers.UserId = 'tc3p1yqw67d8idcp3g98awexqe' AND Channels.Type IN ('D'
,'G') AND Channels.DeleteAt = 0 AND NOT EXISTS ( SELECT 1 FROM SidebarChannels JOIN SidebarCategories on SidebarChannels.CategoryId=SidebarCategories.Id WHERE (SidebarChannels.ChannelId = ChannelMembers.ChannelI
d AND SidebarCategories.UserId = 'tc3p1yqw67d8idcp3g98awexqe' AND SidebarCategories.TeamId = '3ee5y5ok6jgxicrmqstdnghmfr') )) ORDER BY DisplayName ASC;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Sort (cost=5864.68..5865.84 rows=463 width=40) (actual time=9.008..9.022 rows=39 loops=1)
Sort Key: channels.displayname
Sort Method: quicksort Memory: 27kB
Buffers: shared hit=2112
-> Nested Loop Anti Join (cost=1.96..5844.18 rows=463 width=40) (actual time=0.188..8.932 rows=39 loops=1)
Buffers: shared hit=2112
-> Nested Loop (cost=0.99..3476.66 rows=463 width=67) (actual time=0.159..7.952 rows=39 loops=1)
Buffers: shared hit=1956
-> Index Only Scan using idx_channelmembers_user_id_channel_id_last_viewed_at on channelmembers (cost=0.56..40.78 rows=470 width=27) (actual time=0.036..0.467 rows=437 loops=1)
Index Cond: (userid = 'tc3p1yqw67d8idcp3g98awexqe'::text)
Heap Fetches: 45
Buffers: shared hit=208
-> Memoize (cost=0.43..7.69 rows=1 width=40) (actual time=0.016..0.016 rows=0 loops=437)
Cache Key: channelmembers.channelid
Cache Mode: logical
Hits: 0 Misses: 437 Evictions: 0 Overflows: 0 Memory Usage: 42kB
Buffers: shared hit=1748
-> Index Scan using channels_pkey on channels (cost=0.42..7.68 rows=1 width=40) (actual time=0.015..0.015 rows=0 loops=437)
Index Cond: ((id)::text = (channelmembers.channelid)::text)
Filter: ((type = ANY ('{D,G}'::channel_type[])) AND (deleteat = 0))
Rows Removed by Filter: 1
Buffers: shared hit=1748
-> Nested Loop (cost=0.97..5.10 rows=1 width=27) (actual time=0.023..0.023 rows=0 loops=39)
Buffers: shared hit=156
-> Index Only Scan using sidebarchannels_pkey on sidebarchannels (cost=0.55..4.56 rows=1 width=92) (actual time=0.022..0.022 rows=0 loops=39)
Index Cond: (channelid = (channelmembers.channelid)::text)
Heap Fetches: 0
Buffers: shared hit=156
-> Index Scan using sidebarcategories_pkey on sidebarcategories (cost=0.42..0.48 rows=1 width=65) (never executed)
Index Cond: ((id)::text = (sidebarchannels.categoryid)::text)
Filter: (((userid)::text = 'tc3p1yqw67d8idcp3g98awexqe'::text) AND ((teamid)::text = '3ee5y5ok6jgxicrmqstdnghmfr'::text))
Planning:
Buffers: shared hit=48 dirtied=1
Planning Time: 2.222 ms
Execution Time: 9.142 ms
(35 rows)
New:
[bigdb] # EXPLAIN (ANALYZE, BUFFERS) SELECT Id FROM ChannelMembers LEFT JOIN Channels ON Channels.Id=ChannelMembers.ChannelId WHERE (ChannelMembers.UserId = 'tc3p1yqw67d8idcp3g98awexqe' AND Channels.Type IN ('D'
,'G') AND Channels.DeleteAt = 0 AND NOT EXISTS ( SELECT 1 FROM SidebarChannels JOIN SidebarCategories on SidebarChannels.CategoryId=SidebarCategories.Id WHERE (SidebarChannels.ChannelId = ChannelMembers.ChannelId AND SidebarCategories.UserId = 'tc3p1yqw67d8idcp3g98awexqe' AND SidebarCategories.TeamId = '3ee5y5ok6jgxicrmqstdnghmfr') )) ORDER BY DisplayName ASC;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Sort (cost=5059.95..5061.11 rows=463 width=40) (actual time=12.072..12.086 rows=39 loops=1)
Sort Key: channels.displayname
Sort Method: quicksort Memory: 27kB
Buffers: shared hit=1984
-> Nested Loop Anti Join (cost=9.10..5039.45 rows=463 width=40) (actual time=0.751..12.009 rows=39 loops=1)
Join Filter: ((sidebarchannels.channelid)::text = (channelmembers.channelid)::text)
Rows Removed by Join Filter: 7839
Buffers: shared hit=1984
-> Nested Loop (cost=0.99..3476.66 rows=463 width=67) (actual time=0.161..7.579 rows=39 loops=1)
Buffers: shared hit=1956
-> Index Only Scan using idx_channelmembers_user_id_channel_id_last_viewed_at on channelmembers (cost=0.56..40.78 rows=470 width=27) (actual time=0.036..0.449 rows=437 loops=1)
Index Cond: (userid = 'tc3p1yqw67d8idcp3g98awexqe'::text)
Heap Fetches: 45
Buffers: shared hit=208
-> Memoize (cost=0.43..7.69 rows=1 width=40) (actual time=0.016..0.016 rows=0 loops=437)
Cache Key: channelmembers.channelid
Cache Mode: logical
Hits: 0 Misses: 437 Evictions: 0 Overflows: 0 Memory Usage: 42kB
Buffers: shared hit=1748
-> Index Scan using channels_pkey on channels (cost=0.42..7.68 rows=1 width=40) (actual time=0.014..0.014 rows=0 loops=437)
Index Cond: ((id)::text = (channelmembers.channelid)::text)
Filter: ((type = ANY ('{D,G}'::channel_type[])) AND (deleteat = 0))
Rows Removed by Filter: 1
Buffers: shared hit=1748
-> Materialize (cost=8.11..1535.03 rows=4 width=27) (actual time=0.003..0.046 rows=201 loops=39)
Buffers: shared hit=28
-> Nested Loop (cost=8.11..1535.01 rows=4 width=27) (actual time=0.099..0.383 rows=201 loops=1)
Buffers: shared hit=28
-> Index Scan using idx_sidebarcategories_userid_teamid on sidebarcategories (cost=0.42..8.44 rows=1 width=65) (actual time=0.047..0.057 rows=6 loops=1)
Index Cond: (((userid)::text = 'tc3p1yqw67d8idcp3g98awexqe'::text) AND ((teamid)::text = '3ee5y5ok6jgxicrmqstdnghmfr'::text))
Buffers: shared hit=4
-> Bitmap Heap Scan on sidebarchannels (cost=7.69..1522.35 rows=421 width=92) (actual time=0.028..0.040 rows=34 loops=6)
Recheck Cond: ((categoryid)::text = (sidebarcategories.id)::text)
Heap Blocks: exact=6
Buffers: shared hit=24
-> Bitmap Index Scan on idx_sidebarchannels_categoryid (cost=0.00..7.58 rows=421 width=0) (actual time=0.023..0.023 rows=34 loops=6)
Index Cond: ((categoryid)::text = (sidebarcategories.id)::text)
Buffers: shared hit=18
Planning:
Buffers: shared hit=51
Planning Time: 2.240 ms
Execution Time: 12.210 ms
(42 rows)
```
Analysis on MySQL for completion:
```
Before:
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| -> Sort: SidebarCategories.SortOrder, SidebarChannels.SortOrder (actual time=277.675..277.675 rows=4 loops=1)
-> Stream results (cost=138558.36 rows=1287808) (actual time=242.506..277.650 rows=4 loops=1)
-> Left hash join (<hash>(SidebarChannels.CategoryId)=<hash>(SidebarCategories.Id)), extra conditions: (SidebarChannels.CategoryId = SidebarCategories.Id) (cost=138558.36 rows=1287808) (actual time=242.498..277.626 rows=4 loops=1)
-> Index lookup on SidebarCategories using idx_sidebarcategories_userid_teamid (UserId='qdggj9pyobgkjpj8htwzizks1r', TeamId='xmh7bupzajnudqf3h4mm76qapy') (cost=1.40 rows=4) (actual time=0.092..0.094 rows=4 loops=1)
-> Hash
-> Table scan on SidebarChannels (cost=8394.55 rows=321952) (actual time=0.123..106.334 rows=300002 loops=1)
|
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
After:
----------------------------------------------------------------+
| -> Sort: SidebarCategories.SortOrder, SidebarChannels.SortOrder (actual time=0.739..0.742 rows=4 loops=1)
-> Stream results (cost=6.80 rows=7) (actual time=0.468..0.703 rows=4 loops=1)
-> Nested loop left join (cost=6.80 rows=7) (actual time=0.456..0.673 rows=4 loops=1)
-> Index lookup on SidebarCategories using idx_sidebarcategories_userid_teamid (UserId='qdggj9pyobgkjpj8htwzizks1r', TeamId='xmh7bupzajnudqf3h4mm76qapy') (cost=4.38 rows=4) (actual time=0.302..0.313 rows=4 loops=1)
-> Index lookup on SidebarChannels using idx_sidebarchannels_categoryid (CategoryId=SidebarCategories.Id) (cost=0.48 rows=2) (actual time=0.085..0.087 rows=0 loops=4)
|
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
```
Timing wise, it takes around 2s to add the index on a table with 1.2M rows
for Postgres. And it takes around 5s on MySQL on a table with 300K rows.
It looks like it takes longer on MySQL, but since both migrations are
non-locking, it should be fine.
https://mattermost.atlassian.net/browse/MM-63756
```release-note
NONE
```
2025-04-24 12:11:28 +05:30
Jesse Hallam
011f179831
avoid SELECT * in preference store ( #30835 )
2025-04-23 15:06:04 -04:00
Agniva De Sarker
271d928e87
MM-63467: Refactor constLabels to a common initializer ( #30779 )
...
This is useful to avoid mistakes while adding new metrics.
https://mattermost.atlassian.net/browse/MM-63467
```release-note
NONE
```
Co-authored-by: Mattermost Build <build@mattermost.com >
2025-04-23 21:59:51 +05:30
Pablo Vélez
6ae0efd285
MM61173 - settings modal base creation ( #30338 )
...
* MM-61173 - channel settings modal: base modal, initial commit, file creation and base component
* new enhancements to the base modal creation
* revert changes on textbox_links and edit channel header
* fix types and add back unintentioned deleted value
* add the preview textbox component
* extract logic for info tab into its own component
* add the purpose input to the window
* move other component logic to its own component and code clean up
* ability to update channel type
* more advances on the archive channel tab
* fix unit test in textbox
* fix translations
* do not show the archive modal in default channel
* fix issue with url editor not being resetted on undo action
* adjust text and styling for the header and purpose inputs
* remove textboxlinks and use button eye icon
* adjust test and preview button style
* add unit test to channel patch
* move logic from parent modal to info tab component
* fix border issues and focus back to preview textareas
* prevent saving changes when pressing enter when selecting an icon
* enhance input component to cover limits validations and enhances tests
* set default error message for save changes panel
* add props to provide custom value to the buttons
* remove channel input errors on reset button click
* create new component settings textbox
* rename component to advanced textbox and add unit tests
* styling of the info tab and add error state to advanced textbox
* add logic to prevent tab switch with unsaved changes
* adjust url error logic and code clean up
* code clean up and enhance comments
* add char min length to advanced textbox logic
* add the channel settings modal to the new menu
* add new test files and fix reset error
* remove unused error variables
* adjust translations and remove unncesary import
* enhance permissions for archive channels and manage channel settings
* Adjust permission tree so channel admins can convert from private to public
* enhance the test suit around channel conversion type
* fix some e2e tests and solve channel input name issue
* fix unit test by interacting first with the input element
* adjust e2e tests to channel settings modal changes
* remove commented tests and implement pr feedback
* adjust more pr feedback to the code
* more pr feedback enhancements
* further enhancements to tab navigation, and adjust more e2e tests
* remove unused components and fix e2e tests
* revert unnecessary permissions changes
* Add name label to textboxes
* adjust e2e and unit tests
* revert min lenght change value and adjust tests and snapshots
* Channel banner settings (#30721 )
* Added channel banner setting header
* Updated section styling
* handled animation
* handled min and max lengths
* cleanup
* color change fix
* general improvements
* Fixed API test
* removed unused param className
* added e2e tests
* test: add channel settings configuration tab test file
* Based on the context, here's a concise commit message for this change:
feat: Add comprehensive tests for ChannelSettingsConfigurationTab
* added some more tests
* CI
* reverted package-lock.json changes in Playwright
* remove extra border from advaced textbox
* adjust styling for name label in advance texbox and restart preview state on modal close
* sync package.lock in playwright
---------
Co-authored-by: Mattermost Build <build@mattermost.com >
Co-authored-by: Harshil Sharma <harshilsharma63@gmail.com >
Co-authored-by: Harshil Sharma <18575143+harshilsharma63@users.noreply.github.com >
2025-04-23 12:49:54 +02:00
Amy Blais
f0dfe1c49f
Updated minimum supported Edge, Chrome and Firefox versions ( #30825 )
...
Automatic Merge
2025-04-23 11:42:43 +03:00
Jesse Hallam
f6aeca7e50
avoid SELECT * in jobs store ( #30832 )
2025-04-23 12:11:09 +05:30
Jesse Hallam
3c9b2511bc
avoid SELECT * in audit store ( #30829 )
2025-04-23 08:37:06 +02:00
M-ZubairAhmed
e9c54bf88e
[MM-63685] Virtualize drafts in the drafts list ( #30563 )
2025-04-23 11:38:04 +05:30
Julien Tant
282f0769e5
[MM-62517] Improve cross team search UI ( #30698 )
...
Co-authored-by: Mattermost Build <build@mattermost.com >
2025-04-22 23:36:45 +00:00
Jesse Hallam
94bc32b50c
avoid SELECT * in cluster discovery store ( #30830 )
2025-04-23 05:08:43 +08:00
Jesse Hallam
b095ba22b8
avoid SELECT * in notify admin store ( #30834 )
2025-04-22 17:27:33 -03:00
Devin Binnie
a36d29b459
[MM-63023] Conditionally make thread item elements focusable based on whether they have an interaction ( #30592 )
...
* [MM-63023] Conditionally make thread item elements focusable based on whether they have an interaction
* Fix i18n & PR feedback
* Remove focusability from the text preview div
* Fix tests
2025-04-22 15:55:30 -04:00
Jesse Hallam
018c909e2f
avoid SELECT * in command stores ( #30831 )
...
* avoid SELECT * in command stores
* Define column names once and reuse as columns list in selects and inserts
* Define column names once and reuse with ExecBuilder
2025-04-22 19:37:10 +00:00
Harrison Healey
32ce2f13bb
MM-62382/MM-63615 Remove explicit reference to react-popper and remaining references to popper.js ( #30743 )
...
* Replace usage of react-popper in onboarding with floating-ui
* Remove direct dependency on react-popper
Compass components still depend on react-popper, but none of the web app
code does any more.
* Remove direct dependency on popper.js
* Remove unneeded dependency on @types/bootstrap and remaining indirect dependency on popper.js
2025-04-22 15:35:21 -04:00
Jesse Hallam
981d1d869a
avoid SELECT * in channel member history store ( #30828 )
2025-04-22 15:33:32 -04:00
Jesse Hallam
eb8aaba1bf
avoid SELECT * in link metadata store ( #30833 )
...
* avoid SELECT * in link metadata store
* Address PR comment: define column names once and reuse
2025-04-22 19:29:09 +00:00
Jesse Hallam
701ddc896a
MM-63791: guest permissions to teams ( #30789 )
...
* improve th.CreateGuestAndClient
* test coverage for guest user access to teams
* restrict guest access to public teams unless a member
2025-04-22 10:12:22 -03:00
Caleb Roseland
79561c44c2
MM-63276, MM-62707: CPA LDAP/SAML links and Duplicate field ( #30772 )
...
* Squashed commit of the following:
commit 42ef1ff8c3ff881b0f21cb4de23a5964f0bb106b
Merge: 4940da4326 c049748b88
Author: Mattermost Build <build@mattermost.com >
Date: Fri Mar 14 21:15:22 2025 +0200
Merge branch 'master' into MM-62695
commit 4940da4326ff787dd43fc486f06be415257181ae
Author: Julien Tant <julien@craftyx.fr >
Date: Fri Mar 14 12:14:45 2025 -0700
manage error the same way property field and value do
commit cd9ec590264ca3751a55fc0926318cbb6f46d471
Author: Julien Tant <julien@craftyx.fr >
Date: Fri Mar 14 12:05:02 2025 -0700
sanitize and validate
commit 2672e90b06331ff2e31a7807737cc1feff1c1beb
Author: Julien Tant <julien@craftyx.fr >
Date: Fri Mar 14 12:02:20 2025 -0700
use Len test method
commit d101950d655c7d6fd7a668a15554cc52a1d42667
Author: Julien Tant <julien@craftyx.fr >
Date: Fri Mar 14 11:59:12 2025 -0700
rearrange consts
commit ed1b8f66fb08f7be38615ced74282380d5d680b7
Author: Julien Tant <julien@craftyx.fr >
Date: Fri Mar 14 11:58:56 2025 -0700
rename CPASortOrder method
commit d3bc303fa3c9694d2f6d1531186f4fbe69efb956
Author: Julien Tant <julien@craftyx.fr >
Date: Fri Mar 14 11:54:24 2025 -0700
rename CustomProfileAttributes in method to CPA
commit b2323d44a6c3f31ea7c798f8a88c62878d5d2cdf
Author: Julien Tant <julien@craftyx.fr >
Date: Fri Mar 14 11:54:02 2025 -0700
Add SAML and LDAP attr
commit d411ae9da5a078cfbac60c5662bee27622ff31e5
Author: Julien Tant <julien@craftyx.fr >
Date: Wed Mar 12 11:58:21 2025 -0700
i18n
commit 27bc74c71462ae08d496104c908454ebc4f2def3
Author: Julien Tant <julien@craftyx.fr >
Date: Wed Mar 12 11:11:23 2025 -0700
fix TestDeleteCPAField test
commit 0d77071225d8575ace89cbe38c6c06fa94d7696b
Author: Julien Tant <julien@craftyx.fr >
Date: Wed Mar 12 10:28:49 2025 -0700
err->appErr
commit fe87a68caa49c7264c20c32cd4f598ffd18d503f
Author: Julien Tant <julien@craftyx.fr >
Date: Wed Mar 12 10:22:13 2025 -0700
i18n
commit 3b3ddf978fce66d9506416a10c03b21d6a12e9d0
Author: Julien Tant <julien@craftyx.fr >
Date: Wed Mar 12 10:21:12 2025 -0700
tests
commit 2f898bd53b832dea60dcdb960a71cd47709cddf8
Author: Julien Tant <julien@craftyx.fr >
Date: Tue Mar 11 15:09:12 2025 -0700
add validation and tests
commit a8c20841af6e82a6bf4f5dde6324b5e56c4d754e
Author: Julien Tant <julien@craftyx.fr >
Date: Tue Mar 11 13:45:53 2025 -0700
code style
commit 5bb3868b2ce93b9eb6e9d0836c597fa1176fbbbd
Merge: a4180d5d8f 7c25de2cff
Author: Mattermost Build <build@mattermost.com >
Date: Tue Mar 11 22:24:06 2025 +0200
Merge branch 'master' into MM-62695
commit a4180d5d8ff5e23a7a0a73b08806d37289e076ce
Author: Julien Tant <julien@craftyx.fr >
Date: Tue Feb 25 11:53:54 2025 -0700
use CPAField
commit 988177024ceebe73750ce48c40ea0a9ca6db75d6
Author: Julien Tant (aider) <julien@craftyx.fr >
Date: Tue Feb 25 10:52:47 2025 -0700
refactor: Move validateCustomProfileAttributesField to Validate method on CPAField struct
commit 783e64472c7ef3c1e33ce9a94b0716e96a72b105
Author: Julien Tant <julien@craftyx.fr >
Date: Tue Feb 25 10:52:45 2025 -0700
refactor: Improve custom profile attributes field handling and validation
commit aee06af59c748e74e5dc7718c1529527ac8c052a
Author: Julien Tant (aider) <julien@craftyx.fr >
Date: Tue Feb 25 10:50:29 2025 -0700
test: Add test case for CPA field with empty attributes
commit 7ab4455f9feb88826fcf6abb3b93a8a7bb53ed3e
Author: Julien Tant <julien@craftyx.fr >
Date: Tue Feb 25 10:50:28 2025 -0700
refactor: Cleanup whitespace and remove empty Attrs in custom profile attributes test
commit dbdb47d75818d58739c3962d8624388214382611
Author: Julien Tant (aider) <julien@craftyx.fr >
Date: Tue Feb 25 10:48:08 2025 -0700
test: Add test case for property field with empty attributes
commit 43872e06933b40f45caadbca7708eab283cebd8d
Author: Julien Tant (aider) <julien@craftyx.fr >
Date: Tue Feb 25 10:44:39 2025 -0700
test: Add tests for NewCPAFieldFromPropertyField and CPAFieldToPropertyField
commit 335f6b5c8901b6ecdc1e9f031a81695ffc269029
Merge: 01f632db46 e8ef26196c
Author: Julien Tant <julien@craftyx.fr >
Date: Tue Feb 25 10:05:43 2025 -0700
Merge branch 'master' into MM-62695
commit 01f632db46cf0eeeea0bac337b10c66fad815a24
Author: Julien Tant <julien@craftyx.fr >
Date: Thu Feb 13 19:16:33 2025 -0700
removed unused i18n
commit 0214d7eb947d3d8ecfde169cb07c210ecbfc9c92
Merge: db0e371ca2 68c11e9ecb
Author: Julien Tant <julien@craftyx.fr >
Date: Thu Feb 13 19:15:08 2025 -0700
Merge remote-tracking branch 'origin/master' into MM-62695
commit db0e371ca239b5286e58ad264c46a8891eafbe9b
Author: Julien Tant <julien@craftyx.fr >
Date: Thu Feb 13 19:05:58 2025 -0700
generic options
commit 3cd62774a1b54e5e9da0c1c5b2626de4f49116ca
Merge: d95e5d9838 41e0f97176
Author: Julien Tant <julien@craftyx.fr >
Date: Thu Feb 13 10:48:47 2025 -0700
Merge remote-tracking branch 'origin/master' into MM-62695
commit d95e5d9838b9b00bd4ef9ec066df03cfc52596d7
Author: Julien Tant <julien@craftyx.fr >
Date: Wed Feb 12 17:07:28 2025 -0700
style
commit 2256076ed174b25a5decc2631ee6abaa9fa1a3c1
Author: Julien Tant (aider) <julien@craftyx.fr >
Date: Wed Feb 12 17:06:22 2025 -0700
refactor: Make color field optional in custom profile attributes
commit 7382b8ecb3964083d24d879210aa3d137983b404
Author: Julien Tant <julien@craftyx.fr >
Date: Wed Feb 12 16:40:10 2025 -0700
fix api test
commit a54c2d653f9a2e46d989181f9ef5ffd3dcbdb8c0
Author: Julien Tant <julien@craftyx.fr >
Date: Wed Feb 12 16:02:27 2025 -0700
lint
commit 9d2e3f78f6ba836b599df7f3cdd4766bf47cd600
Author: Julien Tant <julien@craftyx.fr >
Date: Wed Feb 12 15:50:31 2025 -0700
use custom types rather than string
commit 4624df52cbda3cb9b0f8fa60b7a3d4f5ecf1c845
Author: Julien Tant (aider) <julien@craftyx.fr >
Date: Wed Feb 12 15:40:52 2025 -0700
refactor: Use consistent "ValidateCPAField" in error messages for custom profile attributes
commit 42716170b7158cc4d3ce06cfef36046be6290def
Author: Julien Tant <julien@craftyx.fr >
Date: Wed Feb 12 15:36:04 2025 -0700
fix casing in custom profilte attributes test
commit bcca3d87c47efcf95fcea2d1b380ce8aee89f7d4
Author: Julien Tant (aider) <julien@craftyx.fr >
Date: Wed Feb 12 15:33:26 2025 -0700
refactor: Modify CustomProfileAttributesSelectOption to use lowercase JSON keys
commit 861e12c1fcaedb69d331120bd4ae58757df1fae1
Author: Julien Tant <julien@craftyx.fr >
Date: Wed Feb 12 15:29:23 2025 -0700
i18n
commit a44f6f40eb5babab5f72a49078bec110a4645ddb
Author: Julien Tant <julien@craftyx.fr >
Date: Wed Feb 12 15:21:08 2025 -0700
improve test
commit b2f002016fb7438a4507f9cb1cc236a43fb71e27
Author: Julien Tant (aider) <julien@craftyx.fr >
Date: Wed Feb 12 15:10:00 2025 -0700
test: Add test case for preserving option IDs when patching select field
commit aac155ef23866d7b85ef49483eec5b610b2a8bc0
Author: Julien Tant <julien@craftyx.fr >
Date: Wed Feb 12 15:04:18 2025 -0700
don't do validation in constructor
commit a88c092768fb0c46b76e72d6e27f417d3f25ba86
Author: Julien Tant (aider) <julien@craftyx.fr >
Date: Wed Feb 12 15:00:10 2025 -0700
feat: Enhance ID validation and trimming in custom profile attributes
commit b6fb5f274a97f9de4d80899a406b4397d2a4983e
Author: Julien Tant (aider) <julien@craftyx.fr >
Date: Wed Feb 12 14:57:24 2025 -0700
test: Add test cases for preserving IDs in custom profile attributes
commit bbb7f3e2610f4ebc96c6043504710f359d48a733
Author: Julien Tant (aider) <julien@craftyx.fr >
Date: Wed Feb 12 14:56:15 2025 -0700
refactor: Update CustomProfileAttributesSelectOption constructor to prioritize ID parameter
commit dbd1728a14fd708e60a3c1180b21a155221a032a
Author: Julien Tant <julien@craftyx.fr >
Date: Wed Feb 12 14:50:14 2025 -0700
feat: Add validation for custom profile attributes fields
commit e87689571bde77c2881f50af537930be9355f815
Author: Julien Tant (aider) <julien@craftyx.fr >
Date: Wed Feb 12 14:44:15 2025 -0700
test: Add comprehensive test for NewCustomProfileAttributesSelectOptionFromMap
commit a2292d44ff2cc496e36633440c3d0cbdb1930e45
Author: Julien Tant (aider) <julien@craftyx.fr >
Date: Wed Feb 12 14:43:14 2025 -0700
feat: Add support for lowercase and title case keys in custom profile attributes map
commit 47ca1848767d597f8305c4c183a68be476c034b9
Author: Julien Tant <julien@craftyx.fr >
Date: Wed Feb 12 14:43:12 2025 -0700
fix: Update custom profile attributes map keys to use capitalized names
commit e8de7dfc6d01c73064c10f65e0ecc86c4b2ae320
Author: Julien Tant (aider) <julien@craftyx.fr >
Date: Wed Feb 12 14:01:31 2025 -0700
feat: Add comprehensive test cases for custom profile attributes field validation
commit e798a53170d0aedbe25916cdaef3a11ac4191fd5
Author: Julien Tant <julien@craftyx.fr >
Date: Wed Feb 12 13:56:25 2025 -0700
add default visibility
commit e54ea2ba2f19bbcea06c9deed1a28923a2db5532
Author: Julien Tant <julien@craftyx.fr >
Date: Wed Feb 12 13:22:04 2025 -0700
fix tests
commit db1839a6e9b7d6a86ae334fa7bcae5e3aa622295
Author: Julien Tant (aider) <julien@craftyx.fr >
Date: Wed Feb 12 13:18:51 2025 -0700
feat: Add index number to validation error messages in custom profile attributes
commit 35e29a0dfd3fb3cc09b7a2ec9234791719224c01
Author: Julien Tant <julien@craftyx.fr >
Date: Wed Feb 12 13:18:49 2025 -0700
refactor: Add validation and creation methods for custom profile attributes
commit eac47527d27607fef30e840175c6ddb855445467
Author: Julien Tant (aider) <julien@craftyx.fr >
Date: Wed Feb 12 12:49:00 2025 -0700
feat: Add validation to prevent empty custom profile attribute options
commit 1baece68f945de3d8fe8d4fe9df0ebcb243ba5f7
Author: Julien Tant <julien@craftyx.fr >
Date: Wed Feb 12 12:48:36 2025 -0700
refactor: Rename NewCustomProfileAttributeSelectOption to NewCustomProfileAttributesSelectOption
commit 43710b018ab102f74ecaf2339e29593ae5dd3f55
Author: Julien Tant (aider) <julien@craftyx.fr >
Date: Wed Feb 12 12:46:43 2025 -0700
refactor: Replace map[string]bool with map[string]struct{} for key existence check
commit 3263b04478cf69533e298535f75a9d6f252e46de
Author: Julien Tant (aider) <julien@craftyx.fr >
Date: Wed Feb 12 12:46:06 2025 -0700
feat: Add IsValid method to validate CustomProfileAttributesSelectOptions
commit 4531710f560fbc22ab76f6a67597e154fec3c896
Author: Julien Tant <julien@craftyx.fr >
Date: Wed Feb 12 12:46:04 2025 -0700
refactor: Fix typo in custom profile attributes select option function name
commit c1c821275c574e15a0e03987098891e191e9aa55
Author: Julien Tant <julien@craftyx.fr >
Date: Wed Feb 12 12:42:50 2025 -0700
gofmt
commit 328c898a3f0c50f8b0dd83aa37c84c099342a8a4
Author: Julien Tant (aider) <julien@craftyx.fr >
Date: Wed Feb 12 12:41:14 2025 -0700
refactor: Trim spaces from name and color in custom profile attribute select option constructor
commit b924431499b1b1472f377fd6c8bc1e726e8857c3
Author: Julien Tant <julien@craftyx.fr >
Date: Wed Feb 12 12:41:12 2025 -0700
feat: Add custom profile attributes model with validation and constants
commit 463ad161c5141cc8994bab0278cdc1df54f4b4e3
Author: Julien Tant (aider) <julien@craftyx.fr >
Date: Wed Feb 12 12:40:19 2025 -0700
test: Add unit tests for custom profile attributes select options
* sort_order int temp
* name, type menu, dot menu
* values add/remove
* disabled when deleted
* - max length
- full height
- validate options
- clear attrs.options when not select/multiselect
* Revert "sort_order int temp"
This reverts commit ed675983c21965d7a9534e6c7b4eb38b8a751002.
* Revert "Squashed commit of the following:"
This reverts commit faf8b01169f0c285b7c77333f601e3cc7a1f4f18.
* field values test
* test type menu
* test table
* fix dot menu item id
* test delete modal
* test dot menu
* fix system_properties test
* fix user_properties_utils tests
* fix attr sort_order type
* i18n
* fix lint
* fix test types
* lint scss
* wip
* fix attrs json
* ldap/saml links
* duplicate
* menuitemlink - blockable
* user_properties_values tests
* add blockable link test
* user_properties_dot_menu test
* types
* lint styling
* fix test
* i18n
* self-review changes:
- enforce field limit for duplicate flow
- useMemo dep
- disable non-text field type options when ldap/saml syncing active
2025-04-22 12:55:05 +02:00
Hosted Weblate
ea217e2352
Update translation files
...
Updated by "Cleanup translation files" hook in Weblate.
Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/
2025-04-22 09:22:29 +00:00
Tom De Moor
8abf889500
Translated using Weblate (Dutch)
...
Currently translated at 99.9% (6133 of 6134 strings)
Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/nl/
2025-04-22 09:22:29 +00:00
Tom De Moor
7cc6f6aa3f
Translated using Weblate (Dutch)
...
Currently translated at 99.6% (2641 of 2649 strings)
Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/nl/
2025-04-22 09:22:29 +00:00
Tom De Moor
ad5f28a7f2
Translated using Weblate (Dutch)
...
Currently translated at 99.6% (6113 of 6134 strings)
Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/nl/
2025-04-22 09:22:29 +00:00
Matthew Williams
2c0320e904
Translated using Weblate (English (Australia))
...
Currently translated at 99.9% (6133 of 6134 strings)
Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/en_AU/
2025-04-22 09:22:29 +00:00
Matthew Williams
e06096417f
Translated using Weblate (English (Australia))
...
Currently translated at 99.9% (2648 of 2649 strings)
Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/en_AU/
2025-04-22 09:22:29 +00:00
Matthew Williams
7656bfa0d8
Translated using Weblate (English (Australia))
...
Currently translated at 98.9% (6067 of 6134 strings)
Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/en_AU/
2025-04-22 09:22:29 +00:00
Matthew Williams
bf8d6756df
Translated using Weblate (English (Australia))
...
Currently translated at 98.9% (2622 of 2649 strings)
Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/en_AU/
2025-04-22 09:22:29 +00:00
Frank Paul Silye
a7f85c9edd
Translated using Weblate (Norwegian Bokmål)
...
Currently translated at 78.1% (4795 of 6134 strings)
Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/nb_NO/
2025-04-22 09:22:29 +00:00
Frank Paul Silye
8636b409f6
Translated using Weblate (Norwegian Bokmål)
...
Currently translated at 2.9% (79 of 2649 strings)
Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/nb_NO/
2025-04-22 09:22:29 +00:00
Bohdan
95b277845e
Translated using Weblate (Ukrainian)
...
Currently translated at 100.0% (6134 of 6134 strings)
Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/uk/
2025-04-22 09:22:29 +00:00
Bohdan
7cd0f9aa38
Translated using Weblate (Ukrainian)
...
Currently translated at 100.0% (2649 of 2649 strings)
Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/uk/
2025-04-22 09:22:29 +00:00
Sharuru
916c8ee95c
Translated using Weblate (Chinese (Simplified Han script))
...
Currently translated at 100.0% (6134 of 6134 strings)
Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/zh_Hans/
2025-04-22 09:22:29 +00:00
Sharuru
c525fa1c88
Translated using Weblate (Chinese (Simplified Han script))
...
Currently translated at 100.0% (2649 of 2649 strings)
Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/zh_Hans/
2025-04-22 09:22:29 +00:00
Sharuru
fdb9c00ccb
Translated using Weblate (Chinese (Simplified Han script))
...
Currently translated at 98.7% (2617 of 2649 strings)
Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/zh_Hans/
2025-04-22 09:22:29 +00:00
Frank Paul Silye
10d02f9591
Translated using Weblate (Norwegian Bokmål)
...
Currently translated at 78.0% (4790 of 6134 strings)
Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/nb_NO/
2025-04-22 09:22:29 +00:00
Bohdan
d6e0421fc8
Translated using Weblate (Ukrainian)
...
Currently translated at 100.0% (6134 of 6134 strings)
Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/uk/
2025-04-22 09:22:29 +00:00
kaakaa
7d734a382f
Translated using Weblate (Japanese)
...
Currently translated at 100.0% (6134 of 6134 strings)
Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/ja/
2025-04-22 09:22:29 +00:00
kaakaa
c5421a693e
Translated using Weblate (Japanese)
...
Currently translated at 100.0% (2649 of 2649 strings)
Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/ja/
2025-04-22 09:22:29 +00:00
jprusch
f0cddc4b57
Translated using Weblate (German)
...
Currently translated at 100.0% (6134 of 6134 strings)
Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/de/
2025-04-22 09:22:29 +00:00
jprusch
57f0e8d0ca
Translated using Weblate (German)
...
Currently translated at 100.0% (2649 of 2649 strings)
Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/de/
2025-04-22 09:22:29 +00:00
jprusch
75d04a3941
Translated using Weblate (German)
...
Currently translated at 99.6% (6111 of 6134 strings)
Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/de/
2025-04-22 09:22:29 +00:00
Frank Paul Silye
fc39127cea
Translated using Weblate (Norwegian Bokmål)
...
Currently translated at 78.0% (4785 of 6134 strings)
Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/nb_NO/
2025-04-22 09:22:29 +00:00
Frank Paul Silye
efe604c05a
Translated using Weblate (Norwegian Bokmål)
...
Currently translated at 77.7% (4772 of 6134 strings)
Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/nb_NO/
2025-04-22 09:22:29 +00:00
Frank Paul Silye
998448880c
Translated using Weblate (Norwegian Bokmål)
...
Currently translated at 77.2% (4738 of 6134 strings)
Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/nb_NO/
2025-04-22 09:22:29 +00:00