diff options
| author | andrewdkim <adkim414@gmail.com> | 2019-08-06 12:30:09 -0400 | 
|---|---|---|
| committer | andrewdkim <adkim414@gmail.com> | 2019-08-06 12:30:09 -0400 | 
| commit | b6990a61befdea70abd99f125a2488ce5a6f04a6 (patch) | |
| tree | 833c13a0ddabb325cc2e39dbb199f111cced22d2 /src/client/views/collections/CollectionStackingViewFieldColumn.tsx | |
| parent | 2c86a6958186c020ce7fbe99555f07ffe9f9f821 (diff) | |
| parent | 298d1c9b29d6ce2171fd9ac8274b64583b73f6f5 (diff) | |
merge from master
Diffstat (limited to 'src/client/views/collections/CollectionStackingViewFieldColumn.tsx')
| -rw-r--r-- | src/client/views/collections/CollectionStackingViewFieldColumn.tsx | 122 | 
1 files changed, 95 insertions, 27 deletions
| diff --git a/src/client/views/collections/CollectionStackingViewFieldColumn.tsx b/src/client/views/collections/CollectionStackingViewFieldColumn.tsx index 387e189e7..df03da376 100644 --- a/src/client/views/collections/CollectionStackingViewFieldColumn.tsx +++ b/src/client/views/collections/CollectionStackingViewFieldColumn.tsx @@ -14,11 +14,17 @@ import { DocumentManager } from "../../util/DocumentManager";  import { SelectionManager } from "../../util/SelectionManager";  import "./CollectionStackingView.scss";  import { Docs } from "../../documents/Documents"; -import { SchemaHeaderField } from "../../../new_fields/SchemaHeaderField"; +import { SchemaHeaderField, PastelSchemaPalette } from "../../../new_fields/SchemaHeaderField";  import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";  import { ScriptField } from "../../../new_fields/ScriptField";  import { CompileScript } from "../../util/Scripting";  import { RichTextField } from "../../../new_fields/RichTextField"; +import { Transform } from "../../util/Transform"; +import { Flyout, anchorPoints } from "../DocumentDecorations"; +import { library } from '@fortawesome/fontawesome-svg-core'; +import { faPalette } from '@fortawesome/free-solid-svg-icons'; + +library.add(faPalette);  interface CSVFieldColumnProps { @@ -30,17 +36,21 @@ interface CSVFieldColumnProps {      parent: CollectionStackingView;      type: "string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function" | undefined;      createDropTarget: (ele: HTMLDivElement) => void; +    screenToLocalTransform: () => Transform;  }  @observer  export class CollectionStackingViewFieldColumn extends React.Component<CSVFieldColumnProps> { -    @observable private _background = "white"; +    @observable private _background = "inherit";      private _dropRef: HTMLDivElement | null = null;      private dropDisposer?: DragManager.DragDropDisposer;      private _headerRef: React.RefObject<HTMLDivElement> = React.createRef(); +    private _startDragPosition: { x: number, y: number } = { x: 0, y: 0 }; +    private _sensitivity: number = 16;      @observable _heading = this.props.headingObject ? this.props.headingObject.heading : this.props.heading; +    @observable _color = this.props.headingObject ? this.props.headingObject.color : "#f1efeb";      createColumnDropRef = (ele: HTMLDivElement | null) => {          this._dropRef = ele; @@ -111,7 +121,7 @@ export class CollectionStackingViewFieldColumn extends React.Component<CSVFieldC          let outerXf = Utils.GetScreenTransform(this.props.parent._masonryGridRef!);          let offset = this.props.parent.props.ScreenToLocalTransform().transformDirection(outerXf.translateX - translateX, outerXf.translateY - translateY);          return this.props.parent.props.ScreenToLocalTransform(). -            translate(offset[0], offset[1] - (this.props.parent.chromeCollapsed ? 0 : 100)). +            translate(offset[0], offset[1]).              scale(NumCast(doc.width, 1) / this.props.parent.columnWidth);      } @@ -150,6 +160,14 @@ export class CollectionStackingViewFieldColumn extends React.Component<CSVFieldC      }      @action +    changeColumnColor = (color: string) => { +        if (this.props.headingObject) { +            this.props.headingObject.setColor(color); +            this._color = color; +        } +    } + +    @action      pointerEntered = () => {          if (SelectionManager.GetIsDragging()) {              this._background = "#b4b4b4"; @@ -158,7 +176,8 @@ export class CollectionStackingViewFieldColumn extends React.Component<CSVFieldC      @action      pointerLeave = () => { -        this._background = "white"; +        this._background = "inherit"; +        document.removeEventListener("pointermove", this.startDrag);      }      @action @@ -180,22 +199,25 @@ export class CollectionStackingViewFieldColumn extends React.Component<CSVFieldC      }      startDrag = (e: PointerEvent) => { -        let alias = Doc.MakeAlias(this.props.parent.props.Document); -        let key = StrCast(this.props.parent.props.Document.sectionFilter); -        let value = this.getValue(this._heading); -        value = typeof value === "string" ? `"${value}"` : value; -        let script = `return doc.${key} === ${value}`; -        let compiled = CompileScript(script, { params: { doc: Doc.name } }); -        if (compiled.compiled) { -            let scriptField = new ScriptField(compiled); -            alias.viewSpecScript = scriptField; -            let dragData = new DragManager.DocumentDragData([alias], [alias.proto]); -            DragManager.StartDocumentDrag([this._headerRef.current!], dragData, e.clientX, e.clientY); -        } +        let [dx, dy] = this.props.screenToLocalTransform().transformDirection(e.clientX - this._startDragPosition.x, e.clientY - this._startDragPosition.y); +        if (Math.abs(dx) + Math.abs(dy) > this._sensitivity) { +            let alias = Doc.MakeAlias(this.props.parent.props.Document); +            let key = StrCast(this.props.parent.props.Document.sectionFilter); +            let value = this.getValue(this._heading); +            value = typeof value === "string" ? `"${value}"` : value; +            let script = `return doc.${key} === ${value}`; +            let compiled = CompileScript(script, { params: { doc: Doc.name } }); +            if (compiled.compiled) { +                let scriptField = new ScriptField(compiled); +                alias.viewSpecScript = scriptField; +                let dragData = new DragManager.DocumentDragData([alias], [alias.proto]); +                DragManager.StartDocumentDrag([this._headerRef.current!], dragData, e.clientX, e.clientY); +            } -        e.stopPropagation(); -        document.removeEventListener("pointermove", this.startDrag); -        document.removeEventListener("pointerup", this.pointerUp); +            e.stopPropagation(); +            document.removeEventListener("pointermove", this.startDrag); +            document.removeEventListener("pointerup", this.pointerUp); +        }      }      pointerUp = (e: PointerEvent) => { @@ -210,12 +232,45 @@ export class CollectionStackingViewFieldColumn extends React.Component<CSVFieldC          e.stopPropagation();          e.preventDefault(); +        let [dx, dy] = this.props.screenToLocalTransform().transformDirection(e.clientX, e.clientY); +        this._startDragPosition = { x: dx, y: dy }; +          document.removeEventListener("pointermove", this.startDrag);          document.addEventListener("pointermove", this.startDrag);          document.removeEventListener("pointerup", this.pointerUp);          document.addEventListener("pointerup", this.pointerUp);      } +    renderColorPicker = () => { +        let selected = this.props.headingObject ? this.props.headingObject.color : "#f1efeb"; + +        let pink = PastelSchemaPalette.get("pink2"); +        let purple = PastelSchemaPalette.get("purple4"); +        let blue = PastelSchemaPalette.get("bluegreen1"); +        let yellow = PastelSchemaPalette.get("yellow4"); +        let red = PastelSchemaPalette.get("red2"); +        let green = PastelSchemaPalette.get("bluegreen7"); +        let cyan = PastelSchemaPalette.get("bluegreen5"); +        let orange = PastelSchemaPalette.get("orange1"); +        let gray = "#f1efeb"; + +        return ( +            <div className="collectionStackingView-colorPicker"> +                <div className="colorOptions"> +                    <div className={"colorPicker" + (selected === pink ? " active" : "")} style={{ backgroundColor: pink }} onClick={() => this.changeColumnColor(pink!)}></div> +                    <div className={"colorPicker" + (selected === purple ? " active" : "")} style={{ backgroundColor: purple }} onClick={() => this.changeColumnColor(purple!)}></div> +                    <div className={"colorPicker" + (selected === blue ? " active" : "")} style={{ backgroundColor: blue }} onClick={() => this.changeColumnColor(blue!)}></div> +                    <div className={"colorPicker" + (selected === yellow ? " active" : "")} style={{ backgroundColor: yellow }} onClick={() => this.changeColumnColor(yellow!)}></div> +                    <div className={"colorPicker" + (selected === red ? " active" : "")} style={{ backgroundColor: red }} onClick={() => this.changeColumnColor(red!)}></div> +                    <div className={"colorPicker" + (selected === gray ? " active" : "")} style={{ backgroundColor: gray }} onClick={() => this.changeColumnColor(gray)}></div> +                    <div className={"colorPicker" + (selected === green ? " active" : "")} style={{ backgroundColor: green }} onClick={() => this.changeColumnColor(green!)}></div> +                    <div className={"colorPicker" + (selected === cyan ? " active" : "")} style={{ backgroundColor: cyan }} onClick={() => this.changeColumnColor(cyan!)}></div> +                    <div className={"colorPicker" + (selected === orange ? " active" : "")} style={{ backgroundColor: orange }} onClick={() => this.changeColumnColor(orange!)}></div> +                </div> +            </div> +        ); +    } +      render() {          let cols = this.props.cols();          let key = StrCast(this.props.parent.props.Document.sectionFilter); @@ -239,7 +294,11 @@ export class CollectionStackingViewFieldColumn extends React.Component<CSVFieldC          };          let headingView = this.props.headingObject ?              <div key={heading} className="collectionStackingView-sectionHeader" ref={this._headerRef} -                style={{ width: (style.columnWidth) / (uniqueHeadings.length + 1) }}> +                style={{ +                    width: (style.columnWidth) / +                        ((uniqueHeadings.length + +                            ((this.props.parent.props.CollectionView.props.Document.chromeStatus !== 'view-mode' && this.props.parent.props.CollectionView.props.Document.chromeStatus !== 'disabled') ? 1 : 0)) || 1) +                }}>                  {/* the default bucket (no key value) has a tooltip that describes what it is.                      Further, it does not have a color and cannot be deleted. */}                  <div className="collectionStackingView-sectionHeader-subCont" onPointerDown={this.headerDown} @@ -247,11 +306,19 @@ export class CollectionStackingViewFieldColumn extends React.Component<CSVFieldC                          `Documents that don't have a ${key} value will go here. This column cannot be removed.` : ""}                      style={{                          width: "100%", -                        background: this.props.headingObject && evContents !== `NO ${key.toUpperCase()} VALUE` ? -                            this.props.headingObject.color : "lightgrey", +                        background: evContents !== `NO ${key.toUpperCase()} VALUE` ? this._color : "lightgrey",                          color: "grey"                      }}>                      <EditableView {...headerEditableViewProps} /> +                    {evContents === `NO ${key.toUpperCase()} VALUE` ? (null) : +                        <div className="collectionStackingView-sectionColor"> +                            <Flyout anchorPoint={anchorPoints.TOP_CENTER} content={this.renderColorPicker()}> +                                <button className="collectionStackingView-sectionColorButton"> +                                    <FontAwesomeIcon icon="palette" size="sm" /> +                                </button> +                            </ Flyout > +                        </div> +                    }                      {evContents === `NO ${key.toUpperCase()} VALUE` ?                          (null) :                          <button className="collectionStackingView-sectionDelete" onClick={this.deleteColumn}> @@ -261,7 +328,7 @@ export class CollectionStackingViewFieldColumn extends React.Component<CSVFieldC              </div> : (null);          for (let i = 0; i < cols; i++) templatecols += `${style.columnWidth}px `;          return ( -            <div key={heading} style={{ width: `${100 / (uniqueHeadings.length + 1)}%`, background: this._background }} +            <div key={heading} style={{ width: `${100 / ((uniqueHeadings.length + ((this.props.parent.props.CollectionView.props.Document.chromeStatus !== 'view-mode' && this.props.parent.props.CollectionView.props.Document.chromeStatus !== 'disabled') ? 1 : 0)) || 1)}%`, background: this._background }}                  ref={this.createColumnDropRef} onPointerEnter={this.pointerEntered} onPointerLeave={this.pointerLeave}>                  {headingView}                  <div key={`${heading}-stack`} className={`collectionStackingView-masonry${singleColumn ? "Single" : "Grid"}`} @@ -279,10 +346,11 @@ export class CollectionStackingViewFieldColumn extends React.Component<CSVFieldC                      {this.children(this.props.docList)}                      {singleColumn ? (null) : this.props.parent.columnDragger}                  </div> -                <div key={`${heading}-add-document`} className="collectionStackingView-addDocumentButton" -                    style={{ width: style.columnWidth / (uniqueHeadings.length + 1) }}> -                    <EditableView {...newEditableViewProps} /> -                </div> +                {(this.props.parent.props.CollectionView.props.Document.chromeStatus !== 'view-mode' && this.props.parent.props.CollectionView.props.Document.chromeStatus !== 'disabled') ? +                    <div key={`${heading}-add-document`} className="collectionStackingView-addDocumentButton" +                        style={{ width: style.columnWidth / (uniqueHeadings.length + 1) }}> +                        <EditableView {...newEditableViewProps} /> +                    </div> : null}              </div>          );      } | 
