diff options
| author | Monika <monika_hedman@brown.edu> | 2019-07-01 15:39:37 -0400 | 
|---|---|---|
| committer | Monika <monika_hedman@brown.edu> | 2019-07-01 15:39:37 -0400 | 
| commit | c5391bf0d352f69211ba28fc263d27204d7b8dc4 (patch) | |
| tree | acbc632aff852e74015bd1c8eee4933a7565cb94 /src/client/views/collections/CollectionSchemaView.tsx | |
| parent | ee4155a168dadad182719eb55df3459d6a937a45 (diff) | |
| parent | cd78d5b3371d73cc51dcb6f3dbfdca1a3bbcf6e1 (diff) | |
edits made
Diffstat (limited to 'src/client/views/collections/CollectionSchemaView.tsx')
| -rw-r--r-- | src/client/views/collections/CollectionSchemaView.tsx | 121 | 
1 files changed, 87 insertions, 34 deletions
diff --git a/src/client/views/collections/CollectionSchemaView.tsx b/src/client/views/collections/CollectionSchemaView.tsx index 97781f722..b0d46953c 100644 --- a/src/client/views/collections/CollectionSchemaView.tsx +++ b/src/client/views/collections/CollectionSchemaView.tsx @@ -11,10 +11,10 @@ import { Doc, DocListCast, DocListCastAsync, Field } from "../../../new_fields/D  import { Id } from "../../../new_fields/FieldSymbols";  import { List } from "../../../new_fields/List";  import { listSpec } from "../../../new_fields/Schema"; -import { Cast, FieldValue, NumCast, StrCast } from "../../../new_fields/Types"; +import { Cast, FieldValue, NumCast, StrCast, BoolCast } from "../../../new_fields/Types";  import { Docs } from "../../documents/Documents";  import { Gateway } from "../../northstar/manager/Gateway"; -import { SetupDrag } from "../../util/DragManager"; +import { SetupDrag, DragManager } from "../../util/DragManager";  import { CompileScript } from "../../util/Scripting";  import { Transform } from "../../util/Transform";  import { COLLECTION_BORDER_WIDTH, MAX_ROW_HEIGHT } from '../../views/globalCssVariables.scss'; @@ -29,6 +29,8 @@ import "./CollectionSchemaView.scss";  import { CollectionSubView } from "./CollectionSubView";  import { CollectionVideoView } from "./CollectionVideoView";  import { CollectionView } from "./CollectionView"; +import { undoBatch } from "../../util/UndoManager"; +import { timesSeries } from "async";  library.add(faCog); @@ -98,11 +100,13 @@ export class CollectionSchemaView extends CollectionSubView(doc => doc) {      renderCell = (rowProps: CellInfo) => {          let props: FieldViewProps = {              Document: rowProps.original, +            DataDoc: rowProps.original,              fieldKey: rowProps.column.id as string, +            fieldExt: "",              ContainingCollectionView: this.props.CollectionView,              isSelected: returnFalse,              select: emptyFunction, -            isTopMost: false, +            renderDepth: this.props.renderDepth + 1,              selectOnLoad: false,              ScreenToLocalTransform: Transform.Identity,              focus: emptyFunction, @@ -114,9 +118,10 @@ export class CollectionSchemaView extends CollectionSubView(doc => doc) {          };          let fieldContentView = <FieldView {...props} />;          let reference = React.createRef<HTMLDivElement>(); -        let onItemDown = (e: React.PointerEvent) => -            (this.props.CollectionView.props.isSelected() ? -                SetupDrag(reference, () => props.Document, this.props.moveDocument, this.props.Document.schemaDoc ? "copy" : undefined)(e) : undefined); +        let onItemDown = (e: React.PointerEvent) => { +            (!this.props.CollectionView.props.isSelected() ? undefined : +                SetupDrag(reference, () => props.Document, this.props.moveDocument, this.props.Document.schemaDoc ? "copy" : undefined)(e)); +        };          let applyToDoc = (doc: Doc, run: (args?: { [name: string]: any }) => any) => {              const res = run({ this: doc });              if (!res.success) return false; @@ -280,9 +285,9 @@ export class CollectionSchemaView extends CollectionSubView(doc => doc) {      @computed      get previewDocument(): Doc | undefined { -        const children = DocListCast(this.props.Document[this.props.fieldKey]); -        const selected = children.length > this._selectedIndex ? FieldValue(children[this._selectedIndex]) : undefined; -        return selected ? (this.previewScript && this.previewScript !== "this" ? FieldValue(Cast(selected[this.previewScript], Doc)) : selected) : undefined; +        const selected = this.childDocs.length > this._selectedIndex ? this.childDocs[this._selectedIndex] : undefined; +        let pdc = selected ? (this.previewScript && this.previewScript !== "this" ? FieldValue(Cast(selected[this.previewScript], Doc)) : selected) : undefined; +        return pdc;      }      getPreviewTransform = (): Transform => this.props.ScreenToLocalTransform().translate( @@ -344,24 +349,38 @@ export class CollectionSchemaView extends CollectionSubView(doc => doc) {              <div className="collectionSchemaView-dividerDragger" onPointerDown={this.onDividerDown} style={{ width: `${this.DIVIDER_WIDTH}px` }} />;      } +      @computed      get previewPanel() { -        trace(); -        return <CollectionSchemaPreview -            Document={this.previewDocument} -            width={this.previewWidth} -            height={this.previewHeight} -            getTransform={this.getPreviewTransform} -            CollectionView={this.props.CollectionView} -            moveDocument={this.props.moveDocument} -            addDocument={this.props.addDocument} -            removeDocument={this.props.removeDocument} -            active={this.props.active} -            whenActiveChanged={this.props.whenActiveChanged} -            addDocTab={this.props.addDocTab} -            setPreviewScript={this.setPreviewScript} -            previewScript={this.previewScript} -        />; +        // let layoutDoc = this.previewDocument; +        // let resolvedDataDoc = (layoutDoc !== this.props.DataDoc) ? this.props.DataDoc : undefined; +        // if (layoutDoc && !(Cast(layoutDoc.layout, Doc) instanceof Doc) && +        //     resolvedDataDoc && resolvedDataDoc !== layoutDoc) { +        //     // ... so change the layout to be an expanded view of the template layout.  This allows the view override the template's properties and be referenceable as its own document. +        //     layoutDoc = Doc.expandTemplateLayout(layoutDoc, resolvedDataDoc); +        // } + +        let layoutDoc = this.previewDocument ? Doc.expandTemplateLayout(this.previewDocument, this.props.DataDoc) : undefined; +        return <div ref={this.createTarget}> +            <CollectionSchemaPreview +                Document={layoutDoc} +                DataDocument={this.previewDocument !== this.props.DataDoc ? this.props.DataDoc : undefined} +                childDocs={this.childDocs} +                renderDepth={this.props.renderDepth} +                width={this.previewWidth} +                height={this.previewHeight} +                getTransform={this.getPreviewTransform} +                CollectionView={this.props.CollectionView} +                moveDocument={this.props.moveDocument} +                addDocument={this.props.addDocument} +                removeDocument={this.props.removeDocument} +                active={this.props.active} +                whenActiveChanged={this.props.whenActiveChanged} +                addDocTab={this.props.addDocTab} +                setPreviewScript={this.setPreviewScript} +                previewScript={this.previewScript} +            /> +        </div>;      }      @action      setPreviewScript = (script: string) => { @@ -383,6 +402,9 @@ export class CollectionSchemaView extends CollectionSubView(doc => doc) {  }  interface CollectionSchemaPreviewProps {      Document?: Doc; +    DataDocument?: Doc; +    childDocs?: Doc[]; +    renderDepth: number;      width: () => number;      height: () => number;      CollectionView?: CollectionView | CollectionPDFView | CollectionVideoView; @@ -392,13 +414,15 @@ interface CollectionSchemaPreviewProps {      removeDocument: (document: Doc) => boolean;      active: () => boolean;      whenActiveChanged: (isActive: boolean) => void; -    addDocTab: (document: Doc, where: string) => void; +    addDocTab: (document: Doc, dataDoc: Doc | undefined, where: string) => void;      setPreviewScript: (script: string) => void;      previewScript?: string;  }  @observer  export class CollectionSchemaPreview extends React.Component<CollectionSchemaPreviewProps>{ +    private dropDisposer?: DragManager.DragDropDisposer; +    _mainCont?: HTMLDivElement;      private get nativeWidth() { return NumCast(this.props.Document!.nativeWidth, this.props.width()); }      private get nativeHeight() { return NumCast(this.props.Document!.nativeHeight, this.props.height()); }      private contentScaling = () => { @@ -408,26 +432,55 @@ export class CollectionSchemaPreview extends React.Component<CollectionSchemaPre          }          return wscale;      } -    private PanelWidth = () => this.nativeWidth * this.contentScaling(); -    private PanelHeight = () => this.nativeHeight * this.contentScaling(); +    protected createDropTarget = (ele: HTMLDivElement) => { +    } +    private createTarget = (ele: HTMLDivElement) => { +        this._mainCont = ele; +        this.dropDisposer && this.dropDisposer(); +        if (ele) { +            this.dropDisposer = DragManager.MakeDropTarget(ele, { handlers: { drop: this.drop.bind(this) } }); +        } +    } + +    @undoBatch +    @action +    drop = (e: Event, de: DragManager.DropEvent) => { +        if (de.data instanceof DragManager.DocumentDragData) { +            let docDrag = de.data; +            this.props.childDocs && this.props.childDocs.map(otherdoc => { +                Doc.GetProto(otherdoc).layout = Doc.MakeDelegate(docDrag.draggedDocuments[0]); +            }); +            e.stopPropagation(); +        } +        return true; +    } +    private PanelWidth = () => this.nativeWidth ? this.nativeWidth * this.contentScaling() : this.props.width(); +    private PanelHeight = () => this.nativeHeight ? this.nativeHeight * this.contentScaling() : this.props.height();      private getTransform = () => this.props.getTransform().translate(-this.centeringOffset, 0).scale(1 / this.contentScaling()); -    get centeringOffset() { return (this.props.width() - this.nativeWidth * this.contentScaling()) / 2; } +    get centeringOffset() { return this.nativeWidth ? (this.props.width() - this.nativeWidth * this.contentScaling()) / 2 : 0; }      @action      onPreviewScriptChange = (e: React.ChangeEvent<HTMLInputElement>) => {          this.props.setPreviewScript(e.currentTarget.value);      }      render() {          let input = this.props.previewScript === undefined ? (null) : -            <input className="collectionSchemaView-input" value={this.props.previewScript} onChange={this.onPreviewScriptChange} -                style={{ left: `calc(50% - ${Math.min(75, (this.props.Document ? this.PanelWidth() / 2 : 75))}px)` }} />; +            <div ref={this.createTarget}><input className="collectionSchemaView-input" value={this.props.previewScript} onChange={this.onPreviewScriptChange} +                style={{ left: `calc(50% - ${Math.min(75, (this.props.Document ? this.PanelWidth() / 2 : 75))}px)` }} /></div>;          return (<div className="collectionSchemaView-previewRegion" style={{ width: this.props.width(), height: "100%" }}>              {!this.props.Document || !this.props.width ? (null) : (                  <div className="collectionSchemaView-previewDoc" style={{ transform: `translate(${this.centeringOffset}px, 0px)`, height: "100%" }}> -                    <DocumentView Document={this.props.Document} isTopMost={false} selectOnLoad={false} -                        addDocument={this.props.addDocument} removeDocument={this.props.removeDocument} moveDocument={this.props.moveDocument} +                    <DocumentView +                        DataDoc={this.props.Document.layout instanceof Doc ? this.props.Document : this.props.DataDocument} +                        Document={this.props.Document} +                        renderDepth={this.props.renderDepth + 1} +                        selectOnLoad={false} +                        addDocument={this.props.addDocument} +                        removeDocument={this.props.removeDocument} +                        moveDocument={this.props.moveDocument}                          ScreenToLocalTransform={this.getTransform}                          ContentScaling={this.contentScaling} -                        PanelWidth={this.PanelWidth} PanelHeight={this.PanelHeight} +                        PanelWidth={this.PanelWidth} +                        PanelHeight={this.PanelHeight}                          ContainingCollectionView={this.props.CollectionView}                          focus={emptyFunction}                          parentActive={this.props.active}  | 
