aboutsummaryrefslogtreecommitdiff
path: root/src/views/nodes/ImageBox.tsx
diff options
context:
space:
mode:
authorTyler Schicke <tyler_schicke@brown.edu>2019-02-01 15:33:21 -0500
committerTyler Schicke <tyler_schicke@brown.edu>2019-02-01 15:33:21 -0500
commitdd427c8d72a5189c0b91132863a6e9c5a62eadfe (patch)
treed3dd624c5f3948b24861c19a5939a2b2f3b9a295 /src/views/nodes/ImageBox.tsx
parentc5e60251835ef9fa60054e422f51d5f92c8494bb (diff)
parent156245bbca2082a8b8cf426a381ed25d1be57bcb (diff)
Merge branch 'master' of github-tsch-brown:browngraphicslab/Dash-Web
Diffstat (limited to 'src/views/nodes/ImageBox.tsx')
-rw-r--r--src/views/nodes/ImageBox.tsx91
1 files changed, 91 insertions, 0 deletions
diff --git a/src/views/nodes/ImageBox.tsx b/src/views/nodes/ImageBox.tsx
new file mode 100644
index 000000000..7577627e8
--- /dev/null
+++ b/src/views/nodes/ImageBox.tsx
@@ -0,0 +1,91 @@
+
+import Lightbox from 'react-image-lightbox';
+import 'react-image-lightbox/style.css'; // This only needs to be imported once in your app
+import { SelectionManager } from "../../util/SelectionManager";
+import { DocumentFieldViewProps } from "./DocumentView";
+import "./ImageBox.scss";
+import React = require("react")
+import { ImageField } from '../../fields/ImageField';
+import { NumberField } from '../../fields/NumberField';
+
+interface ImageBoxState {
+ photoIndex: number,
+ isOpen: boolean,
+};
+
+export class ImageBox extends React.Component<DocumentFieldViewProps, ImageBoxState> {
+
+ public static LayoutString() { return "<ImageBox doc={Document} containingDocumentView={ContainingDocumentView} fieldKey={DataKey} />"; }
+ private _ref: React.RefObject<HTMLDivElement>;
+ private _downX: number = 0;
+ private _downY: number = 0;
+ private _lastTap: number = 0;
+
+ constructor(props: DocumentFieldViewProps) {
+ super(props);
+
+ this._ref = React.createRef();
+ this.state = {
+ photoIndex: 0,
+ isOpen: false,
+ };
+ }
+
+ componentDidMount() {
+ }
+
+ componentWillUnmount() {
+ }
+
+ onPointerDown = (e: React.PointerEvent): void => {
+ if (Date.now() - this._lastTap < 300) {
+ if (e.buttons === 1 && SelectionManager.IsSelected(this.props.containingDocumentView)) {
+ e.stopPropagation();
+ this._downX = e.clientX;
+ this._downY = e.clientY;
+ document.removeEventListener("pointerup", this.onPointerUp);
+ document.addEventListener("pointerup", this.onPointerUp);
+ }
+ } else {
+ this._lastTap = Date.now();
+ }
+ }
+ onPointerUp = (e: PointerEvent): void => {
+ document.removeEventListener("pointerup", this.onPointerUp);
+ if (Math.abs(e.clientX - this._downX) < 2 && Math.abs(e.clientY - this._downY) < 2) {
+ this.setState({ isOpen: true })
+ }
+ e.stopPropagation();
+ }
+
+ render() {
+ let field = this.props.doc.GetFieldT(this.props.fieldKey, ImageField);
+ let path = "";
+ if (field) {
+ path = field.Data.href;
+ }
+ const images = [path,];
+ var lightbox = () => {
+ const { photoIndex } = this.state;
+ if (this.state.isOpen && SelectionManager.IsSelected(this.props.containingDocumentView)) {
+ return (<Lightbox
+ mainSrc={images[photoIndex]}
+ nextSrc={photoIndex + 1 < images.length ? images[(photoIndex + 1) % images.length] : undefined}
+ prevSrc={photoIndex - 1 > 0 ? images[(photoIndex + images.length - 1) % images.length] : undefined}
+ onCloseRequest={() => this.setState({ isOpen: false })}
+ onMovePrevRequest={() =>
+ this.setState({ photoIndex: (photoIndex + images.length - 1) % images.length, })
+ }
+ onMoveNextRequest={() =>
+ this.setState({ photoIndex: (photoIndex + 1) % images.length, })
+ }
+ />)
+ }
+ }
+ return (
+ <div className="imageBox-cont" onPointerDown={this.onPointerDown} ref={this._ref} >
+ <img src={images[0]} width="100%" alt="Image not found" />
+ {lightbox()}
+ </div>)
+ }
+} \ No newline at end of file