diff options
Diffstat (limited to 'server/sonar-web/src/main/js/components/workspace/WorkspaceHeader.tsx')
-rw-r--r-- | server/sonar-web/src/main/js/components/workspace/WorkspaceHeader.tsx | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/server/sonar-web/src/main/js/components/workspace/WorkspaceHeader.tsx b/server/sonar-web/src/main/js/components/workspace/WorkspaceHeader.tsx new file mode 100644 index 00000000000..011991dd54d --- /dev/null +++ b/server/sonar-web/src/main/js/components/workspace/WorkspaceHeader.tsx @@ -0,0 +1,102 @@ +/* + * SonarQube + * Copyright (C) 2009-2018 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +import * as React from 'react'; +import { DraggableCore, DraggableData } from 'react-draggable'; +import { translate } from '../../helpers/l10n'; +import { ButtonIcon } from '../ui/buttons'; +import ClearIcon from '../icons-components/ClearIcon'; +import CollapseIcon from '../icons-components/CollapseIcon'; +import ExpandIcon from '../icons-components/ExpandIcon'; +import MinimizeIcon from '../icons-components/MinimizeIcon'; +import { IconProps } from '../icons-components/types'; + +export interface Props { + children: React.ReactNode; + maximized?: boolean; + onClose: () => void; + onCollapse: () => void; + onMaximize: () => void; + onMinimize: () => void; + onResize: (deltaY: number) => void; +} + +export default class WorkspaceHeader extends React.PureComponent<Props> { + handleDrag = (_event: MouseEvent, data: DraggableData) => { + this.props.onResize(data.deltaY); + }; + + render() { + return ( + <header className="workspace-viewer-header"> + <h6 className="workspace-viewer-name">{this.props.children}</h6> + + <DraggableCore offsetParent={document.body} onDrag={this.handleDrag}> + <div className="workspace-viewer-resize js-resize" /> + </DraggableCore> + + <div className="workspace-viewer-actions"> + <WorkspaceHeaderButton + icon={MinimizeIcon} + onClick={this.props.onCollapse} + tooltip="workspace.minimize" + /> + + {this.props.maximized ? ( + <WorkspaceHeaderButton + icon={CollapseIcon} + onClick={this.props.onMinimize} + tooltip="workspace.normal_size" + /> + ) : ( + <WorkspaceHeaderButton + icon={ExpandIcon} + onClick={this.props.onMaximize} + tooltip="workspace.full_window" + /> + )} + + <WorkspaceHeaderButton + icon={ClearIcon} + onClick={this.props.onClose} + tooltip="workspace.close" + /> + </div> + </header> + ); + } +} + +interface WorkspaceHeaderButtonProps { + icon: React.SFC<IconProps>; + onClick: () => void; + tooltip: string; +} + +function WorkspaceHeaderButton({ icon: Icon, onClick, tooltip }: WorkspaceHeaderButtonProps) { + return ( + <ButtonIcon + className="workspace-header-icon" + color="#fff" + onClick={onClick} + tooltip={translate(tooltip)}> + <Icon fill={undefined} /> + </ButtonIcon> + ); +} |