diff --git a/src/elements/content-preview/preview-header/FileInfo.js b/src/elements/content-preview/preview-header/FileInfo.js.flow similarity index 100% rename from src/elements/content-preview/preview-header/FileInfo.js rename to src/elements/content-preview/preview-header/FileInfo.js.flow diff --git a/src/elements/content-preview/preview-header/FileInfo.tsx b/src/elements/content-preview/preview-header/FileInfo.tsx new file mode 100644 index 0000000000..f3ef43864b --- /dev/null +++ b/src/elements/content-preview/preview-header/FileInfo.tsx @@ -0,0 +1,27 @@ +import React from 'react'; +import FileIcon from '../../../icons/file-icon/FileIcon'; +import type { BoxItem, BoxItemVersion } from '../../../common/types/core'; +import './FileInfo.scss'; + +export interface FileInfoProps { + file?: BoxItem; + version?: BoxItemVersion; +} + +const FileInfo = ({ file, version }: FileInfoProps) => { + // Opt to show version over the file object since it is more specific + const displayItem = version || file; + + return ( +
+ {displayItem && ( + <> + + {displayItem.name} + + )} +
+ ); +}; + +export default FileInfo; diff --git a/src/elements/content-preview/preview-header/PreviewHeader.js b/src/elements/content-preview/preview-header/PreviewHeader.js.flow similarity index 100% rename from src/elements/content-preview/preview-header/PreviewHeader.js rename to src/elements/content-preview/preview-header/PreviewHeader.js.flow diff --git a/src/elements/content-preview/preview-header/PreviewHeader.tsx b/src/elements/content-preview/preview-header/PreviewHeader.tsx new file mode 100644 index 0000000000..9ef8b47dfb --- /dev/null +++ b/src/elements/content-preview/preview-header/PreviewHeader.tsx @@ -0,0 +1,174 @@ +import * as React from 'react'; +import { useIntl } from 'react-intl'; +import classNames from 'classnames'; +import getProp from 'lodash/get'; + +import AsyncLoad from '../../common/async-load'; +import FileInfo from './FileInfo'; +import IconClose from '../../../icons/general/IconClose'; +import IconDownload from '../../../icons/general/IconDownloadSolid'; +import IconDrawAnnotationMode from '../../../icons/annotations/IconDrawAnnotation'; +import IconPointAnnotation from '../../../icons/annotations/IconPointAnnotation'; +import IconPrint from '../../../icons/general/IconPrint'; +import Logo from '../../common/header/Logo'; +import PlainButton from '../../../components/plain-button/PlainButton'; +import { ButtonType } from '../../../components/button'; +import { bdlGray50 } from '../../../styles/variables'; + +import messages from '../../common/messages'; + +import type { BoxItem, BoxItemVersion, Token } from '../../../common/types/core'; +import type { ContentAnswersProps } from '../../common/content-answers/ContentAnswers'; +import type { ContentOpenWithProps } from '../../content-open-with/ContentOpenWith'; + +import './PreviewHeader.scss'; + +export interface PreviewHeaderProps { + canAnnotate: boolean; + canDownload: boolean; + canPrint?: boolean; + contentAnswersProps?: Partial; + contentOpenWithProps?: Partial; + file?: BoxItem; + logoUrl?: string; + onClose?: React.MouseEventHandler; + onDownload: React.MouseEventHandler; + onPrint: React.MouseEventHandler; + selectedVersion?: BoxItemVersion; + token: Token; +} + +const LoadableContentAnswers = AsyncLoad({ + // @ts-ignore Dynamic import for lazy loading + loader: () => import(/* webpackMode: "lazy", webpackChunkName: "content-answers" */ '../../common/content-answers'), +}) as React.ComponentType; +const LoadableContentOpenWith = AsyncLoad({ + // @ts-ignore Dynamic import for lazy loading + loader: () => import(/* webpackMode: "lazy", webpackChunkName: "content-open-with" */ '../../content-open-with'), +}) as React.ComponentType; + +const PreviewHeader = ({ + canAnnotate, + canDownload, + canPrint, + contentAnswersProps = {} as Partial, + contentOpenWithProps = {} as Partial, + file, + logoUrl, + onClose, + onDownload, + onPrint, + selectedVersion, + token, +}: PreviewHeaderProps) => { + const { formatMessage } = useIntl(); + + const fileId = file && file.id; + const shouldRenderAnswers = fileId && contentAnswersProps.show; + const shouldRenderOpenWith = fileId && contentOpenWithProps.show; + const currentVersionId = getProp(file, 'file_version.id'); + const selectedVersionId = getProp(selectedVersion, 'id', currentVersionId); + const isPreviewingCurrentVersion = currentVersionId === selectedVersionId; + + // When previewing an older version the close button returns the user to the current version + const closeMsg = isPreviewingCurrentVersion ? formatMessage(messages.close) : formatMessage(messages.back); + const printMsg = formatMessage(messages.print); + const downloadMsg = formatMessage(messages.download); + const drawMsg = formatMessage(messages.drawAnnotation); + const pointMsg = formatMessage(messages.pointAnnotation); + + return ( +
+ {/* + bp-header and bp-base-header are used by box-annotations, + and must be put one level under bcpr-PreviewHeader + */} +
+ {logoUrl ? : } +
+ {isPreviewingCurrentVersion && ( + <> + {shouldRenderOpenWith && ( + + )} + {shouldRenderAnswers && ( + + )} + {canAnnotate && ( + <> + + + + + + + + )} + {canPrint && ( + + + + )} + {canDownload && ( + + + + )} + + )} + {onClose && ( + + {isPreviewingCurrentVersion ? ( + + ) : ( + closeMsg + )} + + )} +
+
+
+ ); +}; + +export default PreviewHeader; diff --git a/src/elements/content-preview/preview-header/__tests__/PreviewHeader.test.js b/src/elements/content-preview/preview-header/__tests__/PreviewHeader.test.js index ae54178e81..6a8a44db0f 100644 --- a/src/elements/content-preview/preview-header/__tests__/PreviewHeader.test.js +++ b/src/elements/content-preview/preview-header/__tests__/PreviewHeader.test.js @@ -3,7 +3,7 @@ import { shallow } from 'enzyme'; import PreviewHeader from '..'; describe('elements/content-preview/preview-header/PreviewHeader', () => { - const getWrapper = (props = {}) => shallow().dive(); + const getWrapper = (props = {}) => shallow(); it('should render only a logo if logoUrl is provided', () => { const wrapper = getWrapper({ logoUrl: 'box' }); diff --git a/src/elements/content-preview/preview-header/index.js b/src/elements/content-preview/preview-header/index.js.flow similarity index 100% rename from src/elements/content-preview/preview-header/index.js rename to src/elements/content-preview/preview-header/index.js.flow diff --git a/src/elements/content-preview/preview-header/index.ts b/src/elements/content-preview/preview-header/index.ts new file mode 100644 index 0000000000..f6cff1f3c8 --- /dev/null +++ b/src/elements/content-preview/preview-header/index.ts @@ -0,0 +1 @@ +export { default } from './PreviewHeader';