Feature: Wrangler (#23602)
* Migrate feature/wrangler to mono-repo * Add wrangler files * Fix linters, types, etc * Fix snapshots * Fix playwright * Fix pipelines * Fix more pipeline * Fixes for pipelines * More changes for pipeline * Fix types * Add support for a feature flag, but leave it defaulted on for spinwick usage for now * Update snapshot * fix js error when removing last value of multiselect, support CSV marshaling to string array for textsetting * Fix linter * Remove TODO * Remove another TODO * fix tests * Fix i18n * Add server tests * Fix linter * Fix linter * Use proper icon for dot menu * Update snapshot * Add Cypress UI tests for various entrypoints to move thread modal, split SCSS out from forward post into its own thing * clean up * fix linter * More cleanup * Revert files to master * Fix linter for e2e tests * Make ForwardPostChannelSelect channel types configurable with a prop * Add missing return * Fixes from PR feedback * First batch of PR Feedback * Another batch of PR changes * Fix linter * Update snapshots * Wrangler system messages are translated to each user's locale * Initially translate Wrangler into system locale rather than initiating user * More fixes for PR Feedback * Fix some server tests * More updates with master. Fixes around pipelines. Enforce Enterprise license on front/back end * Add tests for dot_menu * More pipeline fixes * Fix e2etests prettier * Update cypress tests, change occurrences of 'Wrangler' with 'Move Thread' * Fix linter * Remove enterprise lock * A couple more occurrences of wrangler strings, and one more enterprise lock * Fix server tests * Fix i18n * Fix e2e linter * Feature flag shouldn't be on by default * Enable move threads feature in smoke tests (#25657) * enable move threads feature * add @prod tag * Fix move_thread_from_public_channel e2e test * Fix e2e style --------- Co-authored-by: Mattermost Build <build@mattermost.com> Co-authored-by: yasserfaraazkhan <attitude3cena.yf@gmail.com>
Этот коммит содержится в:
@@ -1,10 +1,16 @@
|
||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
import type {Channel} from '@mattermost/types/channels';
|
||||
import type {ClientConfig} from '@mattermost/types/config';
|
||||
import type {Post} from '@mattermost/types/posts';
|
||||
import type {UserProfile} from '@mattermost/types/users';
|
||||
|
||||
import {createSelector} from 'mattermost-redux/selectors/create_selector';
|
||||
import {getCurrentUser} from 'mattermost-redux/selectors/entities/common';
|
||||
import {getConfig} from 'mattermost-redux/selectors/entities/general';
|
||||
import {getPost} from 'mattermost-redux/selectors/entities/posts';
|
||||
import {moveThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';
|
||||
import {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';
|
||||
|
||||
import {arePreviewsCollapsed} from 'selectors/preferences';
|
||||
@@ -52,3 +58,69 @@ export function isInlineImageVisible(state: GlobalState, postId: string, imageKe
|
||||
|
||||
return getGlobalItem(state, StoragePrefixes.INLINE_IMAGE_VISIBLE + currentUserId + '_' + postId + '_' + imageKey, !imageCollapsed);
|
||||
}
|
||||
|
||||
export function makeCanWrangler() {
|
||||
return createSelector(
|
||||
'makeCanWrangler',
|
||||
getConfig,
|
||||
getCurrentUser,
|
||||
moveThreadsEnabled,
|
||||
(_state: GlobalState, channelType: Channel['type']) => channelType,
|
||||
(_state: GlobalState, _channelType: Channel['type'], replyCount: number) => replyCount,
|
||||
(config: Partial<ClientConfig>, user: UserProfile, enabled: boolean, channelType: Channel['type'], replyCount: number) => {
|
||||
if (!enabled) {
|
||||
return false;
|
||||
}
|
||||
const {
|
||||
WranglerPermittedWranglerRoles,
|
||||
WranglerAllowedEmailDomain,
|
||||
WranglerMoveThreadMaxCount,
|
||||
WranglerMoveThreadFromPrivateChannelEnable,
|
||||
WranglerMoveThreadFromDirectMessageChannelEnable,
|
||||
WranglerMoveThreadFromGroupMessageChannelEnable,
|
||||
} = config;
|
||||
|
||||
let permittedUsers: string[] = [];
|
||||
if (WranglerPermittedWranglerRoles && WranglerPermittedWranglerRoles !== '') {
|
||||
permittedUsers = WranglerPermittedWranglerRoles?.split(',');
|
||||
}
|
||||
|
||||
let allowedEmailDomains: string[] = [];
|
||||
if (WranglerAllowedEmailDomain && WranglerAllowedEmailDomain !== '') {
|
||||
allowedEmailDomains = WranglerAllowedEmailDomain?.split(',') || [];
|
||||
}
|
||||
|
||||
if (permittedUsers.length > 0 && !user.roles.includes('system_admin')) {
|
||||
const roles = user.roles.split(' ');
|
||||
const hasRole = roles.some((role) => permittedUsers.includes(role));
|
||||
if (!hasRole) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (allowedEmailDomains?.length > 0) {
|
||||
if (!user.email || !allowedEmailDomains.includes(user.email.split('@')[1])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (Number(WranglerMoveThreadMaxCount) < replyCount) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (channelType === 'P' && WranglerMoveThreadFromPrivateChannelEnable === 'false') {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (channelType === 'D' && WranglerMoveThreadFromDirectMessageChannelEnable === 'false') {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (channelType === 'G' && WranglerMoveThreadFromGroupMessageChannelEnable === 'false') {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
Ссылка в новой задаче
Block a user