Merge branch 'master' of github.com:mattermost/mattermost-server into MM-50966-in-product-expansion

Этот коммит содержится в:
Conor Macpherson
2023-04-10 15:44:47 -04:00
родитель 9e41644c5b 6e7759b314
Коммит cd82eede4d
755 изменённых файлов: 10576 добавлений и 6549 удалений

Просмотреть файл

@@ -5,7 +5,7 @@
"plugin:react-hooks/recommended"
],
"plugins": [
"@babel/eslint-plugin",
"@babel",
"mattermost",
"import",
"no-only-tests",
@@ -80,11 +80,22 @@
"react/style-prop-object": [2, {
"allow": ["Timestamp"]
}],
"no-restricted-imports": ["error", {
"paths": [
{"name": "react-bootstrap", "importNames": ["OverlayTrigger"], "message": "Please use OverlayTrigger from '/components/overlay_trigger' instead"}
]
}],
"no-restricted-imports": [
"error",
{
"patterns": [
{
"group": ["react-bootstrap"],
"importNames": ["OverlayTrigger"],
"message": "Please use OverlayTrigger from '/components/overlay_trigger' instead."
},
{
"group": ["@mattermost/compass-components/*"],
"message": "compass-components is now archived"
}
]
}
],
"max-lines": ["warn", {"max": 800, "skipBlankLines": true, "skipComments": true}],
"formatjs/no-multiple-whitespaces": ["error"]
},

Просмотреть файл

@@ -5,10 +5,6 @@
},
"version": "7.9.0",
"private": true,
"engines": {
"npm": ">=7.0.0",
"node": ">=16.4.0"
},
"dependencies": {
"@floating-ui/react-dom": "1.0.0",
"@floating-ui/react-dom-interactions": "0.10.3",
@@ -123,14 +119,12 @@
"@types/bootstrap": "4.5.0",
"@types/country-list": "2.1.0",
"@types/enzyme": "3.10.11",
"@types/highlight.js": "10.1.0",
"@types/jest": "26.0.24",
"@types/katex": "0.11.0",
"@types/lodash": "4.14.182",
"@types/luxon": "3.0.2",
"@types/mark.js": "8.11.6",
"@types/marked": "0.7.4",
"@types/moment-timezone": "0.5.30",
"@types/node": "16.3.1",
"@types/react": "17.0.2",
"@types/react-beautiful-dnd": "13.1.2",
@@ -153,8 +147,8 @@
"@types/styled-components": "5.1.24",
"@types/tinycolor2": "1.4.3",
"@types/webpack-env": "1.18.0",
"@typescript-eslint/eslint-plugin": "5.41.0",
"@typescript-eslint/parser": "5.41.0",
"@typescript-eslint/eslint-plugin": "5.57.1",
"@typescript-eslint/parser": "5.57.1",
"babel-loader": "8.2.3",
"babel-plugin-lodash": "3.3.4",
"babel-plugin-styled-components": "1.12.0",
@@ -167,14 +161,13 @@
"enzyme": "3.11.0",
"enzyme-adapter-react-17-updated": "1.0.2",
"enzyme-to-json": "3.6.2",
"eslint": "7.32.0",
"eslint-import-resolver-webpack": "0.13.2",
"eslint-plugin-formatjs": "4.3.4",
"eslint-plugin-formatjs": "4.9.1",
"eslint-plugin-header": "3.1.1",
"eslint-plugin-import": "2.23.4",
"eslint-plugin-import": "2.27.5",
"eslint-plugin-mattermost": "github:mattermost/eslint-plugin-mattermost#5b0c972eacf19286e4c66221b39113bf8728a99e",
"eslint-plugin-no-only-tests": "2.6.0",
"eslint-plugin-react": "7.31.10",
"eslint-plugin-no-only-tests": "3.1.0",
"eslint-plugin-react": "7.32.2",
"eslint-plugin-react-hooks": "4.6.0",
"external-remotes-plugin": "1.0.0",
"file-loader": "6.2.0",

Просмотреть файл

@@ -14,13 +14,12 @@ import {
searchFilesWithParams,
} from 'mattermost-redux/actions/search';
import * as PostActions from 'mattermost-redux/actions/posts';
import {getCurrentUserId, getCurrentUserMentionKeys} from 'mattermost-redux/selectors/entities/users';
import {getCurrentUserMentionKeys} from 'mattermost-redux/selectors/entities/users';
import {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';
import {getConfig} from 'mattermost-redux/selectors/entities/general';
import {getCurrentChannelId, getCurrentChannelNameForSearchShortcut, getChannel as getChannelSelector} from 'mattermost-redux/selectors/entities/channels';
import {getPost} from 'mattermost-redux/selectors/entities/posts';
import {makeGetUserTimezone} from 'mattermost-redux/selectors/entities/timezone';
import {getUserCurrentTimezone} from 'mattermost-redux/utils/timezone_utils';
import {getCurrentTimezone} from 'mattermost-redux/selectors/entities/timezone';
import {Action, ActionResult, DispatchFunc, GenericAction, GetStateFunc} from 'mattermost-redux/types/actions';
import {Post} from '@mattermost/types/posts';
@@ -174,9 +173,7 @@ export function performSearch(terms: string, isMentionSearch?: boolean) {
}
// timezone offset in seconds
const userId = getCurrentUserId(getState());
const userTimezone = makeGetUserTimezone()(getState(), userId);
const userCurrentTimezone = getUserCurrentTimezone(userTimezone);
const userCurrentTimezone = getCurrentTimezone(getState());
const timezoneOffset = ((userCurrentTimezone && (userCurrentTimezone.length > 0)) ? getUtcOffsetForTimeZone(userCurrentTimezone) : getBrowserUtcOffset()) * 60;
const messagesPromise = dispatch(searchPostsWithParams(isMentionSearch ? '' : teamId, {terms, is_or_search: Boolean(isMentionSearch), include_deleted_channels: viewArchivedChannels, time_zone_offset: timezoneOffset, page: 0, per_page: 20}));
const filesPromise = dispatch(searchFilesWithParams(teamId, {terms: termsWithExtensionsFilters, is_or_search: Boolean(isMentionSearch), include_deleted_channels: viewArchivedChannels, time_zone_offset: timezoneOffset, page: 0, per_page: 20}));

Просмотреть файл

@@ -49,7 +49,7 @@ export default class AboutBuildModal extends React.PureComponent<Props, State> {
doHide = () => {
this.setState({show: false});
}
};
render() {
const config = this.props.config;

Просмотреть файл

@@ -32,11 +32,11 @@ export default class AccessHistoryModal extends React.PureComponent<Props, State
public onShow = () => { // public for testing
this.props.actions.getUserAudits(this.props.currentUserId, 0, 200);
}
};
public onHide = () => { // public for testing
this.setState({show: false});
}
};
public componentDidMount() {
this.onShow();

Просмотреть файл

@@ -23,7 +23,7 @@ export default class Accordion extends React.PureComponent<Props, State> {
setExpanded = (expandedKey: string) => {
this.setState({expandedKey});
}
};
render() {
return (

Просмотреть файл

@@ -39,7 +39,6 @@ exports[`components/actions_menu/ActionsMenu has actions - marketplace disabled
className="post-menu__item post-menu__item--active"
id="center_actions_button_post_id_1"
key="more-actions-button"
onClick={[Function]}
type="button"
>
<i
@@ -107,7 +106,6 @@ exports[`components/actions_menu/ActionsMenu has actions - marketplace enabled a
className="post-menu__item post-menu__item--active"
id="center_actions_button_post_id_1"
key="more-actions-button"
onClick={[Function]}
type="button"
>
<i
@@ -194,7 +192,6 @@ exports[`components/actions_menu/ActionsMenu no actions - sysadmin - menu should
className="post-menu__item post-menu__item--active"
id="center_actions_button_post_id_1"
key="more-actions-button"
onClick={[Function]}
type="button"
>
<i

Просмотреть файл

@@ -38,12 +38,7 @@ describe('components/actions_menu/ActionsMenu', () => {
isSysAdmin: true,
pluginMenuItems: [],
post: TestHelper.getPostMock({id: 'post_id_1', is_pinned: false, type: '' as PostType}),
showTutorialTip: false,
components: {},
handleOpenTip: jest.fn(),
handleNextTip: jest.fn(),
handleDismissTip: jest.fn(),
showPulsatingDot: false,
location: 'center',
canOpenMarketplace: false,
actions: {

Просмотреть файл

@@ -17,7 +17,6 @@ import {AppCallResponseTypes} from 'mattermost-redux/constants/apps';
import {HandleBindingClick, PostEphemeralCallResponseForPost, OpenAppsModal} from 'types/apps';
import {Locations, Constants, ModalIdentifiers} from 'utils/constants';
import Permissions from 'mattermost-redux/constants/permissions';
import {ActionsTutorialTip} from 'components/actions_menu/actions_menu_tutorial_tip';
import {ModalData} from 'types/actions';
import MarketplaceModal, {OpenedFromType} from 'components/plugin_marketplace/marketplace_modal';
import OverlayTrigger from 'components/overlay_trigger';
@@ -44,11 +43,6 @@ export type Props = {
pluginMenuItems?: PluginComponent[];
post: Post;
teamId: string;
handleOpenTip: () => void;
handleNextTip: (e: React.MouseEvent) => void;
handleDismissTip: () => void;
showPulsatingDot?: boolean;
showTutorialTip: boolean;
canOpenMarketplace: boolean;
/**
@@ -98,7 +92,7 @@ export class ActionMenuClass extends React.PureComponent<Props, State> {
appBindings: [],
location: Locations.CENTER,
pluginMenuItems: [],
}
};
private buttonRef: React.RefObject<HTMLButtonElement>;
constructor(props: Props) {
@@ -121,7 +115,7 @@ export class ActionMenuClass extends React.PureComponent<Props, State> {
defaultMessage='Message actions'
/>
</Tooltip>
)
);
componentDidUpdate(prevProps: Props) {
if (this.props.isMenuOpen && !prevProps.isMenuOpen) {
@@ -143,7 +137,7 @@ export class ActionMenuClass extends React.PureComponent<Props, State> {
this.setState({appBindings: data});
});
}
}
};
handleOpenMarketplace = (): void => {
const openedFrom: OpenedFromType = 'actions_menu';
@@ -203,7 +197,7 @@ export class ActionMenuClass extends React.PureComponent<Props, State> {
this.props.actions.postEphemeralCallResponseForPost(callResp, errorMessage, post);
}
}
}
};
visitMarketplaceTip(): React.ReactElement {
return (
@@ -236,14 +230,6 @@ export class ActionMenuClass extends React.PureComponent<Props, State> {
);
}
handleActionsIconClick = (e: React.MouseEvent) => {
if (this.props.showPulsatingDot || this.props.showTutorialTip) {
this.props.handleOpenTip();
e.preventDefault();
e.stopPropagation();
}
};
renderDivider = (suffix: string): React.ReactNode => {
return (
<li
@@ -277,7 +263,7 @@ export class ActionMenuClass extends React.PureComponent<Props, State> {
this.setState({
openUp: (spaceOnTop > spaceOnBottom),
});
}
};
render(): React.ReactNode {
const isSystemMessage = PostUtils.isSystemMessage(this.props.post);
@@ -413,17 +399,8 @@ export class ActionMenuClass extends React.PureComponent<Props, State> {
})}
type='button'
aria-expanded='false'
onClick={this.handleActionsIconClick}
>
<i className={'icon icon-apps'}/>
{this.props.showPulsatingDot &&
<ActionsTutorialTip
showTip={this.props.showTutorialTip}
handleNext={this.props.handleNextTip}
handleOpen={this.props.handleOpenTip}
handleDismiss={this.props.handleDismissTip}
/>
}
</button>
</OverlayTrigger>
<Menu

Просмотреть файл

@@ -37,11 +37,6 @@ describe('components/actions_menu/ActionsMenu returning empty ("")', () => {
},
appBindings: [],
pluginMenuItems: [],
handleOpenTip: jest.fn(),
handleNextTip: jest.fn(),
handleDismissTip: jest.fn(),
showPulsatingDot: false,
showTutorialTip: false,
appsEnabled: false,
isSysAdmin: true,
canOpenMarketplace: false,

Просмотреть файл

@@ -37,11 +37,6 @@ describe('components/actions_menu/ActionsMenu on mobile view', () => {
},
appBindings: [],
pluginMenuItems: [],
handleOpenTip: jest.fn(),
handleNextTip: jest.fn(),
handleDismissTip: jest.fn(),
showPulsatingDot: false,
showTutorialTip: false,
appsEnabled: false,
isSysAdmin: true,
canOpenMarketplace: false,

Просмотреть файл

@@ -6,7 +6,7 @@ import {Link, useRouteMatch, useLocation, matchPath} from 'react-router-dom';
import {useIntl} from 'react-intl';
import {useDispatch, useSelector} from 'react-redux';
import classNames from 'classnames';
import Icon from '@mattermost/compass-components/foundations/icon';
import Icon from '@mattermost/compass-components/foundations/icon'; // eslint-disable-line no-restricted-imports
import {insightsAreEnabled} from 'mattermost-redux/selectors/entities/preferences';
import {getIsRhsOpen, getRhsState} from 'selectors/rhs';

Просмотреть файл

@@ -5,7 +5,7 @@ import React, {memo, useCallback} from 'react';
import ReactSelect, {ValueType} from 'react-select';
import Icon from '@mattermost/compass-components/foundations/icon/Icon';
import Icon from '@mattermost/compass-components/foundations/icon/Icon'; // eslint-disable-line no-restricted-imports
import {trackEvent} from 'actions/telemetry_actions';

Просмотреть файл

@@ -11,14 +11,13 @@ import {TopChannel, TopChannelGraphData} from '@mattermost/types/insights';
import {CircleSkeletonLoader, RectangleSkeletonLoader} from '@mattermost/components';
import {getCurrentRelativeTeamUrl, getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';
import {getCurrentTimezone} from 'mattermost-redux/selectors/entities/timezone';
import {getMyTopChannels, getTopChannelsForTeam} from 'mattermost-redux/actions/insights';
import Constants, {InsightsScopes} from 'utils/constants';
import {trackEvent} from 'actions/telemetry_actions';
import {getCurrentUserTimezone} from 'selectors/general';
import OverlayTrigger from 'components/overlay_trigger';
import Tooltip from 'components/tooltip';
@@ -38,7 +37,7 @@ const TopChannels = (props: WidgetHocProps) => {
const currentTeamId = useSelector(getCurrentTeamId);
const currentTeamUrl = useSelector(getCurrentRelativeTeamUrl);
const timeZone = useSelector(getCurrentUserTimezone);
const timeZone = useSelector(getCurrentTimezone);
const getTopTeamChannels = useCallback(async () => {
if (props.filterType === InsightsScopes.TEAM) {

Просмотреть файл

@@ -53,7 +53,7 @@ type State = {
export default class ActivityLogModal extends React.PureComponent<Props, State> {
static propTypes = {
}
};
constructor(props: Props) {
super(props);
@@ -73,15 +73,15 @@ export default class ActivityLogModal extends React.PureComponent<Props, State>
this.props.actions.revokeSession(this.props.currentUserId, altId).then(() => {
this.props.actions.getSessions(this.props.currentUserId);
});
}
};
onShow = () => {
this.props.actions.getSessions(this.props.currentUserId);
}
};
onHide = () => {
this.setState({show: false});
}
};
componentDidMount() {
this.onShow();

Просмотреть файл

@@ -56,11 +56,11 @@ export default class ActivityLog extends React.PureComponent<Props, State> {
handleMoreInfo = (): void => {
this.setState({moreInfo: true});
}
};
submitRevoke = (e: React.MouseEvent): void => {
this.props.submitRevoke(this.props.currentSession.id, e);
}
};
isMobileSession = (session: Session): boolean => {
return Boolean(session.device_id && (session.device_id.includes('apple') || session.device_id.includes('android')));

Просмотреть файл

@@ -110,7 +110,7 @@ export default class AddGroupsToChannelModal extends React.PureComponent<Props,
handleHide = () => {
this.props.actions.setModalSearchTerm('');
this.setState({show: false});
}
};
handleResponse = (err?: ServerError) => {
let addError = null;
@@ -122,7 +122,7 @@ export default class AddGroupsToChannelModal extends React.PureComponent<Props,
saving: false,
addError,
});
}
};
handleSubmit = async () => {
const groupIDs = this.state.values.map((v) => v.id);
@@ -147,7 +147,7 @@ export default class AddGroupsToChannelModal extends React.PureComponent<Props,
this.handleHide();
}
}));
}
};
addValue = (value: GroupValue) => {
const values = Object.assign([], this.state.values);
@@ -157,13 +157,13 @@ export default class AddGroupsToChannelModal extends React.PureComponent<Props,
}
this.setState({values});
}
};
setGroupsLoadingState = (loadingState: boolean) => {
this.setState({
loadingGroups: loadingState,
});
}
};
handlePageChange = (page: number, prevPage: number) => {
if (page > prevPage) {
@@ -172,15 +172,15 @@ export default class AddGroupsToChannelModal extends React.PureComponent<Props,
this.setGroupsLoadingState(false);
});
}
}
};
handleDelete = (values: GroupValue[]) => {
this.setState({values});
}
};
search = (term: string) => {
this.props.actions.setModalSearchTerm(term);
}
};
renderOption = (option: GroupValue, isSelected: boolean, onAdd: (value: GroupValue) => void, onMouseMove?: (value: GroupValue) => void) => {
const rowSelected = isSelected ? 'more-modal__row--selected' : '';
@@ -222,7 +222,7 @@ export default class AddGroupsToChannelModal extends React.PureComponent<Props,
</div>
</div>
);
}
};
renderValue(props: { data: Partial<Value> }) {
return props.data.display_name;

Просмотреть файл

@@ -105,12 +105,12 @@ export default class AddGroupsToTeamModal extends React.PureComponent<Props, Sta
public handleHide = () => {
this.props.actions.setModalSearchTerm('');
this.setState({show: false});
}
};
// public for tests
public handleExit = (): void => {
this.props.onExited();
}
};
// public for tests
public handleResponse = (err?: Error): void => {
@@ -123,7 +123,7 @@ export default class AddGroupsToTeamModal extends React.PureComponent<Props, Sta
saving: false,
addError,
});
}
};
// public for tests
public handleSubmit = async () => {
@@ -148,7 +148,7 @@ export default class AddGroupsToTeamModal extends React.PureComponent<Props, Sta
this.handleHide();
}
}));
}
};
// public for tests
public addValue = (value: GroupValue): void => {
@@ -159,13 +159,13 @@ export default class AddGroupsToTeamModal extends React.PureComponent<Props, Sta
}
this.setState({values});
}
};
private setGroupsLoadingState = (loadingState: boolean) => {
this.setState({
loadingGroups: loadingState,
});
}
};
// public for tests
public handlePageChange = (page: number, prevPage: number): void => {
@@ -175,7 +175,7 @@ export default class AddGroupsToTeamModal extends React.PureComponent<Props, Sta
this.setGroupsLoadingState(false);
});
}
}
};
// public for tests
public handleDelete = (values: GroupValue[]): void => this.setState({values});
@@ -224,7 +224,7 @@ export default class AddGroupsToTeamModal extends React.PureComponent<Props, Sta
</div>
</div>
);
}
};
// public for tests
public renderValue = (props: { data: Value }): string | undefined => props.data.display_name;

Просмотреть файл

@@ -114,7 +114,7 @@ export default class AddUserToChannelModal extends React.PureComponent<Props, St
enableChannelProvider = () => {
this.suggestionProviders[0].disableDispatches = false;
}
};
focusTextbox = () => {
if (this.channelSearchBox == null) {
@@ -126,30 +126,30 @@ export default class AddUserToChannelModal extends React.PureComponent<Props, St
textbox.focus();
placeCaretAtEnd(textbox);
}
}
};
onInputChange = (e: ChangeEvent<HTMLInputElement>) => {
this.setState({text: e.target.value, selectedChannelId: null});
}
};
onHide = () => {
this.setState({show: false});
}
};
onExited = () => {
this.props.onExited();
}
};
setSearchBoxRef = (input: SuggestionBoxComponent) => {
this.channelSearchBox = input;
this.focusTextbox();
}
};
handleSubmitError = (error: {message: string}) => {
if (error) {
this.setState({submitError: error.message, saving: false});
}
}
};
didSelectChannel = (selection: {channel: Channel}) => {
const channel = selection.channel;
@@ -165,7 +165,7 @@ export default class AddUserToChannelModal extends React.PureComponent<Props, St
this.props.actions.getChannelMember(channel.id, userId).then(() => {
this.setState({checkingForMembership: false});
});
}
};
handleSubmit = (e: FormEvent) => {
if (e && e.preventDefault) {
@@ -192,7 +192,7 @@ export default class AddUserToChannelModal extends React.PureComponent<Props, St
this.onHide();
}
});
}
};
isUserMemberOfChannel = (channelId: string | null) => {
const user = this.props.user;
@@ -207,7 +207,7 @@ export default class AddUserToChannelModal extends React.PureComponent<Props, St
}
return Boolean(memberships[channelId][user.id]);
}
};
render() {
const user = this.props.user;

Просмотреть файл

@@ -173,7 +173,7 @@ export default class AddUserToGroupMultiSelect extends React.PureComponent<Props
return '';
}
return option.username;
}
};
renderOption = (option: UserProfileValue, isSelected: boolean, onAdd: (user: UserProfileValue) => void, onMouseMove: (user: UserProfileValue) => void) => {
return (
@@ -241,5 +241,5 @@ export default class AddUserToGroupMultiSelect extends React.PureComponent<Props
numRemainingText={numRemainingText}
/>
);
}
};
}

Просмотреть файл

@@ -78,11 +78,11 @@ export default class AddUsersToTeamModal extends React.PureComponent<Props, Stat
public componentDidMount = async () => {
await this.props.actions.getProfilesNotInTeam(this.props.team.id, false, 0, USERS_PER_PAGE * 2);
this.setUsersLoadingState(false);
}
};
private setUsersLoadingState = (loading: boolean) => {
this.setState({loading});
}
};
public search = async (term: string) => {
this.setUsersLoadingState(true);
@@ -95,17 +95,17 @@ export default class AddUsersToTeamModal extends React.PureComponent<Props, Stat
await this.props.actions.getProfilesNotInTeam(this.props.team.id, false, 0, USERS_PER_PAGE * 2);
}
this.setState({loading: false, searchResults, search});
}
};
public handleHide = () => {
this.setState({show: false});
}
};
private handleExit = () => {
if (this.props.onExited) {
this.props.onExited();
}
}
};
private renderOption = (option: UserProfileValue, isSelected: boolean, onAdd: (user: UserProfileValue) => void, onMouseMove: (user: UserProfileValue) => void) => {
let rowSelected = '';
@@ -139,15 +139,15 @@ export default class AddUsersToTeamModal extends React.PureComponent<Props, Stat
</div>
</div>
);
}
};
private renderValue = (value: { data: UserProfileValue }): string => {
return value.data?.username || '';
}
};
private renderAriaLabel = (option: UserProfileValue): string => {
return option?.username || '';
}
};
private handleAdd = (value: UserProfileValue) => {
const values: UserProfileValue[] = [...this.state.values];
@@ -155,11 +155,11 @@ export default class AddUsersToTeamModal extends React.PureComponent<Props, Stat
values.push(value);
}
this.setState({values});
}
};
private handleDelete = (values: UserProfileValue[]) => {
this.setState({values});
}
};
private handlePageChange = (page: number, prevPage: number) => {
if (page > prevPage) {
@@ -173,7 +173,7 @@ export default class AddUsersToTeamModal extends React.PureComponent<Props, Stat
private handleSubmit = () => {
this.props.onAddCallback(this.state.values);
this.handleHide();
}
};
public render = (): JSX.Element => {
const numRemainingText = (
@@ -259,5 +259,5 @@ export default class AddUsersToTeamModal extends React.PureComponent<Props, Stat
</Modal.Body>
</Modal>
);
}
};
}

Просмотреть файл

@@ -93,7 +93,7 @@ export default class AdminConsole extends React.PureComponent<Props, State> {
private onFilterChange = (filter: string) => {
this.setState({filter});
}
};
private mainRolesLoaded(roles: Record<string, Role>) {
return (
@@ -186,7 +186,7 @@ export default class AdminConsole extends React.PureComponent<Props, State> {
{<Redirect to={`${this.props.match.url}/${defaultUrl}`}/>}
</Switch>
);
}
};
public render(): JSX.Element | null {
const {

Просмотреть файл

@@ -5746,7 +5746,6 @@ const AdminDefinition = {
sectionTitle: t('admin.sidebar.products'),
sectionTitleDefault: 'Products',
isHidden: it.any(
it.configIsFalse('FeatureFlags', 'BoardsProduct'),
it.not(it.userHasReadPermissionOnSomeResources(RESOURCE_KEYS.PRODUCTS)),
),
boards: {

Просмотреть файл

@@ -69,7 +69,7 @@ export default abstract class AdminSettings <Props extends BaseProps, State exte
private closeTooltip = () => {
this.setState({errorTooltip: false});
}
};
private openTooltip = (e: React.MouseEvent) => {
const elm: HTMLElement|null = e.currentTarget.querySelector('.control-label');
@@ -77,7 +77,7 @@ export default abstract class AdminSettings <Props extends BaseProps, State exte
const isElipsis = elm.offsetWidth < elm.scrollWidth;
this.setState({errorTooltip: isElipsis});
}
}
};
protected handleChange = (id: string, value: boolean) => {
this.setState((prevState) => ({
@@ -95,7 +95,7 @@ export default abstract class AdminSettings <Props extends BaseProps, State exte
e.preventDefault();
this.doSubmit();
}
};
protected doSubmit = async (callback?: () => void) => {
this.setState({

Просмотреть файл

@@ -1072,6 +1072,37 @@ exports[`components/AdminSidebar should match snapshot 1`] = `
title="Plugin 0"
/>
</AdminSidebarCategory>
<AdminSidebarCategory
definitionKey="products"
icon={
<ProductsIcon
className="category-icon fa"
color="currentColor"
size={16}
/>
}
key="products"
parentLink="/admin_console"
sectionClass=""
title={
<Memo(MemoizedFormattedMessage)
defaultMessage="Products"
id="admin.sidebar.products"
/>
}
>
<AdminSidebarSection
definitionKey="products.boards"
key="products.boards"
name="products/boards"
title={
<Memo(MemoizedFormattedMessage)
defaultMessage="Boards"
id="admin.sidebar.boards"
/>
}
/>
</AdminSidebarCategory>
<AdminSidebarCategory
definitionKey="integrations"
icon={
@@ -1775,6 +1806,37 @@ exports[`components/AdminSidebar should match snapshot with workspace optimizati
title="Plugin 0"
/>
</AdminSidebarCategory>
<AdminSidebarCategory
definitionKey="products"
icon={
<ProductsIcon
className="category-icon fa"
color="currentColor"
size={16}
/>
}
key="products"
parentLink="/admin_console"
sectionClass=""
title={
<Memo(MemoizedFormattedMessage)
defaultMessage="Products"
id="admin.sidebar.products"
/>
}
>
<AdminSidebarSection
definitionKey="products.boards"
key="products.boards"
name="products/boards"
title={
<Memo(MemoizedFormattedMessage)
defaultMessage="Boards"
id="admin.sidebar.boards"
/>
}
/>
</AdminSidebarCategory>
<AdminSidebarCategory
definitionKey="integrations"
icon={
@@ -2533,6 +2595,37 @@ exports[`components/AdminSidebar should match snapshot, not prevent the console
title="Plugin 0"
/>
</AdminSidebarCategory>
<AdminSidebarCategory
definitionKey="products"
icon={
<ProductsIcon
className="category-icon fa"
color="currentColor"
size={16}
/>
}
key="products"
parentLink="/admin_console"
sectionClass=""
title={
<Memo(MemoizedFormattedMessage)
defaultMessage="Products"
id="admin.sidebar.products"
/>
}
>
<AdminSidebarSection
definitionKey="products.boards"
key="products.boards"
name="products/boards"
title={
<Memo(MemoizedFormattedMessage)
defaultMessage="Boards"
id="admin.sidebar.boards"
/>
}
/>
</AdminSidebarCategory>
<AdminSidebarCategory
definitionKey="integrations"
icon={
@@ -3236,6 +3329,37 @@ exports[`components/AdminSidebar should match snapshot, render plugins without a
title="Plugin 0"
/>
</AdminSidebarCategory>
<AdminSidebarCategory
definitionKey="products"
icon={
<ProductsIcon
className="category-icon fa"
color="currentColor"
size={16}
/>
}
key="products"
parentLink="/admin_console"
sectionClass=""
title={
<Memo(MemoizedFormattedMessage)
defaultMessage="Products"
id="admin.sidebar.products"
/>
}
>
<AdminSidebarSection
definitionKey="products.boards"
key="products.boards"
name="products/boards"
title={
<Memo(MemoizedFormattedMessage)
defaultMessage="Boards"
id="admin.sidebar.boards"
/>
}
/>
</AdminSidebarCategory>
<AdminSidebarCategory
definitionKey="integrations"
icon={
@@ -4038,6 +4162,37 @@ exports[`components/AdminSidebar should match snapshot, with license (with all f
title="Plugin 0"
/>
</AdminSidebarCategory>
<AdminSidebarCategory
definitionKey="products"
icon={
<ProductsIcon
className="category-icon fa"
color="currentColor"
size={16}
/>
}
key="products"
parentLink="/admin_console"
sectionClass=""
title={
<Memo(MemoizedFormattedMessage)
defaultMessage="Products"
id="admin.sidebar.products"
/>
}
>
<AdminSidebarSection
definitionKey="products.boards"
key="products.boards"
name="products/boards"
title={
<Memo(MemoizedFormattedMessage)
defaultMessage="Boards"
id="admin.sidebar.boards"
/>
}
/>
</AdminSidebarCategory>
<AdminSidebarCategory
definitionKey="integrations"
icon={
@@ -4973,6 +5128,37 @@ exports[`components/AdminSidebar should match snapshot, with license (without an
title="Plugin 0"
/>
</AdminSidebarCategory>
<AdminSidebarCategory
definitionKey="products"
icon={
<ProductsIcon
className="category-icon fa"
color="currentColor"
size={16}
/>
}
key="products"
parentLink="/admin_console"
sectionClass=""
title={
<Memo(MemoizedFormattedMessage)
defaultMessage="Products"
id="admin.sidebar.products"
/>
}
>
<AdminSidebarSection
definitionKey="products.boards"
key="products.boards"
name="products/boards"
title={
<Memo(MemoizedFormattedMessage)
defaultMessage="Boards"
id="admin.sidebar.boards"
/>
}
/>
</AdminSidebarCategory>
<AdminSidebarCategory
definitionKey="integrations"
icon={

Просмотреть файл

@@ -57,11 +57,11 @@ const renderScrollThumbVertical = (props: Props) => (
class AdminSidebar extends React.PureComponent<Props, State> {
searchRef: React.RefObject<HTMLInputElement>;
idx: Index | null
idx: Index | null;
static defaultProps = {
plugins: {},
}
};
constructor(props: Props) {
super(props);
@@ -130,7 +130,7 @@ class AdminSidebar extends React.PureComponent<Props, State> {
}
}
}
}
};
updateTitle = () => {
let currentSiteName = '';
@@ -139,7 +139,7 @@ class AdminSidebar extends React.PureComponent<Props, State> {
}
document.title = localizeMessage('sidebar_right_menu.console', 'System Console') + currentSiteName;
}
};
visibleSections = () => {
const {config, license, buildEnterpriseReady, consoleAccess, adminDefinition, cloud} = this.props;
@@ -166,7 +166,7 @@ class AdminSidebar extends React.PureComponent<Props, State> {
}
}
return result;
}
};
renderRootMenu = (definition: typeof AdminDefinition) => {
const {config, license, buildEnterpriseReady, consoleAccess, cloud, subscriptionProduct} = this.props;
@@ -249,11 +249,11 @@ class AdminSidebar extends React.PureComponent<Props, State> {
return null;
});
return sidebarSections;
}
};
isPluginPresentInSections = (plugin: PluginRedux) => {
return this.state.sections && this.state.sections.indexOf(`plugin_${plugin.id}`) >= 0;
}
};
renderPluginsMenu = () => {
const {config, plugins} = this.props;
@@ -279,12 +279,12 @@ class AdminSidebar extends React.PureComponent<Props, State> {
}
return [];
}
};
handleClearFilter = () => {
this.setState({sections: null, filter: ''});
this.props.onFilterChange('');
}
};
render() {
const {showTaskList} = this.props;

Просмотреть файл

@@ -226,9 +226,9 @@ export const InvoiceInfo = ({invoice, product, fullCharges, partialCharges, hasM
currency='USD'
/>
<FormattedMessage
id='admin.billing.subscriptions.billing_summary.lastInvoice.userCount'
defaultMessage=' x {users} users'
values={{users: charge.quantity}}
id='admin.billing.subscriptions.billing_summary.lastInvoice.seatCount'
defaultMessage=' x {seats} seats'
values={{seats: charge.quantity}}
/>
</>
)}
@@ -309,9 +309,9 @@ export const InvoiceInfo = ({invoice, product, fullCharges, partialCharges, hasM
>
<div className='BillingSummary__lastInvoice-chargeDescription'>
<FormattedMessage
id='admin.billing.subscriptions.billing_summary.lastInvoice.userCountPartial'
defaultMessage='{users} users'
values={{users: charge.quantity}}
id='admin.billing.subscriptions.billing_summary.lastInvoice.seatCountPartial'
defaultMessage='{seats} seats'
values={{seats: charge.quantity}}
/>
</div>
<div className='BillingSummary__lastInvoice-chargeAmount'>

Просмотреть файл

@@ -15,8 +15,6 @@ import {isCloudLicense} from 'utils/license_utils';
import {getCloudSubscription, getSubscriptionProduct} from 'mattermost-redux/selectors/entities/cloud';
import ExternalLink from 'components/external_link';
import DeleteWorkspaceModal from './delete_workspace_modal';
export default function DeleteWorkspaceCTA() {
@@ -80,17 +78,15 @@ export default function DeleteWorkspaceCTA() {
}}
/>
</div>
<ExternalLink
href=''
location='delete_workspace_cta'
className='cancelSubscriptionSection__contactUs'
<button
className='btn cancelSubscriptionSection__contactUs'
onClick={handleOnClickDelete}
>
<FormattedMessage
id='admin.billing.subscription.deleteWorkspaceSection.delete'
defaultMessage='Delete Workspace'
/>
</ExternalLink>
</button>
</div>
</div>
);

Просмотреть файл

@@ -51,28 +51,28 @@ describe('InvoiceUserCount', () => {
[1, InvoiceLineItemType.Full],
[1, InvoiceLineItemType.Partial],
),
expected: '1 metered users, 1 users at full rate, 1 users with partial charges',
expected: '1 metered seats, 1 seats at full rate, 1 seats with partial charges',
},
{
name: 'Supports cloud invoices with only metered line items',
invoice: makeInvoice(
[12.34, InvoiceLineItemType.Metered],
),
expected: '12.34 users',
expected: '12.34 seats',
},
{
name: 'Shows minimum decimal necessary',
invoice: makeInvoice(
[12.499, InvoiceLineItemType.Metered],
),
expected: '12.5 users',
expected: '12.5 seats',
},
{
name: 'hides insignificant decimals',
invoice: makeInvoice(
[12.002, InvoiceLineItemType.Metered],
),
expected: '12 users',
expected: '12 seats',
},
{
name: 'Supports cloud invoices with only non-metered line items',
@@ -80,7 +80,7 @@ describe('InvoiceUserCount', () => {
[1, InvoiceLineItemType.Full],
[249, InvoiceLineItemType.Partial],
),
expected: '1 users at full rate, 249 users with partial charges',
expected: '1 seats at full rate, 249 seats with partial charges',
},
{
name: 'Shows default of 0 full users, 0 partial users when there are no users',
@@ -89,19 +89,19 @@ describe('InvoiceUserCount', () => {
[0, InvoiceLineItemType.Full],
[0, InvoiceLineItemType.Partial],
),
expected: '0 users at full rate, 0 users with partial charges',
expected: '0 seats at full rate, 0 seats with partial charges',
},
{
name: 'Shows default of 0 full users, 0 partial users when there are no line items in invoice',
invoice: makeInvoice(),
expected: '0 users at full rate, 0 users with partial charges',
expected: '0 seats at full rate, 0 seats with partial charges',
},
{
name: 'Shows 3 full userswhen there are on prem users',
invoice: makeInvoice(
[3, InvoiceLineItemType.OnPremise],
),
expected: '3 users',
expected: '3 seats',
},
];

Просмотреть файл

@@ -18,8 +18,8 @@ export default function InvoiceUserCount({invoice}: {invoice: Invoice}): JSX.Ele
if (onPremUsers) {
return (
<FormattedMessage
id='admin.billing.history.onPremUsers'
defaultMessage='{num} users'
id='admin.billing.history.onPremSeats'
defaultMessage='{num} seats'
values={{
// should always be a whole number, but truncate just in case
@@ -32,12 +32,12 @@ export default function InvoiceUserCount({invoice}: {invoice: Invoice}): JSX.Ele
if (fullUsers || partialUsers) {
return (
<FormattedMessage
id='admin.billing.history.fractionalAndRatedUsers'
defaultMessage='{fractionalUsers} metered users, {fullUsers} users at full rate, {partialUsers} users with partial charges'
id='admin.billing.history.fractionalAndRatedSeats'
defaultMessage='{fractionalSeats} metered seats, {fullSeats} seats at full rate, {partialSeats} seats with partial charges'
values={{
fractionalUsers: numberToFixedDynamic(meteredUsers, 2),
fullUsers: fullUsers.toFixed(0),
partialUsers: partialUsers.toFixed(0),
fractionalSeats: numberToFixedDynamic(meteredUsers, 2),
fullSeats: fullUsers.toFixed(0),
partialSeats: partialUsers.toFixed(0),
}}
/>
);
@@ -45,10 +45,10 @@ export default function InvoiceUserCount({invoice}: {invoice: Invoice}): JSX.Ele
return (
<FormattedMessage
id='admin.billing.history.fractionalUsers'
defaultMessage='{fractionalUsers} users'
id='admin.billing.history.fractionalSeats'
defaultMessage='{fractionalSeats} seats'
values={{
fractionalUsers: numberToFixedDynamic(meteredUsers, 2),
fractionalSeats: numberToFixedDynamic(meteredUsers, 2),
}}
/>
);
@@ -56,11 +56,11 @@ export default function InvoiceUserCount({invoice}: {invoice: Invoice}): JSX.Ele
return (
<FormattedMessage
id='admin.billing.history.usersAndRates'
defaultMessage='{fullUsers} users at full rate, {partialUsers} users with partial charges'
id='admin.billing.history.seatsAndRates'
defaultMessage='{fullSeats} seats at full rate, {partialSeats} seats with partial charges'
values={{
fullUsers: fullUsers.toFixed(0),
partialUsers: partialUsers.toFixed(0),
fullSeats: fullUsers.toFixed(0),
partialSeats: partialUsers.toFixed(0),
}}
/>
);

Просмотреть файл

@@ -25,7 +25,7 @@ export default class BleveSettings extends AdminSettings {
config.BleveSettings.EnableAutocomplete = this.state.enableAutocomplete;
return config;
}
};
getStateFromConfig(config) {
return {
@@ -55,17 +55,17 @@ export default class BleveSettings extends AdminSettings {
}
this.handleChange(id, value);
}
};
handleSaved = () => {
this.setState({
canPurgeAndIndex: this.state.enableIndexing && this.state.indexDir !== '',
});
}
};
canSave = () => {
return this.state.canSave;
}
};
getExtraInfo(job) {
if (job.status === JobStatuses.IN_PROGRESS) {
@@ -246,5 +246,5 @@ export default class BleveSettings extends AdminSettings {
/>
</SettingsGroup>
);
}
};
}

Просмотреть файл

@@ -40,7 +40,7 @@ export default class BooleanSetting extends React.PureComponent<Props> {
private handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
this.props.onChange(this.props.id, e.target.value === 'true');
}
};
public render() {
let helpText;

Просмотреть файл

@@ -29,7 +29,7 @@ export default class ClusterSettings extends AdminSettings {
config.ClusterSettings.GossipPort = this.parseIntNonZero(this.state.GossipPort, 8074);
config.ClusterSettings.StreamingPort = this.parseIntNonZero(this.state.StreamingPort, 8075);
return config;
}
};
getStateFromConfig(config) {
const settings = config.ClusterSettings;
@@ -62,7 +62,7 @@ export default class ClusterSettings extends AdminSettings {
});
this.handleChange(id, value);
}
};
renderSettings = () => {
const licenseEnabled = this.props.license.IsLicensed === 'true' && this.props.license.Cluster === 'true';
@@ -309,7 +309,7 @@ export default class ClusterSettings extends AdminSettings {
/>
</SettingsGroup>
);
}
};
}
const style = {

Просмотреть файл

@@ -15,7 +15,7 @@ export default class ClusterTable extends React.PureComponent {
static propTypes = {
clusterInfos: PropTypes.array.isRequired,
reload: PropTypes.func.isRequired,
}
};
render() {
var versionMismatch = (

Просмотреть файл

@@ -28,7 +28,7 @@ export default class ClusterTableContainer extends React.PureComponent {
},
null,
);
}
};
componentDidMount() {
this.load();
@@ -53,7 +53,7 @@ export default class ClusterTableContainer extends React.PureComponent {
});
this.load();
}
};
render() {
if (this.state.clusterInfos == null) {

Просмотреть файл

@@ -21,7 +21,7 @@ export default class ColorSetting extends React.PureComponent<Props> {
if (this.props.onChange) {
this.props.onChange(this.props.id, color);
}
}
};
public render() {
return (

Просмотреть файл

@@ -94,7 +94,7 @@ export default class ComplianceReports extends React.PureComponent<Props, State>
this.props.actions.getComplianceReports().then(
() => this.setState({loadingReports: false}),
);
}
};
runReport = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
e.preventDefault();
@@ -131,7 +131,7 @@ export default class ComplianceReports extends React.PureComponent<Props, State>
this.props.actions.getComplianceReports();
},
);
}
};
getDateTime(millis: number) {
const date = new Date(millis);

Просмотреть файл

@@ -73,7 +73,7 @@ export default class CustomTermsOfServiceSettings extends AdminSettings<Props, S
config.SupportSettings.CustomTermsOfServiceReAcceptancePeriod = this.parseIntNonZero(String(this.state.reAcceptancePeriod), Constants.DEFAULT_TERMS_OF_SERVICE_RE_ACCEPTANCE_PERIOD);
}
return config;
}
};
componentDidMount() {
this.getTermsOfService();
@@ -244,5 +244,5 @@ export default class CustomTermsOfServiceSettings extends AdminSettings<Props, S
/>
</SettingsGroup>
);
}
};
}

Просмотреть файл

@@ -82,7 +82,7 @@ class DataGrid extends React.PureComponent<Props, State> {
static defaultProps = {
term: '',
searchPlaceholder: '',
}
};
public constructor(props: Props) {
super(props);
@@ -134,7 +134,7 @@ class DataGrid extends React.PureComponent<Props, State> {
});
this.setState({visibleColumns});
}
};
private renderRows(): JSX.Element {
const {rows, rowsContainerStyles} = this.props;
@@ -219,19 +219,19 @@ class DataGrid extends React.PureComponent<Props, State> {
if (!this.props.loading) {
this.props.nextPage();
}
}
};
private previousPage = () => {
if (!this.props.loading) {
this.props.previousPage();
}
}
};
private search = (term: string) => {
if (this.props.onSearch) {
this.props.onSearch(term);
}
}
};
private renderFooter = (): JSX.Element | null => {
const {startCount, endCount, total} = this.props;
@@ -286,7 +286,7 @@ class DataGrid extends React.PureComponent<Props, State> {
}
return footer;
}
};
public render() {
return (

Просмотреть файл

@@ -32,7 +32,7 @@ class DataGridSearch extends React.PureComponent<Props, State> {
static defaultProps = {
placeholder: '',
term: '',
}
};
public constructor(props: Props) {
super(props);
@@ -46,7 +46,7 @@ class DataGridSearch extends React.PureComponent<Props, State> {
const term = e.target.value;
this.setState({term});
this.props.onSearch(term);
}
};
resetSearch = () => {
this.props.onSearch('');

Просмотреть файл

@@ -58,14 +58,14 @@ export default class ChannelList extends React.PureComponent<Props, State> {
componentDidMount = () => {
this.loadPage(0, PAGE_SIZE * 2);
}
};
private setStateLoading = (loading: boolean) => {
this.setState({loading});
}
};
private setStatePage = (page: number) => {
this.setState({page});
}
};
private loadPage = async (page: number, pageSize = PAGE_SIZE) => {
if (this.props.policyId) {
@@ -73,26 +73,26 @@ export default class ChannelList extends React.PureComponent<Props, State> {
await this.props.actions.getDataRetentionCustomPolicyChannels(this.props.policyId, page, pageSize);
this.setStateLoading(false);
}
}
};
private nextPage = () => {
const page = this.state.page + 1;
this.loadPage(page + 1);
this.setStatePage(page);
}
};
private previousPage = () => {
const page = this.state.page - 1;
this.loadPage(page + 1);
this.setStatePage(page);
}
};
private getVisibleTotalCount = (): number => {
const {channelsToAdd, channelsToRemove, totalCount} = this.props;
const channelsToAddCount = Object.keys(channelsToAdd).length;
const channelsToRemoveCount = Object.keys(channelsToRemove).length;
return totalCount + (channelsToAddCount - channelsToRemoveCount);
}
};
public getPaginationProps = (): {startCount: number; endCount: number; total: number} => {
const {page} = this.state;
@@ -105,7 +105,7 @@ export default class ChannelList extends React.PureComponent<Props, State> {
endCount = endCount > total ? total : endCount;
return {startCount, endCount, total};
}
};
private removeChannel = (channel: ChannelWithTeamData) => {
const {channelsToRemove} = this.props;
@@ -122,7 +122,7 @@ export default class ChannelList extends React.PureComponent<Props, State> {
}
this.setStatePage(page);
}
};
getColumns = (): Column[] => {
const name = (
@@ -157,7 +157,7 @@ export default class ChannelList extends React.PureComponent<Props, State> {
fixed: true,
},
];
}
};
getRows = () => {
const {page} = this.state;
@@ -235,11 +235,11 @@ export default class ChannelList extends React.PureComponent<Props, State> {
},
};
});
}
};
onSearch = async (searchTerm: string) => {
this.props.actions.setChannelListSearch(searchTerm);
}
};
public async componentDidUpdate(prevProps: Props) {
const {policyId, searchTerm, filters} = this.props;
const filtersModified = !isEqual(prevProps.filters, this.props.filters);
@@ -284,7 +284,7 @@ export default class ChannelList extends React.PureComponent<Props, State> {
filters.team_ids = teamIds.value as string[];
}
this.props.actions.setChannelListFilters(filters);
}
};
render() {
const rows: Row[] = this.getRows();
const columns: Column[] = this.getColumns();

Просмотреть файл

@@ -93,19 +93,19 @@ export default class CustomPolicyForm extends React.PureComponent<Props, State>
openAddChannel = () => {
this.setState({addChannelOpen: true});
}
};
closeAddChannel = () => {
this.setState({addChannelOpen: false});
}
};
openAddTeam = () => {
this.setState({addTeamOpen: true});
}
};
closeAddTeam = () => {
this.setState({addTeamOpen: false});
}
};
getMessageRetentionDefaultInputValue = (): string => {
if (!this.props.policy || Object.keys(this.props.policy).length === 0 || (this.props.policy && this.props.policy.post_duration === -1)) {
return '';
@@ -114,7 +114,7 @@ export default class CustomPolicyForm extends React.PureComponent<Props, State>
return (this.props.policy.post_duration / 365).toString();
}
return this.props.policy.post_duration.toString();
}
};
getMessageRetentionDefaultDropdownValue = () => {
if (!this.props.policyId || (this.props.policy && this.props.policy.post_duration === -1)) {
return keepForeverOption();
@@ -123,11 +123,11 @@ export default class CustomPolicyForm extends React.PureComponent<Props, State>
return yearsOption();
}
return daysOption();
}
};
componentDidMount = async () => {
this.loadPage();
}
};
private loadPage = async () => {
if (this.props.policyId) {
await this.props.actions.fetchPolicy(this.props.policyId);
@@ -137,7 +137,7 @@ export default class CustomPolicyForm extends React.PureComponent<Props, State>
messageRetentionDropdownValue: this.getMessageRetentionDefaultDropdownValue(),
});
}
}
};
addToNewTeams = (teams: Team[]) => {
let {removedTeamsCount} = this.state;
@@ -152,7 +152,7 @@ export default class CustomPolicyForm extends React.PureComponent<Props, State>
});
this.setState({newTeams: {...newTeams}, removedTeams: {...removedTeams}, removedTeamsCount, saveNeeded: true});
this.props.actions.setNavigationBlocked(true);
}
};
addToRemovedTeams = (team: Team) => {
let {removedTeamsCount} = this.state;
@@ -165,7 +165,7 @@ export default class CustomPolicyForm extends React.PureComponent<Props, State>
}
this.setState({removedTeams: {...removedTeams}, newTeams: {...newTeams}, removedTeamsCount, saveNeeded: true});
this.props.actions.setNavigationBlocked(true);
}
};
addToNewChannels = (channels: ChannelWithTeamData[]) => {
let {removedChannelsCount} = this.state;
@@ -180,7 +180,7 @@ export default class CustomPolicyForm extends React.PureComponent<Props, State>
});
this.setState({newChannels: {...newChannels}, removedChannels: {...removedChannels}, removedChannelsCount, saveNeeded: true});
this.props.actions.setNavigationBlocked(true);
}
};
addToRemovedChannels = (channel: ChannelWithTeamData) => {
let {removedChannelsCount} = this.state;
@@ -193,7 +193,7 @@ export default class CustomPolicyForm extends React.PureComponent<Props, State>
}
this.setState({removedChannels: {...removedChannels}, newChannels: {...newChannels}, removedChannelsCount, saveNeeded: true});
this.props.actions.setNavigationBlocked(true);
}
};
getTeamsToExclude = () => {
const {teams} = this.props;
@@ -210,7 +210,7 @@ export default class CustomPolicyForm extends React.PureComponent<Props, State>
teamsToDisplay = [...includeTeamsList, ...teamsToDisplay];
}
return teamsToDisplay;
}
};
handleSubmit = async () => {
const {policyName, messageRetentionInputValue, messageRetentionDropdownValue, newTeams, removedTeams, newChannels, removedChannels} = this.state;
const {policyId, policy} = this.props;
@@ -302,7 +302,7 @@ export default class CustomPolicyForm extends React.PureComponent<Props, State>
this.props.actions.setNavigationBlocked(false);
getHistory().push('/admin_console/compliance/data_retention_settings');
}
}
};
render = () => {
const {serverError, formErrorText} = this.state;
@@ -531,5 +531,5 @@ export default class CustomPolicyForm extends React.PureComponent<Props, State>
</div>
</div>
);
}
};
}

Просмотреть файл

@@ -65,9 +65,9 @@ export default class DataRetentionSettings extends React.PureComponent<Props, St
deleteCustomPolicy = async (id: string) => {
await this.props.actions.deleteDataRetentionCustomPolicy(id);
this.loadPage(0);
}
};
includeBoards = this.props.config.PluginSettings?.PluginStates?.focalboard?.Enable && this.props.config.FeatureFlags?.BoardsDataRetention
includeBoards = this.props.config.PluginSettings?.PluginStates?.focalboard?.Enable && this.props.config.FeatureFlags?.BoardsDataRetention;
getGlobalPolicyColumns = (): Column[] => {
const columns: Column[] = [
{
@@ -119,7 +119,7 @@ export default class DataRetentionSettings extends React.PureComponent<Props, St
},
);
return columns;
}
};
getCustomPolicyColumns = (): Column[] => {
const columns: Column[] = [
{
@@ -156,7 +156,7 @@ export default class DataRetentionSettings extends React.PureComponent<Props, St
},
];
return columns;
}
};
getMessageRetentionSetting = (enabled: boolean | undefined, days: number | undefined): JSX.Element => {
if (!enabled) {
return (
@@ -187,7 +187,7 @@ export default class DataRetentionSettings extends React.PureComponent<Props, St
}}
/>
);
}
};
getGlobalPolicyRows = (): Row[] => {
const {DataRetentionSettings} = this.props.config;
return [{
@@ -240,7 +240,7 @@ export default class DataRetentionSettings extends React.PureComponent<Props, St
getHistory().push('/admin_console/compliance/data_retention_settings/global_policy');
},
}];
}
};
getChannelAndTeamCounts = (policy: DataRetentionCustomPolicy): JSX.Element => {
if (policy.channel_count === 0 && policy.team_count === 0) {
return (
@@ -260,7 +260,7 @@ export default class DataRetentionSettings extends React.PureComponent<Props, St
}}
/>
);
}
};
getCustomPolicyRows = (startCount: number, endCount: number): Row[] => {
let policies = Object.values(this.props.customPolicies);
policies = policies.slice(startCount - 1, endCount);
@@ -333,18 +333,18 @@ export default class DataRetentionSettings extends React.PureComponent<Props, St
this.setState({customPoliciesLoading: true});
await this.props.actions.getDataRetentionCustomPolicies(page);
this.setState({page, customPoliciesLoading: false});
}
};
componentDidMount = async () => {
await this.loadPage(this.state.page);
}
};
private nextPage = () => {
this.loadPage(this.state.page + 1);
}
};
private previousPage = () => {
this.loadPage(this.state.page - 1);
}
};
public getPaginationProps = (): {startCount: number; endCount: number; total: number} => {
const {page} = this.state;
@@ -354,17 +354,17 @@ export default class DataRetentionSettings extends React.PureComponent<Props, St
endCount = endCount > total ? total : endCount;
return {startCount, endCount, total};
}
};
showEditJobTime = (value: boolean) => {
this.setState({showEditJobTime: value});
}
};
componentDidUpdate = (prevProps: Props, prevState: State) => {
if (prevState.showEditJobTime !== this.state.showEditJobTime && this.state.showEditJobTime) {
this.inputRef.current?.focus();
}
}
};
handleCreateJob = async (e?: React.SyntheticEvent) => {
e?.preventDefault();
@@ -382,7 +382,7 @@ export default class DataRetentionSettings extends React.PureComponent<Props, St
await this.props.actions.updateConfig(newConfig);
this.inputRef.current?.blur();
}
};
getJobStartTime = (): JSX.Element | null => {
const {DataRetentionSettings} = this.props.config;
@@ -417,7 +417,7 @@ export default class DataRetentionSettings extends React.PureComponent<Props, St
}}
/>
);
}
};
getJobTimeOptions = () => {
const options: OptionType[] = [];
return () => {
@@ -445,7 +445,7 @@ export default class DataRetentionSettings extends React.PureComponent<Props, St
return options;
};
}
};
getJobTimes = this.getJobTimeOptions();
render = () => {
@@ -653,5 +653,5 @@ export default class DataRetentionSettings extends React.PureComponent<Props, St
</div>
</div>
);
}
};
}

Просмотреть файл

@@ -60,7 +60,7 @@ export default class GlobalPolicyForm extends React.PureComponent<Props, State>
};
}
includeBoards = this.props.config.PluginSettings?.PluginStates?.focalboard?.Enable && this.props.config.FeatureFlags?.BoardsDataRetention
includeBoards = this.props.config.PluginSettings?.PluginStates?.focalboard?.Enable && this.props.config.FeatureFlags?.BoardsDataRetention;
getDefaultInputValue = (isEnabled: boolean | undefined, days: number | undefined): string => {
if (!isEnabled || days === undefined) {
@@ -70,7 +70,7 @@ export default class GlobalPolicyForm extends React.PureComponent<Props, State>
return (days / 365).toString();
}
return days.toString();
}
};
getDefaultDropdownValue = (isEnabled: boolean | undefined, days: number | undefined) => {
if (!isEnabled || days === undefined) {
return keepForeverOption();
@@ -79,7 +79,7 @@ export default class GlobalPolicyForm extends React.PureComponent<Props, State>
return yearsOption();
}
return daysOption();
}
};
handleSubmit = async () => {
const {messageRetentionDropdownValue, messageRetentionInputValue, fileRetentionDropdownValue, fileRetentionInputValue, boardsRetentionDropdownValue, boardsRetentionInputValue} = this.state;
@@ -128,7 +128,7 @@ export default class GlobalPolicyForm extends React.PureComponent<Props, State>
return false;
}
return true;
}
};
setRetentionDays = (dropdownValue: string, value: string): number => {
if (dropdownValue === YEARS) {
@@ -140,7 +140,7 @@ export default class GlobalPolicyForm extends React.PureComponent<Props, State>
}
return 0;
}
};
render = () => {
return (
@@ -290,5 +290,5 @@ export default class GlobalPolicyForm extends React.PureComponent<Props, State>
</div>
</div>
);
}
};
}

Просмотреть файл

@@ -52,14 +52,14 @@ export default class TeamList extends React.PureComponent<Props, State> {
componentDidMount = () => {
this.loadPage(0, PAGE_SIZE * 2);
}
};
private setStateLoading = (loading: boolean) => {
this.setState({loading});
}
};
private setStatePage = (page: number) => {
this.setState({page});
}
};
private loadPage = async (page: number, pageSize = PAGE_SIZE) => {
if (this.props.policyId) {
@@ -67,26 +67,26 @@ export default class TeamList extends React.PureComponent<Props, State> {
await this.props.actions.getDataRetentionCustomPolicyTeams(this.props.policyId, page, pageSize);
this.setStateLoading(false);
}
}
};
private nextPage = () => {
const page = this.state.page + 1;
this.loadPage(page + 1);
this.setStatePage(page);
}
};
private previousPage = () => {
const page = this.state.page - 1;
this.loadPage(page + 1);
this.setStatePage(page);
}
};
private getVisibleTotalCount = (): number => {
const {teamsToAdd, teamsToRemove, totalCount} = this.props;
const teamsToAddCount = Object.keys(teamsToAdd).length;
const teamsToRemoveCount = Object.keys(teamsToRemove).length;
return totalCount + (teamsToAddCount - teamsToRemoveCount);
}
};
public getPaginationProps = (): {startCount: number; endCount: number; total: number} => {
const {page} = this.state;
@@ -98,7 +98,7 @@ export default class TeamList extends React.PureComponent<Props, State> {
endCount = endCount > total ? total : endCount;
return {startCount, endCount, total};
}
};
private removeTeam = (team: Team) => {
const {teamsToRemove} = this.props;
@@ -115,7 +115,7 @@ export default class TeamList extends React.PureComponent<Props, State> {
}
this.setStatePage(page);
}
};
getColumns = (): Column[] => {
const name = (
@@ -139,7 +139,7 @@ export default class TeamList extends React.PureComponent<Props, State> {
className: 'TeamList__actionColumn',
},
];
}
};
getRows = () => {
const {page} = this.state;
@@ -203,11 +203,11 @@ export default class TeamList extends React.PureComponent<Props, State> {
},
};
});
}
};
onSearch = async (searchTerm: string) => {
this.props.actions.setTeamListSearch(searchTerm);
}
};
public async componentDidUpdate(prevProps: Props) {
const {searchTerm} = this.props;
const searchTermModified = prevProps.searchTerm !== this.props.searchTerm;

Просмотреть файл

@@ -32,7 +32,7 @@ export default class DatabaseSettings extends AdminSettings {
config.ServiceSettings.MinimumHashtagLength = this.parseIntNonZero(this.state.minimumHashtagLength, 3, 2);
return config;
}
};
getStateFromConfig(config) {
return {
@@ -370,5 +370,5 @@ export default class DatabaseSettings extends AdminSettings {
</div>
</SettingsGroup>
);
}
};
}

Просмотреть файл

@@ -16,15 +16,15 @@ export default class DropdownSetting extends React.PureComponent {
disabled: PropTypes.bool,
setByEnv: PropTypes.bool.isRequired,
helpText: PropTypes.node,
}
};
static defaultProps = {
isDisabled: false,
}
};
handleChange = (e) => {
this.props.onChange(this.props.id, e.target.value);
}
};
render() {
const options = [];

Просмотреть файл

@@ -33,7 +33,7 @@ export default class ElasticsearchSettings extends AdminSettings {
config.ElasticsearchSettings.EnableAutocomplete = this.state.enableAutocomplete;
return config;
}
};
getStateFromConfig(config) {
return {
@@ -83,17 +83,17 @@ export default class ElasticsearchSettings extends AdminSettings {
}
this.handleChange(id, value);
}
};
handleSaved = () => {
this.setState({
canPurgeAndIndex: this.state.enableIndexing,
});
}
};
canSave = () => {
return this.state.canSave;
}
};
doTestConfig = (success, error) => {
const config = JSON.parse(JSON.stringify(this.props.config));
@@ -116,7 +116,7 @@ export default class ElasticsearchSettings extends AdminSettings {
error(err);
},
);
}
};
getExtraInfo(job) {
if (job.status === JobStatuses.IN_PROGRESS) {
@@ -470,5 +470,5 @@ export default class ElasticsearchSettings extends AdminSettings {
/>
</SettingsGroup>
);
}
};
}

Просмотреть файл

@@ -97,7 +97,7 @@ export default class FeatureDiscovery extends React.PureComponent<Props, State>
callerCTA: 'feature_discovery_subscribe_button',
},
});
}
};
contactSalesFunc = () => {
const {customer, isCloud} = this.props;
@@ -107,7 +107,7 @@ export default class FeatureDiscovery extends React.PureComponent<Props, State>
const companyName = customer?.name || '';
const utmMedium = isCloud ? 'in-product-cloud' : 'in-product';
goToMattermostContactSalesForm(firstName, lastName, companyName, customerEmail, 'mattermost', utmMedium);
}
};
renderPostTrialCta = () => {
const {
@@ -164,7 +164,7 @@ export default class FeatureDiscovery extends React.PureComponent<Props, State>
</div>
);
}
};
renderStartTrial = (learnMoreURL: string, gettingTrialError: React.ReactNode) => {
const {
@@ -317,7 +317,7 @@ export default class FeatureDiscovery extends React.PureComponent<Props, State>
</p>}
</>
);
}
};
render() {
const {

Просмотреть файл

@@ -39,7 +39,7 @@ export default class FileUploadSetting extends Setting {
if (files && files.length > 0) {
this.setState({fileSelected: true, fileName: files[0].name});
}
}
};
handleSubmit = (e) => {
e.preventDefault();
@@ -51,7 +51,7 @@ export default class FileUploadSetting extends Setting {
Utils.clearFileInput(this.fileInputRef.current);
}
});
}
};
render() {
let serverError;

Просмотреть файл

@@ -96,23 +96,23 @@ class Filter extends React.PureComponent<Props, State> {
componentDidMount = () => {
document.addEventListener('mousedown', this.handleClickOutside);
}
};
componentWillUnmount = () => {
document.removeEventListener('mousedown', this.handleClickOutside);
}
};
handleClickOutside = (event: MouseEvent) => {
if (this.filterRef?.current?.contains(event.target as Node)) {
return;
}
this.hidePopover();
}
};
hidePopover = () => {
this.setState({show: false});
this.buttonRef?.current?.blur();
}
};
togglePopover = () => {
if (this.state.show) {
@@ -121,7 +121,7 @@ class Filter extends React.PureComponent<Props, State> {
}
this.setState({show: true});
}
};
updateValues = async (values: FilterValues, optionKey: string) => {
const options = {
@@ -134,12 +134,12 @@ class Filter extends React.PureComponent<Props, State> {
},
};
this.setState({options, optionsModified: true});
}
};
onFilter = () => {
this.props.onFilter(this.state.options);
this.setState({optionsModified: false, show: false, filterCount: this.calculateFilterCount()});
}
};
calculateFilterCount = () => {
const options = this.state.options;
@@ -155,11 +155,11 @@ class Filter extends React.PureComponent<Props, State> {
});
});
return filterCount;
}
};
resetFilters = () => {
this.setState({options: {...this.props.options}}, this.onFilter);
}
};
renderFilterOptions = () => {
const {keys, options} = this.state;
@@ -176,7 +176,7 @@ class Filter extends React.PureComponent<Props, State> {
/>
);
});
}
};
render() {
const filters = this.renderFilterOptions();

Просмотреть файл

@@ -16,7 +16,7 @@ class FilterCheckbox extends React.PureComponent<Props> {
e.stopPropagation();
const {checked, name, updateOption} = this.props;
updateOption(!checked, name);
}
};
render() {
const {name, checked, label} = this.props;

Просмотреть файл

@@ -23,7 +23,7 @@ class FilterList extends React.PureComponent<Props> {
},
};
await this.props.updateValues(values, this.props.optionKey);
}
};
render() {
const {option} = this.props;

Просмотреть файл

@@ -15,7 +15,7 @@ class TeamFilterCheckbox extends React.PureComponent<Props> {
toggleOption = () => {
const {checked, id, updateOption} = this.props;
updateOption(!checked, id);
}
};
render() {
const {

Просмотреть файл

@@ -100,11 +100,11 @@ class TeamFilterDropdown extends React.PureComponent<Props, State> {
componentWillUnmount = () => {
document.removeEventListener('mousedown', this.handleClickOutside);
}
};
hidePopover = () => {
this.setState({show: false});
}
};
togglePopover = (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
if (this.state.show) {
@@ -125,18 +125,18 @@ class TeamFilterDropdown extends React.PureComponent<Props, State> {
this.listRef.current.scrollTop = 0;
}
});
}
};
handleClickOutside = (event: MouseEvent) => {
if (this.ref?.current?.contains(event.target as Node)) {
return;
}
this.hidePopover();
}
};
setScrollPosition = (event: React.UIEvent<HTMLDivElement, UIEvent>) => {
this.scrollPosition = (event.target as HTMLDivElement).scrollTop;
}
};
hasMore = (): boolean => {
if (this.state.loading) {
@@ -145,7 +145,7 @@ class TeamFilterDropdown extends React.PureComponent<Props, State> {
return this.state.searchTotal > this.state.searchResults.length;
}
return this.props.total > (this.state.page + 1) * TEAMS_PER_PAGE;
}
};
loadMore = async () => {
const {searchTerm, loading} = this.state;
@@ -165,7 +165,7 @@ class TeamFilterDropdown extends React.PureComponent<Props, State> {
}
this.setState({page, loading: false});
}
};
searchTeams = async (term: string, page: number) => {
let searchResults = [];
@@ -180,7 +180,7 @@ class TeamFilterDropdown extends React.PureComponent<Props, State> {
}
this.searchRetryInterval *= 2;
this.searchRetryId = window.setTimeout(this.searchTeams.bind(null, term, page), this.searchRetryInterval);
}
};
searchTeamsDebounced = debounce((page, term) => this.searchTeams(term, page), INITIAL_SEARCH_RETRY_TIMEOUT, false, () => {});
@@ -203,12 +203,12 @@ class TeamFilterDropdown extends React.PureComponent<Props, State> {
}
this.searchTeamsDebounced(0, searchTerm);
}
};
resetTeams = () => {
this.setState({savedSelectedTeams: [], show: false, searchResults: [], searchTotal: 0, page: 0, searchTerm: ''});
this.props.updateValues({team_ids: {name: 'Teams', value: []}}, 'teams');
}
};
toggleTeam = (checked: boolean, teamId: string) => {
const prevSelectedTeamIds = this.props.option.values.team_ids.value as string[];
@@ -220,7 +220,7 @@ class TeamFilterDropdown extends React.PureComponent<Props, State> {
}
this.props.updateValues({team_ids: {name: 'Teams', value: selectedTeamIds}}, 'teams');
}
};
generateButtonText = () => {
const selectedTeamIds = this.props.option.values.team_ids.value as string[];
@@ -252,7 +252,7 @@ class TeamFilterDropdown extends React.PureComponent<Props, State> {
});
return {buttonText, buttonMore};
}
};
render() {
const selectedTeamIds = this.props.option.values.team_ids.value as string[];

Просмотреть файл

@@ -42,12 +42,12 @@ export default class FullLogEventModal extends React.PureComponent<Props, State>
</pre>
</div>
);
}
};
copyLog = () => {
navigator.clipboard.writeText(JSON.stringify(this.props.log, undefined, 2));
this.showCopySuccess();
}
};
exportToCsv = () => {
const file = navigator.clipboard.writeText(JSON.stringify(this.props.log, undefined, 2));
@@ -55,7 +55,7 @@ export default class FullLogEventModal extends React.PureComponent<Props, State>
const encodedUri = encodeURI(csvContent);
window.open(encodedUri);
this.showExportSuccess();
}
};
showCopySuccess = () => {
this.setState({
@@ -67,7 +67,7 @@ export default class FullLogEventModal extends React.PureComponent<Props, State>
copySuccess: false,
});
}, 3000);
}
};
showExportSuccess = () => {
this.setState({
@@ -79,7 +79,7 @@ export default class FullLogEventModal extends React.PureComponent<Props, State>
exportSuccess: false,
});
}, 3000);
}
};
render() {
return (

Просмотреть файл

@@ -39,7 +39,7 @@ export default class GeneratedSetting extends React.PureComponent<Props> {
e.preventDefault();
this.props.onChange(this.props.id, crypto.randomBytes(256).toString('base64').substring(0, 32));
}
};
public render() {
let disabledText = null;

Просмотреть файл

@@ -88,7 +88,7 @@ export default class GroupsList extends React.PureComponent<Props, State> {
public closeFilters = () => {
this.setState({showFilters: false});
}
};
public componentDidMount() {
this.props.actions.getLdapGroups(this.state.page, LDAP_GROUPS_PAGE_SIZE).then(() => {
@@ -222,7 +222,7 @@ export default class GroupsList extends React.PureComponent<Props, State> {
</div>
</div>
);
}
};
public renderRows(): JSX.Element | JSX.Element[] {
if (this.state.loading) {
@@ -437,7 +437,7 @@ export default class GroupsList extends React.PureComponent<Props, State> {
this.props.actions.getLdapGroups(this.state.page, LDAP_GROUPS_PAGE_SIZE, {q: ''}).then(() => {
this.setState({loading: false});
});
}
};
public render(): JSX.Element {
const startCount = (this.state.page * LDAP_GROUPS_PAGE_SIZE) + 1;

Просмотреть файл

@@ -60,7 +60,7 @@ class JobTable extends React.PureComponent<Props> {
}
return <span/>;
}
};
reload = () => {
this.props.actions.getJobsByType(this.props.jobType);

Просмотреть файл

@@ -197,7 +197,7 @@ const EnterpriseEditionLeftPanel = ({
);
};
type LegendValues = 'START DATE:' | 'EXPIRES:' | 'USERS:' | 'ACTIVE USERS:' | 'EDITION:' | 'LICENSE ISSUED:' | 'NAME:' | 'COMPANY / ORG:'
type LegendValues = 'START DATE:' | 'EXPIRES:' | 'LICENSED SEATS:' | 'ACTIVE USERS:' | 'EDITION:' | 'LICENSE ISSUED:' | 'NAME:' | 'COMPANY / ORG:'
const renderLicenseValues = (activeUsers: number, seatsPurchased: number, expirationDays: number) => ({legend, value}: {legend: LegendValues; value: string | JSX.Element | null}, index: number): React.ReactNode => {
if (legend === 'ACTIVE USERS:') {
@@ -294,7 +294,7 @@ const renderLicenseContent = (
}> = [
{legend: 'START DATE:', value: startsAt},
{legend: 'EXPIRES:', value: expiresAt},
{legend: 'USERS:', value: users},
{legend: 'LICENSED SEATS:', value: users},
{legend: 'ACTIVE USERS:', value: activeUsers},
{legend: 'EDITION:', value: sku},
{legend: 'LICENSE ISSUED:', value: issued},

Просмотреть файл

@@ -145,14 +145,14 @@ export default class LicenseSettings extends React.PureComponent<Props, State> {
this.interval = setInterval(this.reloadPercentage, 2000);
}
this.setState({upgradingPercentage: percentage || 0, upgradeError: error as string});
}
};
handleChange = () => {
const element = this.fileInputRef.current;
if (element?.files?.length) {
this.setState({fileSelected: true, file: element.files[0]});
}
}
};
openEELicenseModal = async () => {
this.props.actions.openModal({
@@ -183,7 +183,7 @@ export default class LicenseSettings extends React.PureComponent<Props, State> {
this.props.actions.getPrevTrialLicense();
await this.props.actions.getLicenseConfig();
this.setState({serverError: null, removing: false});
}
};
handleUpgrade = async (e?: React.MouseEvent<HTMLButtonElement>) => {
if (e) {
@@ -200,7 +200,7 @@ export default class LicenseSettings extends React.PureComponent<Props, State> {
trackEvent('api', 'upgrade_to_e0_failed', {error: error.message as string});
this.setState({upgradeError: error.message, upgradingPercentage: 0});
}
}
};
checkRestarted = () => {
this.props.actions.ping().then(() => {
@@ -208,7 +208,7 @@ export default class LicenseSettings extends React.PureComponent<Props, State> {
}).catch(() => {
setTimeout(this.checkRestarted, 1000);
});
}
};
handleRestart = async (e?: React.MouseEvent<HTMLButtonElement>) => {
if (e) {
@@ -221,11 +221,11 @@ export default class LicenseSettings extends React.PureComponent<Props, State> {
this.setState({restarting: false, restartError: err as string});
}
setTimeout(this.checkRestarted, 1000);
}
};
setClickNormalUpgradeBtn = () => {
this.setState({clickNormalUpgradeBtn: true});
}
};
currentPlan = (
<div className='current-plan-legend'>
@@ -244,7 +244,7 @@ export default class LicenseSettings extends React.PureComponent<Props, State> {
{text}
</ExternalLink>
);
}
};
termsAndPolicy = (
<div className='terms-and-policy'>
@@ -400,5 +400,5 @@ export default class LicenseSettings extends React.PureComponent<Props, State> {
);
}
return null;
}
};
}

Просмотреть файл

@@ -260,7 +260,7 @@ const UploadLicenseModal = (props: Props): JSX.Element | null => {
<div className='subtitle'>
<FormattedMessage
id='admin.license.upload-modal.successfulUpgradeText'
defaultMessage='You have upgraded to the {skuName} plan for {licensedUsersNum, number} users. This is effective from {startsAt} until {expiresAt}. '
defaultMessage='You have upgraded to the {skuName} plan for {licensedUsersNum, number} seats. This is effective from {startsAt} until {expiresAt}. '
values={{
expiresAt,
startsAt,

Просмотреть файл

@@ -69,7 +69,7 @@ export default class ManageRolesModal extends React.PureComponent<Props, State>
this.setState({
error,
});
}
};
handleSystemAdminChange = (e: React.ChangeEvent<HTMLInputElement>) => {
if (e.target.name === 'systemadmin') {
@@ -115,7 +115,7 @@ export default class ManageRolesModal extends React.PureComponent<Props, State>
} else if (!UserUtils.hasPostAllPublicRole(roles) && UserUtils.hasPostAllPublicRole(oldRoles)) {
trackEvent('actions', 'remove_roles', {role: General.SYSTEM_POST_ALL_PUBLIC_ROLE});
}
}
};
handleSave = async () => {
this.setState({error: null});
@@ -146,7 +146,7 @@ export default class ManageRolesModal extends React.PureComponent<Props, State>
/>,
);
}
}
};
renderContents = () => {
const {user} = this.props;
@@ -335,7 +335,7 @@ export default class ManageRolesModal extends React.PureComponent<Props, State>
</div>
</div>
);
}
};
render() {
return (

Просмотреть файл

@@ -69,7 +69,7 @@ export default class ManageTokensModal extends React.PureComponent<Props, State>
this.setState({
error,
});
}
};
private renderContents = (): JSX.Element => {
const {user, userAccessTokens} = this.props;
@@ -181,7 +181,7 @@ export default class ManageTokensModal extends React.PureComponent<Props, State>
</div>
</div>
);
}
};
public render = (): JSX.Element => {
return (
@@ -209,5 +209,5 @@ export default class ManageTokensModal extends React.PureComponent<Props, State>
</Modal.Body>
</Modal>
);
}
};
}

Просмотреть файл

@@ -96,7 +96,7 @@ export default class MemberListGroup extends React.PureComponent<Props, State> {
loadComplete = () => {
this.setState({loading: false});
}
};
private nextPage = async () => {
const {actions, groupID} = this.props;
@@ -104,11 +104,11 @@ export default class MemberListGroup extends React.PureComponent<Props, State> {
this.setState({loading: true, page});
await actions.getProfilesInGroup(groupID, page, USERS_PER_PAGE * 2);
this.setState({loading: false});
}
};
private previousPage = () => {
this.setState({page: this.state.page - 1});
}
};
private getRows = (): Row[] => {
const {users} = this.props;
@@ -129,7 +129,7 @@ export default class MemberListGroup extends React.PureComponent<Props, State> {
},
};
});
}
};
private getColumns = (): Column[] => {
return [
@@ -143,7 +143,7 @@ export default class MemberListGroup extends React.PureComponent<Props, State> {
field: 'name',
},
];
}
};
private getPaginationProps = () => {
let {total} = this.props;
@@ -158,7 +158,7 @@ export default class MemberListGroup extends React.PureComponent<Props, State> {
endCount = total;
}
return {startCount, endCount, total};
}
};
public render = (): JSX.Element => {
const rows: Row[] = this.getRows();
@@ -190,5 +190,5 @@ export default class MemberListGroup extends React.PureComponent<Props, State> {
/>
</div>
);
}
};
}

Просмотреть файл

@@ -36,7 +36,7 @@ export default class MessageExportSettings extends AdminSettings {
};
}
return config;
}
};
getStateFromConfig(config) {
const state = {
@@ -321,5 +321,5 @@ export default class MessageExportSettings extends AdminSettings {
/>
</SettingsGroup>
);
}
};
}

Просмотреть файл

@@ -39,7 +39,7 @@ export default class MultiSelectSetting extends React.PureComponent {
this.props.onChange(this.props.id, values);
this.setState({error: false});
}
};
calculateValue = () => {
return this.props.selected.reduce((values, item) => {

Просмотреть файл

@@ -73,7 +73,7 @@ export default class OpenIdConvert extends React.PureComponent<Props, State> {
} else {
getHistory().push('/admin_console/authentication/openid');
}
}
};
render() {
return (

Просмотреть файл

@@ -78,7 +78,7 @@ export default class PasswordSettings extends AdminSettings {
config.ServiceSettings.MaximumLoginAttempts = this.parseIntNonZero(this.state.maximumLoginAttempts, Constants.MAXIMUM_LOGIN_ATTEMPTS_DEFAULT);
return config;
}
};
getStateFromConfig(config) {
return {
@@ -123,17 +123,17 @@ export default class PasswordSettings extends AdminSettings {
}}
/>
);
}
};
handlePasswordLengthChange = (id, value) => {
this.handleChange(id, value);
}
};
handleCheckboxChange = (id) => {
return ({target: {checked}}) => {
this.handleChange(id, checked);
};
}
};
renderTitle() {
return (
@@ -283,5 +283,5 @@ export default class PasswordSettings extends AdminSettings {
}
</SettingsGroup>
);
}
};
}

Просмотреть файл

@@ -70,21 +70,21 @@ export default class PermissionGroup extends React.PureComponent<Props, State> {
toggleExpanded = (e: MouseEvent) => {
e.stopPropagation();
this.setState({expanded: !this.state.expanded});
}
};
toggleSelectRow = (id: string) => {
if (this.props.readOnly) {
return;
}
this.props.onChange([id]);
}
};
toggleSelectSubGroup = (ids: string[]) => {
if (this.props.readOnly) {
return;
}
this.props.onChange(ids);
}
};
toggleSelectGroup = () => {
const {readOnly, permissions, role, onChange} = this.props;
@@ -129,7 +129,7 @@ export default class PermissionGroup extends React.PureComponent<Props, State> {
this.setState({prevPermissions: role.permissions || [], expanded: false});
onChange(permissionsToToggle);
}
}
};
isInScope = (permission: string) => {
if (this.props.scope === 'channel_scope' && PermissionsScope[permission] !== 'channel_scope') {
@@ -139,7 +139,7 @@ export default class PermissionGroup extends React.PureComponent<Props, State> {
return false;
}
return true;
}
};
renderPermission = (permission: string, additionalValues: AdditionalValues) => {
if (!this.isInScope(permission)) {
@@ -162,7 +162,7 @@ export default class PermissionGroup extends React.PureComponent<Props, State> {
additionalValues={additionalValues}
/>
);
}
};
renderGroup = (g: Permission) => {
return (
@@ -183,11 +183,11 @@ export default class PermissionGroup extends React.PureComponent<Props, State> {
root={false}
/>
);
}
};
fromParent = (id: string) => {
return this.props.parentRole && this.props.parentRole.permissions?.indexOf(id) !== -1;
}
};
getStatus = (permissions: Permissions) => {
let anyChecked = false;
@@ -219,11 +219,11 @@ export default class PermissionGroup extends React.PureComponent<Props, State> {
return 'checked';
}
return '';
}
};
hasPermissionsOnScope = () => {
return getRecursivePermissions(this.props.permissions).some((permission) => this.isInScope(permission));
}
};
allPermissionsFromParent = (permissions: Permissions) => {
for (const permission of permissions) {
@@ -238,7 +238,7 @@ export default class PermissionGroup extends React.PureComponent<Props, State> {
}
}
return true;
}
};
render = () => {
const {id, uniqId, permissions, readOnly, combined, root, selected, additionalValues} = this.props;

Просмотреть файл

@@ -89,7 +89,7 @@ export default class PermissionSchemesSettings extends React.PureComponent<Props
}
Promise.all(promises).then(() => this.setState({loadingMore: false, page: this.state.page + 1}));
});
}
};
// |RunJobs && !EnableCluster|(*App).IsPhase2MigrationCompleted|View |
// |-------------------------|---------------------------------|-------------------------------------------------------|
@@ -127,7 +127,7 @@ export default class PermissionSchemesSettings extends React.PureComponent<Props
'Migration job on hold: Team Override Schemes are not available until the job server can execute the permissions migration. The job will be automatically started when the job server is enabled. Learn more in the {documentationLink}.',
docLink,
);
}
};
teamOverrideUnavalableView = (id: string, defaultMsg: string, documentationLink: React.ReactNode) => {
return (
@@ -211,7 +211,7 @@ export default class PermissionSchemesSettings extends React.PureComponent<Props
);
}
return false;
}
};
render = () => {
if (this.state.loading) {

Просмотреть файл

@@ -127,7 +127,7 @@ export default class PermissionSystemSchemeSettings extends React.PureComponent<
return true;
}
return false;
}
};
selectRow = (permission: string) => {
this.setState({selectedPermission: permission});
@@ -139,7 +139,7 @@ export default class PermissionSystemSchemeSettings extends React.PureComponent<
setTimeout(() => {
this.setState({selectedPermission: undefined});
}, 3000);
}
};
loadRolesIntoState(props: Props) {
this.setState({
@@ -195,7 +195,7 @@ export default class PermissionSystemSchemeSettings extends React.PureComponent<
permissions: role.permissions?.filter((p) => PermissionsScope[p] === 'run_scope'),
},
};
}
};
deriveRolesFromGuests = (role: Partial<Role>): Record<string, Partial<Role>> => {
return {
@@ -212,7 +212,7 @@ export default class PermissionSystemSchemeSettings extends React.PureComponent<
permissions: role.permissions?.filter((p) => PermissionsScope[p] === 'channel_scope'),
},
};
}
};
restoreExcludedPermissions = (roles: Record<string, Partial<Role>>) => {
for (const permission of this.props.roles.system_user.permissions) {
@@ -236,7 +236,7 @@ export default class PermissionSystemSchemeSettings extends React.PureComponent<
}
}
return roles;
}
};
restoreGuestPermissions = (roles: Record<string, Partial<Role>>) => {
for (const permission of this.props.roles.system_guest.permissions) {
@@ -255,7 +255,7 @@ export default class PermissionSystemSchemeSettings extends React.PureComponent<
}
}
return roles;
}
};
handleSubmit = async () => {
const teamAdminPromise = this.props.actions.editRole(this.state.roles.team_admin);
@@ -303,13 +303,13 @@ export default class PermissionSystemSchemeSettings extends React.PureComponent<
this.setState({serverError, saving: false, saveNeeded});
this.props.actions.setNavigationBlocked(saveNeeded);
}
};
toggleRole = (roleId: string) => {
const newOpenRoles = {...this.state.openRoles};
newOpenRoles[roleId] = !newOpenRoles[roleId];
this.setState({openRoles: newOpenRoles});
}
};
togglePermission = (roleId: string, permissions: Iterable<string>) => {
const roles = {...this.state.roles};
@@ -327,7 +327,7 @@ export default class PermissionSystemSchemeSettings extends React.PureComponent<
this.setState({roles, saveNeeded: true});
this.props.actions.setNavigationBlocked(true);
}
};
resetDefaults = () => {
const newRolesState = JSON.parse(JSON.stringify({...this.state.roles}));
@@ -338,11 +338,11 @@ export default class PermissionSystemSchemeSettings extends React.PureComponent<
this.setState({roles: newRolesState, saveNeeded: true});
this.props.actions.setNavigationBlocked(true);
}
};
haveGuestAccountsPermissions = () => {
return this.props.license.GuestAccountsPermissions === 'true';
}
};
render = () => {
if (!this.state.loaded) {

Просмотреть файл

@@ -110,7 +110,7 @@ export default class PermissionTeamSchemeSettings extends React.PureComponent<Pr
static defaultProps = {
scheme: null,
}
};
componentDidMount() {
const rolesNeeded = [
@@ -178,7 +178,7 @@ export default class PermissionTeamSchemeSettings extends React.PureComponent<Pr
return true;
}
return false;
}
};
goToSelectedRow = () => {
const selected = document.querySelector('.permission-row.selected,.permission-group-row.selected');
@@ -196,7 +196,7 @@ export default class PermissionTeamSchemeSettings extends React.PureComponent<Pr
return true;
}
return false;
}
};
selectRow = (permission: string) => {
this.setState({selectedPermission: permission});
@@ -208,7 +208,7 @@ export default class PermissionTeamSchemeSettings extends React.PureComponent<Pr
setTimeout(() => {
this.setState({selectedPermission: undefined});
}, 3000);
}
};
getStateRoles = () => {
if (this.state.roles !== null) {
@@ -276,7 +276,7 @@ export default class PermissionTeamSchemeSettings extends React.PureComponent<Pr
permissions: teamGuest?.permissions.concat(channelGuest?.permissions || []),
},
};
}
};
deriveRolesFromGuests = (teamGuest: Role, channelGuest: Role, role: Role): RolesMap => {
return {
@@ -289,7 +289,7 @@ export default class PermissionTeamSchemeSettings extends React.PureComponent<Pr
permissions: role.permissions.filter((p) => PermissionsScope[p] === 'channel_scope'),
},
};
}
};
restoreGuestPermissions = (teamGuest: Role, channelGuest: Role, roles: RolesMap) => {
for (const permission of teamGuest.permissions) {
@@ -303,7 +303,7 @@ export default class PermissionTeamSchemeSettings extends React.PureComponent<Pr
}
}
return roles;
}
};
deriveRolesFromAllUsers = (baseTeam: Role, baseChannel: Role, basePlaybookMember: Role, baseRunMember: Role, role: Role): RolesMap => {
return {
@@ -324,7 +324,7 @@ export default class PermissionTeamSchemeSettings extends React.PureComponent<Pr
permissions: role.permissions?.filter((p) => PermissionsScope[p] === 'run_scope'),
},
};
}
};
restoreExcludedPermissions = (baseTeam: Role, baseChannel: Role, roles: RolesMap) => {
for (const permission of baseTeam.permissions) {
@@ -338,17 +338,17 @@ export default class PermissionTeamSchemeSettings extends React.PureComponent<Pr
}
}
return roles;
}
};
handleNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {
this.setState({schemeName: e.target.value, saveNeeded: true});
this.props.actions.setNavigationBlocked(true);
}
};
handleDescriptionChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
this.setState({schemeDescription: e.target.value, saveNeeded: true});
this.props.actions.setNavigationBlocked(true);
}
};
handleSubmit = async () => {
const roles = this.getStateRoles();
@@ -495,13 +495,13 @@ export default class PermissionTeamSchemeSettings extends React.PureComponent<Pr
this.setState({serverError, saving: false, saveNeeded});
this.props.actions.setNavigationBlocked(saveNeeded);
this.props.history.push('/admin_console/user_management/permissions');
}
};
toggleRole = (roleId: 'all_users' | 'team_admin' | 'channel_admin' | 'guests' | 'playbook_admin') => {
const newOpenRoles = {...this.state.openRoles};
newOpenRoles[roleId] = !newOpenRoles[roleId];
this.setState({openRoles: newOpenRoles});
}
};
togglePermission = (roleId: string, permissions: string[]) => {
const roles = {...this.getStateRoles()} as RolesMap;
@@ -543,17 +543,17 @@ export default class PermissionTeamSchemeSettings extends React.PureComponent<Pr
this.setState({roles, saveNeeded: true});
this.props.actions.setNavigationBlocked(true);
}
};
openAddTeam = () => {
this.setState({addTeamOpen: true});
}
};
removeTeam = (teamId: string) => {
const teams = (this.state.teams || this.props.teams).filter((team) => team.id !== teamId);
this.setState({teams, saveNeeded: true});
this.props.actions.setNavigationBlocked(true);
}
};
addTeams = (teams: Team[]) => {
const currentTeams = this.state.teams || this.props.teams || [];
@@ -562,15 +562,15 @@ export default class PermissionTeamSchemeSettings extends React.PureComponent<Pr
saveNeeded: true,
});
this.props.actions.setNavigationBlocked(true);
}
};
closeAddTeam = () => {
this.setState({addTeamOpen: false});
}
};
haveGuestAccountsPermissions = () => {
return this.props.license.GuestAccountsPermissions === 'true';
}
};
render = () => {
if (!this.isLoaded(this.props)) {

Просмотреть файл

@@ -22,7 +22,7 @@ export default class TeamInList extends React.PureComponent<Props> {
return;
}
onRemoveTeam(team.id);
}
};
render() {
const {team, isDisabled} = this.props;

Просмотреть файл

@@ -96,17 +96,17 @@ export default class PermissionsSchemeSummary extends React.PureComponent<Props
onCancel={this.handleDeleteCanceled}
/>
);
}
};
stopPropagation = (e: React.MouseEvent<HTMLElement, MouseEvent>): void => {
e.stopPropagation();
}
};
handleDeleteCanceled = (): void => {
this.setState({
showConfirmModal: false,
});
}
};
handleDeleteConfirmed = async (): Promise<void> => {
this.setState({deleting: true, serverError: undefined});
@@ -116,7 +116,7 @@ export default class PermissionsSchemeSummary extends React.PureComponent<Props
} else {
this.setState({deleting: false, showConfirmModal: false});
}
}
};
delete = (e: React.MouseEvent<HTMLAnchorElement, MouseEvent>): void => {
e.stopPropagation();
@@ -124,11 +124,11 @@ export default class PermissionsSchemeSummary extends React.PureComponent<Props
return;
}
this.setState({showConfirmModal: true, serverError: undefined});
}
};
goToEdit = (): void => {
this.props.history.push('/admin_console/user_management/permissions/team_override_scheme/' + this.props.scheme.id);
}
};
render = () => {
const {scheme, isDisabled} = this.props;

Просмотреть файл

@@ -260,15 +260,15 @@ export default class PermissionsTree extends React.PureComponent<Props, State> {
return true;
});
}
};
openPostTimeLimitModal = () => {
this.setState({editTimeLimitModalIsVisible: true});
}
};
closePostTimeLimitModal = () => {
this.setState({editTimeLimitModalIsVisible: false});
}
};
componentDidUpdate(prevProps: Props) {
if (this.props.config !== prevProps.config || this.props.license !== prevProps.license) {
@@ -281,7 +281,7 @@ export default class PermissionsTree extends React.PureComponent<Props, State> {
return;
}
this.props.onToggle(this.props.role.name!, ids);
}
};
render = () => {
return (

Просмотреть файл

@@ -486,7 +486,7 @@ export default class PluginManagement extends AdminSettings<Props, State> {
}
return config;
}
};
getStateFromConfig(config: Props['config']) {
const state = {
@@ -517,7 +517,7 @@ export default class PluginManagement extends AdminSettings<Props, State> {
if (element.files && element.files.length > 0) {
this.setState({fileSelected: true, file: element.files[0]});
}
}
};
helpSubmitUpload = async (file: File, force: boolean) => {
this.setState({uploading: true});
@@ -561,7 +561,7 @@ export default class PluginManagement extends AdminSettings<Props, State> {
uploading: false,
loading: false,
});
}
};
handleSubmitUpload = (e: React.SyntheticEvent) => {
e.preventDefault();
@@ -575,7 +575,7 @@ export default class PluginManagement extends AdminSettings<Props, State> {
this.helpSubmitUpload(file, false);
}
Utils.clearFileInput(element);
}
};
handleOverwriteUploadPluginCancel = () => {
this.setState({
@@ -586,20 +586,20 @@ export default class PluginManagement extends AdminSettings<Props, State> {
lastMessage: null,
uploading: false,
});
}
};
handleOverwriteUploadPlugin = () => {
this.setState({confirmOverwriteUploadModal: false});
if (this.state.file) {
this.helpSubmitUpload(this.state.file, true);
}
}
};
onPluginDownloadUrlChange = (e: React.ChangeEvent<HTMLInputElement>) => {
this.setState({
pluginDownloadUrl: e.target.value,
});
}
};
installFromUrl = async (force: boolean) => {
const {pluginDownloadUrl} = this.state;
@@ -644,7 +644,7 @@ export default class PluginManagement extends AdminSettings<Props, State> {
installing: false,
loading: false,
});
}
};
getMarketplaceURLHelpText = (url: string, enableUploads: boolean) => {
return (
@@ -685,16 +685,16 @@ export default class PluginManagement extends AdminSettings<Props, State> {
}
</div>
);
}
};
canSave = () => {
return this.state.marketplaceUrl !== '';
}
};
handleSubmitInstall = (e: React.SyntheticEvent) => {
e.preventDefault();
return this.installFromUrl(false);
}
};
handleOverwriteInstallPluginCancel = () => {
this.setState({
@@ -703,12 +703,12 @@ export default class PluginManagement extends AdminSettings<Props, State> {
serverError: null,
lastMessage: null,
});
}
};
handleOverwriteInstallPlugin = () => {
this.setState({confirmOverwriteInstallModal: false});
return this.installFromUrl(true);
}
};
showRemovePluginModal = (e: React.SyntheticEvent) => {
if (this.props.isDisabled) {
@@ -717,16 +717,16 @@ export default class PluginManagement extends AdminSettings<Props, State> {
e.preventDefault();
const pluginId = e.currentTarget.getAttribute('data-plugin-id');
this.setState({showRemoveModal: true, removing: pluginId});
}
};
handleRemovePluginCancel = () => {
this.setState({showRemoveModal: false, removing: null});
}
};
handleRemovePlugin = () => {
this.setState({showRemoveModal: false});
this.handleRemove();
}
};
handleRemove = async () => {
this.setState({lastMessage: null, serverError: null});
@@ -738,7 +738,7 @@ export default class PluginManagement extends AdminSettings<Props, State> {
this.setState({serverError: error.message});
}
}
}
};
handleEnable = async (e: React.KeyboardEvent) => {
e.preventDefault();
@@ -755,7 +755,7 @@ export default class PluginManagement extends AdminSettings<Props, State> {
this.setState({serverError: error.message});
}
}
}
};
handleDisable = async (e: React.KeyboardEvent) => {
this.setState({lastMessage: null, serverError: null});
@@ -772,7 +772,7 @@ export default class PluginManagement extends AdminSettings<Props, State> {
this.setState({serverError: error.message});
}
}
}
};
renderTitle() {
return (
@@ -818,7 +818,7 @@ export default class PluginManagement extends AdminSettings<Props, State> {
onCancel={onCancel}
/>
);
}
};
renderRemovePluginModal = (
show: boolean, onConfirm: (checked: boolean) => void, onCancel: (checked: boolean) => void) => {
@@ -854,7 +854,7 @@ export default class PluginManagement extends AdminSettings<Props, State> {
onCancel={onCancel}
/>
);
}
};
renderEnablePluginsSetting = () => {
const hideEnablePlugins = this.props.config.ExperimentalSettings && this.props.config.ExperimentalSettings.RestrictSystemAdmin;
@@ -892,7 +892,7 @@ export default class PluginManagement extends AdminSettings<Props, State> {
);
}
return null;
}
};
renderSettings = () => {
const {enableUploads} = this.state;
@@ -1256,5 +1256,5 @@ export default class PluginManagement extends AdminSettings<Props, State> {
</div>
</div>
);
}
};
}

Просмотреть файл

@@ -22,13 +22,13 @@ const PUSH_NOTIFICATIONS_CUSTOM = 'custom';
export default class PushSettings extends AdminSettings {
canSave = () => {
return this.state.pushNotificationServerType !== PUSH_NOTIFICATIONS_MHPNS || this.state.agree;
}
};
handleAgreeChange = (e) => {
this.setState({
agree: e.target.checked,
});
}
};
handleDropdownChange = (id, value) => {
if (id === 'pushNotificationServerType') {
@@ -54,7 +54,7 @@ export default class PushSettings extends AdminSettings {
}
this.handleChange(id, value);
}
};
getConfigFromState = (config) => {
config.EmailSettings.SendPushNotifications = this.state.pushNotificationServerType !== PUSH_NOTIFICATIONS_OFF;
@@ -62,7 +62,7 @@ export default class PushSettings extends AdminSettings {
config.TeamSettings.MaxNotificationsPerChannel = this.state.maxNotificationsPerChannel;
return config;
}
};
getStateFromConfig(config) {
let pushNotificationServerType = PUSH_NOTIFICATIONS_CUSTOM;
@@ -318,5 +318,5 @@ export default class PushSettings extends AdminSettings {
/>
</SettingsGroup>
);
}
};
}

Просмотреть файл

@@ -35,7 +35,7 @@ export default class RemoveFileSetting extends Setting {
this.props.onSubmit(this.props.id, () => {
this.setState({removing: false});
});
}
};
render() {
return (

Просмотреть файл

@@ -59,7 +59,7 @@ export default class ResetEmailModal extends React.PureComponent<Props, State> {
isEmailError: false,
isCurrentPasswordError: false,
});
}
};
private isEmailValid = (): boolean => {
if (!this.emailRef.current || !this.emailRef.current.value || !isEmail(this.emailRef.current.value)) {
@@ -75,7 +75,7 @@ export default class ResetEmailModal extends React.PureComponent<Props, State> {
this.setState({error: null, isEmailError: false});
return true;
}
};
private isCurrentPasswordValid = (): boolean => {
if (!this.currentPasswordRef.current || !this.currentPasswordRef.current.value) {
@@ -91,7 +91,7 @@ export default class ResetEmailModal extends React.PureComponent<Props, State> {
}
this.setState({error: null, isCurrentPasswordError: false});
return true;
}
};
private doSubmit = async (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
e.preventDefault();
@@ -126,14 +126,14 @@ export default class ResetEmailModal extends React.PureComponent<Props, State> {
}
this.props.onModalSubmit(this.props.user);
}
};
private doCancel = (): void => {
this.setState({
error: null,
});
this.props.onModalDismissed();
}
};
public render(): JSX.Element {
const user = this.props.user;

Просмотреть файл

@@ -98,7 +98,7 @@ export default class ResetPasswordModal extends React.PureComponent<Props, State
return;
}
this.props.onModalSubmit(this.props.user);
}
};
private doCancel = (): void => {
this.setState({
@@ -106,7 +106,7 @@ export default class ResetPasswordModal extends React.PureComponent<Props, State
serverErrorCurrentPass: null,
});
this.props.onModalDismissed();
}
};
public render(): JSX.Element {
const user = this.props.user;

Просмотреть файл

@@ -25,7 +25,7 @@ export default class RevokeTokenButton extends React.PureComponent<RevokeTokenBu
if ('error' in response) {
this.props.onError(response.error.message);
}
}
};
render() {
return (

Просмотреть файл

@@ -54,7 +54,7 @@ export default class SchemaAdminSettings extends React.PureComponent {
consoleAccess: PropTypes.object,
cloud: PropTypes.object,
isCurrentUserSystemAdmin: PropTypes.bool,
}
};
constructor(props) {
super(props);
@@ -161,7 +161,7 @@ export default class SchemaAdminSettings extends React.PureComponent {
});
this.props.setNavigationBlocked(false);
}
}
};
getConfigFromState(config) {
const schema = this.props.schema;
@@ -317,7 +317,7 @@ export default class SchemaAdminSettings extends React.PureComponent {
);
}
return setting.label;
}
};
renderHelpText = (setting) => {
if (!this.props.schema) {
@@ -353,7 +353,7 @@ export default class SchemaAdminSettings extends React.PureComponent {
textValues={helpTextValues}
/>
);
}
};
renderLabel = (setting) => {
if (!this.props.schema) {
@@ -364,7 +364,7 @@ export default class SchemaAdminSettings extends React.PureComponent {
return setting.label;
}
return Utils.localizeMessage(setting.label, setting.label_default);
}
};
isDisabled = (setting) => {
const enterpriseReady = this.props.config.BuildEnterpriseReady === 'true';
@@ -372,14 +372,14 @@ export default class SchemaAdminSettings extends React.PureComponent {
return setting.isDisabled(this.props.config, this.state, this.props.license, enterpriseReady, this.props.consoleAccess, this.props.cloud, this.props.isCurrentUserSystemAdmin);
}
return Boolean(setting.isDisabled);
}
};
isHidden = (setting) => {
if (typeof setting.isHidden === 'function') {
return setting.isHidden(this.props.config, this.state, this.props.license);
}
return Boolean(setting.isHidden);
}
};
buildButtonSetting = (setting) => {
const handleRequestAction = (success, error) => {
@@ -437,7 +437,7 @@ export default class SchemaAdminSettings extends React.PureComponent {
}}
/>
);
}
};
buildTextSetting = (setting) => {
let inputType = 'input';
@@ -479,7 +479,7 @@ export default class SchemaAdminSettings extends React.PureComponent {
footer={footer}
/>
);
}
};
buildColorSetting = (setting) => {
return (
@@ -494,7 +494,7 @@ export default class SchemaAdminSettings extends React.PureComponent {
onChange={this.handleChange}
/>
);
}
};
buildBoolSetting = (setting) => {
return (
@@ -509,7 +509,7 @@ export default class SchemaAdminSettings extends React.PureComponent {
onChange={this.handleChange}
/>
);
}
};
buildPermissionSetting = (setting) => {
return (
@@ -524,7 +524,7 @@ export default class SchemaAdminSettings extends React.PureComponent {
onChange={this.handlePermissionChange}
/>
);
}
};
buildDropdownSetting = (setting) => {
const enterpriseReady = this.props.config.BuildEnterpriseReady === 'true';
@@ -569,7 +569,7 @@ export default class SchemaAdminSettings extends React.PureComponent {
onChange={this.handleChange}
/>
);
}
};
buildLanguageSetting = (setting) => {
const locales = I18n.getAllLanguages();
@@ -613,7 +613,7 @@ export default class SchemaAdminSettings extends React.PureComponent {
onChange={this.handleChange}
/>
);
}
};
buildRadioSetting = (setting) => {
const options = setting.options || [];
@@ -632,7 +632,7 @@ export default class SchemaAdminSettings extends React.PureComponent {
onChange={this.handleChange}
/>
);
}
};
buildBannerSetting = (setting) => {
if (this.isDisabled(setting)) {
@@ -651,7 +651,7 @@ export default class SchemaAdminSettings extends React.PureComponent {
</div>
</div>
);
}
};
buildGeneratedSetting = (setting) => {
return (
@@ -668,11 +668,11 @@ export default class SchemaAdminSettings extends React.PureComponent {
onChange={this.handleGeneratedChange}
/>
);
}
};
handleGeneratedChange = (id, s) => {
this.handleChange(id, s.replace('+', '-').replace('/', '_'));
}
};
handleChange = (id, value, confirm = false, doSubmit = false, warning = false) => {
let saveNeeded = this.state.saveNeeded === 'permissions' ? 'both' : 'config';
@@ -702,7 +702,7 @@ export default class SchemaAdminSettings extends React.PureComponent {
}
this.props.setNavigationBlocked(true);
}
};
handlePermissionChange = (id, value) => {
let saveNeeded = 'permissions';
@@ -715,7 +715,7 @@ export default class SchemaAdminSettings extends React.PureComponent {
});
this.props.setNavigationBlocked(true);
}
};
buildUsernameSetting = (setting) => {
return (
@@ -730,7 +730,7 @@ export default class SchemaAdminSettings extends React.PureComponent {
onChange={this.handleChange}
/>
);
}
};
buildJobsTableSetting = (setting) => {
return (
@@ -753,7 +753,7 @@ export default class SchemaAdminSettings extends React.PureComponent {
}
/>
);
}
};
buildFileUploadSetting = (setting) => {
const setData = (id, data) => {
@@ -831,7 +831,7 @@ export default class SchemaAdminSettings extends React.PureComponent {
setByEnv={this.isSetByEnv(setting.key)}
/>
);
}
};
buildCustomSetting = (setting) => {
const CustomComponent = setting.component;
@@ -869,21 +869,21 @@ export default class SchemaAdminSettings extends React.PureComponent {
);
}
return componentInstance;
}
};
unRegisterSaveAction = (saveAction) => {
const indexOfSaveAction = this.saveActions.indexOf(saveAction);
this.saveActions.splice(indexOfSaveAction, 1);
}
};
registerSaveAction = (saveAction) => {
this.saveActions.push(saveAction);
}
};
setSaveNeeded = () => {
this.setState({saveNeeded: 'config'});
this.props.setNavigationBlocked(true);
}
};
renderSettings = () => {
const schema = this.props.schema;
@@ -995,17 +995,17 @@ export default class SchemaAdminSettings extends React.PureComponent {
}
return null;
}
};
closeTooltip = () => {
this.setState({errorTooltip: false});
}
};
openTooltip = (e) => {
const elm = e.currentTarget.querySelector('.control-label');
const isElipsis = elm.offsetWidth < elm.scrollWidth;
this.setState({errorTooltip: isElipsis});
}
};
doSubmit = async (getStateFromConfig) => {
// clone config so that we aren't modifying data in the stores
@@ -1106,7 +1106,7 @@ export default class SchemaAdminSettings extends React.PureComponent {
);
}
return null;
}
};
canSave = () => {
if (!this.props.schema || !this.props.schema.settings) {
@@ -1143,7 +1143,7 @@ export default class SchemaAdminSettings extends React.PureComponent {
}
return true;
}
};
render = () => {
const schema = this.props.schema;
@@ -1238,5 +1238,5 @@ export default class SchemaAdminSettings extends React.PureComponent {
</div>
</div>
);
}
};
}

Просмотреть файл

@@ -46,21 +46,21 @@ export default class LogList extends React.PureComponent<Props, State> {
isSearching = (term: string, filters: ChannelSearchOpts) => {
return term.length > 0 || Object.keys(filters).length > 0;
}
};
onSearch = (term: string) => {
this.props.onSearchChange(term);
}
};
nextPage = () => {
const page = this.state.page + 1;
this.setState({page});
}
};
previousPage = () => {
const page = this.state.page - 1;
this.setState({page});
}
};
getPaginationProps = (): {startCount: number; endCount: number; total: number} => {
const {page} = this.state;
@@ -73,12 +73,12 @@ export default class LogList extends React.PureComponent<Props, State> {
endCount = endCount > total ? total : endCount;
return {startCount, endCount, total};
}
};
handleDateSort = () => {
this.setState({dateAsc: !this.state.dateAsc});
this.getColumns(this.state.dateAsc);
}
};
getColumns = (dateAsc: boolean): Column[] => {
const timestamp: JSX.Element = (
@@ -155,7 +155,7 @@ export default class LogList extends React.PureComponent<Props, State> {
width: 1,
},
];
}
};
getRows = (): Row[] => {
const {startCount, endCount} = this.getPaginationProps();
@@ -219,21 +219,21 @@ export default class LogList extends React.PureComponent<Props, State> {
onClick: () => this.showFullLogEvent(log),
};
});
}
};
showFullLogEvent = (log: LogObject) => {
this.setState({
modalLog: log,
modalOpen: true,
});
}
};
hideModal = () => {
this.setState({
modalLog: null,
modalOpen: false,
});
}
};
onFilter = (filterOptions: FilterOptions) => {
const filters = {} as unknown as LogFilter;
@@ -249,17 +249,17 @@ export default class LogList extends React.PureComponent<Props, State> {
}, []);
}
this.props.onFiltersChange(filters);
}
};
showErrors = () => {
this.props.onFiltersChange({logLevels: ['error']} as unknown as LogFilter);
}
};
getErrorCount = (): number => {
let n = 0;
this.props.logs.map((log) => log.level === 'error' && ++n);
return n;
}
};
render = (): JSX.Element => {
const {search} = this.props;
@@ -377,5 +377,5 @@ export default class LogList extends React.PureComponent<Props, State> {
/>
</div>
);
}
};
}

Просмотреть файл

@@ -57,11 +57,11 @@ export default class Logs extends React.PureComponent<Props, State> {
dateTo: this.state.dateTo,
});
this.setState({loadingLogs: false});
}
};
onSearchChange = (search: string) => {
this.setState({search}, () => this.performSearch());
}
};
performSearch = debounce(() => {
const {search} = this.state;
@@ -74,7 +74,7 @@ export default class Logs extends React.PureComponent<Props, State> {
onFiltersChange = ({dateFrom, dateTo, logLevels, serverNames}: LogFilter) => {
this.setState({dateFrom, dateTo, logLevels, serverNames}, () => this.reload());
}
};
render() {
return (

Просмотреть файл

@@ -24,7 +24,7 @@ export default class SessionLengthSettings extends AdminSettings {
config.ServiceSettings.SessionIdleTimeoutInMinutes = this.parseIntZeroOrMin(this.state.sessionIdleTimeoutInMinutes, MINIMUM_IDLE_TIMEOUT);
return config;
}
};
getStateFromConfig(config) {
return {
@@ -204,5 +204,5 @@ export default class SessionLengthSettings extends AdminSettings {
{sessionTimeoutSetting}
</SettingsGroup>
);
}
};
}

Просмотреть файл

@@ -76,11 +76,11 @@ export default class AddUsersToRoleModal extends React.PureComponent<Props, Stat
componentDidMount = async () => {
await this.props.actions.getProfiles(0, USERS_PER_PAGE * 2);
this.setUsersLoadingState(false);
}
};
setUsersLoadingState = (loading: boolean) => {
this.setState({loading});
}
};
search = async (term: string) => {
this.setUsersLoadingState(true);
@@ -93,17 +93,17 @@ export default class AddUsersToRoleModal extends React.PureComponent<Props, Stat
await this.props.actions.getProfiles(0, USERS_PER_PAGE * 2);
}
this.setState({loading: false, searchResults, term});
}
};
handleHide = () => {
this.setState({show: false});
}
};
handleExit = () => {
if (this.props.onExited) {
this.props.onExited();
}
}
};
renderOption = (option: UserProfileValue, isSelected: boolean, onAdd: (user: UserProfileValue) => void, onMouseMove: (user: UserProfileValue) => void) => {
let rowSelected = '';
@@ -137,15 +137,15 @@ export default class AddUsersToRoleModal extends React.PureComponent<Props, Stat
</div>
</div>
);
}
};
renderValue = (value: { data: UserProfileValue }): string => {
return value.data?.username || '';
}
};
renderAriaLabel = (option: UserProfileValue): string => {
return option?.username || '';
}
};
handleAdd = (value: UserProfileValue) => {
const values: UserProfileValue[] = [...this.state.values];
@@ -153,11 +153,11 @@ export default class AddUsersToRoleModal extends React.PureComponent<Props, Stat
values.push(value);
}
this.setState({values});
}
};
handleDelete = (values: UserProfileValue[]) => {
this.setState({values});
}
};
handlePageChange = (page: number, prevPage: number) => {
if (page > prevPage) {
@@ -171,7 +171,7 @@ export default class AddUsersToRoleModal extends React.PureComponent<Props, Stat
handleSubmit = () => {
this.props.onAddCallback(this.state.values);
this.handleHide();
}
};
render = (): JSX.Element => {
const numRemainingText = (
@@ -265,5 +265,5 @@ export default class AddUsersToRoleModal extends React.PureComponent<Props, Stat
</Modal.Body>
</Modal>
);
}
};
}

Просмотреть файл

@@ -74,7 +74,7 @@ export default class SystemRole extends React.PureComponent<Props, State> {
saveNeeded = saveNeeded || difference(updatedRolePermissions, role.permissions).length > 0 || difference(role.permissions, updatedRolePermissions).length > 0;
}
return saveNeeded;
}
};
addUsersToRole = (users: UserProfile[]) => {
const {actions: {setNavigationBlocked}} = this.props;
@@ -95,7 +95,7 @@ export default class SystemRole extends React.PureComponent<Props, State> {
const saveNeeded = this.getSaveStateNeeded({usersToAdd, usersToRemove});
setNavigationBlocked(saveNeeded);
this.setState({usersToAdd, usersToRemove, saveNeeded});
}
};
removeUserFromRole = (user: UserProfile) => {
const {actions: {setNavigationBlocked}} = this.props;
@@ -114,7 +114,7 @@ export default class SystemRole extends React.PureComponent<Props, State> {
const saveNeeded = this.getSaveStateNeeded({usersToAdd, usersToRemove});
setNavigationBlocked(saveNeeded);
this.setState({usersToRemove, usersToAdd, saveNeeded});
}
};
handleSubmit = async () => {
this.setState({saving: true, saveNeeded: false});
@@ -189,7 +189,7 @@ export default class SystemRole extends React.PureComponent<Props, State> {
usersToRemove: {},
saveKey,
});
}
};
updatePermissions = (permissions: PermissionToUpdate[]) => {
const {role, actions: {setNavigationBlocked}} = this.props;
@@ -235,7 +235,7 @@ export default class SystemRole extends React.PureComponent<Props, State> {
...nextState,
saveNeeded: this.getSaveStateNeeded(nextState),
});
}
};
render() {
const {usersToAdd, usersToRemove, saving, saveNeeded, serverError, permissionsToUpdate, saveKey} = this.state;

Просмотреть файл

@@ -28,7 +28,7 @@ export default class SystemRolePermission extends React.PureComponent<Props> {
return visibleSections[section.name];
}
return this.getAccessForSection(section, permissionsMap, permissionsToUpdate) === mixedAccess;
}
};
renderSubsectionToggle = (section: SystemSection, isSectionVisible: boolean) => {
if (!section.subsections || section.subsections.length === 0) {
@@ -59,7 +59,7 @@ export default class SystemRolePermission extends React.PureComponent<Props> {
</button>
</div>
);
}
};
renderSubsections = (section: SystemSection, permissionsMap: Record<string, boolean>, permissionsToUpdate: PermissionsToUpdate, isSectionVisible: boolean) => {
if (!section.subsections || section.subsections.length === 0) {
@@ -74,7 +74,7 @@ export default class SystemRolePermission extends React.PureComponent<Props> {
}
</div>
);
}
};
renderSectionRow = (section: SystemSection, permissionsMap: Record<string, boolean>, permissionsToUpdate: PermissionsToUpdate, isSectionVisible: boolean) => {
return (
@@ -111,7 +111,7 @@ export default class SystemRolePermission extends React.PureComponent<Props> {
</div>
</div>
);
}
};
getAccessForSection = (section: SystemSection, permissions: Record<string, boolean>, permissionsToUpdate: Record<string, PermissionAccess>) => {
// If we have subsections then use them to determine access to show.
@@ -145,7 +145,7 @@ export default class SystemRolePermission extends React.PureComponent<Props> {
}
}
return this.getAccessForSectionByName(section.name, permissions, permissionsToUpdate);
}
};
getAccessForSectionByName = (sectionName: string, permissions: Record<string, boolean>, permissionsToUpdate: Record<string, PermissionAccess>) => {
// Assume sysadmin has write access for everything, this is a bit of a hack but it should be left in until `user_management_read|write_system_roles` is actually a permission
@@ -167,7 +167,7 @@ export default class SystemRolePermission extends React.PureComponent<Props> {
}
return access;
}
};
render() {
const {section, permissionsMap, permissionsToUpdate, visibleSections} = this.props;

Просмотреть файл

@@ -37,7 +37,7 @@ export default class SystemRolePermissionDropdown extends React.PureComponent<Pr
permissions.push({name: section.name, value});
}
this.props.updatePermissions(permissions);
}
};
renderOption = (label: JSX.Element, description: JSX.Element) => {
return (
@@ -50,7 +50,7 @@ export default class SystemRolePermissionDropdown extends React.PureComponent<Pr
</div>
</div>
);
}
};
render() {
const {isDisabled, section} = this.props;

Просмотреть файл

@@ -181,11 +181,11 @@ export default class SystemRolePermissions extends React.PureComponent<Props, St
if (sectionIndex > -1) {
sectionsList.splice(sectionIndex, 1);
}
}
};
updatePermissions = (permissions: PermissionToUpdate[]) => {
this.props.updatePermissions(permissions);
}
};
setSectionVisible = (name: string, visible: boolean) => {
const {visibleSections} = this.state;
@@ -195,7 +195,7 @@ export default class SystemRolePermissions extends React.PureComponent<Props, St
[name]: visible,
},
});
}
};
getRows = (permissionsMap: Record<string, boolean>, permissionsToUpdate: PermissionsToUpdate, visibleSections: Record<string, boolean>) => {
const {isLicensedForCloud} = this.props;
@@ -257,7 +257,7 @@ export default class SystemRolePermissions extends React.PureComponent<Props, St
/>
);
});
}
};
render() {
const {role, permissionsToUpdate} = this.props;

Просмотреть файл

@@ -106,14 +106,14 @@ export default class SystemRoleUsers extends React.PureComponent<Props, State> {
setStateLoading = (loading: boolean) => {
this.setState({loading});
}
};
getVisibleTotalCount = (): number => {
const {usersToRemove, usersToAdd, totalCount} = this.props;
const usersToAddCount = Object.keys(usersToAdd).length;
const usersToRemoveCount = Object.keys(usersToRemove).length;
return totalCount + (usersToAddCount - usersToRemoveCount);
}
};
getPaginationProps = (): {startCount: number; endCount: number; total: number} => {
const {term, usersToRemove, usersToAdd} = this.props;
@@ -138,11 +138,11 @@ export default class SystemRoleUsers extends React.PureComponent<Props, State> {
endCount = endCount > total ? total : endCount;
return {startCount, endCount, total};
}
};
onSearch = async (term: string) => {
this.props.actions.setUserGridSearch(term);
}
};
nextPage = async () => {
if (this.state.loading) {
@@ -152,14 +152,14 @@ export default class SystemRoleUsers extends React.PureComponent<Props, State> {
this.setState({loading: true});
await this.props.actions.getProfiles(page, USERS_PER_PAGE, {role: this.props.role.name});
this.setState({loading: false, page});
}
};
previousPage = async () => {
if (this.state.loading || this.state.page === 0) {
return;
}
this.setState({page: this.state.page - 1});
}
};
getRows = () => {
const {users, readOnly, usersToAdd, usersToRemove} = this.props;
@@ -198,7 +198,7 @@ export default class SystemRoleUsers extends React.PureComponent<Props, State> {
},
};
});
}
};
getColumns = () => {
const name: JSX.Element = (
@@ -228,15 +228,15 @@ export default class SystemRoleUsers extends React.PureComponent<Props, State> {
fixed: true,
},
];
}
};
onAddCallback = (users: UserProfile[]) => {
this.props.onAddCallback(users);
}
};
onRemoveCallback = (user: UserProfile) => {
this.props.onRemoveCallback(user);
}
};
render() {
const {page, loading} = this.state;

Просмотреть файл

@@ -108,11 +108,11 @@ export default class SystemUserDetail extends React.PureComponent<Props & RouteC
this.setState({teams});
this.setState({teamIds});
this.setState({refreshTeams: false});
}
};
openAddTeam = (): void => {
this.setState({addTeamOpen: true});
}
};
addTeams = (teams: Team[]): void => {
const promises = [];
@@ -120,63 +120,63 @@ export default class SystemUserDetail extends React.PureComponent<Props & RouteC
promises.push(this.props.actions.addUserToTeam(team.id, this.props.user.id));
}
Promise.all(promises).finally(() => this.setState({refreshTeams: true}));
}
};
closeAddTeam = (): void => {
this.setState({addTeamOpen: false});
}
};
doPasswordReset = (user: UserProfile): void => {
this.setState({
showPasswordModal: true,
user,
});
}
};
doPasswordResetDismiss = (): void => {
this.setState({
showPasswordModal: false,
});
}
};
doPasswordResetSubmit = (): void => {
this.setState({
showPasswordModal: false,
});
}
};
handleMakeActive = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>): void => {
e.preventDefault();
this.props.actions.updateUserActive(this.props.user.id, true).
then((data) => this.onUpdateActiveResult(data.error));
}
};
handleShowDeactivateMemberModal = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>): void => {
e.preventDefault();
this.setState({showDeactivateMemberModal: true});
}
};
handleDeactivateMember = (): void => {
this.props.actions.updateUserActive(this.props.user.id, false).
then((data) => this.onUpdateActiveResult(data.error));
this.setState({showDeactivateMemberModal: false});
}
};
onUpdateActiveResult = (error: ServerError): void => {
if (error) {
this.setState({error});
}
}
};
handleDeactivateCancel = (): void => {
this.setState({showDeactivateMemberModal: false});
}
};
// TODO: add error handler function
handleResetMfa = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>): void => {
e.preventDefault();
adminResetMfa(this.props.user.id, null, null);
}
};
handleEmailChange = (e: React.ChangeEvent<HTMLInputElement>): void => {
const emailChanged = e.target.value !== this.props.user.email;
@@ -187,7 +187,7 @@ export default class SystemUserDetail extends React.PureComponent<Props & RouteC
saveNeeded: emailChanged,
});
this.props.actions.setNavigationBlocked(emailChanged);
}
};
handleSubmit = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>): void => {
e.preventDefault();
@@ -220,7 +220,7 @@ export default class SystemUserDetail extends React.PureComponent<Props & RouteC
});
this.props.actions.setNavigationBlocked(false);
}
}
};
renderDeactivateMemberModal = (user: UserProfile): React.ReactNode => {
const title = (
@@ -279,7 +279,7 @@ export default class SystemUserDetail extends React.PureComponent<Props & RouteC
onCancel={this.handleDeactivateCancel}
/>
);
}
};
renderActivateDeactivate = (): React.ReactNode => {
if (this.props.user.delete_at > 0) {
@@ -302,7 +302,7 @@ export default class SystemUserDetail extends React.PureComponent<Props & RouteC
{Utils.localizeMessage('admin.user_item.makeInactive', 'Deactivate')}
</AdminButtonOutline>
);
}
};
renderRemoveMFA = (): React.ReactNode => {
if (this.props.user.mfa_active) {
@@ -317,7 +317,7 @@ export default class SystemUserDetail extends React.PureComponent<Props & RouteC
);
}
return null;
}
};
getAuthenticationText(): string {
const {user, mfaEnabled} = this.props;

Просмотреть файл

@@ -63,14 +63,14 @@ export default class AbstractList extends React.PureComponent<Props, State> {
const page = this.state.page < 1 ? 0 : this.state.page - 1;
this.setState({page, loading: true});
this.performSearch();
}
};
private nextPage = async (e: React.MouseEvent<HTMLButtonElement>): Promise<void> => {
e.preventDefault();
const page = this.state.page + 1;
this.setState({page, loading: true});
this.performSearch();
}
};
private performSearch = (): void => {
const userId = this.props.userId;
@@ -83,7 +83,7 @@ export default class AbstractList extends React.PureComponent<Props, State> {
}
this.setState({loading: false});
});
}
};
private getPaging(): Paging {
const startCount = (this.state.page * PAGE_SIZE) + 1;
@@ -110,7 +110,7 @@ export default class AbstractList extends React.PureComponent<Props, State> {
);
}
return null;
}
};
private renderRows = (): JSX.Element | JSX.Element[] => {
if (this.state.loading) {
@@ -134,7 +134,7 @@ export default class AbstractList extends React.PureComponent<Props, State> {
const pageEnd = this.state.page < 1 ? PAGE_SIZE : (this.state.page + 1) * PAGE_SIZE; // ie 10, 20, 30, etc.
const pageData = this.props.data.slice(pageStart, pageEnd).map(this.props.renderRow); // ie 0-10, 10-20, etc.
return pageData;
}
};
public render = (): JSX.Element => {
const {startCount, endCount, total} = this.getPaging();
@@ -179,6 +179,6 @@ export default class AbstractList extends React.PureComponent<Props, State> {
}
</div>
);
}
};
}

Просмотреть файл

@@ -71,7 +71,7 @@ export default class TeamList extends React.PureComponent<Props, State> {
emptyListTextId: t('admin.team_settings.team_list.no_teams_found'),
emptyListTextDefaultMessage: 'No teams found',
refreshTeams: false,
}
};
public constructor(props: Props) {
super(props);
@@ -100,7 +100,7 @@ export default class TeamList extends React.PureComponent<Props, State> {
this.setState({teamsWithMemberships});
this.props.userDetailCallback(teamsWithMemberships);
});
}
};
// check this out
private mergeTeamsWithMemberships = (data: [{data: Team[]}, {data: TeamMembership[]}]): TeamWithMembership[] => {
@@ -113,7 +113,7 @@ export default class TeamList extends React.PureComponent<Props, State> {
});
teamsWithMemberships = filterAndSortTeamsByDisplayName(teamsWithMemberships, this.props.locale);
return teamsWithMemberships;
}
};
private doRemoveUserFromTeam = async (teamId: string): Promise<void> => {
const {error} = await this.props.actions.removeUserFromTeam(teamId, this.props.userId);
@@ -122,7 +122,7 @@ export default class TeamList extends React.PureComponent<Props, State> {
} else {
this.getTeamsAndMemberships();
}
}
};
private doMakeUserTeamAdmin = async (teamId: string) => {
const {error} = await this.props.actions.updateTeamMemberSchemeRoles(teamId, this.props.userId, true, true);
@@ -131,7 +131,7 @@ export default class TeamList extends React.PureComponent<Props, State> {
} else {
this.getTeamsAndMemberships();
}
}
};
private doMakeUserTeamMember = async (teamId: string) => {
const {error} = await this.props.actions.updateTeamMemberSchemeRoles(teamId, this.props.userId, true, false);
@@ -140,7 +140,7 @@ export default class TeamList extends React.PureComponent<Props, State> {
} else {
this.getTeamsAndMemberships();
}
}
};
public render(): JSX.Element {
let serverError = null;
@@ -179,5 +179,5 @@ export default class TeamList extends React.PureComponent<Props, State> {
readOnly={this.props.readOnly}
/>
);
}
};
}

Просмотреть файл

@@ -46,7 +46,7 @@ export default class TeamRow extends React.PureComponent<Props> {
defaultMessage={'Invite only'}
/>
);
}
};
private renderTeamRole = (team: TeamWithMembership) => {
if (team.scheme_guest) {
return (
@@ -73,7 +73,7 @@ export default class TeamRow extends React.PureComponent<Props> {
);
}
return null;
}
};
public render = (): JSX.Element => {
const {team} = this.props;
const teamIconUrl = Utils.imageURLForTeam(team);

Просмотреть файл

@@ -103,11 +103,11 @@ export default class SystemUsersList extends React.PureComponent<Props, State> {
this.setState({page: this.state.page + 1});
this.props.nextPage(this.state.page + 1);
}
};
previousPage = () => {
this.setState({page: this.state.page - 1});
}
};
search = (term: string) => {
this.props.search(term);
@@ -115,63 +115,63 @@ export default class SystemUsersList extends React.PureComponent<Props, State> {
if (term !== '') {
this.setState({page: 0});
}
}
};
doManageTeams = (user: UserProfile) => {
this.setState({
showManageTeamsModal: true,
user,
});
}
};
doManageRoles = (user: UserProfile) => {
this.setState({
showManageRolesModal: true,
user,
});
}
};
doManageTokens = (user: UserProfile) => {
this.setState({
showManageTokensModal: true,
user,
});
}
};
doManageTeamsDismiss = () => {
this.setState({
showManageTeamsModal: false,
user: undefined,
});
}
};
doManageRolesDismiss = () => {
this.setState({
showManageRolesModal: false,
user: undefined,
});
}
};
doManageTokensDismiss = () => {
this.setState({
showManageTokensModal: false,
user: undefined,
});
}
};
doPasswordReset = (user: UserProfile) => {
this.setState({
showPasswordModal: true,
user,
});
}
};
doPasswordResetDismiss = () => {
this.setState({
showPasswordModal: false,
user: undefined,
});
}
};
doPasswordResetSubmit = (user?: UserProfile) => {
if (user) {
@@ -182,21 +182,21 @@ export default class SystemUsersList extends React.PureComponent<Props, State> {
showPasswordModal: false,
user: undefined,
});
}
};
doEmailReset = (user: UserProfile) => {
this.setState({
showEmailModal: true,
user,
});
}
};
doEmailResetDismiss = () => {
this.setState({
showEmailModal: false,
user: undefined,
});
}
};
doEmailResetSubmit = (user?: UserProfile) => {
if (user) {
@@ -207,7 +207,7 @@ export default class SystemUsersList extends React.PureComponent<Props, State> {
showEmailModal: false,
user: undefined,
});
}
};
getInfoForUser(user: UserProfile) {
const info = [];

Просмотреть файл

@@ -164,23 +164,23 @@ export default class SystemUsers extends React.PureComponent<Props, State> {
}
this.setState({loading: false});
}
};
handleTeamChange = (e: ChangeEvent<HTMLSelectElement>) => {
const teamId = e.target.value;
this.loadDataForTeam(teamId, this.props.filter);
this.props.actions.setSystemUsersSearch(this.props.searchTerm, teamId, this.props.filter);
}
};
handleFilterChange = (e: ChangeEvent<HTMLSelectElement>) => {
const filter = e.target.value;
this.loadDataForTeam(this.props.teamId, filter);
this.props.actions.setSystemUsersSearch(this.props.searchTerm, this.props.teamId, filter);
}
};
handleTermChange = (term: string) => {
this.props.actions.setSystemUsersSearch(term, this.props.teamId, this.props.filter);
}
};
handleRevokeAllSessions = async () => {
const {data} = await this.props.actions.revokeSessionsForAllUsers();
if (data) {
@@ -188,13 +188,13 @@ export default class SystemUsers extends React.PureComponent<Props, State> {
} else {
this.props.actions.logError({type: 'critical', message: 'Can\'t revoke all sessions'});
}
}
};
handleRevokeAllSessionsCancel = () => {
this.setState({showRevokeAllSessionsModal: false});
}
};
handleShowRevokeAllSessionsModal = () => {
this.setState({showRevokeAllSessionsModal: true});
}
};
nextPage = async (page: number) => {
const {teamId, filter} = this.props;
@@ -216,7 +216,7 @@ export default class SystemUsers extends React.PureComponent<Props, State> {
await loadProfilesAndTeamMembers(page + 1, USERS_PER_PAGE, teamId, options);
}
this.setState({loading: false});
}
};
doSearch = debounce(async (term, teamId = this.props.teamId, filter = this.props.filter) => {
if (!term) {
@@ -250,7 +250,7 @@ export default class SystemUsers extends React.PureComponent<Props, State> {
await this.props.actions.getUser(id);
this.setState({loading: false});
}
};
getUserByTokenOrId = async (id: string) => {
if (this.props.enableUserAccessTokens) {
@@ -264,7 +264,7 @@ export default class SystemUsers extends React.PureComponent<Props, State> {
}
this.getUserById(id);
}
};
renderRevokeAllUsersModal = () => {
const title = (
@@ -302,7 +302,7 @@ export default class SystemUsers extends React.PureComponent<Props, State> {
onCancel={this.handleRevokeAllSessionsCancel}
/>
);
}
};
renderFilterRow = (doSearch: ((event: React.FormEvent<HTMLInputElement>) => void) | undefined) => {
const teams = this.props.teams.map((team) => (
@@ -363,7 +363,7 @@ export default class SystemUsers extends React.PureComponent<Props, State> {
</label>
</div>
);
}
};
render() {
const revokeAllUsersModal = this.renderRevokeAllUsersModal();

Просмотреть файл

@@ -86,40 +86,40 @@ export default class SystemUsersDropdown extends React.PureComponent<Props, Stat
e.preventDefault();
this.props.actions.updateUserActive(this.props.user.id, true).
then(this.onUpdateActiveResult);
}
};
handleManageTeams = (e: {preventDefault: () => void}) => {
e.preventDefault();
this.props.doManageTeams(this.props.user);
}
};
handleManageRoles = (e: {preventDefault: () => void}) => {
e.preventDefault();
this.props.doManageRoles(this.props.user);
}
};
handleManageTokens = (e: {preventDefault: () => void}) => {
e.preventDefault();
this.props.doManageTokens(this.props.user);
}
};
handleResetPassword = (e: {preventDefault: () => void}) => {
e.preventDefault();
this.props.doPasswordReset(this.props.user);
}
};
handleResetEmail = (e: {preventDefault: () => void}) => {
e.preventDefault();
this.props.doEmailReset(this.props.user);
}
};
handleResetMfa = (e: {preventDefault: () => void}) => {
e.preventDefault();
adminResetMfa(this.props.user.id, null, this.props.onError);
}
};
handleShowDeactivateMemberModal = async (e: {preventDefault: () => void}) => {
e.preventDefault();
@@ -130,23 +130,23 @@ export default class SystemUsersDropdown extends React.PureComponent<Props, Stat
);
}
this.setState({showDeactivateMemberModal: true});
}
};
handleDeactivateMember = () => {
this.props.actions.updateUserActive(this.props.user.id, false).
then(this.onUpdateActiveResult);
this.setState({showDeactivateMemberModal: false});
}
};
onUpdateActiveResult = ({error}: {error: ServerError}) => {
if (error) {
this.props.onError({id: error.server_error_id, ...error});
}
}
};
handleDeactivateCancel = () => {
this.setState({showDeactivateMemberModal: false});
}
};
renderDeactivateMemberModal = () => {
const user = this.props.user;
@@ -273,7 +273,7 @@ export default class SystemUsersDropdown extends React.PureComponent<Props, Stat
onCancel={this.handleDeactivateCancel}
/>
);
}
};
shouldDisableBotsWhenOwnerIsDeactivated() {
return this.props.config &&
@@ -284,12 +284,12 @@ export default class SystemUsersDropdown extends React.PureComponent<Props, Stat
handleShowRevokeSessionsModal = (e: {preventDefault: () => void}) => {
e.preventDefault();
this.setState({showRevokeSessionsModal: true});
}
};
handleShowCreateGroupSyncableMembershipsModal = (e: {preventDefault: () => void}) => {
e.preventDefault();
this.setState({showCreateGroupMembershipsModal: true});
}
};
handleCreateGroupSyncableMemberships = async () => {
const {error} = await this.props.actions.createGroupTeamsAndChannels(this.props.user.id);
@@ -298,11 +298,11 @@ export default class SystemUsersDropdown extends React.PureComponent<Props, Stat
}
this.setState({showCreateGroupMembershipsModal: false});
}
};
handleCreateGroupSyncableMembershipsCancel = () => {
this.setState({showCreateGroupMembershipsModal: false});
}
};
handleRevokeSessions = async () => {
const me = this.props.currentUser;
@@ -315,15 +315,15 @@ export default class SystemUsersDropdown extends React.PureComponent<Props, Stat
}
this.setState({showRevokeSessionsModal: false});
}
};
handleRevokeSessionsCancel = () => {
this.setState({showRevokeSessionsModal: false});
}
};
handlePromoteToUser = () => {
this.setState({showPromoteToUserModal: true});
}
};
handlePromoteToUserConfirm = async () => {
const {error} = await this.props.actions.promoteGuestToUser(this.props.user.id);
@@ -332,15 +332,15 @@ export default class SystemUsersDropdown extends React.PureComponent<Props, Stat
}
this.setState({showPromoteToUserModal: false});
}
};
handlePromoteToUserCancel = () => {
this.setState({showPromoteToUserModal: false});
}
};
handleDemoteToGuest = () => {
this.setState({showDemoteToGuestModal: true});
}
};
handleDemoteToGuestConfirm = async () => {
const {error} = await this.props.actions.demoteUserToGuest(this.props.user.id);
@@ -348,11 +348,11 @@ export default class SystemUsersDropdown extends React.PureComponent<Props, Stat
this.props.onError(error);
}
this.setState({showDemoteToGuestModal: false});
}
};
handleDemoteToGuestCancel = () => {
this.setState({showDemoteToGuestModal: false});
}
};
renderPromoteToUserModal = () => {
const title = (
@@ -393,7 +393,7 @@ export default class SystemUsersDropdown extends React.PureComponent<Props, Stat
onCancel={this.handlePromoteToUserCancel}
/>
);
}
};
renderDemoteToGuestModal = () => {
const title = (
@@ -434,7 +434,7 @@ export default class SystemUsersDropdown extends React.PureComponent<Props, Stat
onCancel={this.handleDemoteToGuestCancel}
/>
);
}
};
renderRevokeSessionsModal = () => {
const title = (
@@ -475,7 +475,7 @@ export default class SystemUsersDropdown extends React.PureComponent<Props, Stat
onCancel={this.handleRevokeSessionsCancel}
/>
);
}
};
renderCreateGroupSyncablesMembershipsModal = () => {
const title = (
@@ -524,7 +524,7 @@ export default class SystemUsersDropdown extends React.PureComponent<Props, Stat
onCancel={this.handleCreateGroupSyncableMembershipsCancel}
/>
);
}
};
renderAccessToken = () => {
const userAccessTokensEnabled = this.props.enableUserAccessTokens;
@@ -561,7 +561,7 @@ export default class SystemUsersDropdown extends React.PureComponent<Props, Stat
/>
</div>
);
}
};
render() {
const {currentUser, user, isLicensed, config} = this.props;

Просмотреть файл

@@ -62,21 +62,21 @@ export default class AbstractList extends React.PureComponent<Props, State> {
const page = this.state.page < 1 ? 0 : this.state.page - 1;
this.setState({page, loading: true});
this.performSearch(page);
}
};
nextPage = async (e: MouseEvent<HTMLButtonElement>): Promise<void> => {
e.preventDefault();
const page = this.state.page + 1;
this.setState({page, loading: true});
this.performSearch(page);
}
};
renderHeader = (): JSX.Element | null => {
if (this.props.data.length > 0) {
return this.props.header;
}
return null;
}
};
renderRows = (): JSX.Element | JSX.Element[] => {
if (this.state.loading) {
@@ -98,7 +98,7 @@ export default class AbstractList extends React.PureComponent<Props, State> {
}
const offset = this.state.page * PAGE_SIZE;
return this.props.data.slice(offset, offset + PAGE_SIZE).map(this.props.renderRow);
}
};
performSearch = (page: number): void => {
this.setState({loading: true});
@@ -109,7 +109,7 @@ export default class AbstractList extends React.PureComponent<Props, State> {
}
this.setState({loading: false});
});
}
};
getPaging(): Paging {
const startCount = (this.state.page * PAGE_SIZE) + 1;
@@ -175,5 +175,5 @@ export default class AbstractList extends React.PureComponent<Props, State> {
</div>}
</div>
);
}
};
}

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше