[MM-63513] Turn Cross team search feature flag into a setting option (#30518)
* feat: Add EnableCrossTeamSearch configuration option to ServiceSettings * feat: Add EnableCrossTeamSearch configuration option to ServiceSettings * feat: Enable cross-team search by default * include old FF in client config
Этот коммит содержится в:
@@ -64,6 +64,7 @@
|
|||||||
"EnableEmojiPicker": true,
|
"EnableEmojiPicker": true,
|
||||||
"PostEditTimeLimit": -1,
|
"PostEditTimeLimit": -1,
|
||||||
"TimeBetweenUserTypingUpdatesMilliseconds": 5000,
|
"TimeBetweenUserTypingUpdatesMilliseconds": 5000,
|
||||||
|
"EnableCrossTeamSearch": true,
|
||||||
"EnablePostSearch": true,
|
"EnablePostSearch": true,
|
||||||
"EnableFileSearch": true,
|
"EnableFileSearch": true,
|
||||||
"MinimumHashtagLength": 3,
|
"MinimumHashtagLength": 3,
|
||||||
|
|||||||
@@ -151,6 +151,7 @@ const defaultServerConfig: AdminConfig = {
|
|||||||
EnableEmojiPicker: true,
|
EnableEmojiPicker: true,
|
||||||
PostEditTimeLimit: -1,
|
PostEditTimeLimit: -1,
|
||||||
TimeBetweenUserTypingUpdatesMilliseconds: 5000,
|
TimeBetweenUserTypingUpdatesMilliseconds: 5000,
|
||||||
|
EnableCrossTeamSearch: true,
|
||||||
EnablePostSearch: true,
|
EnablePostSearch: true,
|
||||||
EnableFileSearch: true,
|
EnableFileSearch: true,
|
||||||
MinimumHashtagLength: 3,
|
MinimumHashtagLength: 3,
|
||||||
@@ -749,7 +750,6 @@ const defaultServerConfig: AdminConfig = {
|
|||||||
WebSocketEventScope: true,
|
WebSocketEventScope: true,
|
||||||
NotificationMonitoring: true,
|
NotificationMonitoring: true,
|
||||||
ExperimentalAuditSettingsSystemConsoleUI: false,
|
ExperimentalAuditSettingsSystemConsoleUI: false,
|
||||||
ExperimentalCrossTeamSearch: false,
|
|
||||||
CustomProfileAttributes: false,
|
CustomProfileAttributes: false,
|
||||||
},
|
},
|
||||||
ImportSettings: {
|
ImportSettings: {
|
||||||
|
|||||||
@@ -5,8 +5,6 @@ import {createRandomTeam} from '@e2e-support/server';
|
|||||||
import {expect, test} from '@e2e-support/test_fixture';
|
import {expect, test} from '@e2e-support/test_fixture';
|
||||||
|
|
||||||
test('team selector must show all my teams', async ({pw}) => {
|
test('team selector must show all my teams', async ({pw}) => {
|
||||||
pw.skipIfFeatureFlagNotSet('ExperimentalCrossTeamSearch', true);
|
|
||||||
|
|
||||||
const {adminClient, user, team} = await pw.initSetup();
|
const {adminClient, user, team} = await pw.initSetup();
|
||||||
|
|
||||||
// # create 2 more teams and add the user to them
|
// # create 2 more teams and add the user to them
|
||||||
|
|||||||
@@ -101,6 +101,10 @@ func GenerateClientConfig(c *model.Config, telemetryID string, license *model.Li
|
|||||||
props["DisableWakeUpReconnectHandler"] = strconv.FormatBool(*c.ExperimentalSettings.DisableWakeUpReconnectHandler)
|
props["DisableWakeUpReconnectHandler"] = strconv.FormatBool(*c.ExperimentalSettings.DisableWakeUpReconnectHandler)
|
||||||
props["UsersStatusAndProfileFetchingPollIntervalMilliseconds"] = strconv.FormatInt(*c.ExperimentalSettings.UsersStatusAndProfileFetchingPollIntervalMilliseconds, 10)
|
props["UsersStatusAndProfileFetchingPollIntervalMilliseconds"] = strconv.FormatInt(*c.ExperimentalSettings.UsersStatusAndProfileFetchingPollIntervalMilliseconds, 10)
|
||||||
|
|
||||||
|
// Here we set the new option, but we also send the old FeatureFlag property for backwards compatibility on mobile < 2.27
|
||||||
|
props["EnableCrossTeamSearch"] = strconv.FormatBool(*c.ServiceSettings.EnableCrossTeamSearch)
|
||||||
|
props["FeatureFlagExperimentalCrossTeamSearch"] = strconv.FormatBool(*c.ServiceSettings.EnableCrossTeamSearch)
|
||||||
|
|
||||||
// Set default values for all options that require a license.
|
// Set default values for all options that require a license.
|
||||||
props["ExperimentalEnableAuthenticationTransfer"] = "true"
|
props["ExperimentalEnableAuthenticationTransfer"] = "true"
|
||||||
props["LdapNicknameAttributeSet"] = "false"
|
props["LdapNicknameAttributeSet"] = "false"
|
||||||
|
|||||||
@@ -526,6 +526,7 @@ func (ts *TelemetryService) trackConfig() {
|
|||||||
"enable_channel_viewed_messages": *cfg.ServiceSettings.EnableChannelViewedMessages,
|
"enable_channel_viewed_messages": *cfg.ServiceSettings.EnableChannelViewedMessages,
|
||||||
"time_between_user_typing_updates_milliseconds": *cfg.ServiceSettings.TimeBetweenUserTypingUpdatesMilliseconds,
|
"time_between_user_typing_updates_milliseconds": *cfg.ServiceSettings.TimeBetweenUserTypingUpdatesMilliseconds,
|
||||||
"cluster_log_timeout_milliseconds": *cfg.ServiceSettings.ClusterLogTimeoutMilliseconds,
|
"cluster_log_timeout_milliseconds": *cfg.ServiceSettings.ClusterLogTimeoutMilliseconds,
|
||||||
|
"enable_cross_team_search": *cfg.ServiceSettings.EnableCrossTeamSearch,
|
||||||
"enable_post_search": *cfg.ServiceSettings.EnablePostSearch,
|
"enable_post_search": *cfg.ServiceSettings.EnablePostSearch,
|
||||||
"minimum_hashtag_length": *cfg.ServiceSettings.MinimumHashtagLength,
|
"minimum_hashtag_length": *cfg.ServiceSettings.MinimumHashtagLength,
|
||||||
"enable_user_statuses": *cfg.ServiceSettings.EnableUserStatuses,
|
"enable_user_statuses": *cfg.ServiceSettings.EnableUserStatuses,
|
||||||
|
|||||||
@@ -392,6 +392,7 @@ type ServiceSettings struct {
|
|||||||
EnableEmojiPicker *bool `access:"site_emoji"`
|
EnableEmojiPicker *bool `access:"site_emoji"`
|
||||||
PostEditTimeLimit *int `access:"user_management_permissions"`
|
PostEditTimeLimit *int `access:"user_management_permissions"`
|
||||||
TimeBetweenUserTypingUpdatesMilliseconds *int64 `access:"experimental_features,write_restrictable,cloud_restrictable"`
|
TimeBetweenUserTypingUpdatesMilliseconds *int64 `access:"experimental_features,write_restrictable,cloud_restrictable"`
|
||||||
|
EnableCrossTeamSearch *bool `access:"write_restrictable,cloud_restrictable"`
|
||||||
EnablePostSearch *bool `access:"write_restrictable,cloud_restrictable"`
|
EnablePostSearch *bool `access:"write_restrictable,cloud_restrictable"`
|
||||||
EnableFileSearch *bool `access:"write_restrictable"`
|
EnableFileSearch *bool `access:"write_restrictable"`
|
||||||
MinimumHashtagLength *int `access:"environment_database,write_restrictable,cloud_restrictable"`
|
MinimumHashtagLength *int `access:"environment_database,write_restrictable,cloud_restrictable"`
|
||||||
@@ -620,6 +621,10 @@ func (s *ServiceSettings) SetDefaults(isUpdate bool) {
|
|||||||
s.TimeBetweenUserTypingUpdatesMilliseconds = NewPointer(int64(5000))
|
s.TimeBetweenUserTypingUpdatesMilliseconds = NewPointer(int64(5000))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if s.EnableCrossTeamSearch == nil {
|
||||||
|
s.EnableCrossTeamSearch = NewPointer(true)
|
||||||
|
}
|
||||||
|
|
||||||
if s.EnablePostSearch == nil {
|
if s.EnablePostSearch == nil {
|
||||||
s.EnablePostSearch = NewPointer(true)
|
s.EnablePostSearch = NewPointer(true)
|
||||||
}
|
}
|
||||||
@@ -3645,9 +3650,11 @@ func (s *ExportSettings) SetDefaults() {
|
|||||||
|
|
||||||
type ConfigFunc func() *Config
|
type ConfigFunc func() *Config
|
||||||
|
|
||||||
const ConfigAccessTagType = "access"
|
const (
|
||||||
const ConfigAccessTagWriteRestrictable = "write_restrictable"
|
ConfigAccessTagType = "access"
|
||||||
const ConfigAccessTagCloudRestrictable = "cloud_restrictable"
|
ConfigAccessTagWriteRestrictable = "write_restrictable"
|
||||||
|
ConfigAccessTagCloudRestrictable = "cloud_restrictable"
|
||||||
|
)
|
||||||
|
|
||||||
// Allows read access if any PermissionSysconsoleRead* is allowed
|
// Allows read access if any PermissionSysconsoleRead* is allowed
|
||||||
const ConfigAccessTagAnySysConsoleRead = "*_read"
|
const ConfigAccessTagAnySysConsoleRead = "*_read"
|
||||||
|
|||||||
@@ -56,8 +56,6 @@ type FeatureFlags struct {
|
|||||||
|
|
||||||
ExperimentalAuditSettingsSystemConsoleUI bool
|
ExperimentalAuditSettingsSystemConsoleUI bool
|
||||||
|
|
||||||
ExperimentalCrossTeamSearch bool
|
|
||||||
|
|
||||||
CustomProfileAttributes bool
|
CustomProfileAttributes bool
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -82,7 +80,6 @@ func (f *FeatureFlags) SetDefaults() {
|
|||||||
f.WebSocketEventScope = true
|
f.WebSocketEventScope = true
|
||||||
f.NotificationMonitoring = true
|
f.NotificationMonitoring = true
|
||||||
f.ExperimentalAuditSettingsSystemConsoleUI = false
|
f.ExperimentalAuditSettingsSystemConsoleUI = false
|
||||||
f.ExperimentalCrossTeamSearch = true
|
|
||||||
f.CustomProfileAttributes = false
|
f.CustomProfileAttributes = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -47,6 +47,7 @@
|
|||||||
"EnableEmojiPicker": true,
|
"EnableEmojiPicker": true,
|
||||||
"PostEditTimeLimit": -1,
|
"PostEditTimeLimit": -1,
|
||||||
"TimeBetweenUserTypingUpdatesMilliseconds": 5000,
|
"TimeBetweenUserTypingUpdatesMilliseconds": 5000,
|
||||||
|
"EnableCrossTeamSearch": true,
|
||||||
"EnablePostSearch": true,
|
"EnablePostSearch": true,
|
||||||
"MinimumHashtagLength": 3,
|
"MinimumHashtagLength": 3,
|
||||||
"EnableUserTypingMessages": true,
|
"EnableUserTypingMessages": true,
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import styled from 'styled-components';
|
|||||||
|
|
||||||
import {TrackCrossTeamSearchFeature, TrackCrossTeamSearchAllTeamsEvent, TrackCrossTeamSearchCurrentTeamEvent, TrackCrossTeamSearchDifferentTeamEvent} from 'mattermost-redux/constants/telemetry';
|
import {TrackCrossTeamSearchFeature, TrackCrossTeamSearchAllTeamsEvent, TrackCrossTeamSearchCurrentTeamEvent, TrackCrossTeamSearchDifferentTeamEvent} from 'mattermost-redux/constants/telemetry';
|
||||||
import {getCurrentChannelNameForSearchShortcut} from 'mattermost-redux/selectors/entities/channels';
|
import {getCurrentChannelNameForSearchShortcut} from 'mattermost-redux/selectors/entities/channels';
|
||||||
import {getFeatureFlagValue} from 'mattermost-redux/selectors/entities/general';
|
import {getIsCrossTeamSearchEnabled} from 'mattermost-redux/selectors/entities/general';
|
||||||
import {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';
|
import {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';
|
||||||
|
|
||||||
import {trackFeatureEvent} from 'actions/telemetry_actions';
|
import {trackFeatureEvent} from 'actions/telemetry_actions';
|
||||||
@@ -25,8 +25,6 @@ import * as Keyboard from 'utils/keyboard';
|
|||||||
import {isServerVersionGreaterThanOrEqualTo} from 'utils/server_version';
|
import {isServerVersionGreaterThanOrEqualTo} from 'utils/server_version';
|
||||||
import {isDesktopApp, getDesktopVersion, isMacApp} from 'utils/user_agent';
|
import {isDesktopApp, getDesktopVersion, isMacApp} from 'utils/user_agent';
|
||||||
|
|
||||||
import type {GlobalState} from 'types/store';
|
|
||||||
|
|
||||||
import SearchBox from './search_box';
|
import SearchBox from './search_box';
|
||||||
|
|
||||||
const PopoverStyled = styled(Popover)`
|
const PopoverStyled = styled(Popover)`
|
||||||
@@ -115,7 +113,7 @@ const NewSearch = (): JSX.Element => {
|
|||||||
const searchTeam = useSelector(getSearchTeam);
|
const searchTeam = useSelector(getSearchTeam);
|
||||||
const pluginSearch = useSelector(getSearchButtons);
|
const pluginSearch = useSelector(getSearchButtons);
|
||||||
const currentTeamId = useSelector(getCurrentTeamId);
|
const currentTeamId = useSelector(getCurrentTeamId);
|
||||||
const crossTeamSearchEnabled = useSelector((state: GlobalState) => getFeatureFlagValue(state, 'ExperimentalCrossTeamSearch')) === 'true';
|
const crossTeamSearchEnabled = useSelector(getIsCrossTeamSearchEnabled);
|
||||||
|
|
||||||
const dispatch = useDispatch();
|
const dispatch = useDispatch();
|
||||||
const [focused, setFocused] = useState<boolean>(false);
|
const [focused, setFocused] = useState<boolean>(false);
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import type {ServerError} from '@mattermost/types/errors';
|
|||||||
|
|
||||||
import {getMorePostsForSearch, getMoreFilesForSearch} from 'mattermost-redux/actions/search';
|
import {getMorePostsForSearch, getMoreFilesForSearch} from 'mattermost-redux/actions/search';
|
||||||
import {getCurrentChannel} from 'mattermost-redux/selectors/entities/channels';
|
import {getCurrentChannel} from 'mattermost-redux/selectors/entities/channels';
|
||||||
import {getFeatureFlagValue} from 'mattermost-redux/selectors/entities/general';
|
import {getIsCrossTeamSearchEnabled} from 'mattermost-redux/selectors/entities/general';
|
||||||
|
|
||||||
import {autocompleteChannelsForSearch} from 'actions/channel_actions';
|
import {autocompleteChannelsForSearch} from 'actions/channel_actions';
|
||||||
import {autocompleteUsersInCurrentTeam} from 'actions/user_actions';
|
import {autocompleteUsersInCurrentTeam} from 'actions/user_actions';
|
||||||
@@ -43,6 +43,7 @@ function mapStateToProps(state: GlobalState) {
|
|||||||
const currentChannel = getCurrentChannel(state);
|
const currentChannel = getCurrentChannel(state);
|
||||||
const isMobileView = getIsMobileView(state);
|
const isMobileView = getIsMobileView(state);
|
||||||
const isRhsOpen = getIsRhsOpen(state);
|
const isRhsOpen = getIsRhsOpen(state);
|
||||||
|
const crossTeamSearchEnabled = getIsCrossTeamSearchEnabled(state);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
currentChannel,
|
currentChannel,
|
||||||
@@ -64,7 +65,7 @@ function mapStateToProps(state: GlobalState) {
|
|||||||
isPinnedPosts: rhsState === RHSStates.PIN,
|
isPinnedPosts: rhsState === RHSStates.PIN,
|
||||||
isChannelFiles: rhsState === RHSStates.CHANNEL_FILES,
|
isChannelFiles: rhsState === RHSStates.CHANNEL_FILES,
|
||||||
isMobileView,
|
isMobileView,
|
||||||
crossTeamSearchEnabled: getFeatureFlagValue(state, 'ExperimentalCrossTeamSearch') === 'true',
|
crossTeamSearchEnabled,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -159,3 +159,7 @@ export const getCustomProfileAttributes: (state: GlobalState) => UserPropertyFie
|
|||||||
return Object.values(fields).sort((a, b) => (a.attrs?.sort_order ?? 0) - (b.attrs?.sort_order ?? 0));
|
return Object.values(fields).sort((a, b) => (a.attrs?.sort_order ?? 0) - (b.attrs?.sort_order ?? 0));
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
export function getIsCrossTeamSearchEnabled(state: GlobalState): boolean {
|
||||||
|
return state.entities.general.config.EnableCrossTeamSearch === 'true';
|
||||||
|
}
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ export type ClientConfig = {
|
|||||||
EnableUserStatuses: string;
|
EnableUserStatuses: string;
|
||||||
EnableLastActiveTime: string;
|
EnableLastActiveTime: string;
|
||||||
EnableTimedDND: string;
|
EnableTimedDND: string;
|
||||||
|
EnableCrossTeamSearch: 'true' | 'false';
|
||||||
EnableCustomTermsOfService: string;
|
EnableCustomTermsOfService: string;
|
||||||
EnableDeveloper: string;
|
EnableDeveloper: string;
|
||||||
EnableDiagnostics: string;
|
EnableDiagnostics: string;
|
||||||
@@ -353,6 +354,7 @@ export type ServiceSettings = {
|
|||||||
GiphySdkKey: string;
|
GiphySdkKey: string;
|
||||||
PostEditTimeLimit: number;
|
PostEditTimeLimit: number;
|
||||||
TimeBetweenUserTypingUpdatesMilliseconds: number;
|
TimeBetweenUserTypingUpdatesMilliseconds: number;
|
||||||
|
EnableCrossTeamSearch: boolean;
|
||||||
EnablePostSearch: boolean;
|
EnablePostSearch: boolean;
|
||||||
EnableFileSearch: boolean;
|
EnableFileSearch: boolean;
|
||||||
MinimumHashtagLength: number;
|
MinimumHashtagLength: number;
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user