Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions api/v4/source/definitions.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -243,19 +243,27 @@ components:
roles:
type: string
last_viewed_at:
description: The time in milliseconds the channel was last viewed by the user
description: >-
The time in milliseconds the channel was last viewed by the user.
This field is omitted when the membership belongs to a user other
than the requester, as the value is private to that user.
type: integer
format: int64
nullable: true
msg_count:
type: integer
mention_count:
type: integer
notify_props:
$ref: "#/components/schemas/ChannelNotifyProps"
last_update_at:
description: The time in milliseconds the channel member was last updated
description: >-
The time in milliseconds the channel member was last updated. This
field is omitted when the membership belongs to a user other than
the requester, as the value is private to that user.
type: integer
format: int64
nullable: true
ChannelMemberWithTeamData:
allOf:
- $ref: "#/components/schemas/ChannelMember"
Expand Down
8 changes: 1 addition & 7 deletions docs/develop/integrate/plugins/interactive-dialogs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -436,8 +436,6 @@ The full list of supported fields for `date` elements is included below:
| `help_text` | String | (Optional) Help text displayed below the field. Maximum 150 characters. |
| `optional` | Boolean | (Optional) Set to `true` if this form element is not required. Default is `false`. |
| `datetime_config` | Object | (Optional) Nested date configuration object. See [datetime_config object](#datetime_config-object) for supported properties. |
| `min_date` | String | (Deprecated — use `datetime_config.min_date`.) Earliest selectable date. Supports ISO date format (YYYY-MM-DD) or relative formats (`today`, `tomorrow`, `+1d`, `-7d`, etc.). Full ISO datetime strings are accepted, but only the date part is parsed; timezone information is ignored. |
| `max_date` | String | (Deprecated — use `datetime_config.max_date`.) Latest selectable date. Supports ISO date format (YYYY-MM-DD) or relative formats (`today`, `+30d`, `+1y`, etc.). Full ISO datetime strings are accepted, but only the date part is parsed; timezone information is ignored. |

#### Date field usage examples

Expand Down Expand Up @@ -505,9 +503,6 @@ The full list of supported fields for `datetime` elements is included below:
| `help_text` | String | (Optional) Help text displayed below the field. Maximum 150 characters. |
| `optional` | Boolean | (Optional) Set to `true` if this form element is not required. Default is `false`. |
| `datetime_config` | Object | (Optional) Nested datetime configuration object. See [datetime_config object](#datetime_config-object) for supported properties. |
| `min_date` | String | (Deprecated — use `datetime_config.min_date`.) Earliest selectable date. Supports ISO format or relative formats (`today`, `tomorrow`, `+1d`, `-7d`, etc.). |
| `max_date` | String | (Deprecated — use `datetime_config.max_date`.) Latest selectable date. Supports ISO format or relative formats (`today`, `+30d`, `+1y`, etc.). |
| `time_interval` | Integer | (Deprecated — use `datetime_config.time_interval`.) Time selection interval in minutes. Must be between 1 and 1440, and must be a divisor of 1440 to create evenly spaced intervals throughout the day. Common values: 15, 30, 60, 90, 120. Default is 60. |

#### DateTime field usage examples

Expand Down Expand Up @@ -570,9 +565,8 @@ The `datetime_config` object groups date/datetime configuration into a single ne
| `time_interval` | Integer | `datetime` | 11.6 | (Optional) Time selection interval in minutes. Must be between 1 and 1440, and must be a divisor of 1440. Default is 60. |
| `location_timezone` | String | `datetime` | 11.6 | (Optional) IANA timezone used to display and submit the time (e.g. `America/Denver`, `Asia/Tokyo`). When set, all users see the same wall-clock time regardless of their own timezone. Defaults to the viewing user's timezone. |
| `manual_time_entry` | Boolean | `datetime` | 11.8 | (Optional) When `true`, users can type the time directly in addition to using the dropdown. Default is `false`. |
| `allow_manual_time_entry` | Boolean | `datetime` | 11.6 (deprecated in 11.8) | (Deprecated — use `manual_time_entry`.) When both are set, either enabling turns the feature on. |

**Backward compatibility (new in 11.8):** The top-level `min_date`, `max_date`, and `time_interval` fields on `date` and `datetime` elements are still accepted for existing integrations, but are deprecated in favor of `datetime_config`. When both are provided on the same element, values inside `datetime_config` take precedence over the legacy top-level values.
> **Breaking change (12.0):** The top-level `min_date`, `max_date`, and `time_interval` fields on `date`/`datetime` elements, and the `datetime_config.allow_manual_time_entry` field, have been removed. Integrations must send these values under `datetime_config` (using `manual_time_entry` instead of `allow_manual_time_entry`) or they will be silently ignored.

#### Date and DateTime field specifications

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -361,46 +361,6 @@ Set a default theme that applies to all new users on the system.
</tbody>
</table>

### Enable user typing messages

This setting determines whether "user is typing..." messages are displayed below the message box when using Mattermost in a web browser or the desktop app.

<table style={{width: '98%'}}>
<colgroup>
<col style={{width: '98%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"EnableUserTypingMessages": true</code> with options <code>true</code> and <code>false</code>.</td>
</tr>
</tbody>
</table>

<Note>

Disabling this experimental configuration setting in larger deployments may improve server performance in the following areas:

- Reduced Server Load: Typing events generate additional websocket traffic. Disabling them can reduce the amount of data that needs to be handled by the server, improving the overall response time and decreasing server load.
- Lower Network Traffic: When typing events are enabled, every keystroke generates a network event. This can lead to a significant amount of network traffic, particularly in busy channels. Disabling these events reduces the amount of information transmitted over the network.
- Client Performance: On the client side, processing typing events requires resources. By not having to handle these events, the client can be more responsive and use less memory and CPU.

</Note>

### User typing timeout

This setting defines how frequently "user is typing..." messages are updated, measured in milliseconds.

<table style={{width: '99%'}}>
<colgroup>
<col style={{width: '99%'}} />
</colgroup>
<tbody>
<tr>
<td>This feature's <code>config.json</code> setting is <code>"TimeBetweenUserTypingUpdatesMilliseconds": 5000</code> with numerical input.</td>
</tr>
</tbody>
</table>

### User's status and profile fetching poll interval

This setting configures the number of milliseconds to wait between fetching user statuses and profiles periodically. Set to `0` to disable.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1714,6 +1714,52 @@ While drafts can be very useful for maintaining work continuity, especially in c
</tbody>
</table>

### Enable user typing messages

<table>
<colgroup>
<col style={{width: '43%'}} />
<col style={{width: '56%'}} />
</colgroup>
<tbody>
<tr>
<td><p>This setting determines whether "user is typing..." messages are displayed below the message box.</p><ul><li><strong>true</strong>: <strong>(Default)</strong> "User is typing..." messages are displayed below the message box.</li><li><strong>false</strong>: "User is typing..." messages are not displayed.</li></ul></td>
<td><ul><li>System Config path: <strong>Site Configuration &gt; Posts</strong></li><li><code>config.json</code> setting: <code>ServiceSettings</code> &gt; <code>EnableUserTypingMessages</code> &gt; <code>true</code></li><li>Environment variable: <code>MM_SERVICESETTINGS_ENABLEUSERTYPINGMESSAGES</code></li></ul></td>
</tr>
</tbody>
</table>

<Note>

Disabling this configuration setting in larger deployments may improve server performance in the following areas:

- Reduced Server Load: Typing events generate additional websocket traffic. Disabling them can reduce the amount of data that needs to be handled by the server, improving the overall response time and decreasing server load.
- Lower Network Traffic: When typing events are enabled, every keystroke generates a network event. This can lead to a significant amount of network traffic, particularly in busy channels. Disabling these events reduces the amount of information transmitted over the network.
- Client Performance: On the client side, processing typing events requires resources. By not having to handle these events, the client can be more responsive and use less memory and CPU.

</Note>

### User typing timeout

<table>
<colgroup>
<col style={{width: '43%'}} />
<col style={{width: '56%'}} />
</colgroup>
<tbody>
<tr>
<td><p>The number of milliseconds to wait between emitting user typing websocket events, which determines how frequently "user is typing..." messages are updated.</p><p>Numerical input in milliseconds. Default is <strong>5000</strong>. Minimum is 1000.</p></td>
<td><ul><li>System Config path: <strong>Site Configuration &gt; Posts</strong></li><li><code>config.json</code> setting: <code>ServiceSettings</code> &gt; <code>TimeBetweenUserTypingUpdatesMilliseconds</code> &gt; <code>5000</code></li><li>Environment variable: <code>MM_SERVICESETTINGS_TIMEBETWEENUSERTYPINGUPDATESMILLISECONDS</code></li></ul></td>
</tr>
</tbody>
</table>

<Note>

This setting only applies when **Enable user typing messages** is set to **true**.

</Note>

------------------------------------------------------------------------------------------------------------------------

## Content flagging
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ We recommend reviewing the [additional upgrade notes](#additional-upgrade-notes)
</thead>
<tbody>
<tr>
<td>v12.0</td>
<td><p>Mattermost v12.0 removes the deprecated interactive dialog date/datetime fields. Top-level <code>min_date</code>, <code>max_date</code>, and <code>time_interval</code> on dialog elements and app fields, and <code>datetime_config.allow_manual_time_entry</code>, are no longer accepted. Integrations must migrate to <code>datetime_config</code> (using <code>manual_time_entry</code> instead of <code>allow_manual_time_entry</code>) before upgrading to v12.0. Legacy keys are silently ignored, so date constraints and manual time entry will not apply until payloads are updated. See the <a href="https://developers.mattermost.com/integrate/plugins/interactive-dialogs/">interactive dialogs documentation</a> for details.</p></td>
</tr>
<tr>
<td rowspan="13">v11.9</td>
<td><p>Mattermost v11.9 changes how redirect URI allowlist patterns are matched for OAuth Dynamic Client Registration (DCR). Patterns are now evaluated per URL component (scheme, host, path, and query) rather than as a whole-string glob. As a result, a pattern such as <code>https://\*.example.com/\*\*</code> no longer matches redirect URIs that include a query string (for example, <code>https://app.example.com/callback?tenant=foo</code>); redirect URIs without a query string continue to match as expected.</p><p>Admins using DCR with redirect URIs that include query strings must update their allowlist. To allow redirect URIs both with and without a query string, add two separate entries:</p><ul><li><code>https://\*.example.com/\*\*</code> — matches redirect URIs with no query string.</li><li><code>https://\*.example.com/\*\*?\*\*</code> — matches redirect URIs with any query string.</li></ul><p>A pattern that includes a query component (such as <code>?\*\*</code>) only matches URIs that also carry a query string; it will not match URIs without one. Both entries are required to cover both cases.</p></td>
</tr>
Expand Down
1 change: 0 additions & 1 deletion e2e-tests/.ci/server.generate.sh
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,6 @@ services:
MM_EMAILSETTINGS_SMTPSERVER: "localhost"
MM_CLUSTERSETTINGS_READONLYCONFIG: "false"
MM_SERVICEENVIRONMENT: "test"
MM_FEATUREFLAGS_MOVETHREADSENABLED: "true"
MM_FEATUREFLAGS_CUSTOMPROFILEATTRIBUTES: "true"
MM_FEATUREFLAGS_PERMISSIONPOLICIES: "true"
MM_FEATUREFLAGS_TEAMMEMBERSHIPACCESSCONTROL: "true"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@

import * as TIMEOUTS from '@/fixtures/timeouts';

describe('Move Thread', () => {
// Skipped: MoveThreadsEnabled is retired and rejected by Config.IsValid (MM-69646).
// These specs require the flag and cannot run while the server refuses to enable it.
describe.skip('Move Thread', () => {
let user1;
let user2;
let testTeam;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@

import * as TIMEOUTS from '@/fixtures/timeouts';

describe('Move thread', () => {
// Skipped: MoveThreadsEnabled is retired and rejected by Config.IsValid (MM-69646).
// These specs require the flag and cannot run while the server refuses to enable it.
describe.skip('Move thread', () => {
let user1;
let user2;
let user3;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@

import * as TIMEOUTS from '@/fixtures/timeouts';

describe('Move thread', () => {
// Skipped: MoveThreadsEnabled is retired and rejected by Config.IsValid (MM-69646).
// These specs require the flag and cannot run while the server refuses to enable it.
describe.skip('Move thread', () => {
let user1;
let testTeam;
let privateChannel;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@
// Stage: @prod
// Group: @channels @enterprise @messaging

describe('Move Thread', () => {
// Skipped: MoveThreadsEnabled is retired and rejected by Config.IsValid (MM-69646).
// These specs require the flag and cannot run while the server refuses to enable it.
describe.skip('Move Thread', () => {
let user1;
let user2;
let user3;
Expand Down
12 changes: 9 additions & 3 deletions e2e-tests/cypress/utils/webhook_utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -437,7 +437,9 @@ function getBasicDateTimeDialog(triggerId, webhookBaseUrl) {
placeholder: 'Select date and time',
help_text: 'Select the date and time for your meeting',
optional: false,
time_interval: 60,
datetime_config: {
time_interval: 60,
},
},
],
submit_label: 'Submit',
Expand Down Expand Up @@ -465,7 +467,9 @@ function getMinDateConstraintDialog(triggerId, webhookBaseUrl) {
placeholder: 'Select a future date',
help_text: 'Must be today or later',
optional: true,
min_date: 'today',
datetime_config: {
min_date: 'today',
},
},
],
submit_label: 'Submit',
Expand Down Expand Up @@ -493,7 +497,9 @@ function getCustomIntervalDialog(triggerId, webhookBaseUrl) {
placeholder: 'Select time (30min intervals)',
help_text: 'Time picker with 30-minute intervals',
optional: true,
time_interval: 30,
datetime_config: {
time_interval: 30,
},
},
],
submit_label: 'Submit',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -567,7 +567,9 @@ function getBasicDateTimeDialog(triggerId, webhookBaseUrl) {
placeholder: 'Select date and time',
help_text: 'Select the date and time for your meeting',
optional: false,
time_interval: 60,
datetime_config: {
time_interval: 60,
},
},
],
submit_label: 'Submit',
Expand Down Expand Up @@ -595,7 +597,9 @@ function getMinDateConstraintDialog(triggerId, webhookBaseUrl) {
placeholder: 'Select a future date',
help_text: 'Must be today or later',
optional: true,
min_date: 'today',
datetime_config: {
min_date: 'today',
},
},
],
submit_label: 'Submit',
Expand Down Expand Up @@ -623,7 +627,9 @@ function getCustomIntervalDialog(triggerId, webhookBaseUrl) {
placeholder: 'Select time (30min intervals)',
help_text: 'Time picker with 30-minute intervals',
optional: true,
time_interval: 30,
datetime_config: {
time_interval: 30,
},
},
],
submit_label: 'Submit',
Expand Down
1 change: 0 additions & 1 deletion e2e-tests/playwright/lib/src/containers/env_baseline.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ export const SERVER_ENV_BASELINE: Record<string, string> = {
// Feature flags this test suite needs on, off by default in the server
MM_FEATUREFLAGS_ATTRIBUTEVALUEMASKING: 'true',
MM_FEATUREFLAGS_ENABLEREMOTECLUSTERSERVICE: 'true',
MM_FEATUREFLAGS_MOVETHREADSENABLED: 'true',
MM_FEATUREFLAGS_PERMISSIONPOLICIES: 'true',
MM_FEATUREFLAGS_PROPERTYFIELDRANK: 'true',
MM_FEATUREFLAGS_RECURRINGSCHEDULEDPOSTS: 'true',
Expand Down
Loading
Loading