mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-07 14:05:44 +01:00
Add viewer for pdf files (#1843)
Adds an viewer for pdf files to the source code browser.
This commit is contained in:
2
gradle/changelog/pdfviewer.yaml
Normal file
2
gradle/changelog/pdfviewer.yaml
Normal file
@@ -0,0 +1,2 @@
|
||||
- type: added
|
||||
description: Viewer for pdf files ([#1843](https://github.com/scm-manager/scm-manager/pull/1843))
|
||||
34
scm-ui/ui-components/src/PdfViewer.stories.tsx
Normal file
34
scm-ui/ui-components/src/PdfViewer.stories.tsx
Normal file
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020-present Cloudogu GmbH and Contributors
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
import React from "react";
|
||||
import PdfViewer from "./PdfViewer";
|
||||
// @ts-ignore no need to declare module for a single import
|
||||
import pdf from "./__resources__/doc.pdf";
|
||||
import { storiesOf } from "@storybook/react";
|
||||
|
||||
storiesOf("PdfViewer", module)
|
||||
.add("Simple", () => <PdfViewer src={pdf} />)
|
||||
.add("Error", () => <PdfViewer src="/does/not/exists" />)
|
||||
.add("Error with download URL", () => <PdfViewer src="/does/not/exists" download={pdf} />);
|
||||
60
scm-ui/ui-components/src/PdfViewer.tsx
Normal file
60
scm-ui/ui-components/src/PdfViewer.tsx
Normal file
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020-present Cloudogu GmbH and Contributors
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
import React, { FC } from "react";
|
||||
import { File, Link } from "@scm-manager/ui-types";
|
||||
import { Notification } from "@scm-manager/ui-components";
|
||||
import { Trans, useTranslation } from "react-i18next";
|
||||
|
||||
type Props = {
|
||||
src: string | File;
|
||||
download?: string | File;
|
||||
height?: string;
|
||||
};
|
||||
|
||||
const createHref = (src: string | File): string => {
|
||||
if (typeof src === "string") {
|
||||
return src;
|
||||
}
|
||||
return (src._links.self as Link).href;
|
||||
};
|
||||
|
||||
const PdfViewer: FC<Props> = ({ src, download, height = "50rem" }) => {
|
||||
const [t] = useTranslation("commons");
|
||||
const href = createHref(src);
|
||||
const downloadHref = download ? createHref(download) : href;
|
||||
return (
|
||||
<div style={{ height }}>
|
||||
<object height="100%" width="100%" type="application/pdf" data={href + "#toolbar=0&navpanes=0&scrollbar=0"}>
|
||||
<Notification type="warning">
|
||||
<Trans t={t} i18nKey="pdfViewer.error">
|
||||
Failed to display the document. Please download it from <a href={downloadHref}>here</a>.
|
||||
</Trans>
|
||||
</Notification>
|
||||
</object>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default PdfViewer;
|
||||
BIN
scm-ui/ui-components/src/__resources__/doc.pdf
Normal file
BIN
scm-ui/ui-components/src/__resources__/doc.pdf
Normal file
Binary file not shown.
@@ -71,6 +71,7 @@ export { default as UserAutocomplete } from "./UserAutocomplete";
|
||||
export { default as BranchSelector } from "./BranchSelector";
|
||||
export { default as Breadcrumb } from "./Breadcrumb";
|
||||
export { default as MarkdownView } from "./markdown/MarkdownView";
|
||||
export { default as PdfViewer } from "./PdfViewer";
|
||||
export { default as SyntaxHighlighter } from "./SyntaxHighlighter";
|
||||
export { default as ErrorBoundary } from "./ErrorBoundary";
|
||||
export { default as OverviewPageActions } from "./OverviewPageActions";
|
||||
|
||||
@@ -215,5 +215,8 @@
|
||||
"copyTimestampTooltip": "Zeitstempel in Zwischenablage kopieren"
|
||||
}
|
||||
}
|
||||
},
|
||||
"pdfViewer": {
|
||||
"error": "Das Dokument konnte nicht angezeigt werden. Es kann <1>hier</1> heruntergeladen werden."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -216,5 +216,8 @@
|
||||
"copyTimestampTooltip": "Copy Timestamp to Clipboard"
|
||||
}
|
||||
}
|
||||
},
|
||||
"pdfViewer": {
|
||||
"error": "Failed to display the document. Please download it from <1>here</1>."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@ import ImageViewer from "../components/content/ImageViewer";
|
||||
import DownloadViewer from "../components/content/DownloadViewer";
|
||||
import { ExtensionPoint } from "@scm-manager/ui-extensions";
|
||||
import { File, Link, Repository } from "@scm-manager/ui-types";
|
||||
import { ErrorNotification, Loading } from "@scm-manager/ui-components";
|
||||
import { ErrorNotification, Loading, PdfViewer } from "@scm-manager/ui-components";
|
||||
import SwitchableMarkdownViewer from "../components/content/SwitchableMarkdownViewer";
|
||||
import styled from "styled-components";
|
||||
import { useContentType } from "@scm-manager/ui-api";
|
||||
@@ -69,6 +69,8 @@ const SourcesView: FC<Props> = ({ file, repository, revision }) => {
|
||||
sources = <SourcecodeViewer file={file} language={language} />;
|
||||
} else if (contentType.startsWith("text/")) {
|
||||
sources = <SourcecodeViewer file={file} language="none" />;
|
||||
} else if (contentType.startsWith("application/pdf")) {
|
||||
sources = <PdfViewer src={file} />;
|
||||
} else {
|
||||
sources = (
|
||||
<ExtensionPoint
|
||||
|
||||
Reference in New Issue
Block a user