Merge branch 'master' into boards-playbooks-i18n-sync

Этот коммит содержится в:
Caleb Roseland
2023-04-07 09:31:29 -05:00
родитель 4a5e5b7b96 9bffaeae42
Коммит 8f9b22b004
452 изменённых файлов: 4480 добавлений и 4111 удалений

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

@@ -1,3 +1,3 @@
save-exact=true
legacy-peer-deps=true
global-style=true
global-style=true

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

@@ -102,12 +102,11 @@
"@types/react-router-dom": "^5.3.3",
"@types/react-transition-group": "4.4.4",
"@types/redux-mock-store": "1.0.3",
"@typescript-eslint/eslint-plugin": "5.16.0",
"@typescript-eslint/parser": "5.16.0",
"@typescript-eslint/eslint-plugin": "5.57.1",
"@typescript-eslint/parser": "5.57.1",
"babel-eslint": "10.1.0",
"cross-env": "^7.0.3",
"css-loader": "6.7.1",
"eslint": "^8.11.0",
"eslint-import-resolver-webpack": "0.13.2",
"eslint-plugin-babel": "^5.3.1",
"eslint-plugin-formatjs": "4.9.0",

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

@@ -873,7 +873,7 @@ exports[`src/components/workspace return workspace readonly and showcard 1`] = `
>
<div
class="octo-board-header-cell KanbanColumnHeader"
draggable="true"
draggable="false"
style="opacity: 1;"
>
<span
@@ -901,7 +901,7 @@ exports[`src/components/workspace return workspace readonly and showcard 1`] = `
</div>
<div
class="octo-board-header-cell KanbanColumnHeader"
draggable="true"
draggable="false"
style="opacity: 1;"
>
<span
@@ -1927,7 +1927,7 @@ exports[`src/components/workspace should match snapshot with readonly 1`] = `
>
<div
class="octo-board-header-cell KanbanColumnHeader"
draggable="true"
draggable="false"
style="opacity: 1;"
>
<span
@@ -1955,7 +1955,7 @@ exports[`src/components/workspace should match snapshot with readonly 1`] = `
</div>
<div
class="octo-board-header-cell KanbanColumnHeader"
draggable="true"
draggable="false"
style="opacity: 1;"
>
<span

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

@@ -29,7 +29,14 @@ jest.mock('react-router-dom', () => {
return {
...originalModule,
useRouteMatch: jest.fn(() => {
return {url: '/board/view'}
return {
params: {
teamId: 'team1',
boardId: 'boardId1',
viewId: 'viewId1',
cardId: 'cardId1',
},
}
}),
}
})

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

@@ -469,7 +469,7 @@ exports[`src/components/kanban/kanbanColumnHeader should match snapshot readonly
<div>
<div
class="octo-board-header-cell KanbanColumnHeader"
draggable="true"
draggable="false"
style="opacity: 1;"
>
<span

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

@@ -52,8 +52,12 @@ const defaultProperty: IPropertyTemplate = {
export default function KanbanColumnHeader(props: Props): JSX.Element {
const intl = useIntl()
const {board, activeView, group, groupByProperty} = props
let readonly = props.readonly
if(!readonly){
readonly = !useHasCurrentBoardPermissions([Permission.ManageBoardProperties])
}
const [groupTitle, setGroupTitle] = useState(group.option.value)
const canEditBoardProperties = useHasCurrentBoardPermissions([Permission.ManageBoardProperties])
const canEditOption = groupByProperty?.type !== 'person' && group.option.id
const headerRef = useRef<HTMLDivElement>(null)
@@ -79,7 +83,7 @@ export default function KanbanColumnHeader(props: Props): JSX.Element {
setGroupTitle(group.option.value)
}, [group.option.value])
if (canEditBoardProperties) {
if (!readonly) {
drop(drag(headerRef))
}
@@ -97,7 +101,7 @@ export default function KanbanColumnHeader(props: Props): JSX.Element {
ref={headerRef}
style={{opacity: isDragging ? 0.5 : 1}}
className={className}
draggable={!props.readonly && canEditBoardProperties}
draggable={!readonly}
>
{!group.option.id &&
<Label
@@ -133,7 +137,7 @@ export default function KanbanColumnHeader(props: Props): JSX.Element {
onCancel={() => {
setGroupTitle(group.option.value)
}}
readonly={props.readonly || !canEditBoardProperties}
readonly={readonly}
spellCheck={true}
/>
</Label>}
@@ -145,7 +149,7 @@ export default function KanbanColumnHeader(props: Props): JSX.Element {
onMenuClose={props.onCalculationMenuClose}
onMenuOpen={props.onCalculationMenuOpen}
cardProperties={board.cardProperties}
readonly={props.readonly || !canEditBoardProperties}
readonly={readonly}
onChange={(data: {calculation: string, propertyId: string}) => {
if (data.calculation === calculationValue && data.propertyId === calculationProperty.id) {
return

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

@@ -983,11 +983,11 @@ exports[`src/components/shareBoard/shareBoard return shareBoard and click Regene
>
<a
class="shareUrl"
href="http://localhost:8065/team/team-id/shared/1/1?r=anotherToken"
href="http://localhost:8065/boards/public/team/team-id/shared/1/1?r=anotherToken"
rel="noreferrer"
target="_blank"
>
http://localhost:8065/team/team-id/shared/1/1?r=anotherToken
http://localhost:8065/boards/public/team/team-id/shared/1/1?r=anotherToken
</a>
<div
class="octo-tooltip tooltip-top"
@@ -3188,11 +3188,11 @@ exports[`src/components/shareBoard/shareBoard return shareBoard, and click switc
>
<a
class="shareUrl"
href="http://localhost:8065/team/team-id/shared/1/1?r=oneToken"
href="http://localhost:8065/boards/public/team/team-id/shared/1/1?r=oneToken"
rel="noreferrer"
target="_blank"
>
http://localhost:8065/team/team-id/shared/1/1?r=oneToken
http://localhost:8065/boards/public/team/team-id/shared/1/1?r=oneToken
</a>
<div
class="octo-tooltip tooltip-top"
@@ -3461,11 +3461,11 @@ exports[`src/components/shareBoard/shareBoard return shareBoardComponent and cli
>
<a
class="shareUrl"
href="http://localhost:8065/team/team-id/shared/1/1?r=aToken"
href="http://localhost:8065/boards/public/team/team-id/shared/1/1?r=aToken"
rel="noreferrer"
target="_blank"
>
http://localhost:8065/team/team-id/shared/1/1?r=aToken
http://localhost:8065/boards/public/team/team-id/shared/1/1?r=aToken
</a>
<div
class="octo-tooltip tooltip-top"

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

@@ -259,7 +259,7 @@ export default function ShareBoardDialog(props: Props): JSX.Element {
viewId: match.params.viewId,
teamId: match.params.teamId,
})
shareUrl.pathname = newPath
shareUrl.pathname = `/boards/public${newPath}`
const boardPath = generatePath('/team/:teamId/:boardId/:viewId', {
boardId: match.params.boardId,

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

@@ -21,10 +21,12 @@ jest.mock('react-router-dom', () => {
...originalModule,
useRouteMatch: jest.fn(() => {
return {
teamId: 'team1',
boardId: 'boardId1',
viewId: 'viewId1',
cardId: 'cardId1',
params: {
teamId: 'team1',
boardId: 'boardId1',
viewId: 'viewId1',
cardId: 'cardId1',
},
}
}),
}

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

@@ -3,7 +3,7 @@
import React, {useCallback} from 'react'
import {FormattedMessage} from 'react-intl'
import {generatePath, useRouteMatch, useHistory} from 'react-router-dom'
import {generatePath, useRouteMatch} from 'react-router-dom'
import Button from 'src/widgets/buttons/button'
import TelemetryClient, {TelemetryActions, TelemetryCategory} from 'src/telemetry/telemetryClient'
@@ -12,14 +12,17 @@ import './shareBoardLoginButton.scss'
const ShareBoardLoginButton = () => {
const match = useRouteMatch<{teamId: string, boardId: string, viewId?: string, cardId?: string}>()
const history = useHistory()
const redirectQueryParam = 'r=' + encodeURIComponent(generatePath('/:boardId?/:viewId?/:cardId?', match.params))
const loginPath = '/login?' + redirectQueryParam
// Mattermost login doesn't respect the redirect query parameter
// if the user is already logged in, so we send the user to the
// board and if they are not logged in, the webapp will take care
// of the redirection
const baseURL = window.location.href.split('/boards/public')[0]
const loginPath = `${baseURL}/${generatePath('/boards/team/:teamId/:boardId?/:viewId?/:cardId?', match.params)}`
const onLoginClick = useCallback(() => {
TelemetryClient.trackEvent(TelemetryCategory, TelemetryActions.ShareBoardLogin)
history.push(loginPath)
location.assign(loginPath)
}, [])
return (

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

@@ -52,19 +52,22 @@ const TeamPermissionsRow = (): JSX.Element => {
}
}
let currentRoleName = intl.formatMessage({id: 'BoardMember.schemeNone', defaultMessage: 'None'})
if (board.type === BoardTypeOpen && board.minimumRole === MemberRole.Admin) {
currentRoleName = intl.formatMessage({id: 'BoardMember.schemeAdmin', defaultMessage: 'Admin'})
} else if (board.type === BoardTypeOpen && board.minimumRole === MemberRole.Editor) {
if (board.isTemplate) {
let currentRoleName = intl.formatMessage({id: 'BoardMember.schemeAdmin', defaultMessage: 'Admin'})
if (board.type === BoardTypeOpen) {
currentRoleName = intl.formatMessage({id: 'BoardMember.schemeEditor', defaultMessage: 'Editor'})
if (board.minimumRole === MemberRole.Editor) {
if (board.isTemplate) {
currentRoleName = intl.formatMessage({id: 'BoardMember.schemeViewer', defaultMessage: 'Viewer'})
} else {
currentRoleName = intl.formatMessage({id: 'BoardMember.schemeEditor', defaultMessage: 'Editor'})
}
} else if (board.minimumRole === MemberRole.Commenter) {
currentRoleName = intl.formatMessage({id: 'BoardMember.schemeCommenter', defaultMessage: 'Commenter'})
} else if (board.minimumRole === MemberRole.Viewer) {
currentRoleName = intl.formatMessage({id: 'BoardMember.schemeViewer', defaultMessage: 'Viewer'})
} else {
currentRoleName = intl.formatMessage({id: 'BoardMember.schemeEditor', defaultMessage: 'Editor'})
}
} else if (board.type === BoardTypeOpen && board.minimumRole === MemberRole.Commenter) {
currentRoleName = intl.formatMessage({id: 'BoardMember.schemeCommenter', defaultMessage: 'Commenter'})
} else if (board.type === BoardTypeOpen && board.minimumRole === MemberRole.Viewer) {
currentRoleName = intl.formatMessage({id: 'BoardMember.schemeViewer', defaultMessage: 'Viewer'})
} else {
currentRoleName = intl.formatMessage({id: 'BoardMember.schemeNone', defaultMessage: 'None'})
}
const confirmationDialog = (

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

@@ -59,9 +59,12 @@ const ViewHeader = (props: Props) => {
const [showFilter, setShowFilter] = useState(false)
const [lockFilterOnClose, setLockFilterOnClose] = useState(false)
const intl = useIntl()
const canEditBoardProperties = useHasCurrentBoardPermissions([Permission.ManageBoardProperties])
const {board, activeView, views, groupByProperty, cards, dateDisplayProperty} = props
let readonly = props.readonly
if(!readonly){
readonly = !useHasCurrentBoardPermissions([Permission.ManageBoardProperties])
}
const withGroupBy = activeView.fields.viewType === 'board' || activeView.fields.viewType === 'table'
const withDisplayBy = activeView.fields.viewType === 'calendar'
@@ -137,7 +140,7 @@ const ViewHeader = (props: Props) => {
}}
onChange={setViewTitle}
saveOnEsc={true}
readonly={props.readonly || !canEditBoardProperties}
readonly={readonly}
spellCheck={true}
autoExpand={false}
/>
@@ -148,7 +151,7 @@ const ViewHeader = (props: Props) => {
board={board}
activeView={activeView}
views={views}
readonly={props.readonly || !canEditBoardProperties}
readonly={readonly}
allowCreateView={allowCreateView}
/>
</MenuWrapper>
@@ -159,7 +162,7 @@ const ViewHeader = (props: Props) => {
<div className='octo-spacer'/>
{!props.readonly && canEditBoardProperties &&
{!readonly &&
<>
{/* Card properties */}

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

@@ -34,9 +34,11 @@ const ViewTitle = (props: Props) => {
}, [board.id, board.icon])
const onShowDescription = useCallback(() => mutator.showBoardDescription(board.id, Boolean(board.showDescription), true), [board.id, board.showDescription])
const onHideDescription = useCallback(() => mutator.showBoardDescription(board.id, Boolean(board.showDescription), false), [board.id, board.showDescription])
const canEditBoardProperties = useHasCurrentBoardPermissions([Permission.ManageBoardProperties])
const readonly = props.readonly || !canEditBoardProperties
let readonly = props.readonly
if(!readonly){
readonly = !useHasCurrentBoardPermissions([Permission.ManageBoardProperties])
}
const intl = useIntl()

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

@@ -114,6 +114,7 @@ jest.mock('react-router-dom', () => {
useRouteMatch: jest.fn(() => {
return {
params: {
teamId: board.teamId,
boardId: board.id,
viewId: activeView.id,
},

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

@@ -12,13 +12,12 @@ export const useHasPermissions = (teamId: string, boardId: string, permissions:
return false
}
const member = useAppSelector(getMyBoardMembership(boardId))
const board = useAppSelector(getBoard(boardId))
if (!board) {
return false
}
const member = useAppSelector(getMyBoardMembership(boardId))
if (!member) {
return false
}

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

@@ -28,6 +28,7 @@ windowAny.baseURL = '/plugins/boards'
windowAny.frontendBaseURL = '/boards'
import App from 'src/app'
import PublicApp, {publicBaseURL} from 'src/public/app'
import store from 'src/store'
import WithWebSockets from 'src/components/withWebSockets'
@@ -175,10 +176,44 @@ const MainApp = (props: Props) => {
)
}
const PublicMainApp = () => {
useEffect(() => {
document.body.classList.add('focalboard-body')
const root = document.getElementById('root')
if (root) {
while (root.firstElementChild) {
if( root.firstElementChild.id === 'focalboard-app'){
break
}
root.removeChild(root.firstElementChild)
}
root.classList.add('focalboard-plugin-root')
}
return () => {
document.body.classList.remove('focalboard-body')
if (root) {
root.classList.remove('focalboard-plugin-root')
}
}
}, [])
return (
<ErrorBoundary>
<ReduxProvider store={store}>
<div id='focalboard-app'>
<PublicApp />
</div>
<div id='focalboard-root-portal' />
</ReduxProvider>
</ErrorBoundary>
)
}
const HeaderComponent = () => {
return (
<ErrorBoundary>
<GlobalHeader history={browserHistory}/>
<GlobalHeader history={browserHistory} />
</ErrorBoundary>
)
}
@@ -243,8 +278,6 @@ export default class Plugin {
}
})
const initCurrentChannelId = mmStore.getState().entities.channels.currentChannelId
const initCurrentChannel = mmStore.getState().entities.channels.channels[initCurrentChannelId]
let lastViewedChannelId = initCurrentChannelId
@@ -274,7 +307,9 @@ export default class Plugin {
prevTeamId = currentTeamId
store.dispatch(setTeam(currentTeamId))
octoClient.teamId = currentTeamId
store.dispatch(initialLoad())
if(!window.location.pathname.includes(publicBaseURL())){
store.dispatch(initialLoad())
}
}
if (currentTeamId && currentTeamId !== prevTeamId) {
@@ -336,6 +371,9 @@ export default class Plugin {
HeaderComponent,
() => null,
true,
true,
true,
PublicMainApp,
)
const goToFocalboardTemplate = () => {

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

@@ -0,0 +1,13 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`properties/number should match snapshot for number with empty value 1`] = `
<div>
<input
class="Editable octo-propertyvalue"
placeholder=""
style="width: 100%;"
title=""
value=""
/>
</div>
`;

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

@@ -0,0 +1,70 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import React, {ComponentProps} from 'react'
import {screen} from '@testing-library/react'
import {mocked} from 'jest-mock'
import {setup, wrapIntl} from 'src/testUtils'
import {TestBlockFactory} from 'src/test/testBlockFactory'
import mutator from 'src/mutator'
import {Board, IPropertyTemplate} from 'src/blocks/board'
import {Card} from 'src/blocks/card'
import NumberProperty from './property'
import NumberEditor from './number'
jest.mock('src/components/flashMessages')
jest.mock('src/mutator')
const mockedMutator = mocked(mutator)
describe('properties/number', () => {
let board: Board
let card: Card
let propertyTemplate: IPropertyTemplate
let baseProps: ComponentProps<typeof NumberEditor>
beforeEach(() => {
board = TestBlockFactory.createBoard()
card = TestBlockFactory.createCard()
propertyTemplate = board.cardProperties[0]
baseProps = {
property: new NumberProperty(),
card,
board,
propertyTemplate,
propertyValue: '',
readOnly: false,
showEmptyPlaceholder: false,
}
})
it('should match snapshot for number with empty value', () => {
const {container} = setup(
wrapIntl((
<NumberEditor
{...baseProps}
/>
))
)
expect(container).toMatchSnapshot()
})
it('should fire change event when valid number value is entered', async () => {
const {user} = setup(
wrapIntl(
<NumberEditor
{...baseProps}
/>
)
)
const value = '42'
const input = screen.getByRole('textbox')
await user.type(input, `${value}{Enter}`)
expect(mockedMutator.changePropertyValue).toHaveBeenCalledWith(board.id, card, propertyTemplate.id, `${value}`)
})
})

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

@@ -10,7 +10,7 @@ const Number = (props: PropertyProps): JSX.Element => {
return (
<BaseTextEditor
{...props}
validator={() => !isNaN(parseInt(props.propertyValue as string, 10))}
validator={() => props.propertyValue === '' || !isNaN(parseInt(props.propertyValue as string, 10))}
/>
)
}

61
webapp/boards/src/public/app.tsx Обычный файл
Просмотреть файл

@@ -0,0 +1,61 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import React from 'react'
import {Router, Switch} from 'react-router-dom'
import {IntlProvider} from 'react-intl'
import {DndProvider} from 'react-dnd'
import {HTML5Backend} from 'react-dnd-html5-backend'
import {TouchBackend} from 'react-dnd-touch-backend'
import {createBrowserHistory} from 'history'
import BoardPage from 'src/pages/boardPage/boardPage'
import FBRoute from 'src/route'
import {getMessages} from 'src/i18n'
import FlashMessages from 'src/components/flashMessages'
import NewVersionBanner from 'src/components/newVersionBanner'
import {Utils} from 'src/utils'
import {getLanguage} from 'src/store/language'
import {useAppSelector} from 'src/store/hooks'
export const publicBaseURL = () => {
return Utils.getFrontendBaseURL() + '/public'
}
const PublicRouter = () => {
const history = createBrowserHistory({basename: publicBaseURL()})
return (
<Router history={history}>
<Switch>
<FBRoute path={['/team/:teamId/shared/:boardId?/:viewId?/:cardId?', '/shared/:boardId?/:viewId?/:cardId?']}>
<BoardPage readonly={true}/>
</FBRoute>
</Switch>
</Router>
)
}
const PublicApp = (): JSX.Element => {
const language = useAppSelector<string>(getLanguage)
return (
<IntlProvider
locale={language.split(/[_]/)[0]}
messages={getMessages(language)}
>
<DndProvider backend={Utils.isMobile() ? TouchBackend : HTML5Backend}>
<FlashMessages milliseconds={2000}/>
<div id='frame'>
<div id='main'>
<NewVersionBanner/>
<PublicRouter/>
</div>
</div>
</DndProvider>
</IntlProvider>
)
}
export default React.memo(PublicApp)

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

@@ -14,7 +14,9 @@ export interface PluginRegistry {
registerCustomRoute(route: string, component: ReactResolvable): any
registerProductRoute(route: string, component: ReactResolvable): any
unregisterComponent(componentId: string): any
registerProduct(baseURL: string, switcherIcon: string, switcherText: string, switcherLinkURL: string, mainComponent: ReactResolvable, headerCentreComponent: ReactResolvable, headerRightComponent: ReactResolvable, showTeamSidebar: boolean): any
registerProduct(baseURL: string, switcherIcon: string, switcherText: string, switcherLinkURL: string,
mainComponent: ReactResolvable, headerCentreComponent: ReactResolvable, headerRightComponent: ReactResolvable,
showTeamSidebar: boolean, showAppBar: boolean, wrapped: boolean, publicComponent: ReactResolvable | null): any
registerPostWillRenderEmbedComponent(match: (embed: {type: string, data: any}) => void, component: any, toggleable: boolean): any
registerWebSocketEventHandler(event: string, handler: (e: any) => void): any
unregisterWebSocketEventHandler(event: string): any

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

@@ -5,7 +5,7 @@
"plugin:react-hooks/recommended"
],
"plugins": [
"@babel/eslint-plugin",
"@babel",
"mattermost",
"import",
"no-only-tests",

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

@@ -7,7 +7,7 @@
"private": true,
"engines": {
"npm": ">=7.0.0",
"node": ">=16.4.0"
"node": ">=16.10.0"
},
"dependencies": {
"@floating-ui/react-dom": "1.0.0",
@@ -153,8 +153,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 +167,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",

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

@@ -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 (

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

@@ -92,7 +92,7 @@ export class ActionMenuClass extends React.PureComponent<Props, State> {
appBindings: [],
location: Locations.CENTER,
pluginMenuItems: [],
}
};
private buttonRef: React.RefObject<HTMLButtonElement>;
constructor(props: Props) {
@@ -115,7 +115,7 @@ export class ActionMenuClass extends React.PureComponent<Props, State> {
defaultMessage='Message actions'
/>
</Tooltip>
)
);
componentDidUpdate(prevProps: Props) {
if (this.props.isMenuOpen && !prevProps.isMenuOpen) {
@@ -137,7 +137,7 @@ export class ActionMenuClass extends React.PureComponent<Props, State> {
this.setState({appBindings: data});
});
}
}
};
handleOpenMarketplace = (): void => {
const openedFrom: OpenedFromType = 'actions_menu';
@@ -197,7 +197,7 @@ export class ActionMenuClass extends React.PureComponent<Props, State> {
this.props.actions.postEphemeralCallResponseForPost(callResp, errorMessage, post);
}
}
}
};
visitMarketplaceTip(): React.ReactElement {
return (
@@ -263,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);

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

@@ -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;

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

@@ -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);

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

@@ -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;
}
};
}

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

@@ -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;

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