diff --git a/scm-ui/ui-components/src/repos/DiffFile.tsx b/scm-ui/ui-components/src/repos/DiffFile.tsx index b4ec64a8e8..71bfa4957b 100644 --- a/scm-ui/ui-components/src/repos/DiffFile.tsx +++ b/scm-ui/ui-components/src/repos/DiffFile.tsx @@ -33,7 +33,7 @@ import Icon from "../Icon"; import { Change, ChangeEvent, DiffObjectProps, File, Hunk as HunkType } from "./DiffTypes"; import TokenizedDiffView from "./TokenizedDiffView"; import DiffButton from "./DiffButton"; -import { MenuContext } from "@scm-manager/ui-components"; +import { MenuContext, OpenInFullscreenButton, FullscreenModal } from "@scm-manager/ui-components"; import DiffExpander, { ExpandableHunk } from "./DiffExpander"; import HunkExpandLink from "./HunkExpandLink"; import { Modal } from "../modals"; @@ -57,6 +57,7 @@ type State = Collapsible & { sideBySide?: boolean; diffExpander: DiffExpander; expansionError?: any; + showFullscreenModal: boolean; }; const DiffFilePanel = styled.div` @@ -91,6 +92,10 @@ const ChangeTypeTag = styled(Tag)` margin-left: 0.75rem; `; +const MarginlessModalContent = styled.div` + margin: -1.25rem; +`; + class DiffFile extends React.Component { static defaultProps: Partial = { defaultCollapse: false, @@ -103,7 +108,8 @@ class DiffFile extends React.Component { collapsed: this.defaultCollapse(), sideBySide: props.sideBySide, diffExpander: new DiffExpander(props.file), - file: props.file + file: props.file, + showFullscreenModal: false }; } @@ -144,6 +150,18 @@ class DiffFile extends React.Component { ); }; + openModal = () => { + this.setState({ + showFullscreenModal: true + }); + }; + + closeModal = () => { + this.setState({ + showFullscreenModal: false + }); + }; + setCollapse = (collapsed: boolean) => { this.setState({ collapsed @@ -403,7 +421,7 @@ class DiffFile extends React.Component { render() { const { fileControlFactory, fileAnnotationFactory, t } = this.props; - const { file, collapsed, sideBySide, diffExpander, expansionError } = this.state; + const { file, collapsed, sideBySide, diffExpander, expansionError, showFullscreenModal } = this.state; const viewType = sideBySide ? "split" : "unified"; let body = null; @@ -426,7 +444,8 @@ class DiffFile extends React.Component { } const collapseIcon = this.hasContent(file) ? : null; const fileControls = fileControlFactory ? fileControlFactory(file, this.setCollapse) : null; - const sideBySideToggle = file.hunks && file.hunks.length && ( + const openInFullscreen = file?.hunks?.length ? : null; + const sideBySideToggle = file?.hunks?.length && ( {({ setCollapsed }) => ( { {sideBySideToggle} + {openInFullscreen} {fileControls} @@ -464,8 +484,24 @@ class DiffFile extends React.Component { ); } + let modalContent; + if (file?.hunks?.length) { + modalContent = ( + this.closeModal()} + body={{body}} + active={showFullscreenModal} + /> + ); + } + return ( - + {errorModal}
@@ -484,6 +520,7 @@ class DiffFile extends React.Component {
{body} + {modalContent}
); }