diff options
Diffstat (limited to 'src')
19 files changed, 51 insertions, 51 deletions
| diff --git a/src/client/util/RichTextRules.ts b/src/client/util/RichTextRules.ts index c0c62463a..c727eec73 100644 --- a/src/client/util/RichTextRules.ts +++ b/src/client/util/RichTextRules.ts @@ -61,7 +61,7 @@ export const inpRules = {              new RegExp(/^#([0-9]+)\s$/),              (state, match, start, end) => {                  let size = Number(match[1]); -                let ruleProvider = Cast(FormattedTextBox.InputBoxOverlay!.props.Document.ruleProvider, Doc) as Doc; +                let ruleProvider = FormattedTextBox.InputBoxOverlay!.props.ruleProvider;                  let heading = NumCast(FormattedTextBox.InputBoxOverlay!.props.Document.heading);                  if (ruleProvider && heading) {                      (Cast(FormattedTextBox.InputBoxOverlay!.props.Document, Doc) as Doc).heading = Number(match[1]); @@ -74,7 +74,7 @@ export const inpRules = {              (state, match, start, end) => {                  let node = (state.doc.resolve(start) as any).nodeAfter;                  let sm = state.storedMarks || undefined; -                let ruleProvider = Cast(FormattedTextBox.InputBoxOverlay!.props.Document.ruleProvider, Doc) as Doc; +                let ruleProvider = FormattedTextBox.InputBoxOverlay!.props.ruleProvider;                  let heading = NumCast(FormattedTextBox.InputBoxOverlay!.props.Document.heading);                  if (ruleProvider && heading) {                      ruleProvider["ruleAlign_" + heading] = "center"; @@ -88,7 +88,7 @@ export const inpRules = {              (state, match, start, end) => {                  let node = (state.doc.resolve(start) as any).nodeAfter;                  let sm = state.storedMarks || undefined; -                let ruleProvider = Cast(FormattedTextBox.InputBoxOverlay!.props.Document.ruleProvider, Doc) as Doc; +                let ruleProvider = FormattedTextBox.InputBoxOverlay!.props.ruleProvider;                  let heading = NumCast(FormattedTextBox.InputBoxOverlay!.props.Document.heading);                  if (ruleProvider && heading) {                      ruleProvider["ruleAlign_" + heading] = "left"; @@ -100,7 +100,7 @@ export const inpRules = {              (state, match, start, end) => {                  let node = (state.doc.resolve(start) as any).nodeAfter;                  let sm = state.storedMarks || undefined; -                let ruleProvider = Cast(FormattedTextBox.InputBoxOverlay!.props.Document.ruleProvider, Doc) as Doc; +                let ruleProvider = FormattedTextBox.InputBoxOverlay!.props.ruleProvider;                  let heading = NumCast(FormattedTextBox.InputBoxOverlay!.props.Document.heading);                  if (ruleProvider && heading) {                      ruleProvider["ruleAlign_" + heading] = "right"; diff --git a/src/client/util/TooltipTextMenu.tsx b/src/client/util/TooltipTextMenu.tsx index c376b6f86..84d045e6f 100644 --- a/src/client/util/TooltipTextMenu.tsx +++ b/src/client/util/TooltipTextMenu.tsx @@ -496,7 +496,7 @@ export class TooltipTextMenu {              if (markType.name[0] === 'p') {                  let size = this.fontSizeToNum.get(markType);                  if (size) { this.updateFontSizeDropdown(String(size) + " pt"); } -                let ruleProvider = Cast(this.editorProps.Document.ruleProvider, Doc) as Doc; +                let ruleProvider = this.editorProps.ruleProvider;                  let heading = NumCast(this.editorProps.Document.heading);                  if (ruleProvider && heading) {                      ruleProvider["ruleSize_" + heading] = size; @@ -505,7 +505,7 @@ export class TooltipTextMenu {              else {                  let fontName = this.fontStylesToName.get(markType);                  if (fontName) { this.updateFontStyleDropdown(fontName); } -                let ruleProvider = Cast(this.editorProps.Document.ruleProvider, Doc) as Doc; +                let ruleProvider = this.editorProps.ruleProvider;                  let heading = NumCast(this.editorProps.Document.heading);                  if (ruleProvider && heading) {                      ruleProvider["ruleFont_" + heading] = fontName; diff --git a/src/client/views/DocumentDecorations.tsx b/src/client/views/DocumentDecorations.tsx index 6d63e8f73..ebdf2a749 100644 --- a/src/client/views/DocumentDecorations.tsx +++ b/src/client/views/DocumentDecorations.tsx @@ -365,14 +365,7 @@ export class DocumentDecorations extends React.Component<{}, { value: string }>                      Math.abs(e.pageY - this._downY) < Utils.DRAG_THRESHOLD) {                      let docViews = SelectionManager.ViewsSortedVertically();                      let topDocView = docViews[0]; -                    let ind = topDocView.templates.indexOf(Templates.Bullet.Layout); -                    if (ind !== -1) { -                        topDocView.templates.splice(ind, 1); -                        topDocView.props.Document.subBulletDocs = undefined; -                    } else { -                        topDocView.addTemplate(Templates.Bullet); -                        topDocView.props.Document.subBulletDocs = new List<Doc>(docViews.filter(v => v !== topDocView).map(v => v.props.Document.proto!)); -                    } +                    topDocView.props.Document.subBulletDocs = new List<Doc>(docViews.filter(v => v !== topDocView).map(v => v.props.Document.proto!));                  }              }              this._removeIcon = false; @@ -439,7 +432,7 @@ export class DocumentDecorations extends React.Component<{}, { value: string }>          let usingRule = false;          SelectionManager.SelectedDocuments().map(dv => {              let cv = dv.props.ContainingCollectionView; -            let ruleProvider = cv && (Cast(cv.props.Document.ruleProvider, Doc) as Doc); +            let ruleProvider = cv && cv.props.ruleProvider;              let heading = NumCast(dv.props.Document.heading);              ruleProvider && heading && (Doc.GetProto(ruleProvider)["ruleRounding_" + heading] = `${Math.min(100, dist)}%`);              usingRule = usingRule || (ruleProvider && heading ? true : false); diff --git a/src/client/views/InkingControl.tsx b/src/client/views/InkingControl.tsx index 867735c0b..86d0fc0be 100644 --- a/src/client/views/InkingControl.tsx +++ b/src/client/views/InkingControl.tsx @@ -71,9 +71,8 @@ export class InkingControl extends React.Component {                      targetDoc.backgroundColor = this._selectedColor;                  if (view.props.Document.heading) {                      let cv = view.props.ContainingCollectionView; -                    let ruleProvider = cv && (Cast(cv.props.Document.ruleProvider, Doc) as Doc); -                    let parback = cv && StrCast(cv.props.Document.backgroundColor); -                    cv && parback && (Doc.GetProto(ruleProvider ? ruleProvider : cv.props.Document)["ruleColor_" + NumCast(view.props.Document.heading)] = Utils.toRGBAstr(color.rgb)); +                    let ruleProvider = cv && (Cast(cv.props.ruleProvider, Doc) as Doc); +                    cv && (Doc.GetProto(ruleProvider ? ruleProvider : cv.props.Document)["ruleColor_" + NumCast(view.props.Document.heading)] = Utils.toRGBAstr(color.rgb));                      // if (parback && cv && parback.indexOf("rgb") !== -1) {                      //     let parcol = Utils.fromRGBAstr(parback);                      //     let hsl = Utils.RGBToHSL(parcol.r, parcol.g, parcol.b); diff --git a/src/client/views/MainOverlayTextBox.tsx b/src/client/views/MainOverlayTextBox.tsx index c3a2cb214..71fb2707d 100644 --- a/src/client/views/MainOverlayTextBox.tsx +++ b/src/client/views/MainOverlayTextBox.tsx @@ -72,7 +72,6 @@ export class MainOverlayTextBox extends React.Component<MainOverlayTextBoxProps>          if (this._textTargetDiv) {              this._textTargetDiv.style.color = this._textColor;          } -        this._textAutoHeight = autoHeight;          this.TextFieldKey = textFieldKey!;          let txf = tx ? tx : () => Transform.Identity();          this._textXf = txf; @@ -143,6 +142,7 @@ export class MainOverlayTextBox extends React.Component<MainOverlayTextBoxProps>                                  Document={FormattedTextBox.InputBoxOverlay.props.Document}                                  DataDoc={FormattedTextBox.InputBoxOverlay.props.DataDoc}                                  onClick={undefined} +                                ruleProvider={this._textBox ? this._textBox.props.ruleProvider : undefined}                                  ChromeHeight={this.ChromeHeight}                                  isSelected={returnTrue} select={emptyFunction} renderDepth={0}                                  ContainingCollectionView={undefined} whenActiveChanged={emptyFunction} active={returnTrue} ContentScaling={returnOne} diff --git a/src/client/views/MainView.tsx b/src/client/views/MainView.tsx index b64986084..2cec1c052 100644 --- a/src/client/views/MainView.tsx +++ b/src/client/views/MainView.tsx @@ -322,6 +322,7 @@ export class MainView extends React.Component {                              addDocTab={emptyFunction}                              pinToPres={emptyFunction}                              onClick={undefined} +                            ruleProvider={undefined}                              removeDocument={undefined}                              ScreenToLocalTransform={Transform.Identity}                              ContentScaling={returnOne} @@ -385,6 +386,7 @@ export class MainView extends React.Component {              addDocTab={this.addDocTabFunc}              pinToPres={emptyFunction}              removeDocument={undefined} +            ruleProvider={undefined}              onClick={undefined}              ScreenToLocalTransform={Transform.Identity}              ContentScaling={returnOne} diff --git a/src/client/views/TemplateMenu.tsx b/src/client/views/TemplateMenu.tsx index 0ef1a137d..060191e29 100644 --- a/src/client/views/TemplateMenu.tsx +++ b/src/client/views/TemplateMenu.tsx @@ -51,16 +51,16 @@ export class TemplateMenu extends React.Component<TemplateMenuProps> {      @observable private _hidden: boolean = true;      dragRef = React.createRef<HTMLUListElement>(); -    constructor(props: TemplateMenuProps) { -        super(props); -    } -      toggleCustom = (e: React.MouseEvent): void => {          this.props.docs.map(dv => { -            if (dv.Document.type !== DocumentType.COL && dv.Document.type !== DocumentType.TEMPLATE) { -                dv.makeCustomViewClicked(); -            } else if (dv.Document.nativeLayout) { -                dv.makeNativeViewClicked(); +            if (dv.props.ContainingCollectionView && dv.props.ContainingCollectionView.props.DataDoc) { +                Doc.MakeMetadataFieldTemplate(dv.props.Document, dv.props.ContainingCollectionView.props.DataDoc) +            } else { +                if (dv.Document.type !== DocumentType.COL && dv.Document.type !== DocumentType.TEMPLATE) { +                    dv.makeCustomViewClicked(); +                } else if (dv.Document.nativeLayout) { +                    dv.makeNativeViewClicked(); +                }              }          });      } diff --git a/src/client/views/collections/CollectionDockingView.tsx b/src/client/views/collections/CollectionDockingView.tsx index fb8b0c41b..166fa0811 100644 --- a/src/client/views/collections/CollectionDockingView.tsx +++ b/src/client/views/collections/CollectionDockingView.tsx @@ -631,6 +631,7 @@ export class DockedFrameRenderer extends React.Component<DockedFrameProps> {              bringToFront={emptyFunction}              addDocument={undefined}              removeDocument={undefined} +            ruleProvider={undefined}              ContentScaling={this.contentScaling}              PanelWidth={this.panelWidth}              PanelHeight={this.panelHeight} diff --git a/src/client/views/collections/CollectionSchemaView.tsx b/src/client/views/collections/CollectionSchemaView.tsx index 9d83aa6c1..dca1d7c1d 100644 --- a/src/client/views/collections/CollectionSchemaView.tsx +++ b/src/client/views/collections/CollectionSchemaView.tsx @@ -995,6 +995,7 @@ export class CollectionSchemaPreview extends React.Component<CollectionSchemaPre                          Document={this.props.Document}                          fitToBox={this.props.fitToBox}                          onClick={this.props.onClick} +                        ruleProvider={undefined}                          showOverlays={this.props.showOverlays}                          addDocument={this.props.addDocument}                          removeDocument={this.props.removeDocument} diff --git a/src/client/views/collections/CollectionSubView.tsx b/src/client/views/collections/CollectionSubView.tsx index 99e5ab7b3..270916522 100644 --- a/src/client/views/collections/CollectionSubView.tsx +++ b/src/client/views/collections/CollectionSubView.tsx @@ -34,6 +34,7 @@ export interface CollectionViewProps extends FieldViewProps {  export interface SubCollectionViewProps extends CollectionViewProps {      CollectionView: CollectionView | CollectionPDFView | CollectionVideoView; +    ruleProvider: Doc | undefined;  }  export function CollectionSubView<T>(schemaCtor: (doc: Doc) => T) { diff --git a/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx b/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx index 9a8ae3535..4a3e5039a 100644 --- a/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx +++ b/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx @@ -257,18 +257,14 @@ export class CollectionFreeFormView extends CollectionSubView(PanZoomDocument) {      private getLocalTransform = (): Transform => Transform.Identity().scale(1 / this.zoomScaling()).translate(this.panX(), this.panY());      private addLiveTextBox = (newBox: Doc) => {          FormattedTextBox.SelectOnLoad = newBox[Id];// track the new text box so we can give it a prop that tells it to focus itself when it's displayed -        let heading = this.childDocs.reduce((maxHeading, doc) => NumCast(doc.heading) > maxHeading ? NumCast(doc.heading) : maxHeading, 0); -        heading = heading === 0 || this.childDocs.length === 0 ? 1 : heading === 1 ? 2 : 0; +        let maxHeading = this.childDocs.reduce((maxHeading, doc) => NumCast(doc.heading) > maxHeading ? NumCast(doc.heading) : maxHeading, 0); +        let heading = maxHeading === 0 || this.childDocs.length === 0 ? 1 : maxHeading === 1 ? 2 : 0;          if (heading === 0) {              let sorted = this.childDocs.filter(d => d.type === DocumentType.TEXT && d.data_ext instanceof Doc && d.data_ext.lastModified).sort((a, b) => DateCast((Cast(a.data_ext, Doc) as Doc).lastModified).date > DateCast((Cast(b.data_ext, Doc) as Doc).lastModified).date ? 1 :                  DateCast((Cast(a.data_ext, Doc) as Doc).lastModified).date < DateCast((Cast(b.data_ext, Doc) as Doc).lastModified).date ? -1 : 0); -            heading = !sorted.length ? 1 : NumCast(sorted[sorted.length - 1].heading) === 1 ? 2 : NumCast(sorted[sorted.length - 1].heading); -        } -        newBox.heading = heading; - -        if (Cast(this.props.Document.ruleProvider, Doc) as Doc) { -            newBox.ruleProvider = Doc.GetProto(Cast(this.props.Document.ruleProvider, Doc) as Doc); +            heading = !sorted.length ? Math.max(1, maxHeading) : NumCast(sorted[sorted.length - 1].heading) === 1 ? 2 : NumCast(sorted[sorted.length - 1].heading);          } +        !this.props.Document.isRuleProvider && (newBox.heading = heading);          this.addDocument(newBox, false);      }      private addDocument = (newBox: Doc, allowDuplicates: boolean) => { @@ -698,6 +694,7 @@ export class CollectionFreeFormView extends CollectionSubView(PanZoomDocument) {              addDocument: this.props.addDocument,              removeDocument: this.props.removeDocument,              moveDocument: this.props.moveDocument, +            ruleProvider: this.props.Document.isRuleProvider && childLayout.type !== DocumentType.TEXT ? this.props.Document : this.props.ruleProvider,              onClick: this.props.onClick,              ScreenToLocalTransform: childLayout.z ? this.getTransformOverlay : this.getTransform,              renderDepth: this.props.renderDepth + 1, @@ -723,6 +720,7 @@ export class CollectionFreeFormView extends CollectionSubView(PanZoomDocument) {              addDocument: this.props.addDocument,              removeDocument: this.props.removeDocument,              moveDocument: this.props.moveDocument, +            ruleProvider: this.props.ruleProvider,              onClick: this.props.onClick,              ScreenToLocalTransform: this.getTransform,              renderDepth: this.props.renderDepth, @@ -817,6 +815,7 @@ export class CollectionFreeFormView extends CollectionSubView(PanZoomDocument) {                      if (pair.layout && !(pair.data instanceof Promise)) {                          prev.push({                              ele: <CollectionFreeFormDocumentView key={doc[Id]} +                                ruleProvider={this.props.Document.isRuleProvider ? this.props.Document : this.props.ruleProvider}                                  jitterRotation={NumCast(this.props.Document.jitterRotation)}                                  x={script ? pos.x : undefined} y={script ? pos.y : undefined}                                  width={script ? pos.width : undefined} height={script ? pos.height : undefined} {...this.getChildDocumentViewProps(pair.layout, pair.data)} />, @@ -873,6 +872,11 @@ export class CollectionFreeFormView extends CollectionSubView(PanZoomDocument) {          }, "arrange contents");      } +    autoFormat = () => { +        this.props.Document.isRuleProvider = !this.props.Document.isRuleProvider; +        this.childDocs.map(child => child.heading = undefined); +    } +      analyzeStrokes = async () => {          let data = Cast(this.fieldExtensionDoc[this.inkKey], InkField);          if (!data) { @@ -900,11 +904,7 @@ export class CollectionFreeFormView extends CollectionSubView(PanZoomDocument) {              },              icon: !this.props.Document.useClusters ? "braille" : "braille"          }); -        layoutItems.push({ -            description: `${this.props.Document.isRuleProvider ? "Stop Auto Format" : "Auto Format"}`, -            event: () => this.props.Document.isRuleProvider = !this.props.Document.isRuleProvider, -            icon: !this.props.Document.useClusters ? "chalkboard" : "chalkboard" -        }); +        layoutItems.push({ description: `${this.props.Document.isRuleProvider ? "Stop Auto Format" : "Auto Format"}`, event: this.autoFormat, icon: !this.props.Document.isRuleProvider ? "chalkboard" : "chalkboard" });          layoutItems.push({ description: "Arrange contents in grid", event: this.arrangeContents, icon: "table" });          layoutItems.push({ description: "Analyze Strokes", event: this.analyzeStrokes, icon: "paint-brush" });          layoutItems.push({ description: "Jitter Rotation", event: action(() => this.props.Document.jitterRotation = 10), icon: "paint-brush" }); @@ -1034,7 +1034,6 @@ class CollectionFreeFormOverlayView extends React.Component<DocumentViewProps &  @observer  class CollectionFreeFormBackgroundView extends React.Component<DocumentViewProps & { isSelected: () => boolean }> {      @computed get backgroundView() { -        let props = this.props;          return (<DocumentContentsView {...this.props} layoutKey={"backgroundLayout"}              renderDepth={this.props.renderDepth} isSelected={this.props.isSelected} select={emptyFunction} />);      } diff --git a/src/client/views/collections/collectionFreeForm/MarqueeView.tsx b/src/client/views/collections/collectionFreeForm/MarqueeView.tsx index 4308497a1..e46e8cb88 100644 --- a/src/client/views/collections/collectionFreeForm/MarqueeView.tsx +++ b/src/client/views/collections/collectionFreeForm/MarqueeView.tsx @@ -329,7 +329,6 @@ export class MarqueeView extends React.Component<MarqueeViewProps>                  selected = [newCollection];                  newCollection.x = bounds.left + bounds.width;                  summary.proto!.subBulletDocs = new List<Doc>(selected); -                summary.templates = new List<string>([Templates.Bullet.Layout]);                  let container = Docs.Create.FreeformDocument([summary, newCollection], { x: bounds.left, y: bounds.top, width: 300, height: 200, chromeStatus: "disabled", title: "-summary-" });                  container.viewType = CollectionViewType.Stacking;                  container.autoHeight = true; @@ -356,7 +355,6 @@ export class MarqueeView extends React.Component<MarqueeViewProps>                  this.props.addLiveTextDocument(summary);              }              else { -                newCollection.ruleProvider = this.props.container.props.Document.isRuleProvider ? this.props.container.props.Document : this.props.container.props.Document.ruleProvider;                  this.props.addDocument(newCollection, false);                  this.props.selectDocuments([newCollection]);              } diff --git a/src/client/views/nodes/CollectionFreeFormDocumentView.tsx b/src/client/views/nodes/CollectionFreeFormDocumentView.tsx index 082e5c5e3..4872a7aa1 100644 --- a/src/client/views/nodes/CollectionFreeFormDocumentView.tsx +++ b/src/client/views/nodes/CollectionFreeFormDocumentView.tsx @@ -74,7 +74,7 @@ export class CollectionFreeFormDocumentView extends DocComponent<CollectionFreeF      }      borderRounding = () => { -        let ruleProvider = this.props.Document.ruleProvider as Doc; +        let ruleProvider = this.props.ruleProvider;          let ruleRounding = ruleProvider ? StrCast(Doc.GetProto(ruleProvider)["ruleRounding_" + NumCast(this.props.Document.heading)]) : undefined;          let br = StrCast(this.layoutDoc.layout instanceof Doc ? this.layoutDoc.layout.borderRounding : this.props.Document.borderRounding);          br = !br && ruleRounding ? ruleRounding : br; diff --git a/src/client/views/nodes/DocumentView.tsx b/src/client/views/nodes/DocumentView.tsx index 0816cb813..cc04c5a9f 100644 --- a/src/client/views/nodes/DocumentView.tsx +++ b/src/client/views/nodes/DocumentView.tsx @@ -1,6 +1,6 @@  import { library } from '@fortawesome/fontawesome-svg-core';  import * as fa from '@fortawesome/free-solid-svg-icons'; -import { action, computed, IReactionDisposer, reaction, runInAction, trace, observable } from "mobx"; +import { action, computed, IReactionDisposer, reaction, runInAction } from "mobx";  import { observer } from "mobx-react";  import * as rp from "request-promise";  import { Doc, DocListCast, DocListCastAsync, HeightSym, Opt, WidthSym } from "../../../new_fields/Doc"; @@ -9,12 +9,13 @@ import { List } from "../../../new_fields/List";  import { ObjectField } from "../../../new_fields/ObjectField";  import { createSchema, listSpec, makeInterface } from "../../../new_fields/Schema";  import { ScriptField } from '../../../new_fields/ScriptField'; -import { BoolCast, Cast, FieldValue, NumCast, StrCast, PromiseValue } from "../../../new_fields/Types"; +import { BoolCast, Cast, FieldValue, NumCast, PromiseValue, StrCast } from "../../../new_fields/Types";  import { CurrentUserUtils } from "../../../server/authentication/models/current_user_utils";  import { RouteStore } from '../../../server/RouteStore';  import { emptyFunction, returnTrue, Utils } from "../../../Utils";  import { DocServer } from "../../DocServer";  import { Docs, DocUtils } from "../../documents/Documents"; +import { DocumentType } from '../../documents/DocumentTypes';  import { ClientUtils } from '../../util/ClientUtils';  import { DictationManager } from '../../util/DictationManager';  import { DocumentManager } from "../../util/DocumentManager"; @@ -35,12 +36,10 @@ import { MainView } from '../MainView';  import { OverlayView } from '../OverlayView';  import { ScriptBox } from '../ScriptBox';  import { ScriptingRepl } from '../ScriptingRepl'; -import { Template } from "./../Templates";  import { DocumentContentsView } from "./DocumentContentsView";  import "./DocumentView.scss";  import { FormattedTextBox } from './FormattedTextBox';  import React = require("react"); -import { DocumentType } from '../../documents/DocumentTypes';  const JsxParser = require('react-jsx-parser').default; //TODO Why does this need to be imported like this?  library.add(fa.faTrash); @@ -89,6 +88,7 @@ export interface DocumentViewProps {      renderDepth: number;      showOverlays?: (doc: Doc) => { title?: string, caption?: string };      ContentScaling: () => number; +    ruleProvider: Doc | undefined;      PanelWidth: () => number;      PanelHeight: () => number;      focus: (doc: Doc, willZoom: boolean, scale?: number) => void; @@ -470,6 +470,9 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu                      this.props.Document.type === DocumentType.VID ? Docs.Create.VideoDocument("http://www.cs.brown.edu", options) :                          Docs.Create.ImageDocument("http://www.cs.brown.edu", options); +                fieldTemplate.backgroundColor = StrCast(this.props.Document.backgroundColor); +                fieldTemplate.heading = 1; +                  let docTemplate = Docs.Create.FreeformDocument([fieldTemplate], { title: StrCast(this.Document.title) + "layout", width: NumCast(this.props.Document.width) + 20, height: Math.max(100, NumCast(this.props.Document.height) + 45) });                  let proto = Doc.GetProto(docTemplate);                  Doc.MakeMetadataFieldTemplate(fieldTemplate, proto); @@ -800,7 +803,7 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu      render() { -        let ruleProvider = this.props.Document.ruleProvider as Doc; +        let ruleProvider = this.props.ruleProvider;          let ruleColor = ruleProvider ? StrCast(Doc.GetProto(ruleProvider)["ruleColor_" + NumCast(this.props.Document.heading)]) : undefined;          let ruleRounding = ruleProvider ? StrCast(Doc.GetProto(ruleProvider)["ruleRounding_" + NumCast(this.props.Document.heading)]) : undefined;          let colorSet = this.layoutDoc.backgroundColor !== this.layoutDoc.defaultBackgroundColor; diff --git a/src/client/views/nodes/FieldView.tsx b/src/client/views/nodes/FieldView.tsx index d9774303b..943d181d6 100644 --- a/src/client/views/nodes/FieldView.tsx +++ b/src/client/views/nodes/FieldView.tsx @@ -30,6 +30,7 @@ export interface FieldViewProps {      leaveNativeSize?: boolean;      fitToBox?: boolean;      ContainingCollectionView: Opt<CollectionView | CollectionPDFView | CollectionVideoView>; +    ruleProvider: Doc | undefined;      Document: Doc;      DataDoc?: Doc;      onClick?: ScriptField; diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx index d39291743..a0dc054cf 100644 --- a/src/client/views/nodes/FormattedTextBox.tsx +++ b/src/client/views/nodes/FormattedTextBox.tsx @@ -458,7 +458,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe          this._rulesReactionDisposer = reaction(() => { -            let ruleProvider = Cast(this.props.Document.ruleProvider, Doc); +            let ruleProvider = this.props.ruleProvider;              let heading = NumCast(this.props.Document.heading);              if (ruleProvider instanceof Doc) {                  return { diff --git a/src/client/views/presentationview/PresentationElement.tsx b/src/client/views/presentationview/PresentationElement.tsx index 80aa25f48..7be44faf6 100644 --- a/src/client/views/presentationview/PresentationElement.tsx +++ b/src/client/views/presentationview/PresentationElement.tsx @@ -351,6 +351,7 @@ export default class PresentationElement extends React.Component<PresentationEle                      Document={this.props.document}                      addDocument={returnFalse}                      removeDocument={returnFalse} +                    ruleProvider={undefined}                      ScreenToLocalTransform={Transform.Identity}                      addDocTab={returnFalse}                      pinToPres={returnFalse} diff --git a/src/client/views/search/SearchItem.tsx b/src/client/views/search/SearchItem.tsx index c56d093fa..cd3dd912c 100644 --- a/src/client/views/search/SearchItem.tsx +++ b/src/client/views/search/SearchItem.tsx @@ -165,6 +165,7 @@ export class SearchItem extends React.Component<SearchItemProps> {                      Document={this.props.doc}                      addDocument={returnFalse}                      removeDocument={returnFalse} +                    ruleProvider={undefined}                      ScreenToLocalTransform={Transform.Identity}                      addDocTab={returnFalse}                      pinToPres={returnFalse} diff --git a/src/new_fields/Doc.ts b/src/new_fields/Doc.ts index 1a3d689bb..5b22a62a1 100644 --- a/src/new_fields/Doc.ts +++ b/src/new_fields/Doc.ts @@ -560,7 +560,7 @@ export namespace Doc {      export function MakeMetadataFieldTemplate(fieldTemplate: Doc, templateDataDoc: Doc) {          // move data doc fields to layout doc as needed (nativeWidth/nativeHeight, data, ??) -        let metadataFieldName = StrCast(fieldTemplate.title); +        let metadataFieldName = StrCast(fieldTemplate.title).replace(/^-/, "");          let backgroundLayout = StrCast(fieldTemplate.backgroundLayout);          let fieldLayoutDoc = fieldTemplate;          if (fieldTemplate.layout instanceof Doc) { | 
